<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://grove-trees.netlify.app">
    <title>宁静之森</title>
    <link href="https://grove-trees.netlify.app/feed.xml" rel="self" />
    <link href="https://grove-trees.netlify.app" />
    <updated>2025-06-25T03:06:46Z</updated>
    <id>https://grove-trees.netlify.app</id>
        <entry>
            <title>
                我的音乐歌手关键词
                
            </title>
            <updated>2024-10-20T10:01:35.000Z</updated>
            <id>https://grove-trees.netlify.app/card/音乐/我的音乐歌手关键词/</id>
            <content type="html">
                &lt;h1 id=&quot;我的音乐歌手关键词&quot; tabindex=&quot;-1&quot;&gt;我的音乐歌手关键词&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/image-20230728225527377.png&quot; alt=&quot;image-20230728225527377.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/音乐/我的音乐歌手关键词/" />
        </entry>
        <entry>
            <title>
                202405061046 音乐-圆桌骑士
                
            </title>
            <updated>2024-07-31T12:13:47.000Z</updated>
            <id>https://grove-trees.netlify.app/card/音乐/202405061046 音乐-圆桌骑士/</id>
            <content type="html">
                &lt;h1 id=&quot;202405061046&quot; tabindex=&quot;-1&quot;&gt;202405061046 音乐-圆桌骑士&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://music.163.com/song?id=2127857336&amp;amp;userid=16553655&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://music.163.com/song?id=2127857336&amp;amp;userid=16553655&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很有西方的骑士感觉&lt;/p&gt;
&lt;iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=&quot;50%&quot; height=&quot;86&quot; src=&quot;https://music.163.com/outchain/player?type=2&amp;id=2127857336&amp;userid=16553655&amp;auto=0&amp;height=66&quot;&gt;&lt;/iframe&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/音乐/202405061046 音乐-圆桌骑士/" />
        </entry>
        <entry>
            <title>
                如何合并marginnote笔记本
                
            </title>
            <updated>2024-09-26T07:29:50.000Z</updated>
            <id>https://grove-trees.netlify.app/card/阅读/如何合并marginnote笔记本/</id>
            <content type="html">
                &lt;h1 id=&quot;marginnote&quot; tabindex=&quot;-1&quot;&gt;如何合并marginnote笔记本&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://bbs.marginnote.cn/t/topic/3651/2&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;一个文档的多个笔记本中的笔记能否合并？ - 方法、技巧、工作流 - MarginNote 中文社区&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/阅读/如何合并marginnote笔记本/" />
        </entry>
        <entry>
            <title>
                软装-沙发
                
            </title>
            <updated>2024-10-12T14:55:32.000Z</updated>
            <id>https://grove-trees.netlify.app/card/装修/软装-沙发/</id>
            <content type="html">
                &lt;h1 id=&quot;软装-沙发&quot; tabindex=&quot;-1&quot;&gt;软装-沙发&lt;/h1&gt;
&lt;h2 id=&quot;材质&quot; tabindex=&quot;-1&quot;&gt;材质&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;布艺&lt;/li&gt;
&lt;li&gt;科技布？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;填充物&quot; tabindex=&quot;-1&quot;&gt;填充物&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一体成型&lt;/li&gt;
&lt;li&gt;海绵密度高于 50&lt;/li&gt;
&lt;li&gt;海绵加羽绒&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;尺寸&quot; tabindex=&quot;-1&quot;&gt;尺寸&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;坐深 65cm 以上&lt;/li&gt;
&lt;li&gt;坐高 40cm 左右&lt;/li&gt;
&lt;li&gt;靠背高度 55cm 以上&lt;/li&gt;
&lt;li&gt;长度 3.2-3.5 米&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;框架&quot; tabindex=&quot;-1&quot;&gt;框架&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;蛇形弹簧&lt;/li&gt;
&lt;li&gt;实木框架&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;封底&quot; tabindex=&quot;-1&quot;&gt;封底&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;布艺封底&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;颜色&quot; tabindex=&quot;-1&quot;&gt;颜色&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;深色（不容易翻车）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h2&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/装修/软装-沙发/" />
        </entry>
        <entry>
            <title>
                202405081320 IPv6的回环地址是如何表示的
                
            </title>
            <updated>2024-05-08T05:37:58.000Z</updated>
            <id>https://grove-trees.netlify.app/card/网络/202405081320 IPv6的回环地址是如何表示的/</id>
            <content type="html">
                &lt;h1 id=&quot;202405081320-i-pv6&quot; tabindex=&quot;-1&quot;&gt;202405081320 IPv6的回环地址是如何表示的&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;::1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240508133743.png&quot; alt=&quot;Pasted image 20240508133743.png|648&quot; width=&quot;648px&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/网络/202405081320 IPv6的回环地址是如何表示的/" />
        </entry>
        <entry>
            <title>
                算法新年祝福语
                
            </title>
            <updated>2024-02-05T04:42:49.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/算法新年祝福语/</id>
            <content type="html">
                &lt;h1 id=&quot;算法新年祝福语&quot; tabindex=&quot;-1&quot;&gt;算法新年祝福语&lt;/h1&gt;
&lt;p&gt;祝你冒泡排序，选择排序，插入排序，快速排序，堆排序，归并排序，希尔排序，桶排序，基数排序新年帮您排忧解难。&lt;/p&gt;
&lt;p&gt;有向图，无向图，有环图，无环图，完全图，稠密图，稀疏图，拓扑图祝您新年宏图大展。&lt;/p&gt;
&lt;p&gt;最长路，最短路，单源路径，所有节点对路径祝您新年路路通畅。&lt;/p&gt;
&lt;p&gt;二叉树，红黑树，van Emde Boas树，最小生成树祝您新年好运枝繁叶茂。&lt;/p&gt;
&lt;p&gt;最大流，网络流，标准输入流，标准输出流，文件输入流，文件输出流祝您新年顺顺流流。&lt;/p&gt;
&lt;p&gt;线性动规，区间动规，坐标动规，背包动规，树型动归为您的新年规划精彩。&lt;/p&gt;
&lt;p&gt;散列表，哈希表，邻接表，双向链表，循环链表帮您在新年表达喜悦。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/算法新年祝福语/" />
        </entry>
        <entry>
            <title>
                滑动窗口模板
                
            </title>
            <updated>2024-04-20T10:25:52.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/滑动窗口模板/</id>
            <content type="html">
                &lt;h1 id=&quot;滑动窗口模板&quot; tabindex=&quot;-1&quot;&gt;滑动窗口模板&lt;/h1&gt;
&lt;p&gt;以 &lt;a href=&quot;https://leetcode-cn.com/problems/grumpy-bookstore-owner/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;1052. 爱生气的书店老板&lt;/a&gt; 为例&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Solution {

    /**
     * @param Integer[] $customers
     * @param Integer[] $grumpy
     * @param Integer $X
     * @return Integer
     */
    function maxSatisfied($customers, $grumpy, $X) {
        if (empty($customers)) {
            return 0;
        }

        // 1. 计算初始状态： 不压抑的时候，最大的满意人数
        $maxSat = 0;
        foreach ($grumpy as $key =&amp;gt; $g) {
            if ($g == 0) {
                $maxSat += $customers[$key];
            }
        }
		
		// 1.1 初始化左右指针位置
        $len = count($customers);
        $left = $right = 0;
        $curSat = $maxSat;
		
        // 2. 滑窗具体代码
        // 2.1 右指针一直往右做
        while ($right &amp;lt; $len) {
            $span = $right - $left + 1;

            // 2.1 直到遇到临界条件之后，左指针往右走，直到满足临界条件
            if ($span &amp;gt; $X) {
                if ($grumpy[$left]) {
                    $curSat -= $customers[$left];
                }
                $left ++;
            }

            // 计算当前窗口的数值
            if ($grumpy[$right]) {
                $curSat += $customers[$right];
            }
			
            // 最终结果比较
            $maxSat = max($curSat, $maxSat);
            $right++;
        }

        return $maxSat;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;多看几个题解：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;lc 的官方题解： &lt;a href=&quot;https://leetcode-cn.com/problems/grumpy-bookstore-owner/solution/ai-sheng-qi-de-shu-dian-lao-ban-by-leetc-dloq/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;爱生气的书店老板&lt;/a&gt;&lt;br /&gt;
一般官方题解的思路会非常详细，建议多看几遍&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://leetcode-cn.com/problems/grumpy-bookstore-owner/solution/yong-mi-mi-ji-qiao-wan-liu-zhu-zui-duo-d-py41/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;用「秘密技巧」挽留住最多的原本因为生气而被赶走的顾客&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/滑动窗口模板/" />
        </entry>
        <entry>
            <title>
                动态规划很多时候就是在填表
                
            </title>
            <updated>2024-10-21T13:52:03.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/动态规划/动态规划很多时候就是在填表/</id>
            <content type="html">
                &lt;h1 id=&quot;动态规划很多时候就是在填表&quot; tabindex=&quot;-1&quot;&gt;动态规划很多时候就是在填表&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/longest-palindromic-substring/solutions/7792/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://leetcode.cn/problems/longest-palindromic-substring/solutions/7792/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;填表的顺序是非常重要的&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/动态规划/动态规划很多时候就是在填表/" />
        </entry>
        <entry>
            <title>
                leetcode题目难度更新了
                
            </title>
            <updated>2024-11-05T16:28:34.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目难度更新了/</id>
            <content type="html">
                &lt;h1 id=&quot;leetcode&quot; tabindex=&quot;-1&quot;&gt;leetcode题目难度更新了&lt;/h1&gt;
&lt;p&gt;2023-02-25 的时候还是困难题的编辑距离&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020241106002654.png&quot; alt=&quot;Pasted image 20241106002654.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;2024年变成了中等题，哈哈哈哈哈，但是我的脑子没有跟着更新啊&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020241106002811.png&quot; alt=&quot;Pasted image 20241106002811.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目难度更新了/" />
        </entry>
        <entry>
            <title>
                leetcode-557. 反转字符串中的单词 III
                
            </title>
            <updated>2024-10-21T04:41:35.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-557. 反转字符串中的单词 III/</id>
            <content type="html">
                &lt;h1 id=&quot;leetcode-557-iii&quot; tabindex=&quot;-1&quot;&gt;leetcode-557. 反转字符串中的单词 III&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/reverse-words-in-a-string-iii/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;557. 反转字符串中的单词 III - 力扣（Leetcode）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;与代码 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/leetcode-541.%20%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%20II/&quot;&gt;leetcode-541. 反转字符串 II&lt;/a&gt; 相关联，&lt;code&gt;swapStrBytes&lt;/code&gt; 函数，使用了上次的代码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;func reverseWords(s string) string {
    sBytes := []byte(s)
    
    for left, right := 0, 0; right &amp;lt; len(sBytes);  right++ {
        if sBytes[right] == &#39; &#39; {
            swapStrBytes(sBytes, left, right-1)
            left = right+1
        }
        if right == len(sBytes) - 1 {
            swapStrBytes(sBytes, left, right)
        }
    }

    return string(sBytes)
}

func swapStrBytes(s []byte, left, right int) {
	if left &amp;gt;= right {
		return
	}

	for left &amp;lt; right {
		s[left], s[right] = s[right], s[left]
		left++
		right--
	}
}
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-557. 反转字符串中的单词 III/" />
        </entry>
        <entry>
            <title>
                leetcode-541. 反转字符串 II
                
            </title>
            <updated>2024-10-25T06:50:18.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-541. 反转字符串 II/</id>
            <content type="html">
                &lt;h1 id=&quot;leetcode-541-ii&quot; tabindex=&quot;-1&quot;&gt;leetcode-541. 反转字符串 II&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/reverse-string-ii/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;541. 反转字符串 II - 力扣（Leetcode）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;比较简单，想清楚边界条件，然后做一下字符的反转即可。go 可以将不能变动的字符串转换成可以变动的 &lt;code&gt;[]byte&lt;/code&gt; 之后，修改完之后，再转成 string&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;func reverseStr(s string, k int) string {
	if len(s) &amp;lt;= 1 {
		return s
	}

	strBytes := []byte(s)

	var left, right int
	// abcdefg   2
	for ; right &amp;lt; len(strBytes); right++ {
		if (right-left) &amp;gt;= 2*k-1 || right == len(strBytes)-1 {
			if left+k-1 &amp;gt; len(strBytes)-1 {
				swapStrBytes(strBytes, left, len(strBytes)-1)
			} else {
				swapStrBytes(strBytes, left, left+k-1)
			}
			left = right + 1
		}
	}

	return string(strBytes)
}

func swapStrBytes(s []byte, left, right int) {
	if left &amp;gt;= right {
		return
	}

	for left &amp;lt; right {
		s[left], s[right] = s[right], s[left]
		left++
		right--
	}
}
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-541. 反转字符串 II/" />
        </entry>
        <entry>
            <title>
                leetcode-53. 最大子数组和
                
            </title>
            <updated>2024-11-01T02:48:24.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-53. 最大子数组和/</id>
            <content type="html">
                &lt;h1 id=&quot;leetcode-53&quot; tabindex=&quot;-1&quot;&gt;leetcode-53. 最大子数组和&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode-cn.com/problems/maximum-subarray/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;53. 最大子数组和&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;解法&quot; tabindex=&quot;-1&quot;&gt;解法&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;第一版写的时候，可以加一个 dp 数组，保存每个节点的最大值&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;dp&lt;/code&gt; 公式&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; display=&quot;true&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -2.148ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;47.438ex&quot; height=&quot;5.428ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -1449.5 20967.4 2399&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;msub&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D453&quot; d=&quot;M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(523,-150) scale(0.707)&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1275,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mrow&quot; transform=&quot;translate(2330.8,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(0 -0.5)&quot;&gt;&lt;path data-c=&quot;7B&quot; d=&quot;M618 -943L612 -949H582L568 -943Q472 -903 411 -841T332 -703Q327 -682 327 -653T325 -350Q324 -28 323 -18Q317 24 301 61T264 124T221 171T179 205T147 225T132 234Q130 238 130 250Q130 255 130 258T131 264T132 267T134 269T139 272T144 275Q207 308 256 367Q310 436 323 519Q324 529 325 851Q326 1124 326 1154T332 1205Q369 1358 566 1443L582 1450H612L618 1444V1429Q618 1413 616 1411L608 1406Q599 1402 585 1393T552 1372T515 1343T479 1305T449 1257T429 1200Q425 1180 425 1152T423 851Q422 579 422 549T416 498Q407 459 388 424T346 364T297 318T250 284T214 264T197 254L188 251L205 242Q290 200 345 138T416 3Q421 -18 421 -48T423 -349Q423 -397 423 -472Q424 -677 428 -694Q429 -697 429 -699Q434 -722 443 -743T465 -782T491 -816T519 -845T548 -868T574 -886T595 -899T610 -908L616 -910Q618 -912 618 -928V-943Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtable&quot; transform=&quot;translate(750,0)&quot;&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,600)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D45A&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(878,0)&quot;&gt;&lt;path data-c=&quot;1D44E&quot; d=&quot;M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1407,0)&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1979,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2368,0)&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2968,0)&quot;&gt;&lt;path data-c=&quot;1D462&quot; d=&quot;M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(3540,0)&quot;&gt;&lt;path data-c=&quot;1D45A&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4418,0)&quot;&gt;&lt;path data-c=&quot;1D460&quot; d=&quot;M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4887,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(5165,0)&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5765,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6265.2,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;msub&quot; transform=&quot;translate(7265.4,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D453&quot; d=&quot;M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; transform=&quot;translate(523,-150) scale(0.707)&quot; data-mjx-texclass=&quot;ORD&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(600,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1378,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9166.4,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(9611.1,0)&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(10211.1,0)&quot;&gt;&lt;path data-c=&quot;1D462&quot; d=&quot;M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(10783.1,0)&quot;&gt;&lt;path data-c=&quot;1D45A&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(11661.1,0)&quot;&gt;&lt;path data-c=&quot;1D460&quot; d=&quot;M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12130.1,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(12408.1,0)&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13008.1,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13286.1,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(14675.1,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(877.8,0)&quot;&gt;&lt;g data-mml-node=&quot;text&quot;&gt;&lt;path data-c=&quot;3E&quot; d=&quot;M84 520Q84 528 88 533T96 539L99 540Q106 540 253 471T544 334L687 265Q694 260 694 250T687 235Q685 233 395 96L107 -40H101Q83 -38 83 -20Q83 -19 83 -17Q82 -10 98 -1Q117 9 248 71Q326 108 378 132L626 250L378 368Q90 504 86 509Q84 513 84 520Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;text&quot; transform=&quot;translate(778,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(2711.6,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-600)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(600,0)&quot;&gt;&lt;path data-c=&quot;1D462&quot; d=&quot;M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1172,0)&quot;&gt;&lt;path data-c=&quot;1D45A&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2050,0)&quot;&gt;&lt;path data-c=&quot;1D460&quot; d=&quot;M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2519,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2797,0)&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3397,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3675,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(14675.1,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(877.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1933.6,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(18636.6,0) translate(0 250)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;msub&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;INNER&quot;&gt;&lt;mo data-mjx-texclass=&quot;OPEN&quot;&gt;{&lt;/mo&gt;&lt;mtable columnalign=&quot;left left&quot; columnspacing=&quot;1em&quot; rowspacing=&quot;.2em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;&amp;gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo data-mjx-texclass=&quot;CLOSE&quot; fence=&quot;true&quot; stretchy=&quot;true&quot; symmetric=&quot;true&quot;&gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Solution {
    
    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function maxSubArray($nums) {
        $len = count($nums);
        if ($len == 1) {
            return $nums[0];
        }
        
        $currentMaxSum = $nums[0];
        
        $max = $nums[0];
        for ($i=1; $i &amp;lt; $len; $i++) {
            $currentMaxSum = max($currentMaxSum + $nums[$i], $nums[$i]);
            $max = max($currentMaxSum, $max);
        }
        
        return $max;
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2024-10-31&quot; tabindex=&quot;-1&quot;&gt;2024-10-31&lt;/h2&gt;
&lt;p&gt;使用go语言重新写一遍，仍然是dp思想&lt;/p&gt;
&lt;p&gt;该算法的核心思想是求 “&lt;strong&gt;以当前位置为结尾的最大子数组和&lt;/strong&gt;”&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func maxSubArray(nums []int) int {
    if len(nums) == 0 {
        return 0
    }

    winSum := 0
    mxSum := nums[0]

    for i := range nums {
	    winSum = max(nums[i], nums[i]+winSum)
        mxSum = max(mxSum, winSum)
    }

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

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-53. 最大子数组和/" />
        </entry>
        <entry>
            <title>
                leetcode-49. 字母异位词分组
                
            </title>
            <updated>2024-10-26T08:58:07.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-49. 字母异位词分组/</id>
            <content type="html">
                &lt;h1 id=&quot;leetcode-49&quot; tabindex=&quot;-1&quot;&gt;leetcode-49. 字母异位词分组&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/group-anagrams/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;49. 字母异位词分组 - 力扣（Leetcode）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;两种方法，都是把 key 聚合起来&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;func groupAnagrams(strs []string) [][]string {
    mp := make(map[[26]int][]string)

    for _, str := range strs {
        var cCnt [26]int

        for _, b := range str {
            cCnt[b-&#39;a&#39;] ++
        }

        mp[cCnt] = append(mp[cCnt], str)
    }

    var ret [][]string

    for _, m := range mp {
        ret = append(ret, m)
    }

    return ret
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2024-10-26-16-44&quot; tabindex=&quot;-1&quot;&gt;2024-10-26 16:44&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func groupAnagrams(strs []string) [][]string {
    retMap := map[[26]byte][]string{}

    for _, s := range strs {
        var key [26]byte
        for _, b := range []byte(s) {
            key[b-97] ++
        }

        retMap[key] = append(retMap[key], s)
    }

    ret := [][]string{}
    for _, r := range retMap {
        ret = append(ret, r)
    }

    return ret
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这两个版本的 &lt;code&gt;groupAnagrams&lt;/code&gt; 函数基本实现相同，都是通过构造字母计数数组 &lt;code&gt;key&lt;/code&gt; 来对字母异位词进行分组，但有一些细节上的优化空间：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;变量类型优化&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二个版本使用 &lt;code&gt;[26]byte&lt;/code&gt; 而不是 &lt;code&gt;[26]int&lt;/code&gt; 作为 &lt;code&gt;key&lt;/code&gt; 的类型。&lt;code&gt;byte&lt;/code&gt; 是 &lt;code&gt;uint8&lt;/code&gt; 的别名，占用更小的内存，在这种场景下是合理的选择，因为字母计数不会超过 &lt;code&gt;255&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在性能上，&lt;code&gt;byte&lt;/code&gt; 数组的哈希处理可能稍微快一点，因为它是更小的数值类型。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;字符索引转换&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一版使用 &lt;code&gt;cCnt[b-&#39;a&#39;]&lt;/code&gt;，而第二版使用 &lt;code&gt;key[b-97]&lt;/code&gt;。两者在功能上是一样的，只是 &lt;code&gt;97&lt;/code&gt; 是 &lt;code&gt;&#39;a&#39;&lt;/code&gt; 的 ASCII 值，显式的 &lt;code&gt;97&lt;/code&gt; 有助于代码执行更直接的索引定位。&lt;/li&gt;
&lt;li&gt;为了提升可读性，使用 &lt;code&gt;&#39;a&#39;&lt;/code&gt; 可以更直观地说明这个值是为了计算字母位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;初始化变量的方式&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二个版本直接使用 &lt;code&gt;map[...][]string{}&lt;/code&gt; 作为 &lt;code&gt;retMap&lt;/code&gt; 的初始化方式，写法上更简洁，减少了 &lt;code&gt;make&lt;/code&gt; 的调用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;结构一致性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;retMap&lt;/code&gt; 和 &lt;code&gt;ret&lt;/code&gt; 在两版代码中分别表示分组字典和结果容器。虽然功能一致，但如果你更喜欢语义化的命名，可以考虑更贴近业务逻辑的命名。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;总的来说，这些修改带来了代码的更紧凑写法和微小的内存性能优化。&lt;/p&gt;
&lt;p&gt;后面写的这一版明显比之前的要好很多了，而且写得很快&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-49. 字母异位词分组/" />
        </entry>
        <entry>
            <title>
                leetcode-401. 二进制手表
                
            </title>
            <updated>2024-10-21T08:54:48.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-401. 二进制手表/</id>
            <content type="html">
                &lt;h1 id=&quot;leetcode-401&quot; tabindex=&quot;-1&quot;&gt;leetcode-401. 二进制手表&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode-cn.com/problems/binary-watch/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;401. 二进制手表&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#算法/回溯算法&quot;&gt;#算法/回溯算法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1,2,4,8&lt;br /&gt;
取 2 个&lt;/p&gt;
&lt;p&gt;1，2 = 3&lt;br /&gt;
1，4 = 5&lt;br /&gt;
1，8 = 9&lt;br /&gt;
2，4 = 6&lt;br /&gt;
2，8 = 10&lt;br /&gt;
4，8 = 12&lt;/p&gt;
&lt;p&gt;1，2，4 = 7&lt;br /&gt;
1，2，8 = 11&lt;br /&gt;
1，4，8 = 13&lt;br /&gt;
2，4，8 = 14&lt;/p&gt;
&lt;p&gt;1，2，4，8&lt;/p&gt;
&lt;p&gt;1,2,4,8,16,32&lt;/p&gt;
&lt;p&gt;1,2 = 3&lt;br /&gt;
1,4 = 5&lt;br /&gt;
1,8 = 9&lt;br /&gt;
1,16 =17&lt;br /&gt;
1,32 = 33&lt;br /&gt;
2,4 = 6&lt;br /&gt;
2,8 = 10&lt;br /&gt;
2,16 = 18&lt;br /&gt;
2,32 = 34&lt;br /&gt;
4,8 = 12&lt;br /&gt;
4,16 = 20&lt;br /&gt;
4,32 = 36&lt;br /&gt;
8,16 = 24&lt;br /&gt;
8,32 = 40&lt;br /&gt;
16,32 = 48&lt;/p&gt;
&lt;p&gt;1,2,4 = 7&lt;br /&gt;
1,2,8 = 11&lt;br /&gt;
1,2,16 = 19&lt;br /&gt;
1,2,32 = 35&lt;br /&gt;
1,4,8 = 13&lt;br /&gt;
1,4,16 = 21&lt;br /&gt;
1,4,32 = 37&lt;br /&gt;
1,8,16 = 25&lt;br /&gt;
1,8,32 = 41&lt;br /&gt;
1,16,32 = 49&lt;br /&gt;
2,4,8 = 14&lt;br /&gt;
2,4,16 = 22&lt;br /&gt;
2,4,32 = 38&lt;br /&gt;
4,8,16 = 28&lt;br /&gt;
4,8,32 = 44&lt;br /&gt;
8,16,32 = 56&lt;/p&gt;
&lt;p&gt;1,2,4,8,16,32&lt;/p&gt;
&lt;p&gt;1,2,4,8 = 15&lt;br /&gt;
1,2,4,16 = 23&lt;br /&gt;
1,2,4,32 = 39&lt;br /&gt;
1,4,8,16 = 29&lt;br /&gt;
1,4,8,32 = 45&lt;br /&gt;
1,8,16,32 = 57&lt;br /&gt;
2,4,8,16 = 30&lt;br /&gt;
2,4,8,32 = 46&lt;br /&gt;
4,8,16,32 = 60&lt;/p&gt;
&lt;p&gt;1,2,4,8,16 = 31&lt;br /&gt;
1,2,4,8,32 = 47&lt;br /&gt;
2,4,8,16,32 = 62&lt;/p&gt;
&lt;p&gt;1,2,4,8,16,32 =&lt;/p&gt;
&lt;p&gt;枚举出来所有的集合&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;        $hourSet   = [
            0 =&amp;gt; [0],
            1 =&amp;gt; [1, 2, 4, 8],
            2 =&amp;gt; [3, 5, 9, 6, 10],
            3 =&amp;gt; [7, 11],
        ];
        $minuteSet = [
            0 =&amp;gt; [0],
            1 =&amp;gt; [1, 2, 4, 8, 16, 32],
            2 =&amp;gt; [3, 5, 9, 17, 33, 6, 10, 18, 34, 12, 20, 36, 24, 40, 48],
            3 =&amp;gt; [7, 11, 19, 35, 13, 21, 37, 25, 41, 49, 14, 22, 38, 28, 44, 56],
            4 =&amp;gt; [15, 23, 39, 29, 45, 57, 30, 46],
            5 =&amp;gt; [31, 47],
        ];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;话不多说，上代码，差点栽在一个简单题手里，也是我没有想到的&lt;/p&gt;
&lt;p&gt;其实呢，我有两种思路&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一种就是把小时和分钟的所有位表示的数字都枚举出来，然后最后处理一下最后的输出格式就行了，这个可行，但是废手，而且容易出错&lt;/li&gt;
&lt;li&gt;另外一种就是利用递归的方式，计算出每一步的所有可能值&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第二种方式：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Solution {
    
    /**
     * @param Integer $turnedOn
     * @return String[]
     */
    public function readBinaryWatch($turnedOn) {
        // 时针最多有 4 个
        // 分针最多亮 6 个
        
        $hour    = [1, 2, 4, 8];
        $minutes = [1, 2, 4, 8, 16, 32];
        
        $ret = [];
        for ($i = 0; $i &amp;lt;= $turnedOn &amp;amp;&amp;amp; $i &amp;lt; 4; $i++) {
            $hourPossible   = $this-&amp;gt;getSetPossible($hour, $i, 11);
            $minutePossible = $this-&amp;gt;getSetPossible($minutes, $turnedOn - $i, 59);
            
            foreach ($hourPossible as $hItem) {
                foreach ($minutePossible as $mItem) {
                    if ($mItem &amp;lt; 10) {
                        $mItem = &#39;0&#39; . $mItem;
                    }
                    $ret[] = $hItem . &#39;:&#39; . $mItem;
                }
            }
        }
        

        
        return $ret;
    }
    
    /**
     * @param $set
     * @param $count
     * @param $maxValue
     * @return array
     */
    public function getSetPossible($set, $count, $maxValue) {
        if ($count == 0) {
            return [0];
        }
        if ($count == 1) {
            return $set;
        }
        
        $setLen = count($set);
        
        $ret = [];
        
        // 第一个值的取值范围
        $maxIndex = $setLen - $count;
        
        // 第一个值的取值范围如果超过,那么退出
        for ($i = 0; $i &amp;lt;= $maxIndex; $i++) {
            $possibleSet = $this-&amp;gt;getSetPossible(array_slice($set, $i + 1), $count - 1, $maxValue);
            foreach ($possibleSet as $setItem) {
                if ($setItem + $set[$i] &amp;lt;= $maxValue) {
                    $ret[] = $set[$i] + $setItem;
                }
            }
        }
        
        return $ret;
    }
}
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-401. 二进制手表/" />
        </entry>
        <entry>
            <title>
                leetcode-303. 区域和检索 - 数组不可变
                
            </title>
            <updated>2024-10-30T15:25:41.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-303. 区域和检索 - 数组不可变/</id>
            <content type="html">
                &lt;h1 id=&quot;leetcode-303&quot; tabindex=&quot;-1&quot;&gt;leetcode-303. 区域和检索 - 数组不可变&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/range-sum-query-immutable/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;303. 区域和检索 - 数组不可变 - 力扣（LeetCode）&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201123234844.png&quot; alt=&quot;Pasted image 20201123234844.png&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;解法&quot; tabindex=&quot;-1&quot;&gt;解法&lt;/h1&gt;
&lt;h2 id=&quot;直接遍历，也能通过&quot; tabindex=&quot;-1&quot;&gt;直接遍历，也能通过&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;    function sumRangeV1($i, $j) {
        $ret = 0;
        for (; $i &amp;lt;= $j; $i++) {
            $ret += $this-&amp;gt;nums[$i];
        }
        return $ret;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201123234958.png&quot; alt=&quot;Pasted image 20201123234958.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;## 分析下面数组能不能拆分&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;[-2, 0, 3, -5, 2, -1]&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;1. 拆分成多个数组&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;2. 只有 $i &amp;gt;= $left &amp;amp;&amp;amp; $j &amp;lt;= $right  才行&lt;/s&gt;&lt;br /&gt;
[1, 2]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c++&quot;&gt;
感受一下这个版本,代码即注释，就是把前面的和给减掉就行了，也算是一个 dp 

class NumArray {
private:
    int* sum;
public:
    NumArray(vector&amp;lt;int&amp;gt;&amp;amp; nums) {
        //sum[i] 为 nums[0 : i-1]的和
        sum = new int[nums.size() + 1];
        sum[0] = 0;
        for(int i = 1; i &amp;lt;= nums.size(); i++)
            sum[i] = sum[i - 1] + nums[i - 1];
    }
    ~NumArray(){
        delete[] sum;
    }
    int sumRange(int i, int j) {
        return sum[j + 1] - sum[i];
    }
};


作者：realzzg-2
链接：https://leetcode-cn.com/problems/range-sum-query-immutable/solution/qian-zhui-he-ji-hu-shuang-bai-by-realzzg-2/
来源：力扣（LeetCode）
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2024-10-30&quot; tabindex=&quot;-1&quot;&gt;2024-10-30&lt;/h2&gt;
&lt;p&gt;使用前缀和，轻松拿捏&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;type NumArray struct {
    preSum []int
}


func Constructor(nums []int) NumArray {
    numArray := NumArray{
        preSum: make([]int, len(nums)+1),
    }
    for i := range nums {
        numArray.preSum[i+1] = numArray.preSum[i]+nums[i]
    }

    return numArray
}


func (this *NumArray) SumRange(left int, right int) int {
    return this.preSum[right+1] - this.preSum[left]
}
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-303. 区域和检索 - 数组不可变/" />
        </entry>
        <entry>
            <title>
                leetcode-1137第 N 个泰波那契数
                
            </title>
            <updated>2024-09-09T06:55:02.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-1137第 N 个泰波那契数/</id>
            <content type="html">
                &lt;h1 id=&quot;leetcode-1137-n&quot; tabindex=&quot;-1&quot;&gt;leetcode-1137第 N 个泰波那契数&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode-cn.com/problems/n-th-tribonacci-number/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;1137. 第 N 个泰波那契数&lt;/a&gt;&lt;br /&gt;
这个跟斐波那契好像是一样的，一模一样&lt;/p&gt;
&lt;h1 id=&quot;解法&quot; tabindex=&quot;-1&quot;&gt;解法&lt;/h1&gt;
&lt;p&gt;跟斐波纳契数列一样的解法&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Solution {

    /**
     * @param Integer $n
     * @return Integer
     */
    function tribonacci($n) {
        if ($n &amp;lt;= 0) {
            return 0;
        }
        
        $retArr = [0,1,1];
        for ($i = 3; $i &amp;lt;= $n; $i++) {
            $retArr[$i] = $retArr[$i-1] + $retArr[$i-2] + $retArr[$i-3];
        }

        return $retArr[$n];
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-1137第 N 个泰波那契数/" />
        </entry>
        <entry>
            <title>
                leetcode-1014. 最佳观光组合
                
            </title>
            <updated>2024-02-28T14:24:03.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-1014. 最佳观光组合/</id>
            <content type="html">
                &lt;p&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#leetcode&quot;&gt;#leetcode&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;leetcode-1014&quot; tabindex=&quot;-1&quot;&gt;leetcode-1014. 最佳观光组合&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode-cn.com/problems/best-sightseeing-pair/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;1014. 最佳观光组合&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;解法&quot; tabindex=&quot;-1&quot;&gt;解法&lt;/h1&gt;
&lt;p&gt;转换一下公式&lt;/p&gt;
&lt;p&gt;vn 代表 i 与 j 的值&lt;br /&gt;
fn 为最大值&lt;/p&gt;
&lt;p&gt;因为 &lt;code&gt;values[j] - j&lt;/code&gt; 是固定的，所以，只需要求 &lt;code&gt;values[i] + i&lt;/code&gt; 的最大值就可以了&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; display=&quot;true&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -2.149ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;39.082ex&quot; height=&quot;5.43ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -1450 17274.2 2400&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtable&quot;&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,700)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;msub&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D463&quot; d=&quot;M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; transform=&quot;translate(518,-150) scale(0.707)&quot; data-mjx-texclass=&quot;ORD&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1270,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtext&quot; transform=&quot;translate(2325.8,0)&quot;&gt;&lt;path data-c=&quot;A0&quot; d=&quot;&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;76&quot; d=&quot;M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z&quot; transform=&quot;translate(250,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;61&quot; d=&quot;M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z&quot; transform=&quot;translate(778,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6C&quot; d=&quot;M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z&quot; transform=&quot;translate(1278,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(1556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;65&quot; d=&quot;M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z&quot; transform=&quot;translate(2112,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;73&quot; d=&quot;M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z&quot; transform=&quot;translate(2556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;A0&quot; d=&quot;&quot; transform=&quot;translate(2950,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5525.8,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(5803.8,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6148.8,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6649,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(7649.3,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8216.5,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtext&quot; transform=&quot;translate(9216.7,0)&quot;&gt;&lt;path data-c=&quot;A0&quot; d=&quot;&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;76&quot; d=&quot;M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z&quot; transform=&quot;translate(250,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;61&quot; d=&quot;M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z&quot; transform=&quot;translate(778,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6C&quot; d=&quot;M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z&quot; transform=&quot;translate(1278,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(1556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;65&quot; d=&quot;M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z&quot; transform=&quot;translate(2112,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;73&quot; d=&quot;M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z&quot; transform=&quot;translate(2556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;A0&quot; d=&quot;&quot; transform=&quot;translate(2950,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12416.7,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(12694.7,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13106.7,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13606.9,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(14607.2,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-700)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;msub&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D453&quot; d=&quot;M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; transform=&quot;translate(523,-150) scale(0.707)&quot; data-mjx-texclass=&quot;ORD&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1275,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2330.8,0)&quot;&gt;&lt;path data-c=&quot;6D&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;61&quot; d=&quot;M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z&quot; transform=&quot;translate(833,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;78&quot; d=&quot;M201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201Z&quot; transform=&quot;translate(1333,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4191.8,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtext&quot; transform=&quot;translate(4580.8,0)&quot;&gt;&lt;path data-c=&quot;A0&quot; d=&quot;&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;76&quot; d=&quot;M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z&quot; transform=&quot;translate(250,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;61&quot; d=&quot;M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z&quot; transform=&quot;translate(778,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6C&quot; d=&quot;M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z&quot; transform=&quot;translate(1278,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(1556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;65&quot; d=&quot;M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z&quot; transform=&quot;translate(2112,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;73&quot; d=&quot;M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z&quot; transform=&quot;translate(2556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;A0&quot; d=&quot;&quot; transform=&quot;translate(2950,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7780.8,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(8058.8,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8403.8,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8904,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(9904.3,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10471.5,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtext&quot; transform=&quot;translate(11471.7,0)&quot;&gt;&lt;path data-c=&quot;A0&quot; d=&quot;&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;76&quot; d=&quot;M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z&quot; transform=&quot;translate(250,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;61&quot; d=&quot;M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z&quot; transform=&quot;translate(778,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6C&quot; d=&quot;M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z&quot; transform=&quot;translate(1278,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(1556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;65&quot; d=&quot;M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z&quot; transform=&quot;translate(2112,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;73&quot; d=&quot;M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z&quot; transform=&quot;translate(2556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;A0&quot; d=&quot;&quot; transform=&quot;translate(2950,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(14671.7,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(14949.7,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(15361.7,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(15861.9,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(16862.2,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtable columnalign=&quot;left&quot; columnspacing=&quot;1em&quot; rowspacing=&quot;4pt&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;msub&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt; values &lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mtext&gt; values &lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;msub&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo data-mjx-texclass=&quot;OP&quot; movablelimits=&quot;true&quot;&gt;max&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mtext&gt; values &lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mtext&gt; values &lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Solution {
    
    /**
     * @param Integer[] $values
     * @return Integer
     */
    function maxScoreSightseeingPair($values) {
        $len = count($values);
        $max = $maxI = 0;
        for ($i = 0; $i &amp;lt; $len; $i++) {
            $max = max($max, $maxI + $values[$i] - $i);
            $maxI = max($values[$i], $maxI);
        }
        
        return $max;
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode-cn.com/problems/best-sightseeing-pair/solution/zui-jia-guan-guang-zu-he-by-leetcode-solution/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;官方题解&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/leetcode-1014. 最佳观光组合/" />
        </entry>
        <entry>
            <title>
                72. 编辑距离
                
            </title>
            <updated>2024-11-08T04:32:31.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/72. 编辑距离/</id>
            <content type="html">
                &lt;h1 id=&quot;72&quot; tabindex=&quot;-1&quot;&gt;72. 编辑距离&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/edit-distance/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;72. 编辑距离 - 力扣（LeetCode）&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;学习&quot; tabindex=&quot;-1&quot;&gt;学习&lt;/h2&gt;
&lt;p&gt;chatgpt对话&lt;br /&gt;
&lt;a href=&quot;https://chatgpt.com/share/672cf317-1db4-8002-88ab-097738bce5b1&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://chatgpt.com/share/672cf317-1db4-8002-88ab-097738bce5b1&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;代码&quot; tabindex=&quot;-1&quot;&gt;代码&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func minDistance(word1 string, word2 string) int {
    if len(word1) == 0 || len(word2) == 0 {
        return max(len(word1), len(word2))
    }

    dp := make([][]int, len(word1)+1)

    for i := range dp {
        dp[i] = make([]int, len(word2)+1)
        dp[i][0] = i
    }

    for j := range dp[0] {
        dp[0][j]= j
    }

    for i:=1;i&amp;lt;len(dp);i++ {
        for j:=1;j&amp;lt;len(dp[i]);j++ {
            if word1[i-1] == word2[j-1] {
                dp[i][j] = dp[i-1][j-1]
            } else {
                dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1])+1
            }
        }
    }

    return dp[len(word1)][len(word2)]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键在于填表&lt;/p&gt;
&lt;p&gt;这个解法能打败50%，还有其他的解法，灵神的视频讲解的很清楚： &lt;a href=&quot;https://www.bilibili.com/video/BV1TM4y1o7ug/?vd_source=cdeb63885c1e7687c8d443ba7d3f4fd9&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;最长公共子序列 编辑距离_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/72. 编辑距离/" />
        </entry>
        <entry>
            <title>
                59. 螺旋矩阵 II
                
            </title>
            <updated>2024-11-09T10:21:08.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/59. 螺旋矩阵 II/</id>
            <content type="html">
                &lt;h1 id=&quot;59-ii&quot; tabindex=&quot;-1&quot;&gt;59. 螺旋矩阵 II&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/spiral-matrix-ii/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;59. 螺旋矩阵 II - 力扣（LeetCode）&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;代码&quot; tabindex=&quot;-1&quot;&gt;代码&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func generateMatrix(n int) [][]int {
    res := make([][]int, n)

    for i := range res {
        res[i] = make([]int, n)
    }

    // 方向
    // 右下左上
    direction := [][]int{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}

    curDirectionIdx := 0
    curPos := []int{0, 0}
    for i := 0; i &amp;lt; n*n; i++ {
        res[curPos[0]][curPos[1]] = i+1

        nexPos := []int{curPos[0]+direction[curDirectionIdx][0], curPos[1] + direction[curDirectionIdx][1]}
        if  nexPos[0] &amp;lt; 0 || nexPos[0] &amp;gt;= n ||
            nexPos[1] &amp;lt; 0 || nexPos[1] &amp;gt;= n || 
            res[nexPos[0]][nexPos[1]] &amp;gt; 0 {
                curDirectionIdx = (curDirectionIdx+1)%4
                nexPos = []int{curPos[0]+direction[curDirectionIdx][0], curPos[1] + direction[curDirectionIdx][1]}
        }

        curPos = nexPos
    }

    return res
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;非常好，螺旋矩阵做的很快&lt;/p&gt;
&lt;p&gt;几个关键因素&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;定义方向数组&lt;/li&gt;
&lt;li&gt;当前方向&lt;/li&gt;
&lt;li&gt;当前位置&lt;/li&gt;
&lt;li&gt;转方向的条件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;上一题： &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/54.%20%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5/&quot;&gt;54. 螺旋矩阵&lt;/a&gt;&lt;br /&gt;
上一题使用的是题解中某一个做法，四次方向转换都在循环中完成&lt;/p&gt;
&lt;p&gt;这次用的是方向做法&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/59. 螺旋矩阵 II/" />
        </entry>
        <entry>
            <title>
                560. 和为 K 的子数组
                
            </title>
            <updated>2024-10-30T15:40:32.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/560. 和为 K 的子数组/</id>
            <content type="html">
                &lt;h1 id=&quot;560-k&quot; tabindex=&quot;-1&quot;&gt;560. 和为 K 的子数组&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/subarray-sum-equals-k/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;560. 和为 K 的子数组 - 力扣（LeetCode）&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func subarraySum(nums []int, k int) int {
    cntMap := make(map[int]int, len(nums))
    cntMap[0] = 1

    currentSum := 0
    ans := 0

    for _, num := range nums {
        currentSum+=num

        if val, ok := cntMap[currentSum-k]; ok {
            ans+=val
        }

        cntMap[currentSum]++
    }

    return ans
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;刚开始一直看不懂 currentSum-k 什么意思，后来问了下chatgpt。看下原话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;/p&gt;
&lt;p&gt;这段代码的目的是检查当前的前缀和减去目标值 &lt;code&gt;k&lt;/code&gt; 是否存在于哈希表 &lt;code&gt;sumCount&lt;/code&gt; 中，从而帮助我们找到和为 &lt;code&gt;k&lt;/code&gt; 的子数组。我们来详细解析一下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;前缀和的概念&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前缀和是指数组中从第一个元素到当前元素的和。例如，对于数组 &lt;code&gt;[1, 2, 3]&lt;/code&gt;，其前缀和为：
&lt;ul&gt;
&lt;li&gt;累计到第一个元素：&lt;code&gt;1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;累计到第二个元素：&lt;code&gt;1 + 2 = 3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;累计到第三个元素：&lt;code&gt;1 + 2 + 3 = 6&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在代码中，&lt;code&gt;currentSum&lt;/code&gt; 表示当前遍历到某个元素时的前缀和。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;为什么要检查 &lt;code&gt;currentSum - k&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果当前前缀和是 &lt;code&gt;currentSum&lt;/code&gt;，我们希望找到一个子数组，使得这个子数组的和为 &lt;code&gt;k&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设这个子数组的起始位置为 &lt;code&gt;j&lt;/code&gt;，那么可以得出：&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; display=&quot;true&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;42.831ex&quot; height=&quot;2.262ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -750 18931.3 1000&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;path data-c=&quot;73&quot; d=&quot;M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(394,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6D&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; transform=&quot;translate(950,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1783,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2172,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2584,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(3028.7,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3373.7,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4040.4,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtext&quot; transform=&quot;translate(5096.2,0)&quot;&gt;&lt;path data-c=&quot;63&quot; d=&quot;M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(444,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;72&quot; d=&quot;M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;72&quot; d=&quot;M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z&quot; transform=&quot;translate(1392,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;65&quot; d=&quot;M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z&quot; transform=&quot;translate(1784,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6E&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; transform=&quot;translate(2228,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;74&quot; d=&quot;M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z&quot; transform=&quot;translate(2784,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;53&quot; d=&quot;M55 507Q55 590 112 647T243 704H257Q342 704 405 641L426 672Q431 679 436 687T446 700L449 704Q450 704 453 704T459 705H463Q466 705 472 699V462L466 456H448Q437 456 435 459T430 479Q413 605 329 646Q292 662 254 662Q201 662 168 626T135 542Q135 508 152 480T200 435Q210 431 286 412T370 389Q427 367 463 314T500 191Q500 110 448 45T301 -21Q245 -21 201 -4T140 27L122 41Q118 36 107 21T87 -7T78 -21Q76 -22 68 -22H64Q61 -22 55 -16V101Q55 220 56 222Q58 227 76 227H89Q95 221 95 214Q95 182 105 151T139 90T205 42T305 24Q352 24 386 62T420 155Q420 198 398 233T340 281Q284 295 266 300Q261 301 239 306T206 314T174 325T141 343T112 367T85 402Q55 451 55 507Z&quot; transform=&quot;translate(3173,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(3729,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6D&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; transform=&quot;translate(4285,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10436.4,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtext&quot; transform=&quot;translate(11436.7,0)&quot;&gt;&lt;path data-c=&quot;73&quot; d=&quot;M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(394,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6D&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; transform=&quot;translate(950,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13219.7,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(13608.7,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(14108.7,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(14553.3,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(15187.6,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(16187.8,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(16687.8,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(17354.6,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(18410.3,0)&quot;&gt;&lt;path data-c=&quot;1D458&quot; d=&quot;M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtext&gt;sum&lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;currentSum&lt;/mtext&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mtext&gt;sum&lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;p&gt;其中 &lt;code&gt;i&lt;/code&gt; 是当前元素的索引。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过变形可以得到：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; display=&quot;true&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;31.301ex&quot; height=&quot;2.262ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -750 13835.1 1000&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;path data-c=&quot;73&quot; d=&quot;M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(394,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6D&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; transform=&quot;translate(950,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1783,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(2172,0)&quot;&gt;&lt;path data-c=&quot;30&quot; d=&quot;M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2672,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(3116.7,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3750.9,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(4751.1,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5251.1,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5917.9,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtext&quot; transform=&quot;translate(6973.7,0)&quot;&gt;&lt;path data-c=&quot;63&quot; d=&quot;M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(444,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;72&quot; d=&quot;M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;72&quot; d=&quot;M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z&quot; transform=&quot;translate(1392,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;65&quot; d=&quot;M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z&quot; transform=&quot;translate(1784,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6E&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; transform=&quot;translate(2228,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;74&quot; d=&quot;M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z&quot; transform=&quot;translate(2784,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;53&quot; d=&quot;M55 507Q55 590 112 647T243 704H257Q342 704 405 641L426 672Q431 679 436 687T446 700L449 704Q450 704 453 704T459 705H463Q466 705 472 699V462L466 456H448Q437 456 435 459T430 479Q413 605 329 646Q292 662 254 662Q201 662 168 626T135 542Q135 508 152 480T200 435Q210 431 286 412T370 389Q427 367 463 314T500 191Q500 110 448 45T301 -21Q245 -21 201 -4T140 27L122 41Q118 36 107 21T87 -7T78 -21Q76 -22 68 -22H64Q61 -22 55 -16V101Q55 220 56 222Q58 227 76 227H89Q95 221 95 214Q95 182 105 151T139 90T205 42T305 24Q352 24 386 62T420 155Q420 198 398 233T340 281Q284 295 266 300Q261 301 239 306T206 314T174 325T141 343T112 367T85 402Q55 451 55 507Z&quot; transform=&quot;translate(3173,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;75&quot; d=&quot;M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z&quot; transform=&quot;translate(3729,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6D&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; transform=&quot;translate(4285,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12313.9,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(13314.1,0)&quot;&gt;&lt;path data-c=&quot;1D458&quot; d=&quot;M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtext&gt;sum&lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;currentSum&lt;/mtext&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;ul&gt;
&lt;li&gt;这意味着，如果我们能找到某个位置的前缀和等于 &lt;code&gt;currentSum - k&lt;/code&gt;，那么从 &lt;code&gt;j&lt;/code&gt; 到 &lt;code&gt;i&lt;/code&gt; 的子数组的和就是 &lt;code&gt;k&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;哈希表的作用&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;哈希表 &lt;code&gt;sumCount&lt;/code&gt; 记录了每个前缀和出现的次数。&lt;/li&gt;
&lt;li&gt;当我们检查 &lt;code&gt;currentSum - k&lt;/code&gt; 是否存在于哈希表中时，如果存在，说明从某个之前的位置到当前的位置形成的子数组的和正好是 &lt;code&gt;k&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;val&lt;/code&gt; 是 &lt;code&gt;sumCount[currentSum-k]&lt;/code&gt; 的值，表示前缀和为 &lt;code&gt;currentSum - k&lt;/code&gt; 的次数，即表示有多少个以该前缀和为起点的子数组的和为 &lt;code&gt;k&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;计数更新&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果找到了 &lt;code&gt;val&lt;/code&gt;，就说明当前前缀和之前有 &lt;code&gt;val&lt;/code&gt; 个起点可以形成和为 &lt;code&gt;k&lt;/code&gt; 的子数组，因此我们把 &lt;code&gt;count&lt;/code&gt; 增加 &lt;code&gt;val&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;总之，这段代码的核心思想是利用前缀和的特性，通过检查哈希表来高效地找到和为 &lt;code&gt;k&lt;/code&gt; 的子数组。如果有任何具体的疑问，欢迎继续提问！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;关键点是这里：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果当前前缀和是 &lt;code&gt;currentSum&lt;/code&gt;，我们希望找到一个子数组，使得这个子数组的和为 &lt;code&gt;k&lt;/code&gt;。&lt;br /&gt;
设这个子数组的起始位置为 &lt;code&gt;j&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;遍历到&lt;code&gt;i&lt;/code&gt;时，求以&lt;code&gt;i&lt;/code&gt;结尾的子数组的和有哪些是&lt;code&gt;k&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个解释相当清晰，写代码也就几分钟就写完了&lt;/p&gt;
&lt;p&gt;前缀和如何求可以看： &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/leetcode-303.%20%E5%8C%BA%E5%9F%9F%E5%92%8C%E6%A3%80%E7%B4%A2%20-%20%E6%95%B0%E7%BB%84%E4%B8%8D%E5%8F%AF%E5%8F%98/&quot;&gt;leetcode-303. 区域和检索 - 数组不可变&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/560. 和为 K 的子数组/" />
        </entry>
        <entry>
            <title>
                56. 合并区间
                
            </title>
            <updated>2024-10-24T16:00:24.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/56. 合并区间/</id>
            <content type="html">
                &lt;h1 id=&quot;56&quot; tabindex=&quot;-1&quot;&gt;56. 合并区间&lt;/h1&gt;
&lt;h2 id=&quot;第一版&quot; tabindex=&quot;-1&quot;&gt;第一版&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;import (
	&amp;quot;slices&amp;quot;
)

func merge(intervals [][]int) [][]int {
    // 根据数组的第一个元素进行排序
    slices.SortFunc(intervals, func(a, b []int) int {
        if a[0] &amp;lt; b[0] {
            return -1
        } else if a[0] == b[0] {
            return 0
        } else {
            return 1
        }
    })


    // 依次合并每一个元素
    ret := [][]int{}

    item := intervals[0]
    for i:=1;i&amp;lt;len(intervals);i++ {
        if item[1] &amp;lt; intervals[i][0] {
            ret = append(ret, item)
            item = intervals[i]
        } else {
            item[1] = max(intervals[i][1], item[1])
        }
    }

    ret = append(ret, item)
    return ret
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;优化的点&quot; tabindex=&quot;-1&quot;&gt;优化的点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;sortFunc 那里太啰嗦了&lt;/li&gt;
&lt;li&gt;没必要加一个item，直接用intervals的尾部进行比较即可&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;import (
	&amp;quot;slices&amp;quot;
)
func merge(intervals [][]int) [][]int {
    // 根据数组的第一个元素进行排序
    slices.SortFunc(intervals, func(a, b []int) int {
        return a[0]-b[0]
    })


    // 递归合并每一个元素
    ret := [][]int{intervals[0]}
    for i:=1;i&amp;lt;len(intervals);i++ {
        if ret[len(ret)-1][1] &amp;lt; intervals[i][0] {
            // 无法合并
            ret = append(ret, intervals[i])
        } else {
            // 可以合并
            ret[len(ret)-1][1] = max(intervals[i][1], ret[len(ret)-1][1])
        }
    }

    return ret
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020241024235857.png&quot; alt=&quot;Pasted image 20241024235857.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;经过优化之后，虽然代码执行用时没有太大的变化，但是更简洁更精炼了，而且减少了一个临时变量的使用&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/56. 合并区间/" />
        </entry>
        <entry>
            <title>
                55. 跳跃游戏
                
            </title>
            <updated>2024-11-16T14:38:10.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/55. 跳跃游戏/</id>
            <content type="html">
                &lt;h1 id=&quot;55&quot; tabindex=&quot;-1&quot;&gt;55. 跳跃游戏&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/jump-game/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;55. 跳跃游戏 - 力扣（LeetCode）&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;代码一&quot; tabindex=&quot;-1&quot;&gt;代码一&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func canJump(nums []int) bool {

	jumpMap := make(map[int]struct{}, 0)

    jumpMap[0] = struct{}{}

	for i := 0; i &amp;lt; len(nums); i++ {
        if _, ok := jumpMap[i]; !ok {
            continue
        }

		if nums[i]+i+1 &amp;gt;= len(nums) {
			return true
		}

		for j := 1; j &amp;lt;= nums[i]; j++ {
			jumpMap[i+j] = struct{}{}
		}
	}

    return false
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br /&gt;
执行用时分布&lt;/p&gt;
&lt;p&gt;1145ms&lt;/p&gt;
&lt;p&gt;击败5.13%&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;执行时间很长，但是能通过&lt;/p&gt;
&lt;h2 id=&quot;代码二 - 贪心&quot; tabindex=&quot;-1&quot;&gt;代码二 - 贪心&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func canJump(nums []int) bool {
    maxReachNum := 0

    for i := range nums {
	    // 如果最大值已经超过了最大索引，那么直接返回
        if maxReachNum &amp;gt;= len(nums)-1 {
            return true
        }
        if i &amp;gt; maxReachNum {
            return false
        }

        maxReachNum = max(maxReachNum, i+nums[i])
    }

    return true
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;维护一个最大可以到达的最大值，如果 i 比这个值大，那么就代表，无法继续往后走了&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/55. 跳跃游戏/" />
        </entry>
        <entry>
            <title>
                54. 螺旋矩阵
                
            </title>
            <updated>2024-10-28T12:54:51.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/54. 螺旋矩阵/</id>
            <content type="html">
                &lt;h1 id=&quot;54&quot; tabindex=&quot;-1&quot;&gt;54. 螺旋矩阵&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/spiral-matrix/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;54. 螺旋矩阵&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func spiralOrder(matrix [][]int) []int {
    ret := []int{}
    if len(matrix) == 0 {
        return ret
    }

    left:=0
    right:=len(matrix[0])-1
    top:=0
    bottom:=len(matrix)-1

    for {
 

        for j:=left;j&amp;lt;=right;j++ {
            ret = append(ret, matrix[top][j])
        }
        top++
        if top &amp;gt; bottom {
            break
        }

        for i:=top; i &amp;lt;= bottom;i++ {
            ret = append(ret, matrix[i][right])
        }
        right--
        if right &amp;lt; left {
            break
        }

        for j:=right;j &amp;gt;= left;j-- {
            ret = append(ret, matrix[bottom][j])
        }
        bottom--
        if bottom &amp;lt; top {
            break
        }

        for i := bottom;i &amp;gt;= top;i-- {
            ret = append(ret, matrix[i][left])
        }
        left++
        if left &amp;gt; right {
            break
        }
    }

    return ret
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看了题解，基本就是两种做法，一种是限制左右上下四个边界的数值，达到在各个方向移动时不超过限制&lt;/p&gt;
&lt;p&gt;另外一种是dfs，设置四个遍历方向，循环往复，直到所有的块被遍历完全&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/54. 螺旋矩阵/" />
        </entry>
        <entry>
            <title>
                5. 最长回文子串
                
            </title>
            <updated>2024-09-12T02:27:44.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/5. 最长回文子串/</id>
            <content type="html">
                &lt;h1 id=&quot;5&quot; tabindex=&quot;-1&quot;&gt;5. 最长回文子串&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E5%BE%88%E5%A4%9A%E6%97%B6%E5%80%99%E5%B0%B1%E6%98%AF%E5%9C%A8%E5%A1%AB%E8%A1%A8/&quot;&gt;动态规划很多时候就是在填表&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;暴力解法&lt;/li&gt;
&lt;li&gt;动态规划&lt;/li&gt;
&lt;li&gt;马拉车算法，没仔细看&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;动态规划算法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;func longestPalindrome(s string) string {
    return dynamic(s)    
}

func dynamic(s string) string {

    dp := make([][]bool, len(s))

    for i := range dp {
        dp[i] = make([]bool, len(s))
        dp[i][i] = true
    }

    ret := s[0:1]
    mxLen := 1
    for j := 1; j &amp;lt; len(s); j++ {
        for i := 0; i&amp;lt;j; i++ {
            if s[i] == s[j] {
                if j-i &amp;lt; 3 {
                    dp[i][j] = true
                } else {
                    dp[i][j] = dp[i+1][j-1]
                }
                if dp[i][j] &amp;amp;&amp;amp; j-i+1 &amp;gt; mxLen {
                    mxLen = j-i+1
                    ret = s[i:j+1]
                }
            } else {
                dp[i][j] = false
            }
        }
    }

    return ret
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;初始化：&lt;/p&gt;
&lt;p&gt;填表格，对角线，也就是 i=j 时，单个字符，都是回文串，设置为 true &lt;code&gt;dp[i][i] = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;遍历顺序：&lt;/p&gt;
&lt;p&gt;因为初始化的是对角线，也就是如图所示：&lt;br /&gt;
图中对角线坐标写错了，应该是 &lt;code&gt;[0,0] [1,1] [2,2] [3,3]&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/%E6%88%AA%E5%B1%8F%202024-09-11%2023.48.54.png&quot; alt=&quot;截屏 2024-09-11 23.48.54.png&quot; /&gt;&lt;br /&gt;
如果按照平常的顺序，这么写代码遍历&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;for i := 0; i &amp;lt; len(s); i++ {
	for j := i+1; j&amp;lt;len(s); j++ {
		...
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么会有如图所示的问题，&lt;code&gt;[0,3]&lt;/code&gt; 会因为需要 &lt;code&gt;[1,2]&lt;/code&gt; 的结果从而导致无法推算出正确的结果&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/%E6%88%AA%E5%B1%8F%202024-09-11%2023.52.06.png&quot; alt=&quot;截屏 2024-09-11 23.52.06.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所以需要这么遍历，就能够使用到上一列的数据&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/%E6%88%AA%E5%B1%8F%202024-09-11%2023.56.01.png&quot; alt=&quot;截屏 2024-09-11 23.56.01.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/5. 最长回文子串/" />
        </entry>
        <entry>
            <title>
                239. 滑动窗口最大值
                
            </title>
            <updated>2024-11-08T16:09:01.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/239. 滑动窗口最大值/</id>
            <content type="html">
                &lt;h1 id=&quot;239&quot; tabindex=&quot;-1&quot;&gt;239. 滑动窗口最大值&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/sliding-window-maximum/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;239. 滑动窗口最大值 - 力扣（LeetCode）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这是一道困难题，虽然我看了题解，但是我感觉没有这么困难&lt;/p&gt;
&lt;h2 id=&quot;代码&quot; tabindex=&quot;-1&quot;&gt;代码&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;
func maxSlidingWindow(nums []int, k int) []int {
    res := make([]int, 0, len(nums)-k+1)

    deque := make([]int, 0, k)

    for i := 0; i &amp;lt; len(nums); i++ {
        for len(deque) &amp;gt; 0 &amp;amp;&amp;amp; nums[deque[len(deque)-1]] &amp;lt; nums[i] {
            // 将最后一个元素去掉
            deque = deque[:len(deque)-1]
        }

        deque = append(deque, i)

        if i - deque[0] &amp;gt;= k {
            deque = deque[1:]
        }

        // fmt.Println(deque)

        // 获取当前窗口结果
        if i &amp;gt;= k-1 {
            res = append(res, nums[deque[0]])
        }
    }

    return res
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;chatgpt 聊天内容： &lt;a href=&quot;https://chatgpt.com/c/672e2ed7-8a7c-8002-abe2-a8bc52af9e74&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://chatgpt.com/c/672e2ed7-8a7c-8002-abe2-a8bc52af9e74&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deque&lt;/code&gt; 维护了一个单调递减的双端队列，存储的是索引值。&lt;/li&gt;
&lt;li&gt;每次遍历时，先清理不在窗口范围内的元素，然后清除比当前值小的所有元素（保证队列从大到小）。&lt;/li&gt;
&lt;li&gt;每当窗口达到大小 &lt;code&gt;k&lt;/code&gt; 时，将队列的第一个元素（最大值）添加到结果数组中。&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/239. 滑动窗口最大值/" />
        </entry>
        <entry>
            <title>
                200. 岛屿数量
                
            </title>
            <updated>2024-10-21T14:37:10.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/200. 岛屿数量/</id>
            <content type="html">
                &lt;h1 id=&quot;200&quot; tabindex=&quot;-1&quot;&gt;200. 岛屿数量&lt;/h1&gt;
&lt;p&gt;原始写的是这段代码，虽然能执行成功，但是不是很优雅&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;
import &amp;quot;fmt&amp;quot;
var cnt int

func numIslands(grid [][]byte) int {
    cnt=0
    used := map[[2]int]bool{}

    for i := 0; i &amp;lt; len(grid); i++ {
        for j := 0; j &amp;lt; len(grid[i]); j++ {
            dfs(i,j,grid, used, 0)
            // fmt.Println(i,j)
        }
    }

    return cnt
}

func dfs(i int, j int, grid [][]byte, used map[[2]int]bool, depth int) {
    if used[[2]int{i,j}] {
        return
    }

    if grid[i][j] == 48 {
        return
    }
    
    if depth == 0 {
        cnt++
        // fmt.Println(cnt)
    }

    used[[2]int{i,j}] = true

    depth++

    // 上
    if i&amp;gt; 0 {
        dfs(i-1, j, grid, used, depth)
    }

    // 下
    if i &amp;lt; len(grid)-1 {
        dfs(i+1,j,grid,used, depth)
    }

    // 左
    if j&amp;gt;0 {
        dfs(i, j-1, grid, used, depth)
    }

    // 右
    if j &amp;lt; len(grid[i])-1 {
        dfs(i, j+1, grid, used, depth)
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;优化这段代码：&quot; tabindex=&quot;-1&quot;&gt;优化这段代码：&lt;/h2&gt;
&lt;p&gt;这段代码的目的是计算一个二维 &lt;code&gt;grid&lt;/code&gt; 中的岛屿数量（岛屿由值为 &lt;code&gt;1&lt;/code&gt; 的相邻单元格组成）。优化点主要在于减少冗余逻辑和提升代码可读性。我们可以进行以下几个优化：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;移除不必要的 &lt;code&gt;depth&lt;/code&gt; 参数&lt;/strong&gt;：&lt;code&gt;depth&lt;/code&gt; 仅用于判断是否递归的第一层，可以通过直接判断当前格子是否已经访问过和是否为岛屿来增加 &lt;code&gt;cnt&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少重复的 &lt;code&gt;used&lt;/code&gt; 判断&lt;/strong&gt;：在 &lt;code&gt;dfs&lt;/code&gt; 中每次递归之前判断是否已经访问过，可以减少逻辑冗余。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直接在 &lt;code&gt;numIslands&lt;/code&gt; 函数中判断是否需要调用 &lt;code&gt;dfs&lt;/code&gt;&lt;/strong&gt;：如果当前格子已经访问或不是岛屿，则不需要调用 &lt;code&gt;dfs&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下是优化后的代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;import &amp;quot;fmt&amp;quot;

var cnt int

func numIslands(grid [][]byte) int {
    cnt = 0
    used := map[[2]int]bool{}

    for i := 0; i &amp;lt; len(grid); i++ {
        for j := 0; j &amp;lt; len(grid[i]); j++ {
            // 如果当前格子是岛屿并且没有被访问过，才进行 DFS
            if grid[i][j] == &#39;1&#39; &amp;amp;&amp;amp; !used[[2]int{i, j}] {
                cnt++
                dfs(i, j, grid, used)
            }
        }
    }

    return cnt
}

func dfs(i, j int, grid [][]byte, used map[[2]int]bool) {
    if i &amp;lt; 0 || i &amp;gt;= len(grid) || j &amp;lt; 0 || j &amp;gt;= len(grid[i]) || grid[i][j] == &#39;0&#39; || used[[2]int{i, j}] {
        return
    }

    used[[2]int{i, j}] = true

    // 上
    dfs(i-1, j, grid, used)
    // 下
    dfs(i+1, j, grid, used)
    // 左
    dfs(i, j-1, grid, used)
    // 右
    dfs(i, j+1, grid, used)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;优化细节：&quot; tabindex=&quot;-1&quot;&gt;优化细节：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;简化了 &lt;code&gt;dfs&lt;/code&gt; 函数调用的逻辑&lt;/strong&gt;：通过提前判断边界和条件来&lt;em&gt;减少递归深度的传递&lt;/em&gt;，不需要再维护 &lt;code&gt;depth&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少了冗余的判断&lt;/strong&gt;：在 &lt;code&gt;numIslands&lt;/code&gt; 中，只有当当前格子是 &lt;code&gt;1&lt;/code&gt; 并且没有被访问过时，才开始深度优先搜索，避免了不必要的 &lt;code&gt;dfs&lt;/code&gt; 调用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码更简洁可读&lt;/strong&gt;：直接通过坐标来判断上下左右的格子，没有再单独去处理 &lt;code&gt;depth&lt;/code&gt; 相关的逻辑。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样，代码运行效率会更高，并且可读性也更好。&lt;/p&gt;
&lt;h2 id=&quot;进一步优化&quot; tabindex=&quot;-1&quot;&gt;进一步优化&lt;/h2&gt;
&lt;p&gt;在进一步优化这段代码时，可以考虑以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;移除 &lt;code&gt;used&lt;/code&gt; 变量&lt;/strong&gt;：由于我们可以直接修改 &lt;code&gt;grid&lt;/code&gt;，将访问过的岛屿格子改为 &lt;code&gt;&#39;0&#39;&lt;/code&gt;，这样不需要额外维护一个 &lt;code&gt;used&lt;/code&gt; 哈希表来记录访问状态。这样还能减少空间复杂度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;减少递归开销&lt;/strong&gt;：由于递归调用可能在深度较大时导致栈溢出，可以使用非递归的方式实现深度优先搜索 (DFS)。但为了简单起见，保持递归的实现并优化它。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;整合重复代码&lt;/strong&gt;：可以将上、下、左、右的逻辑整合成方向数组，以减少重复的代码行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;优化后的代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;import &amp;quot;fmt&amp;quot;

func numIslands(grid [][]byte) int {
    cnt := 0

    for i := 0; i &amp;lt; len(grid); i++ {
        for j := 0; j &amp;lt; len(grid[i]); j++ {
            if grid[i][j] == &#39;1&#39; {
                cnt++
                dfs(i, j, grid)
            }
        }
    }

    return cnt
}

func dfs(i, j int, grid [][]byte) {
    if i &amp;lt; 0 || i &amp;gt;= len(grid) || j &amp;lt; 0 || j &amp;gt;= len(grid[i]) || grid[i][j] == &#39;0&#39; {
        return
    }

    // 标记已访问
    grid[i][j] = &#39;0&#39;

    // 定义方向数组，上下左右
    directions := [][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

    // 遍历四个方向
    for _, dir := range directions {
        ni, nj := i+dir[0], j+dir[1]
        dfs(ni, nj, grid)
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;进一步优化后的改进点：&quot; tabindex=&quot;-1&quot;&gt;进一步优化后的改进点：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;移除了 &lt;code&gt;used&lt;/code&gt; 变量&lt;/strong&gt;：我们直接修改 &lt;code&gt;grid&lt;/code&gt; 来标记已经访问过的节点，这样节省了空间复杂度，不需要额外维护一个哈希表。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方向数组简化代码&lt;/strong&gt;：用一个方向数组代替上下左右的手动递归调用，代码更加简洁，易于扩展到其他问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;递归更加直观&lt;/strong&gt;：去掉了不必要的条件检查，将条件判断直接放在 &lt;code&gt;dfs&lt;/code&gt; 开头，逻辑更加简洁。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;时间和空间复杂度：&quot; tabindex=&quot;-1&quot;&gt;时间和空间复杂度：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;时间复杂度&lt;/strong&gt;: O(M * N)，其中 M 和 N 分别是 &lt;code&gt;grid&lt;/code&gt; 的行数和列数，每个元素最多访问一次。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;空间复杂度&lt;/strong&gt;: O(M * N)，最坏情况下，递归深度可能达到 M * N。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这段代码的性能已经比较接近理论最优，并且代码结构更加简洁，维护和理解成本更低。&lt;/p&gt;
&lt;h2 id=&quot;总结：&quot; tabindex=&quot;-1&quot;&gt;总结：&lt;/h2&gt;
&lt;p&gt;最大的优化，通过 grid 中的1改成0，直接省略掉used或者叫visited数组。时间直接从超越5%升到80%&lt;/p&gt;
&lt;p&gt;一个小技巧，方向遍历时定义方向数组：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// 定义方向数组，上下左右
directions := [][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
// 遍历四个方向
for _, dir := range directions {
	ni, nj := i+dir[0], j+dir[1]
	dfs(ni, nj, grid)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;感慨一下，现在的chatgpt真的好用，学习东西时非常有用&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/200. 岛屿数量/" />
        </entry>
        <entry>
            <title>
                14. 最长公共前缀
                
            </title>
            <updated>2024-10-25T15:47:26.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/14. 最长公共前缀/</id>
            <content type="html">
                &lt;h1 id=&quot;14&quot; tabindex=&quot;-1&quot;&gt;14. 最长公共前缀&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/longest-common-prefix/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;14. 最长公共前缀 - 力扣（LeetCode）&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;第一版&quot; tabindex=&quot;-1&quot;&gt;第一版&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;
import (
	&amp;quot;math&amp;quot;
)
func longestCommonPrefix(strs []string) string {
    ret := []byte{}

    minLen := math.MaxInt
    for _, s := range strs {
        minLen = min(minLen, len(s))
    }

    for i := 0; i &amp;lt; minLen; i++ {

        for j := range strs {
            if j == 0 {
                continue
            }

            if strs[j][i] != strs[0][i] {
                return string(ret)
            }
        }

        ret = append(ret, strs[0][i])
    }

    return string(ret)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;可以将长度判断放到循环里面去做&lt;/li&gt;
&lt;li&gt;直接遍历第一个元素就行了，如果遇到不相等的，直接返回prefix，遇到相等的就继续，最多也就是第一个元素这么长&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;第二版&quot; tabindex=&quot;-1&quot;&gt;第二版&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;
func longestCommonPrefix(strs []string) string {
    for j, b := range []byte(strs[0]) {
        for _, s := range strs {
            if j == len(s) || s[j] != b {
                return strs[0][:j]
            }
        }
    }

    return strs[0]
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参考了一下灵神的答案，优雅&lt;/p&gt;
&lt;p&gt;贴个灵神答案的链接： &lt;a href=&quot;https://leetcode.cn/problems/longest-common-prefix/solutions/2801713/jian-dan-ti-jian-dan-zuo-pythonjavaccgoj-478q&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;简单题，简单做（Python/Java/C++/C/Go/JS/Rust）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;希望我以后做题也是这么举重若轻&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/14. 最长公共前缀/" />
        </entry>
        <entry>
            <title>
                128. 最长连续序列
                
            </title>
            <updated>2024-10-26T10:01:11.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/128. 最长连续序列/</id>
            <content type="html">
                &lt;h1 id=&quot;128&quot; tabindex=&quot;-1&quot;&gt;128. 最长连续序列&lt;/h1&gt;
&lt;p&gt;看了题解：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func longestConsecutive(nums []int) int {
    nMap := map[int]bool{}

    for _, n := range nums {
        nMap[n]=true
    }

    longest := 0
    for n := range nMap {
        if nMap[n-1] {
            continue
        }

        cur := 0
        for nMap[n] {
            n++
            cur++
        }

        longest = max(longest, cur)
    }

    return longest
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/longest-consecutive-sequence/solutions/276931/zui-chang-lian-xu-xu-lie-by-leetcode-solution&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://leetcode.cn/problems/longest-consecutive-sequence/solutions/276931/zui-chang-lian-xu-xu-lie-by-leetcode-solution&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个大哥的评论比较好理解： &lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020241026175401.png&quot; alt=&quot;Pasted image 20241026175401.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/128. 最长连续序列/" />
        </entry>
        <entry>
            <title>
                1143. 最长公共子序列
                
            </title>
            <updated>2024-11-10T11:42:56.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode题目/1143. 最长公共子序列/</id>
            <content type="html">
                &lt;h1 id=&quot;1143&quot; tabindex=&quot;-1&quot;&gt;1143. 最长公共子序列&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/longest-common-subsequence/description/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;1143. 最长公共子序列 - 力扣（LeetCode）&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;代码&quot; tabindex=&quot;-1&quot;&gt;代码&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func longestCommonSubsequence(text1 string, text2 string) int {
	len1 := len(text1)
	len2 := len(text2)
	if len1 == 0 || len2 == 0 {
		return 0
	}

	dp := make([][]int, len1+1)

	for i := range dp {
		dp[i] = make([]int, len2+1)
	}

	for i := 1; i &amp;lt;= len1; i++ {
		for j := 1; j &amp;lt;= len2; j++ {
			if text1[i-1] == text2[j-1] {
				dp[i][j] = dp[i-1][j-1] + 1
			} else {
				dp[i][j] = max(dp[i-1][j], dp[i][j-1])
			}
		}
	}

	return dp[len1][len2]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一题的核心思想是，选或者不选&lt;/p&gt;
&lt;p&gt;如果遍历时，&lt;br /&gt;
&lt;strong&gt;当前的两个字符相等，那么必须选&lt;/strong&gt;，那么就是：&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; display=&quot;true&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;27.794ex&quot; height=&quot;2.262ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -750 12284.9 1000&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(520,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1023,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1301,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1646,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1924,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2202,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2614,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3169.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4225.6,0)&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4745.6,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5248.6,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(5526.6,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6093.8,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(7094,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7594,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7872,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(8150,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8784.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(9784.4,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10284.4,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10784.7,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(11784.9,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;p&gt;这里加的1就代表选中了当前的值，&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; style=&quot;direction: ltr; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;14.337ex&quot; height=&quot;2.262ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -750 6336.9 1000&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(520,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1023,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1301,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1868.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(2868.4,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3368.4,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3646.4,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(3924.4,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4558.7,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(5558.9,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6058.9,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;inline&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt; 代表不选i，不选j的最大值&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果两个字符不相等&lt;/strong&gt;，那就是有三种情况，那就是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不选i，选j&lt;/li&gt;
&lt;li&gt;选i，不选j&lt;/li&gt;
&lt;li&gt;不选i，不选j&lt;/li&gt;
&lt;/ol&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; display=&quot;true&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;53.026ex&quot; height=&quot;2.262ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -750 23437.7 1000&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(520,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1023,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1301,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1646,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1924,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2202,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2614,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3169.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4225.6,0)&quot;&gt;&lt;path data-c=&quot;1D45A&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(5103.6,0)&quot;&gt;&lt;path data-c=&quot;1D44E&quot; d=&quot;M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(5632.6,0)&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6204.6,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(6593.6,0)&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(7113.6,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7616.6,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(7894.6,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8461.8,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(9462,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9962,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10240,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(10518,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10930,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(11208,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(11652.7,0)&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(12172.7,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12675.7,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(12953.7,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13298.7,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(13576.7,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(13854.7,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(14488.9,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(15489.1,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(15989.1,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(16267.1,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(16711.8,0)&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(17231.8,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(17734.8,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(18012.8,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(18580,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(19580.2,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(20080.2,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(20358.2,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(20636.2,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(21270.4,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(22270.7,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(22770.7,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(23048.7,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;p&gt;因为【不选i，不选j】这种情况被前两种包含进去了，所以代码中可以省略&lt;/p&gt;
&lt;p&gt;最终的转移方程：&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; display=&quot;true&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -2.148ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;61.504ex&quot; height=&quot;5.428ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -1449.5 27184.7 2399&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(520,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1023,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1301,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1646,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1924,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2202,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2614,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3169.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mrow&quot; transform=&quot;translate(4225.6,0)&quot;&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(0 -0.5)&quot;&gt;&lt;path data-c=&quot;7B&quot; d=&quot;M618 -943L612 -949H582L568 -943Q472 -903 411 -841T332 -703Q327 -682 327 -653T325 -350Q324 -28 323 -18Q317 24 301 61T264 124T221 171T179 205T147 225T132 234Q130 238 130 250Q130 255 130 258T131 264T132 267T134 269T139 272T144 275Q207 308 256 367Q310 436 323 519Q324 529 325 851Q326 1124 326 1154T332 1205Q369 1358 566 1443L582 1450H612L618 1444V1429Q618 1413 616 1411L608 1406Q599 1402 585 1393T552 1372T515 1343T479 1305T449 1257T429 1200Q425 1180 425 1152T423 851Q422 579 422 549T416 498Q407 459 388 424T346 364T297 318T250 284T214 264T197 254L188 251L205 242Q290 200 345 138T416 3Q421 -18 421 -48T423 -349Q423 -397 423 -472Q424 -677 428 -694Q429 -697 429 -699Q434 -722 443 -743T465 -782T491 -816T519 -845T548 -868T574 -886T595 -899T610 -908L616 -910Q618 -912 618 -928V-943Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtable&quot; transform=&quot;translate(750,0)&quot;&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,600)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(520,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1023,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1301,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1868.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(2868.4,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3368.4,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3646.4,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(3924.4,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4558.7,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(5558.9,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6058.9,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6559.1,0)&quot;&gt;&lt;path data-c=&quot;2B&quot; d=&quot;M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(7559.3,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8059.3,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(13708.6,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D461&quot; d=&quot;M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(361,0)&quot;&gt;&lt;path data-c=&quot;1D452&quot; d=&quot;M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(827,0)&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1399,0)&quot;&gt;&lt;path data-c=&quot;1D461&quot; d=&quot;M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1760,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2260,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2538,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2883,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3438.8,0)&quot;&gt;&lt;g data-mml-node=&quot;text&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;text&quot; transform=&quot;translate(778,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(5272.6,0)&quot;&gt;&lt;path data-c=&quot;1D461&quot; d=&quot;M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(5633.6,0)&quot;&gt;&lt;path data-c=&quot;1D452&quot; d=&quot;M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(6099.6,0)&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(6671.6,0)&quot;&gt;&lt;path data-c=&quot;1D461&quot; d=&quot;M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(7032.6,0)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7532.6,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(7810.6,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8222.6,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtr&quot; transform=&quot;translate(0,-600)&quot;&gt;&lt;g data-mml-node=&quot;mtd&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D45A&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(878,0)&quot;&gt;&lt;path data-c=&quot;1D44E&quot; d=&quot;M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1407,0)&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(1979,0)&quot;&gt;&lt;path data-c=&quot;28&quot; d=&quot;M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2368,0)&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2888,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3391,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(3669,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(4236.2,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(5236.4,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5736.4,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6014.4,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(6292.4,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6704.4,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(6982.4,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(7427.1,0)&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(7947.1,0)&quot;&gt;&lt;path data-c=&quot;1D45D&quot; d=&quot;M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(8450.1,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(8728.1,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9073.1,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9351.1,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(9629.1,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(10263.3,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(11263.6,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(11763.6,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12041.6,0)&quot;&gt;&lt;path data-c=&quot;29&quot; d=&quot;M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(12430.6,0)&quot;&gt;&lt;path data-c=&quot;2C&quot; d=&quot;M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtd&quot; transform=&quot;translate(13708.6,0)&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D461&quot; d=&quot;M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(361,0)&quot;&gt;&lt;path data-c=&quot;1D452&quot; d=&quot;M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(827,0)&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1399,0)&quot;&gt;&lt;path data-c=&quot;1D461&quot; d=&quot;M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(1760,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2260,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2538,0)&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2883,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3161,0)&quot;&gt;&lt;path data-c=&quot;21&quot; d=&quot;M78 661Q78 682 96 699T138 716T180 700T199 661Q199 654 179 432T158 206Q156 198 139 198Q121 198 119 206Q118 209 98 431T78 661ZM79 61Q79 89 97 105T141 121Q164 119 181 104T198 61Q198 31 181 16T139 1Q114 1 97 16T79 61Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(3716.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4772.6,0)&quot;&gt;&lt;path data-c=&quot;1D461&quot; d=&quot;M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(5133.6,0)&quot;&gt;&lt;path data-c=&quot;1D452&quot; d=&quot;M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(5599.6,0)&quot;&gt;&lt;path data-c=&quot;1D465&quot; d=&quot;M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(6171.6,0)&quot;&gt;&lt;path data-c=&quot;1D461&quot; d=&quot;M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(6532.6,0)&quot;&gt;&lt;path data-c=&quot;32&quot; d=&quot;M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7032.6,0)&quot;&gt;&lt;path data-c=&quot;5B&quot; d=&quot;M118 -250V750H255V710H158V-210H255V-250H118Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(7310.6,0)&quot;&gt;&lt;path data-c=&quot;1D457&quot; d=&quot;M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7722.6,0)&quot;&gt;&lt;path data-c=&quot;5D&quot; d=&quot;M22 710V750H159V-250H22V-210H119V710H22Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(22959.1,0) translate(0 250)&quot;&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow data-mjx-texclass=&quot;INNER&quot;&gt;&lt;mo data-mjx-texclass=&quot;OPEN&quot;&gt;{&lt;/mo&gt;&lt;mtable columnalign=&quot;left left&quot; columnspacing=&quot;1em&quot; rowspacing=&quot;.2em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;==&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;!&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo data-mjx-texclass=&quot;CLOSE&quot; fence=&quot;true&quot; stretchy=&quot;true&quot; symmetric=&quot;true&quot;&gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;
            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode题目/1143. 最长公共子序列/" />
        </entry>
        <entry>
            <title>
                leetcode 编码技巧
                
            </title>
            <updated>2024-10-21T13:51:27.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/leetcode 编码技巧/</id>
            <content type="html">
                &lt;h1 id=&quot;leetcode&quot; tabindex=&quot;-1&quot;&gt;leetcode 编码技巧&lt;/h1&gt;
&lt;p&gt;编码技巧&lt;/p&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 数字&lt;/h2&gt;
&lt;h3 id=&quot;1-1&quot; tabindex=&quot;-1&quot;&gt;1.1 快速上取整&lt;/h3&gt;
&lt;p&gt;正整数的情况下， &lt;code&gt;a/b&lt;/code&gt;  上取整可以使用 :&lt;br /&gt;
&lt;code&gt;(a+b-1)/b&lt;/code&gt;  快速计算，适用于强类型语言&lt;/p&gt;
&lt;h3 id=&quot;1-2&quot; tabindex=&quot;-1&quot;&gt;1.2 取中间数&lt;/h3&gt;
&lt;p&gt;强类型语言：&lt;code&gt;(left+right)/2&lt;/code&gt; 。此方式在 &lt;code&gt;left+right&lt;/code&gt; 时有可能会出现溢出，可以使用 &lt;code&gt;left-(left-right)/2&lt;/code&gt; 计算&lt;/p&gt;
&lt;h3 id=&quot;1-3&quot; tabindex=&quot;-1&quot;&gt;1.3 整除&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;123 &amp;gt;&amp;gt; 1 // 右移一位即可完成整除
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 二进制&lt;/h2&gt;
&lt;h3 id=&quot;2-1-1-0&quot; tabindex=&quot;-1&quot;&gt;2.1 最低位1变0&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;num1 &amp;amp;= num1 - 1  // 最低的 1 变成 0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-2-0-1&quot; tabindex=&quot;-1&quot;&gt;2.2 最低位0变1&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;num1 |= num1 + 1 // 最低的 0 变成 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-3-2&quot; tabindex=&quot;-1&quot;&gt;2.3 判断是否是2的整数次&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;if (num &amp;amp; (num - 1)) == 0 {
	return true
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-4-0-1&quot; tabindex=&quot;-1&quot;&gt;2.4 0和1取反&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;x ^= 1
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func flip(a int) int {
	if a == 0 {
		return 1
	}

	return 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;x = 1 - x
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 数组&lt;/h2&gt;
&lt;h3 id=&quot;3-1&quot; tabindex=&quot;-1&quot;&gt;3.1 双指针&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://leetcode.cn/problems/two-sum/?envType=featured-list&amp;amp;envId=2cktkvj?envType=featured-list&amp;amp;envId=2cktkvj&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;1. 两数之和 - 力扣（LeetCode）&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;leetcode-42. 接雨水&lt;/a&gt;&lt;br /&gt;
对向双指针 &lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;leetcode-11. 盛最多水的容器&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-2&quot; tabindex=&quot;-1&quot;&gt;3.2 前缀和&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;pre := []int{}

for i := range nums {
	if i == 0 {
		pre[i] = 0
		continue
	}

	pre[i] = pre[i-1] + nums[i-1]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;3-2-1&quot; tabindex=&quot;-1&quot;&gt;3.2.1 从前缀和中获取后缀和&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// 小技巧，前缀和也能得出后缀和
if i == 0 {
    postfixSum = prefixSum[len(prefixSum)-1]
} else {
    postfixSum = prefixSum[len(prefixSum)-1] - prefixSum[i-1]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4 深度搜索&lt;/h2&gt;
&lt;h3 id=&quot;4-1&quot; tabindex=&quot;-1&quot;&gt;4.1 方向&lt;/h3&gt;
&lt;p&gt;在做深度搜索题时，经常用到方向，可以用下面的代码判断方向&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;var (
    dx = []int{1, 0, 0, -1}
    dy = []int{0, 1, -1, 0}
)

// 四个方向
for j := 0; j &amp;lt; 4; j++ {
    mx, my := cell[0] + dx[j], cell[1] + dy[j]
    // 查看每个方向有没有超出边界，如果没有超出边界则进行处理
    if mx &amp;gt;= 0 &amp;amp;&amp;amp; mx &amp;lt; n &amp;amp;&amp;amp; my &amp;gt;= 0 &amp;amp;&amp;amp; my &amp;lt; m &amp;amp;&amp;amp; image[mx][my] == currColor {
        queue = append(queue, []int{mx, my})
        image[mx][my] = color
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;5&quot; tabindex=&quot;-1&quot;&gt;5 字符串&lt;/h2&gt;
&lt;h3 id=&quot;5-1&quot; tabindex=&quot;-1&quot;&gt;5.1 字符在数组中的偏移位置&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;widths[c-&#39;a&#39;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;6&quot; tabindex=&quot;-1&quot;&gt;6 矩阵&lt;/h2&gt;
&lt;p&gt;&lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;判断点在对角线上&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;7-reference&quot; tabindex=&quot;-1&quot;&gt;7 Reference&lt;/h2&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/leetcode 编码技巧/" />
        </entry>
        <entry>
            <title>
                202404091044 leetcode-会员购买优惠-宫水三叶
                
            </title>
            <updated>2024-10-21T13:53:50.000Z</updated>
            <id>https://grove-trees.netlify.app/card/算法/202404091044 leetcode-会员购买优惠-宫水三叶/</id>
            <content type="html">
                &lt;h1 id=&quot;202404091044-leetcode&quot; tabindex=&quot;-1&quot;&gt;202404091044 leetcode-会员购买优惠-宫水三叶&lt;/h1&gt;
&lt;p&gt;宫水三叶的优惠链接，多 60 天： &lt;a href=&quot;https://leetcode.cn/premium/?promoChannel=acoier&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://leetcode.cn/premium/?promoChannel=acoier&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;年度会员 : 加赠 425−365=60 天&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;季度会员 : 加赠 104−90=14 天&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同时，同时，同时！！！你还将获取如下福利：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;返佣红包：年度会员获得定额红包 ¥66.66（折算后 ¥1.02/天），季度会员获得定额红包 ¥22.22（折算后 ¥1.70/天）&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;巨划算的 LeetCode 会员专属福利 ~&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/算法/202404091044 leetcode-会员购买优惠-宫水三叶/" />
        </entry>
        <entry>
            <title>
                20240417125706 部落冲突
                
            </title>
            <updated>2024-04-30T13:19:25.000Z</updated>
            <id>https://grove-trees.netlify.app/card/游戏/20240417125706 部落冲突/</id>
            <content type="html">
                &lt;h1 id=&quot;20240417125706&quot; tabindex=&quot;-1&quot;&gt;20240417125706 部落冲突&lt;/h1&gt;
&lt;p&gt;部落冲突玩到13本了，原来部落联盟的人都没了，然后也没有什么动力能继续玩下去，就这样偶尔上线一次了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/IMG_2971.png&quot; alt=&quot;IMG_2971.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/游戏/20240417125706 部落冲突/" />
        </entry>
        <entry>
            <title>
                20240415142052 原神挺好玩
                
            </title>
            <updated>2024-10-12T14:42:54.000Z</updated>
            <id>https://grove-trees.netlify.app/card/游戏/20240415142052 原神挺好玩/</id>
            <content type="html">
                &lt;h1 id=&quot;20240415142052&quot; tabindex=&quot;-1&quot;&gt;20240415142052 原神挺好玩&lt;/h1&gt;
&lt;p&gt;最近游戏一直在玩原神，一个开放的大世界。主线剧情刚刚做完，确实是我想象中的角色扮演（RPG）游戏。&lt;/p&gt;
&lt;p&gt;记得高中在塞班手机上玩的一款RPG游戏，一个周末都在刷怪。后来重新练了个号，结果跟大师傅打架的时候，他的70级宠物不知道为什么变成我的了。我就带着一个70级将近满级的宠物一路过关斩将玩通关了。&lt;/p&gt;
&lt;p&gt;原神里面我自己感觉可玩的点有几个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;角色都很二次元，都是按照动漫里面的角色画出来的，二次元的估计会很喜欢。&lt;/li&gt;
&lt;li&gt;剧情比较代入，某些剧情需要努力打怪，不过主线剧情并不是很难。&lt;/li&gt;
&lt;li&gt;大世界地图非常大，如果不是有传送节点估计跑图都得跑断腿。&lt;/li&gt;
&lt;li&gt;大世界里面有很多宝箱，有些宝箱需要解密之后才能获得，不过这些宝箱都是一次性的，我在蒙德、璃月、稻妻的探索度最高才到 50% ，所以也可见大世界有多大东西有多丰富。&lt;/li&gt;
&lt;li&gt;支线剧情也很丰富多彩，比如我就特别喜欢璃月里面的一个支线剧情《神女劈观》，并且剧情最后有一首歌，大家可以先听一下。不过没有了解剧情之前听这首歌触动应该不是很大，还是具体体验一下剧情再说。点击可播放： &lt;iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=&quot;330&quot; height=&quot;86&quot; src=&quot;https://music.163.com/outchain/player?type=3&amp;id=2496574602&amp;auto=0&amp;height=66&quot;&gt;&lt;/iframe&gt;&lt;/li&gt;
&lt;li&gt;最后一点，原神不花钱氪金也可以玩的很舒服，每天做做每日任务，开开宝箱，欣赏欣赏美景，然后读一读角色的背景故事。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对了，游戏社区里的前辈忠告，当深渊不存在，能打到哪里就打到哪里。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-01-31_36.png&quot; alt=&quot;clop_2024-01-31_36.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/游戏/20240415142052 原神挺好玩/" />
        </entry>
        <entry>
            <title>
                树莓派无法上网排查
                
            </title>
            <updated>2024-10-23T14:09:35.000Z</updated>
            <id>https://grove-trees.netlify.app/card/树莓派/树莓派无法上网排查/</id>
            <content type="html">
                &lt;h1 id=&quot;树莓派无法上网排查&quot; tabindex=&quot;-1&quot;&gt;树莓派无法上网排查&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;wget -v &lt;a href=&quot;http://baidu.com/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;baidu.com&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;会有输出：&lt;/li&gt;
&lt;li&gt;如何处理呢&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;--2021-07-15 10:52:24--  http://baidu.com/
Resolving baidu.com (baidu.com)... 39.156.69.79, 220.181.38.148
Connecting to baidu.com (baidu.com)|39.156.69.79|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 81 [text/html]
Saving to: ‘index.html’
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上次我就卡在了 解析 &lt;a href=&quot;http://baidu.com/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;baidu.com&lt;/a&gt; 域名这个地方&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通过 &lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;linux-nslookup&lt;/a&gt; 命令查看路由解析&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;发现解析不通&lt;/li&gt;
&lt;li&gt;查看 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; 将 &lt;code&gt;nameserver&lt;/code&gt; 改成： &lt;code&gt;114.114.114.114&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;再次查看路由解析，发现已经 OK 了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何修改 &lt;code&gt;/etc/resolv.conf&lt;/code&gt; ，重启机器之后会发现文件又被改回去了，导致无法联网，正确的做法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo vi /etc/systemd/resolved.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重启网络服务 &lt;code&gt;sudo service networking restart&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/qq_42820594/article/details/107325437&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;树莓派4B】三、笔记本给树莓派Ubuntu 18.04提供网络|为什么Ubuntu18.04更改/etc/resolv.conf修改nameserver重启网络被重置&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/树莓派/树莓派无法上网排查/" />
        </entry>
        <entry>
            <title>
                ubuntu 树莓派启动时配置网络
                
            </title>
            <updated>2024-09-24T10:53:22.000Z</updated>
            <id>https://grove-trees.netlify.app/card/树莓派/ubuntu 树莓派启动时配置网络/</id>
            <content type="html">
                &lt;h1 id=&quot;ubuntu&quot; tabindex=&quot;-1&quot;&gt;ubuntu 树莓派启动时配置网络&lt;/h1&gt;
&lt;p&gt;树莓派现在可以安装很多操作系统，其中 &lt;code&gt;ubuntu&lt;/code&gt; 也提供了树莓派版本，因为对 &lt;code&gt;ubuntu&lt;/code&gt; 更加熟悉，所以就往 &lt;code&gt;SD&lt;/code&gt; 卡中烧录了 &lt;code&gt;ubuntu&lt;/code&gt; 的 &lt;code&gt;20.04 lts 64位&lt;/code&gt; 版本。&lt;a href=&quot;https://www.raspberrypi.org/software/operating-systems/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;这里有可供选择的操作系统。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;简单提一嘴烧录操作系统到 &lt;code&gt;SD&lt;/code&gt; 卡上面的方法，树莓派提供了一个&lt;a href=&quot;https://www.raspberrypi.org/software/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;傻瓜式的软件&lt;/a&gt;给大家使用，直接打开之后选择系统，就可以烧录了，烧录过程大概会有几分钟。&lt;/p&gt;
&lt;p&gt;烧录完成之后，如果你按照树莓派官网的教程进行操作，肯定都行不通，因为树莓派的官方操作系统 &lt;code&gt;Raspberry Pi OS&lt;/code&gt; 和 &lt;code&gt;Ubuntu For Raspberry&lt;/code&gt; 上面的网络配置方式完全不一样。&lt;/p&gt;
&lt;h2 id=&quot;1-ubuntu&quot; tabindex=&quot;-1&quot;&gt;1 安装了 ubuntu 的树莓派怎么配置网络？&lt;/h2&gt;
&lt;p&gt;打开你烧录好的 &lt;code&gt;SD&lt;/code&gt; 卡&lt;/p&gt;
&lt;p&gt;找到 &lt;code&gt;network-config&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;写入如下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;wifis:
  wlan0:
  dhcp4: true
  optional: true
  access-points:
    &amp;lt;wifi network name&amp;gt;:
      password: &amp;quot;&amp;lt;wifi password&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是企业网络：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;wifis:
  wlan0:
  dhcp4: true
  optional: true
  access-points:
        &amp;lt;wifi network name&amp;gt;:
          auth:
            key-management: eap
            method: peap
            identity: &amp;quot;wudanyang&amp;quot;
            password: &amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://netplan.io/examples/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;配置文件的格式&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;修改完之后，把 &lt;code&gt;SD&lt;/code&gt; 卡从电脑上弹出，然后插到树莓派里。&lt;/p&gt;
&lt;p&gt;不过，&lt;strong&gt;重启之后，你可能还是无法连接到网络&lt;/strong&gt;。可以看下&lt;a href=&quot;https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#3-wifi-or-ethernet&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: During the first boot, your Raspberry Pi will try to connect to this network. It will fail the first time around. Simply reboot &lt;code&gt;sudo reboot&lt;/code&gt; and it will work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用&lt;code&gt;ubuntu&lt;/code&gt;官网的一段话，第一次会失败，直接重启，&lt;strong&gt;第二次就能连上了&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 开启网络之后，如何登录树莓派？&lt;/h2&gt;
&lt;p&gt;安装好之后默认用户名和密码都是 &lt;code&gt;ubuntu&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ssh ubuntu@&amp;lt;raspberry ip&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;ip 地址的获取这里列举几种方法，不详细介绍：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;自己的路由器&lt;/strong&gt;：登录后台查看分配的 ip&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;局域网扫描&lt;/strong&gt;（局域网机器不多的情况下）：
&lt;ol&gt;
&lt;li&gt;下载个局域网扫描工具，如果局域网机器不多，会看到一个制造商为树莓派的 ip&lt;/li&gt;
&lt;li&gt;使用命令行 &lt;code&gt;arp -a &lt;/code&gt; 挨个试一下&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ubuntu&lt;/code&gt; 启动之后会使用 &lt;code&gt;avahi&lt;/code&gt; 服务通过 &lt;a href=&quot;https://baike.baidu.com/item/mdns&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;mdns&lt;/a&gt; 协议在局域网注册一个域名 &lt;code&gt;ubuntu.local&lt;/code&gt;，所以你可以这样登录 &lt;code&gt;ssh ubuntu@ubuntu.local&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.raspberrypi.org/software/operating-systems/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;树莓派支持的操作系统&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.raspberrypi.org/software/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;树莓派操作系统烧录软件&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://shumeipai.nxez.com/2017/09/13/raspberry-pi-network-configuration-before-boot.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;无屏幕和键盘配置树莓派WiFi和SSH&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://baike.baidu.com/item/mdns&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;百度百科-mdns&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/lonerpaul/p/11054419.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Mac通过网线直连控制树莓派 - lonerpaul - 博客园&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/树莓派/ubuntu 树莓派启动时配置网络/" />
        </entry>
        <entry>
            <title>
                202103251635 - 获取树莓派温度
                
            </title>
            <updated>2024-10-21T08:54:22.000Z</updated>
            <id>https://grove-trees.netlify.app/card/树莓派/202103251635 - 获取树莓派温度/</id>
            <content type="html">
                &lt;h1 id=&quot;202103251635&quot; tabindex=&quot;-1&quot;&gt;202103251635 - 获取树莓派温度&lt;/h1&gt;
&lt;p&gt;cat /sys/class/thermal/thermal_zone0/temp&lt;/p&gt;
&lt;p&gt;取出值后除以 &lt;code&gt;1000&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020210325163653.png&quot; alt=&quot;Pasted image 20210325163653.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;写个脚本获取&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#!/usr/bin/env python
# -*- coding: utf-8 -*-
import commands
​
def main():
# 查看GPU温度
    gpu = commands.getoutput( &#39;/opt/vc/bin/vcgencmd measure_temp&#39; ).replace( &#39;temp=&#39;, &#39;&#39; ).replace( &#39;&#92;&#39;C&#39;, &#39;&#39; )
    gpu = float(gpu)
    print(&#39;gpu Temp: %.2f &#39; % gpu)
	
# 查看CPU温度
    file = open(&amp;quot;/sys/class/thermal/thermal_zone0/temp&amp;quot;)
    cpu = float(file.read()) / 1000
    file.close()
    print(&#39;cpu Temp: %2.2f&#39; % cpu)
​
if __name__ == &#39;__main__&#39;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://my.oschina.net/zhenggao/blog/4336898&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://my.oschina.net/zhenggao/blog/4336898&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/树莓派/202103251635 - 获取树莓派温度/" />
        </entry>
        <entry>
            <title>
                202404191548 GTD的主要思想
                
            </title>
            <updated>2024-04-20T16:16:11.000Z</updated>
            <id>https://grove-trees.netlify.app/card/时间管理/202404191548 GTD的主要思想/</id>
            <content type="html">
                &lt;h1 id=&quot;202404191548-gtd&quot; tabindex=&quot;-1&quot;&gt;202404191548 GTD的主要思想&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;把事情做好&lt;/li&gt;
&lt;li&gt;执行时是拿结果engage（而不是仅仅去 exec）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;主要思想：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;捕获&lt;/li&gt;
&lt;li&gt;处理，明确下一步行动是什么&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020220509232211.png&quot; alt=&quot;Pasted image 20220509232211.png&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1wE411176Q?p=6&amp;amp;spm_id_from=333.880.my_history.page.click&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;bilibili教程&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;transclusion internal-embed is-loaded&quot;&gt;&lt;div class=&quot;markdown-embed&quot;&gt;
&lt;h1 id=&quot;gtd&quot; tabindex=&quot;-1&quot;&gt;重新认识GTD&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#Omnivore&quot;&gt;#Omnivore&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://omnivore.app/me/topbook-18ef555cd3f&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Read on Omnivore&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://topbook.cc/course/detail/153&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Read Original&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;Notes&lt;/h2&gt;
&lt;/div&gt;&lt;/div&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/时间管理/202404191548 GTD的主要思想/" />
        </entry>
        <entry>
            <title>
                操作系统-内核态与用户态
                
            </title>
            <updated>2024-10-21T08:56:43.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/操作系统-内核态与用户态/</id>
            <content type="html">
                &lt;h1 id=&quot;操作系统-内核态与用户态&quot; tabindex=&quot;-1&quot;&gt;操作系统-内核态与用户态&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;System&lt;/strong&gt;: You are a helpful AI assistant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: 请说明linux操作系统的系统调用过程的全过程，并配上必要的mermaid图解&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assistant&lt;/strong&gt;: 在Linux操作系统中，系统调用是用户空间进程与内核空间通交流的主要方式。以下是系统调用过程的全过程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;用户空间进程通过库函数发起系统调用。这些库函数通常是glibc库中的封装函数，如&lt;code&gt;open()&lt;/code&gt;, &lt;code&gt;read()&lt;/code&gt;, &lt;code&gt;write()&lt;/code&gt;等。这些函数内部实际上是通过使用特定的系统调用号和参数来发起系统调用的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;库函数将系统调用号和参数放入适当的寄存器，然后执行一个特殊的陷阱指令（如&lt;code&gt;int 0x80&lt;/code&gt;或&lt;code&gt;syscall&lt;/code&gt;）。这个指令将CPU从用户模式切换到内核模式，并跳转到内核中预定义的固定地址开始执行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内核检查系统调用号和参数的有效性，然后找到对应的内核函数并执行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内核函数执行完毕后，将返回结果放入一个寄存器，然后执行一个特殊的指令（如&lt;code&gt;iret&lt;/code&gt;）来将CPU从内核模式切换回用户模式，并跳回到库函数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;库函数从寄存器取出返回结果，然后返回给用户空间进程。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下是对应的mermaid图解：&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;sequenceDiagram
    participant P as 用户空间进程
    participant L as 库函数
    participant K as 内核
    P-&gt;&gt;L: 发起系统调用
    L-&gt;&gt;K: 执行陷阱指令
    K-&gt;&gt;K: 检查系统调用号和参数
    K-&gt;&gt;K: 执行内核函数
    K-&gt;&gt;L: 返回结果
    L-&gt;&gt;P: 返回结果&lt;/pre&gt;&lt;p&gt;这个图解描述了用户空间进程、库函数和内核之间在系统调用过程中的交互。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: 从进程或者线程的角度看系统调用是怎样的&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assistant&lt;/strong&gt;: 从进程或线程的角度来看，系统调用可以被视为一个函数调用。进程或线程通过调用特定的库函数（如&lt;code&gt;open()&lt;/code&gt;, &lt;code&gt;read()&lt;/code&gt;, &lt;code&gt;write()&lt;/code&gt;等）来发起系统调用。然而，与普通的函数调用不同，系统调用涉及到用户空间和内核空间之间的切换。&lt;/p&gt;
&lt;p&gt;当进程或线程发起系统调用时，它将被挂起，直到系统调用完成。此时，CPU从用户模式切换到内核模式，开始执行内核中的代码。这种模式切换是必要的，因为内核空间可以访问硬件和所有系统资源，而用户空间的访问权限则被严格限制。&lt;/p&gt;
&lt;p&gt;系统调用完成后，结果会被返回到用户空间，CPU模式切换回用户模式，进程或线程继续执行。&lt;/p&gt;
&lt;p&gt;因此，即使系统调用看起来像一个简单的函数调用，但它实际上涉及到了许多复杂的步骤，包括模式切换、权限检查、参数验证等。&lt;/p&gt;
&lt;p&gt;以下是对应的mermaid图解：&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;sequenceDiagram
    participant T as 线程/进程
    participant L as 库函数
    participant K as 内核
    T-&gt;&gt;L: 调用库函数（如open(), read()等）
    L-&gt;&gt;K: 执行陷阱指令，将CPU从用户模式切换到内核模式
    K-&gt;&gt;K: 检查参数，执行对应的内核函数
    K-&gt;&gt;L: 执行完毕，将结果返回到用户空间，CPU切换回用户模式
    L-&gt;&gt;T: 返回结果&lt;/pre&gt;&lt;p&gt;这个图解描述了线程/进程、库函数和内核之间在系统调用过程中的交互。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: 进程做完系统调用操作之后，处理系统调用的进程还是原来的进程吗？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assistant&lt;/strong&gt;: 是的，处理系统调用的仍然是原来的进程。当一个进程发起系统调用时，它并没有改变，也没有被替换或转换。相反，它只是暂时地切换到了内核模式，以便内核可以代表它执行特定的操作，如读取文件、打开网络连接等。&lt;/p&gt;
&lt;p&gt;在系统调用完成后，控制权将返回到原来的进程，进程将继续从系统调用返回点开始执行。因此，尽管系统调用涉及到用户空间和内核空间之间的上下文切换，但发起系统调用的进程始终保持不变。&lt;/p&gt;
&lt;p&gt;这也是为什么系统调用常常被描述为&amp;quot;昂贵&amp;quot;或&amp;quot;耗时&amp;quot;的操作，因为涉及到上下文切换和模式切换，这些都是需要消耗处理器时间的操作。但是，这是必要的，因为它使得用户空间的进程能够安全地访问硬件和系统资源，而不需要关心底层的细节。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: 为什么有的地方说是先通过软中断陷入系统内核，然后由内核线程执行系统调用，然后再返回给用户线程？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assistant&lt;/strong&gt;: 首先，我们需要理解这里的&amp;quot;软中断&amp;quot;和&amp;quot;内核线程&amp;quot;。&lt;/p&gt;
&lt;p&gt;软中断（也被称为软件中断或陷阱）是一种 CPU 指令，它会引发 CPU 切换到内核模式并开始执行内核代码。这就是进程如何发起系统调用的：它通过执行一个软中断指令（如 int 0x80 或 syscall），将 CPU 从用户模式切换到内核模式，并跳转到内核中的预定义地址开始执行。&lt;/p&gt;
&lt;p&gt;内核线程是内核的一部分，它在内核空间中运行，并且可以访问所有的系统资源和硬件。当进程发起系统调用时，实际上是由内核线程来完成这个调用的。内核线程会检查系统调用的参数、执行相应的内核函数，然后将结果返回给用户空间。&lt;/p&gt;
&lt;p&gt;所以，当我们说&amp;quot;通过软中断陷入系统内核，然后由内核线程执行系统调用，然后再返回给用户线程&amp;quot;，其实是这样的过程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;用户线程（或进程）通过执行一个软中断指令，发起一个系统调用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CPU 切换到内核模式，开始执行内核代码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内核线程接管，检查系统调用的参数、执行相应的内核函数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;内核线程执行完毕，将结果返回给用户空间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CPU 切换回用户模式，用户线程（或进程）继续执行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这就是为什么有的地方会说是通过软中断陷入系统内核，然后由内核线程执行系统调用，然后再返回给用户线程。这个表述可能会让人误解为系统调用是由另一个线程来完成的，但实际上是由同一个进程（只不过是在内核模式下）来完成的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: 但是你上文所说的：【当一个进程发起系统调用时，它并没有改变，也没有被替换或转换。相反，它只是暂时地切换到了内核模式，以便内核可以代表它执行特定的操作，如读取文件、打开网络连接等。】  和现在说的需要一个内核线程执行，不是自相矛盾的吗？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assistant&lt;/strong&gt;: 对不起，让我们来澄清一下。当我们说“内核线程执行系统调用”时，实际上是指在内核模式下的原始进程（或线程）。&lt;/p&gt;
&lt;p&gt;在大多数情况下，当一个用户进程发起一个系统调用时，该进程会切换到内核模式并继续执行。在这种情况下，我们可以将其视为“内核线程”，因为它现在正在执行内核代码，尽管它实际上仍然是原始的用户进程。&lt;/p&gt;
&lt;p&gt;所以，当我们说“内核线程执行系统调用”时，我们实际上是指原始的用户进程，但现在它正在内核模式下执行。&lt;/p&gt;
&lt;p&gt;这是一个复杂的概念，因为它涉及到操作系统的用户模式和内核模式之间的切换，以及用户进程和内核线程之间的区别。我希望这个解释能够帮助你理解。再次对之前可能造成的混淆表示歉意。&lt;/p&gt;
&lt;p&gt;总结：&lt;br /&gt;
当然，让我们总结一下关于Linux系统调用和进程在用户空间和内核空间之间交互的讨论：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;系统调用概念&lt;/strong&gt;：系统调用是用户空间进程请求操作系统内核提供服务的机制。这些服务包括文件操作、进程控制、网络通信等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发起系统调用&lt;/strong&gt;：用户进程通过库函数（如C标准库中的封装函数）发起系统调用。这些库函数将系统调用号和参数放入适当的寄存器，并执行一个特殊的软中断指令（如&lt;code&gt;int 0x80&lt;/code&gt;或&lt;code&gt;syscall&lt;/code&gt;）来触发系统调用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户模式和内核模式&lt;/strong&gt;：当软中断指令执行时，CPU从用户模式（低权限模式）切换到内核模式（高权限模式），这样进程就可以安全地执行需要更高权限的操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内核处理&lt;/strong&gt;：在内核模式下，操作系统内核接管，验证系统调用参数，执行相应的内核服务，并将结果准备好返回。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;返回用户空间&lt;/strong&gt;：一旦内核完成了系统调用请求的处理，它将结果放入寄存器，并将控制权返回给用户空间进程，同时将CPU模式切换回用户模式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进程和内核线程&lt;/strong&gt;：执行系统调用的实际上还是原始的用户进程，只是它现在以内核模式运行。它在执行系统调用期间，可以认为是一个“内核线程”，但这并不意味着它是一个完全独立的线程实体。一旦系统调用完成，原始的用户进程将继续在用户空间执行。这里的“内核线程”描述并不意味着有一个新的、独立的线程被创建来处理系统调用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概念澄清&lt;/strong&gt;：在前面的对话中，使用“内核线程执行系统调用”这样的表述可能会导致理解上的混淆。为了澄清，执行系统调用的是在内核模式下运行的用户进程本身，而不是一个单独的内核线程实体。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;希望这次的总结能够更加清晰地阐述了Linux系统调用的全过程，以及进程在用户模式和内核模式之间切换的概念。&lt;/p&gt;
&lt;h1 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/57124847/does-each-system-call-create-a-process&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Does each system call create a process?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No, they don&#39;t. The operating system uses software interrupt to execute the system call operation within the same process. You can imagine them as a function call but they are executed with kernel privileges.&lt;br /&gt;
不，它们不是。操作系统使用软件中断在同一进程内执行系统调用操作。你可以将它们想象为函数调用，但它们是以内核特权执行的。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ofstack.com/C++/8673/based-on-the-difference-between-select--poll--epoll.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Based on the difference between select poll epoll&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/操作系统-内核态与用户态/" />
        </entry>
        <entry>
            <title>
                内存问题分析
                
            </title>
            <updated>2024-10-22T03:31:51.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/内存问题分析/</id>
            <content type="html">
                &lt;h1 id=&quot;内存问题分析&quot; tabindex=&quot;-1&quot;&gt;内存问题分析&lt;/h1&gt;
&lt;p&gt;找到内存问题的来源后，下一步就是相应的优化工作了。在我看来，内存调优最重要的就是，保证应用程序的热点数据放到内存中，并尽量减少换页和交换。&lt;/p&gt;
&lt;p&gt;常见的优化思路有这么几种。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最好禁止 Swap&lt;/strong&gt;。 如果必须开启 Swap，降低 swappiness 的值，减少内存回收时 Swap 的使用倾向。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少内存的动态分配&lt;/strong&gt;。比如，可以使用内存池、大页（HugePage）等。尽量使用缓存和缓冲区来访问数据。比如，可以使用堆栈明确声明内存空间，来存储需要缓存的数据；或者用 Redis 这类的外部缓存组件，优化数据的访问。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用 cgroups 等方式限制进程的内存使用情况&lt;/strong&gt;。这样，可以确保系统内存不会被异常进程耗尽。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通过 /proc/pid/oom_adj ，调整核心应用的 oom_score&lt;/strong&gt;。这样，可以保证即使内存紧张，核心应用也不会被 OOM 杀死。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;参考资料&quot; tabindex=&quot;-1&quot;&gt;参考资料&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://time.geekbang.org/column/article/76460&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;21 | 套路篇：如何“快准狠”找到系统内存的问题？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://ku.baidu-int.com/knowledge/HFVrC7hq1Q/pKzJfZczuc/Gs4uNFcjEC/gzGld6QZrpsx1t&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;短视频BS上线大批实例出现OOM现象问题&lt;/a&gt;](&lt;a href=&quot;ticktick://ttMarkdownLink&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://ku.baidu-int.com/knowledge/HFVrC7hq1Q/pKzJfZczuc/Gs4uNFcjEC/gzGld6QZrpsx1t&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://www.cnblogs.com/zh94/p/11922714.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Linux查看哪些进程占用的系统 buffer/cache 较高 (hcache，lsof）命令 - 陈咬金 - 博客园&lt;/a&gt;](&lt;a href=&quot;ticktick://ttMarkdownLink&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.cnblogs.com/zh94/p/11922714.html&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://linux.cn/article-5627-1.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;技术|在 Linux 上如何清除内存的 Cache、Buffer 和交换空间&lt;/a&gt;](&lt;a href=&quot;ticktick://ttMarkdownLink&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://linux.cn/article-5627-1.html&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;https://github.com/tobert/pcstat&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;tobert/pcstat: Page Cache stat: get page cache stats for files on Linux&lt;/a&gt;](&lt;a href=&quot;ticktick://ttMarkdownLink&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/tobert/pcstat&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;在 pcstat 基础上做的工具： [&lt;a href=&quot;https://github.com/silenceshell/hcache&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;silenceshell/hcache: showing top X biggest cache files global&lt;/a&gt;](&lt;a href=&quot;ticktick://ttMarkdownLink&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/silenceshell/hcache&lt;/a&gt;)&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/内存问题分析/" />
        </entry>
        <entry>
            <title>
                进程上下文切换详情
                
            </title>
            <updated>2024-09-20T13:17:13.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/进程上下文切换详情/</id>
            <content type="html">
                &lt;h1 id=&quot;进程上下文切换详情&quot; tabindex=&quot;-1&quot;&gt;进程上下文切换详情&lt;/h1&gt;
&lt;p&gt;当操作系统进行&lt;strong&gt;进程上下文切换&lt;/strong&gt;时，CPU 会保存当前进程的状态并加载下一个要运行的进程的状态。具体来说，以下信息需要在进程上下文切换时保存和恢复：&lt;/p&gt;
&lt;h2 id=&quot;1-strong-cpu-strong&quot; tabindex=&quot;-1&quot;&gt;1 &lt;strong&gt;CPU 寄存器状态&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;这是上下文切换中最关键的部分，因为寄存器中保存了当前进程的执行状态。具体包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;程序计数器（Program Counter，PC）&lt;/strong&gt;：保存当前进程正在执行的指令地址，以便在恢复时从该地址继续执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;栈指针（Stack Pointer，SP）&lt;/strong&gt;：指向当前进程的栈顶，保存当前进程的调用栈状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通用寄存器&lt;/strong&gt;：如 &lt;code&gt;eax&lt;/code&gt;, &lt;code&gt;ebx&lt;/code&gt;, &lt;code&gt;ecx&lt;/code&gt;, &lt;code&gt;edx&lt;/code&gt; 等 CPU 寄存器，存储进程的临时数据、函数参数和返回值等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态寄存器（Flags）&lt;/strong&gt;：保存当前 CPU 的状态标志位，如是否有进位、溢出或中断等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些寄存器状态会保存在进程的**进程控制块（Process Control Block，PCB）**中。&lt;/p&gt;
&lt;h2 id=&quot;2-strong-strong&quot; tabindex=&quot;-1&quot;&gt;2 &lt;strong&gt;内存管理信息&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;每个进程都有独立的虚拟内存空间，系统需要切换进程的内存映射，确保每个进程只能访问自己的内存。具体包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;页表（Page Table）&lt;/strong&gt;：虚拟内存到物理内存的映射表，操作系统在上下文切换时需要更新页表，指向新进程的地址空间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;段寄存器（Segment Registers）&lt;/strong&gt;：如果使用段式内存管理，也需要切换段寄存器，指向新进程的代码段、数据段和栈段。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-strong-process-status-word-psw-strong&quot; tabindex=&quot;-1&quot;&gt;3 &lt;strong&gt;程序状态字（Process Status Word，PSW）&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;程序状态字记录了当前进程的运行模式（如用户态或内核态）、中断使能状态、优先级等。在上下文切换时，系统会保存当前进程的状态字，并恢复下一个进程的状态字。&lt;/p&gt;
&lt;h2 id=&quot;4-strong-strong&quot; tabindex=&quot;-1&quot;&gt;4 &lt;strong&gt;内核栈&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;每个进程在内核态运行时都会有一个专属的&lt;strong&gt;内核栈&lt;/strong&gt;，用来存储系统调用或中断处理过程中的数据。上下文切换时，操作系统会切换到下一个进程的内核栈。&lt;/p&gt;
&lt;h2 id=&quot;5-strong-strong&quot; tabindex=&quot;-1&quot;&gt;5 &lt;strong&gt;硬件上下文&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;除了 CPU 寄存器，某些硬件设备（如浮点运算单元、SIMD 寄存器等）也可能需要保存状态。对于使用了这些硬件的进程，操作系统在切换时也需要保存这些硬件的状态，以便后续恢复。&lt;/p&gt;
&lt;h2 id=&quot;6-strong-strong&quot; tabindex=&quot;-1&quot;&gt;6 &lt;strong&gt;进程优先级和调度信息&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;在上下文切换过程中，调度器会根据进程的优先级、剩余时间片等调度策略选择下一个要运行的进程。调度信息存储在 PCB 中。&lt;/p&gt;
&lt;h2 id=&quot;7-strong-strong&quot; tabindex=&quot;-1&quot;&gt;7 &lt;strong&gt;文件描述符表、信号处理状态等（较少切换）&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;虽然这些信息在一般的上下文切换中不会频繁变动，但操作系统仍然为每个进程维护了与之相关的资源信息，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文件描述符表&lt;/strong&gt;：记录进程打开的文件及其位置等信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信号处理状态&lt;/strong&gt;：记录进程当前的信号处理函数和挂起信号。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;8&quot; tabindex=&quot;-1&quot;&gt;8 进程上下文切换的总结步骤：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;保存当前进程状态&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将当前进程的寄存器状态（程序计数器、栈指针、通用寄存器等）保存到 PCB 中。&lt;/li&gt;
&lt;li&gt;保存当前进程的内存管理信息（页表等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;切换内存空间&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更新 CPU 的页表寄存器，使其指向新进程的地址空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;加载新进程状态&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从新进程的 PCB 中恢复其寄存器状态、程序计数器等。&lt;/li&gt;
&lt;li&gt;切换到新进程的内核栈。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;恢复执行&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将控制权交给新进程，从其上次暂停的位置继续执行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过这些操作，CPU 可以在多个进程之间高效切换，使得操作系统能够实现多任务并发执行。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/进程上下文切换详情/" />
        </entry>
        <entry>
            <title>
                计算机中断
                
            </title>
            <updated>2025-02-12T12:59:21.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/计算机中断/</id>
            <content type="html">
                &lt;h1 id=&quot;计算机中断&quot; tabindex=&quot;-1&quot;&gt;计算机中断&lt;/h1&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 什么是中断&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;中断&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://grove-trees.netlify.app/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;（英语：Interrupt），又称&lt;strong&gt;插断&lt;/strong&gt;，在&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6&quot; title=&quot;计算机科学&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;计算机科学&lt;/a&gt;中是指&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%A4%AE%E8%99%95%E7%90%86%E5%99%A8&quot; title=&quot;中央处理器&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;处理器&lt;/a&gt;接收到来自硬件或软件的信号，提示发生了某个事件，应予以注意，这种情况就称为中断。&lt;/p&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 中断是如何工作的&lt;/h2&gt;
&lt;p&gt;计算机中的中断机制是&lt;strong&gt;CPU和操作系统共同配合&lt;/strong&gt;的结果。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU层面的机制&lt;/strong&gt;：&lt;br /&gt;
中断在硬件层面是由&lt;strong&gt;CPU管理&lt;/strong&gt;的。CPU中内置了处理中断的硬件电路，当接收到中断信号时，它会暂停当前正在执行的指令，将程序计数器（PC）和相关寄存器的内容保存起来，然后跳转到一个预定义的中断处理程序的入口地址。CPU需要具备检测中断信号、保存现场（当前程序的状态）、并执行相应的中断处理程序的能力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;操作系统层面的机制&lt;/strong&gt;：&lt;br /&gt;
中断处理程序（Interrupt Service Routine, ISR）通常是由&lt;strong&gt;操作系统编写和管理&lt;/strong&gt;的。操作系统负责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注册和管理中断处理程序。&lt;/li&gt;
&lt;li&gt;响应不同的中断类型（如硬件中断、软件中断、时钟中断等）。&lt;/li&gt;
&lt;li&gt;保存和恢复进程的上下文，确保中断处理完毕后能够恢复正常程序执行。&lt;/li&gt;
&lt;li&gt;控制任务调度，在多任务环境下，当中断发生时，操作系统会决定是继续运行当前任务，还是切换到其他任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此，中断机制的基础来自于&lt;strong&gt;CPU硬件支持&lt;/strong&gt;，而&lt;strong&gt;操作系统负责管理中断的高层逻辑&lt;/strong&gt;。两者紧密协作，确保中断处理的高效和系统的正常运行。&lt;/p&gt;
&lt;p&gt;一般来说，中断的优先级高于普通进程&lt;/p&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 中断的种类&lt;/h2&gt;
&lt;h3 id=&quot;3-1&quot; tabindex=&quot;-1&quot;&gt;3.1 硬件中断&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;硬件中断&lt;/strong&gt;是由计算机外部硬件设备（如键盘、鼠标、硬盘、网络接口等）或内部硬件组件（如定时器、控制器）生成的信号，用来通知CPU发生了某个事件，要求CPU暂停当前任务并立即进行处理。这是一种异步的通信方式，能够确保外部设备与CPU高效互动。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;键盘中断&lt;/strong&gt;：当你按下一个键时，键盘发送一个中断信号给CPU，CPU暂停当前任务，读取按键数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;鼠标中断&lt;/strong&gt;：移动鼠标时，鼠标发送中断信号给CPU，CPU响应并处理移动事件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定时器中断&lt;/strong&gt;：系统定时器会周期性地向CPU发送中断信号，用于管理任务调度和系统时钟。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-2&quot; tabindex=&quot;-1&quot;&gt;3.2 软件中断&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;软件中断&lt;/strong&gt;是由程序通过特定的指令主动触发的中断，它通常用于实现系统调用或处理特定的程序异常。与硬件中断不同，软件中断是由软件发出的，而不是由外部设备或硬件组件引发的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;系统调用（System Call）&lt;/strong&gt;： 软件中断最常见的用途是实现系统调用。当应用程序需要操作系统提供的服务（如文件读写、内存分配、网络通信等）时，它会触发一个软件中断。操作系统会捕获该中断并执行相应的服务，随后返回给应用程序。这种机制让用户程序能够安全、受控地访问操作系统的资源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常处理（Exception Handling）&lt;/strong&gt;： 当程序运行时发生某些异常（如除零错误、非法内存访问），CPU会自动触发软件中断，进入异常处理程序进行处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调试（Debugging）&lt;/strong&gt;： 软件中断也可以用于调试。例如，调试器通过在代码中插入断点，利用软件中断暂停程序的执行，检查当前状态，从而帮助开发者进行故障排查。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-3-linux&quot; tabindex=&quot;-1&quot;&gt;3.3 Linux 中断处理&lt;/h3&gt;
&lt;p&gt;Linux 将中断处理过程分成了两个阶段，也就是上半部和下半部：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上半部&lt;/strong&gt;用来快速处理中断，它在中断禁止模式下运行，主要处理跟硬件紧密相关的或时间敏感的工作。 &lt;strong&gt;对应硬中断，快速执行&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下半部&lt;/strong&gt;用来延迟处理上半部未完成的工作，通常以内核线程的方式运行。 &lt;strong&gt;对应软中断，延迟执行&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-3-1&quot; tabindex=&quot;-1&quot;&gt;3.3.1 查看中断&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;/proc/softirqs 提供了软中断的运行情况；&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;                    CPU0       CPU1
          HI:         32          4
       TIMER:     217168     160788
      NET_TX:      58113          1
      NET_RX:      73923         35
       BLOCK:      12544         10
    IRQ_POLL:          0          0
     TASKLET:       2802         54
       SCHED:     283839     258237
     HRTIMER:          0          0
         RCU:     116166     128092
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体字段解释如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HI&lt;/strong&gt;：高优先级软中断，用于处理非常紧急的软中断任务，极少使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TIMER&lt;/strong&gt;：定时器软中断，系统定时器触发的中断。用于定期任务（如进程调度、系统计时）的处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NET_TX&lt;/strong&gt;：网络传输（发送）软中断，处理网络数据包的发送。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NET_RX&lt;/strong&gt;：网络接收软中断，处理网络数据包的接收。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BLOCK&lt;/strong&gt;：块设备 I/O 的软中断，处理硬盘等块设备的 I/O 操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BLOCK_IOPOLL&lt;/strong&gt;：块设备 I/O 轮询软中断，处理块设备的 I/O 轮询操作，通常在高性能场景中用到。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TASKLET&lt;/strong&gt;：任务队列（Tasklets），用于延迟执行一些非紧急任务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SCHED&lt;/strong&gt;：调度软中断，触发进程调度相关的任务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HRTIMER&lt;/strong&gt;：高精度定时器软中断，用于高精度计时任务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RCU&lt;/strong&gt;：RCU（Read-Copy Update）软中断，RCU 是 Linux 内核中的一种同步机制，通常用于读写锁的管理和延迟删除任务。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;软中断实际上是以内核线程的方式运行的，每个 CPU 都对应一个软中断内核线程，这个软中断内核线程就叫做  ksoftirqd/CPU 编号。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;wudanyang@dy-turbo-vm:~$ ps aux | grep softirq
root          16  0.0  0.0      0     0 ?        S    02:08   0:00 [ksoftirqd/0]
root          24  0.0  0.0      0     0 ?        S    02:08   0:00 [ksoftirqd/1]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;/proc/interrupts 提供了硬中断的运行情况。 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E7%A1%AC%E4%BB%B6%E4%B8%AD%E6%96%AD%E8%BE%93%E5%87%BA%E7%A4%BA%E4%BE%8B/&quot;&gt;硬件中断输出示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4 参考&lt;/h2&gt;
&lt;hr class=&quot;footnotes-sep&quot; /&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;中断 - 维基百科，自由的百科全书: &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E4%B8%AD%E6%96%B7&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://zh.wikipedia.org/wiki/中斷&lt;/a&gt; &lt;a href=&quot;https://grove-trees.netlify.app/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/计算机中断/" />
        </entry>
        <entry>
            <title>
                线程上下文切换详情
                
            </title>
            <updated>2024-09-20T13:17:21.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/线程上下文切换详情/</id>
            <content type="html">
                &lt;h1 id=&quot;线程上下文切换详情&quot; tabindex=&quot;-1&quot;&gt;线程上下文切换详情&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;线程上下文切换&lt;/strong&gt;与进程上下文切换类似，但由于线程是轻量级的进程，线程上下文切换主要涉及保存和恢复线程的执行状态，而无需切换进程的虚拟内存空间和其他与进程相关的资源。以下是线程上下文切换时需要保存和恢复的主要内容：&lt;/p&gt;
&lt;h2 id=&quot;1-strong-cpu-strong&quot; tabindex=&quot;-1&quot;&gt;1 &lt;strong&gt;CPU 寄存器状态&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;与进程上下文切换一样，线程上下文切换中，最重要的是保存和恢复 CPU 的寄存器状态，具体包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;程序计数器（Program Counter，PC）&lt;/strong&gt;：保存当前线程正在执行的指令地址，以便恢复时从该地址继续执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;栈指针（Stack Pointer，SP）&lt;/strong&gt;：保存当前线程的栈顶指针，指向当前调用栈的位置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通用寄存器&lt;/strong&gt;：保存线程当前的寄存器状态，包括 CPU 寄存器中的数据、临时变量、函数参数等内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态寄存器（Flags）&lt;/strong&gt;：保存 CPU 的状态标志，如是否有中断、溢出或进位等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些寄存器状态会保存在 &lt;strong&gt;线程控制块（Thread Control Block，TCB）&lt;/strong&gt; 中。&lt;/p&gt;
&lt;h2 id=&quot;2-strong-strong&quot; tabindex=&quot;-1&quot;&gt;2 &lt;strong&gt;线程栈&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;每个线程都有独立的栈，用于存储函数调用的局部变量、返回地址等。在上下文切换时，操作系统会切换到新线程的栈指针，指向该线程的栈顶。&lt;/p&gt;
&lt;h2 id=&quot;3-strong-program-status-word-psw-strong&quot; tabindex=&quot;-1&quot;&gt;3 &lt;strong&gt;程序状态字（Program Status Word，PSW）&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;和进程一样，线程上下文切换时也需要保存程序状态字，记录线程的运行状态（如用户态或内核态）、中断状态等信息。&lt;/p&gt;
&lt;h2 id=&quot;4-strong-thread-local-storage-tls-strong&quot; tabindex=&quot;-1&quot;&gt;4 &lt;strong&gt;线程本地存储（Thread-Local Storage，TLS）&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;线程可能会使用线程本地存储来保存&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/线程上下文切换详情/" />
        </entry>
        <entry>
            <title>
                系统调用时上下文调度
                
            </title>
            <updated>2024-09-20T13:17:37.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/系统调用时上下文调度/</id>
            <content type="html">
                &lt;h1 id=&quot;系统调用时上下文调度&quot; tabindex=&quot;-1&quot;&gt;系统调用时上下文调度&lt;/h1&gt;
&lt;h2 id=&quot;cpu-br-linux-code-ring-0-code-code-ring3-code&quot; tabindex=&quot;-1&quot;&gt;CPU 的特权等级：&lt;br /&gt;
linux 中只使用了 &lt;code&gt;Ring 0&lt;/code&gt; 和 &lt;code&gt;Ring3&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240919001040.png&quot; alt=&quot;Pasted image 20240919001040.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在系统调用时可能会发生&lt;strong&gt;上下文切换&lt;/strong&gt;，但这取决于具体情况。系统调用涉及从用户态（User Mode）切换到内核态（Kernel Mode），这是一个&lt;strong&gt;模式切换&lt;/strong&gt;，不一定总是伴随完整的进程上下文切换。让我们更详细地看一下：&lt;/p&gt;
&lt;h2 id=&quot;1-strong-strong&quot; tabindex=&quot;-1&quot;&gt;1) &lt;strong&gt;用户态和内核态切换&lt;/strong&gt;（模式切换）&lt;/h2&gt;
&lt;p&gt;当一个进程执行系统调用时，CPU 会从用户态切换到内核态，以便操作系统内核执行需要访问硬件资源或特权操作的指令（如文件读写、内存管理等）。这叫做&lt;strong&gt;模式切换&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模式切换 ≠ 上下文切换&lt;/strong&gt;：&lt;br /&gt;
模式切换是 CPU 从执行用户代码切换到执行内核代码，并不涉及进程的完整上下文（如寄存器、页表、内存等）切换，因此它比完整的上下文切换开销要小。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-strong-strong&quot; tabindex=&quot;-1&quot;&gt;2) &lt;strong&gt;系统调用时的上下文切换&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;在以下几种情况下，系统调用会导致真正的进程上下文切换：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;进程阻塞&lt;/strong&gt;：&lt;br /&gt;
如果系统调用需要等待某些事件（如 I/O 操作、网络请求、锁等），当前进程会被挂起，进入&lt;strong&gt;等待状态&lt;/strong&gt;。此时，操作系统会进行&lt;strong&gt;进程上下文切换&lt;/strong&gt;，将 CPU 资源分配给其他进程执行，直到当前进程的请求完成，再切换回该进程继续执行。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调用 &lt;code&gt;read()&lt;/code&gt; 时，如果数据还没有准备好，进程会进入阻塞状态，等待 I/O 完成，导致上下文切换。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;时间片用完&lt;/strong&gt;：&lt;br /&gt;
如果系统调用时间过长，进程在内核态执行时，可能会因为时间片耗尽被操作系统调度器切换出去，调度其他进程。这样会产生上下文切换。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;高优先级进程的出现&lt;/strong&gt;：&lt;br /&gt;
当进程在系统调用中运行时，如果有更高优先级的进程进入可运行队列，操作系统可能强制进行上下文切换，将 CPU 资源让给更高优先级的进程。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;3-strong-strong&quot; tabindex=&quot;-1&quot;&gt;3) &lt;strong&gt;不会导致上下文切换的系统调用&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;某些系统调用不会导致上下文切换，比如短时间内能立即完成的调用。典型的例子包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;getpid()&lt;/code&gt;&lt;/strong&gt;：返回进程的 PID，几乎是瞬时操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;gettimeofday()&lt;/code&gt;&lt;/strong&gt;：获取当前时间，操作非常快。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些系统调用通常只涉及模式切换（从用户态切换到内核态再返回），不会导致进程切换。&lt;/p&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4) 总结&lt;/h2&gt;
&lt;p&gt;系统调用时&lt;strong&gt;不一定&lt;/strong&gt;会发生上下文切换：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果系统调用涉及 I/O 操作或进程需要等待某些资源时，系统会发生&lt;strong&gt;进程上下文切换&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;仅涉及用户态和内核态的&lt;strong&gt;模式切换&lt;/strong&gt;时，不涉及完整的上下文切换，开销较小。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5&quot; tabindex=&quot;-1&quot;&gt;5) 参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;操作系统之哲学原理第2版 - 3.3 内核态和用户态 - 邹恒明 - 微信读书: &lt;a href=&quot;https://weread.qq.com/web/reader/9eb326d05933d79ebf22eb3k6ea321b021d6ea9ab1ba605&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://weread.qq.com/web/reader/9eb326d05933d79ebf22eb3k6ea321b021d6ea9ab1ba605&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;现代操作系统（原书第4版） (豆瓣): &lt;a href=&quot;https://book.douban.com/subject/27096665/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://book.douban.com/subject/27096665/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/系统调用时上下文调度/" />
        </entry>
        <entry>
            <title>
                硬件中断输出示例
                
            </title>
            <updated>2024-09-20T13:17:58.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/硬件中断输出示例/</id>
            <content type="html">
                &lt;h1 id=&quot;硬件中断输出示例&quot; tabindex=&quot;-1&quot;&gt;硬件中断输出示例&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;cat /proc/interrupts
           CPU0       CPU1
 10:     690796     792946     GICv3  27 Level     arch_timer
 12:          0          0       MSI 344064 Edge      PCIe PME, pciehp
 13:          0          0       MSI 346112 Edge      PCIe PME, pciehp
 14:          0          0       MSI 348160 Edge      PCIe PME, pciehp
 15:          0          0       MSI 350208 Edge      PCIe PME, pciehp
 16:          0          0       MSI 352256 Edge      PCIe PME, pciehp
 17:          0          0       MSI 354304 Edge      PCIe PME, pciehp
 18:          0          0       MSI 356352 Edge      PCIe PME, pciehp
 19:          0          0       MSI 358400 Edge      PCIe PME, pciehp
 20:          0          0       MSI 360448 Edge      PCIe PME, pciehp
 21:          0          0       MSI 362496 Edge      PCIe PME, pciehp
 22:          0          0       MSI 364544 Edge      PCIe PME, pciehp
 23:          0          0       MSI 366592 Edge      PCIe PME, pciehp
 24:          0          0       MSI 368640 Edge      PCIe PME, pciehp
 25:          0          0       MSI 370688 Edge      PCIe PME, pciehp
 26:          0          0       MSI 372736 Edge      PCIe PME, pciehp
 27:          0          0       MSI 374784 Edge      PCIe PME, pciehp
 28:          0          0       MSI 376832 Edge      PCIe PME, pciehp
 29:          0          0       MSI 378880 Edge      PCIe PME, pciehp
 30:          0          0       MSI 380928 Edge      PCIe PME, pciehp
 31:          0          0       MSI 382976 Edge      PCIe PME, pciehp
 32:          0          0       MSI 385024 Edge      PCIe PME, pciehp
 33:          0          0       MSI 387072 Edge      PCIe PME, pciehp
 34:          0          0       MSI 389120 Edge      PCIe PME, pciehp
 35:          0          0       MSI 391168 Edge      PCIe PME, pciehp
 36:          0          0       MSI 393216 Edge      PCIe PME, pciehp
 37:          0          0       MSI 395264 Edge      PCIe PME, pciehp
 38:          0          0       MSI 397312 Edge      PCIe PME, pciehp
 39:          0          0       MSI 399360 Edge      PCIe PME, pciehp
 40:          0          0       MSI 401408 Edge      PCIe PME, pciehp
 41:          0          0       MSI 403456 Edge      PCIe PME, pciehp
 42:          0          0       MSI 405504 Edge      PCIe PME, pciehp
 43:          0          0       MSI 407552 Edge      PCIe PME, pciehp
 44:          0          0     GICv3  32 Level     ehci_hcd:usb1
 46:          0          0     GICv3  23 Level     arm-pmu
 48:      81341          0       MSI 1048576 Edge      ens160-rx-0
 49:      61793          0       MSI 1048577 Edge      ens160-tx-0
 50:          7          0       MSI 1048578 Edge      ens160
 51:      13113          0       MSI 573440 Edge      ahci[0000:01:03.0]
 52:        116          0       MSI 9437184 Edge      nvme0q0
 53:      14025          0       MSI 9437185 Edge      nvme0q1
 54:          0      15724       MSI 9437186 Edge      nvme0q2
 56:        232          0       MSI 5242880 Edge      xhci_hcd
 59:       3364          0       MSI 14336 Edge      vmw_vmci
 60:          0          0       MSI 14337 Edge      vmw_vmci
 61:       6732          0       MSI 14338 Edge      vmw_vmci
 62:          0          0       MSI 245760 Edge      vmwgfx
 63:          0          0       MSI 245761 Edge      vmwgfx
 64:          0          0       MSI 245762 Edge      vmwgfx
 65:          0          0       MSI 245763 Edge      vmwgfx
 66:          0          0       MSI 245764 Edge      vmwgfx
 67:          0          0       MSI 245765 Edge      vmwgfx
 68:        315          0       MSI 540672 Edge      snd_hda_intel:card0
IPI0:      9633      18455       Rescheduling interrupts
IPI1:    133913     157019       Function call interrupts
IPI2:         0          0       CPU stop interrupts
IPI3:         0          0       CPU stop (for crash dump) interrupts
IPI4:         0          0       Timer broadcast interrupts
IPI5:       198       2356       IRQ work interrupts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/proc/interrupts&lt;/code&gt; 文件记录了系统中各个中断源的触发情况。根据你提供的内容，以下是该文件中各个字段的解释：&lt;/p&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1) 字段解析&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中断号（IRQ Number）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一列表示每个中断的唯一标识符。中断号以数字表示，例如 &lt;code&gt;10&lt;/code&gt;, &lt;code&gt;12&lt;/code&gt;, &lt;code&gt;13&lt;/code&gt; 等。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU 列&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接下来的列表示各个 CPU 核心上该中断被触发的次数。在你的输出中，有 &lt;code&gt;CPU0&lt;/code&gt; 和 &lt;code&gt;CPU1&lt;/code&gt;，后面分别是它们上面的中断触发计数。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中断类型&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中断的类型（如 &lt;code&gt;GICv3&lt;/code&gt; 和 &lt;code&gt;MSI&lt;/code&gt;），表示该中断的来源和处理方式。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GICv3&lt;/code&gt;：代表使用通用中断控制器（Generic Interrupt Controller）版本 3。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MSI&lt;/code&gt;（Message Signaled Interrupts）：一种通过消息而不是物理线路发送中断的机制。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中断编号/级别&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某些中断行后面有数字（如 &lt;code&gt;27&lt;/code&gt;, &lt;code&gt;32&lt;/code&gt;），这些数字通常表示该中断的向量号或中断级别。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Level&lt;/code&gt; 表示该中断为电平触发（持续有效）中断。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Edge&lt;/code&gt; 表示为边缘触发中断（只在状态变化时有效）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设备名称&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最后一列通常是中断源设备的描述，表示触发该中断的硬件设备。例如：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arch_timer&lt;/code&gt;：表示体系结构定时器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pciehp&lt;/code&gt;：表示 PCI Express 热插拔控制器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ens160-rx-0&lt;/code&gt; 和 &lt;code&gt;ens160-tx-0&lt;/code&gt;：表示网络接口卡的接收和发送中断。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2) 示例行解释&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;10:     690796     792946     GICv3  27 Level     arch_timer&lt;/code&gt;：
&lt;ul&gt;
&lt;li&gt;中断号为 &lt;code&gt;10&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CPU0&lt;/code&gt; 上该中断触发了 &lt;code&gt;690796&lt;/code&gt; 次，&lt;code&gt;CPU1&lt;/code&gt; 上触发了 &lt;code&gt;792946&lt;/code&gt; 次。&lt;/li&gt;
&lt;li&gt;中断类型为 &lt;code&gt;GICv3&lt;/code&gt;，向量号为 &lt;code&gt;27&lt;/code&gt;，为电平触发。&lt;/li&gt;
&lt;li&gt;设备为 &lt;code&gt;arch_timer&lt;/code&gt;，表示这是体系结构定时器的中断。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-ipi-inter-processor-interrupts&quot; tabindex=&quot;-1&quot;&gt;3) IPI（Inter-Processor Interrupts）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;IPI 代表处理器间中断（Inter-Processor Interrupts），用于在多核处理器系统中进行通信或协调。例子包括：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;IPI0&lt;/code&gt; 表示重新调度中断，触发次数分别为 &lt;code&gt;9633&lt;/code&gt; 和 &lt;code&gt;18455&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/硬件中断输出示例/" />
        </entry>
        <entry>
            <title>
                模拟软中断特别多的情况
                
            </title>
            <updated>2024-09-26T05:20:33.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/模拟软中断特别多的情况/</id>
            <content type="html">
                &lt;h1 id=&quot;模拟软中断特别多的情况&quot; tabindex=&quot;-1&quot;&gt;模拟软中断特别多的情况&lt;/h1&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 客户端请求&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;sudo hping -S -p 8080 -i u100 192.168.135.130

# 如果上面的命令没有显著提高软中断的占用率，可以将 -i 间隔取消，加上 --flood 忽略回复消息
sudo hping -S -p 8080 --flood 192.168.135.130
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 服务端情况&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;watch -d cat /proc/softirqs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;观察服务端软中断情况&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/模拟软中断特别多的情况/" />
        </entry>
        <entry>
            <title>
                模拟突发进程特别多的情况
                
            </title>
            <updated>2024-09-20T13:18:14.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/模拟突发进程特别多的情况/</id>
            <content type="html">
                &lt;h1 id=&quot;模拟突发进程特别多的情况&quot; tabindex=&quot;-1&quot;&gt;模拟突发进程特别多的情况&lt;/h1&gt;
&lt;p&gt;突发进程特别多的情况构建：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;# 如果无写入权限，iowait 都不会升高，否则 wa 使用率值升高
# top 中只能看到 us 使用率值升高非常多
# 无法观测到具体什么进程CPU使用率较高
# 因为全是突发进程
while true;do stress -t 1 -d 1 2&amp;gt;&amp;amp;1 ;done
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/模拟突发进程特别多的情况/" />
        </entry>
        <entry>
            <title>
                快速分析系统CPU瓶颈的命令工具
                
            </title>
            <updated>2025-01-26T13:24:20.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/快速分析系统CPU瓶颈的命令工具/</id>
            <content type="html">
                &lt;h1 id=&quot;cpu&quot; tabindex=&quot;-1&quot;&gt;快速分析系统CPU瓶颈的命令工具&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240920205108.png&quot; alt=&quot;Pasted image 20240920205108.png|600&quot; width=&quot;600px&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;11 | 套路篇：如何迅速分析出系统CPU的瓶颈在哪里？-Linux 性能优化实战-极客时间: &lt;a href=&quot;https://time.geekbang.org/column/article/72685&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://time.geekbang.org/column/article/72685&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/快速分析系统CPU瓶颈的命令工具/" />
        </entry>
        <entry>
            <title>
                中断上下文切换详情
                
            </title>
            <updated>2024-10-12T15:10:44.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/中断上下文切换详情/</id>
            <content type="html">
                &lt;h1 id=&quot;中断上下文切换详情&quot; tabindex=&quot;-1&quot;&gt;中断上下文切换详情&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;中断上下文切换&lt;/strong&gt;是指当硬件或软件中断&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://grove-trees.netlify.app/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;发生时，操作系统需要暂停当前正在执行的任务，去处理中断事件的过程。与进程或线程上下文切换不同，中断上下文切换主要在用户态或内核态中断当前执行的任务，将 CPU 切换到中断处理程序执行。它是一种临时的、优先级很高的切换，不涉及切换到其他进程或线程的执行。&lt;/p&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 中断上下文切换的过程&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;保存当前 CPU 寄存器状态&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当中断发生时，CPU 会首先保存当前任务的部分寄存器状态，例如程序计数器（PC）、栈指针（SP）、标志寄存器等，以确保在中断处理完成后能够恢复到中断前的状态。这部分信息通常会被保存到&lt;strong&gt;内核栈&lt;/strong&gt;中。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;切换到内核栈&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中断处理是在内核态执行的，因此 CPU 会切换到当前任务的&lt;strong&gt;内核栈&lt;/strong&gt;。每个进程或线程在内核中都有独立的内核栈。切换到内核栈后，中断处理程序可以安全地执行需要的内核操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;执行中断处理程序&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 切换到中断处理程序执行。中断处理程序可以是硬件中断处理（如键盘输入、中断时钟、网络数据到达等）或软件中断处理（如系统调用）。在这个阶段，处理程序可以执行与中断相关的操作，例如读取设备数据、更新状态等。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;恢复 CPU 状态&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中断处理完成后，操作系统会恢复之前保存的 CPU 寄存器状态，包括程序计数器、通用寄存器、栈指针等，确保中断发生前的任务能够继续运行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;返回中断前的执行&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;恢复到中断发生前的执行状态，继续执行中断前的任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 中断上下文切换与进程/线程上下文切换的区别&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;中断上下文切换&lt;/strong&gt;只涉及当前执行任务的&lt;strong&gt;部分寄存器状态&lt;/strong&gt;的保存与恢复，不涉及切换到其他进程或线程，因此通常比进程/线程上下文切换更轻量。&lt;/li&gt;
&lt;li&gt;中断上下文切换发生在&lt;strong&gt;内核态&lt;/strong&gt;，其目的是快速处理硬件或软件中断，使系统能够及时响应外部事件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中断上下文&lt;/strong&gt;不涉及虚拟内存空间的切换，因为中断处理程序运行在内核态，并且不关心哪个用户进程引发了中断。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 中断上下文中的注意事项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在中断上下文中，&lt;strong&gt;不允许执行阻塞操作&lt;/strong&gt;（如等待 I/O、睡眠等），因为中断处理程序需要尽快完成，避免影响系统的实时性和性能。&lt;/li&gt;
&lt;li&gt;中断处理程序通常只完成必要的工作，其余的处理可能会被推迟到&lt;strong&gt;软中断&lt;/strong&gt;或&lt;strong&gt;内核线程&lt;/strong&gt;中，以减少中断处理的开销。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4 小结&lt;/h2&gt;
&lt;p&gt;中断上下文切换是一个高优先级、临时的切换，用于处理外部事件（如硬件中断）。它会保存当前任务的部分 CPU 寄存器状态，然后切换到中断处理程序。处理完中断后，系统恢复中断前的执行状态，继续原来的任务。由于中断上下文切换并不涉及切换到其他进程或线程，它的开销相对较小。&lt;/p&gt;
&lt;h2 id=&quot;5&quot; tabindex=&quot;-1&quot;&gt;5 参考&lt;/h2&gt;
&lt;hr class=&quot;footnotes-sep&quot; /&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%AD%E6%96%AD/&quot;&gt;计算机中断&lt;/a&gt; &lt;a href=&quot;https://grove-trees.netlify.app/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/中断上下文切换详情/" />
        </entry>
        <entry>
            <title>
                sar命令输出
                
            </title>
            <updated>2024-09-20T13:16:48.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/sar命令输出/</id>
            <content type="html">
                &lt;h1 id=&quot;sar&quot; tabindex=&quot;-1&quot;&gt;sar命令输出&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;Linux 6.8.0-44-generic (dy-turbo-vm) 	09/19/2024 	_aarch64_	(8 CPU)

10:54:49 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:54:50 AM     all      0.12      0.00      0.12      0.00      0.00     99.75
10:54:51 AM     all      0.00      0.00      0.25      0.00      0.00     99.75
10:54:52 AM     all      0.00      0.00      0.12      0.00      0.00     99.88
10:54:53 AM     all      0.00      0.00      0.12      0.00      0.00     99.88
10:54:54 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
Average:        all      0.03      0.00      0.13      0.00      0.00     99.85
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/sar命令输出/" />
        </entry>
        <entry>
            <title>
                mpstat命令输出
                
            </title>
            <updated>2024-09-20T13:16:37.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/mpstat命令输出/</id>
            <content type="html">
                &lt;h1 id=&quot;mpstat&quot; tabindex=&quot;-1&quot;&gt;mpstat命令输出&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;Linux 6.8.0-44-generic (dy-turbo-vm) 	09/19/2024 	_aarch64_	(8 CPU)

10:52:27 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
10:52:27 AM  all    0.02    0.00    0.05    0.01    0.00    0.00    0.00    0.00    0.00   99.91
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/mpstat命令输出/" />
        </entry>
        <entry>
            <title>
                linux-perf
                
            </title>
            <updated>2024-10-21T13:32:00.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/linux-perf/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-perf&quot; tabindex=&quot;-1&quot;&gt;linux-perf&lt;/h1&gt;
&lt;p&gt;linux 下的性能分析工具&lt;/p&gt;
&lt;h2 id=&quot;1-perf-top&quot; tabindex=&quot;-1&quot;&gt;1 perf top&lt;/h2&gt;
&lt;p&gt;显示占用 cpu 时钟最多的函数或指令，可以用来查找热点函数&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020211224200819.png&quot; alt=&quot;Pasted image 20211224200819.png|800&quot; width=&quot;800px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;表头四个字段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Overhead 百分比&lt;/li&gt;
&lt;li&gt;Shared 该函数或指令所在的动态共享对象（dynamic Shared Object）&lt;/li&gt;
&lt;li&gt;Object 动态对象类型，&lt;code&gt;[.]&lt;/code&gt; 代表用户空间可执行程序、动态链接库，&lt;code&gt;[k]&lt;/code&gt; 代表内核空间&lt;/li&gt;
&lt;li&gt;Symbol 符号名，函数名。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 常用命令&lt;/h2&gt;
&lt;p&gt;记录当前状态&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;perf record -a -g -- sleep 30
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;产出一份图标报告&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;perf report -g graph,0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://time.geekbang.org/column/article/70476&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://time.geekbang.org/column/article/70476&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/linux-perf/" />
        </entry>
        <entry>
            <title>
                linux-execsnoop
                
            </title>
            <updated>2024-09-20T13:18:39.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/linux-execsnoop/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-execsnoop&quot; tabindex=&quot;-1&quot;&gt;linux-execsnoop&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br /&gt;
execsnoop - Trace new processes via exec() syscalls. Uses Linux eBPF/bcc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;适合查看系统中突发进程比较多的情况&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;wudanyang@dy-turbo-vm:~$ sudo execsnoop
[sudo] password for wudanyang:
PCOMM            PID    PPID   RET ARGS
stress           17095  1351     0 /usr/bin/stress
stress           17097  1351     0 /usr/bin/stress
stress           17099  1351     0 /usr/bin/stress -t 1 -d
stress           17101  1351     0 /usr/bin/stress
stress           17103  1351     0
stress           17105  1351     0 /usr/bin/stress -t
stress           17107  1351     0 /usr/bin/stress -t
stress           17109  1351     0 /usr/bin/stress -t
stress           17111  1351     0 /usr/bin/stress -t 1 -d
stress           17113  1351     0 /usr/bin/stress
stress           17115  1351     0
stress           17117  1351     0 /usr/bin/stress -t 1
stress           17119  1351     0 /usr/bin/stress -t 1 -d 1
stress           17121  1351     0 /usr/bin/stress
stress           17123  1351     0 /usr/bin/stress -t 1 -d
stress           17125  1351     0 /usr/bin/stress -t
stress           17127  1351     0
stress           17129  1351     0 /usr/bin/stress -t 1
stress           17131  1351     0 /usr/bin/stress -t 1 -d 1
stress           17133  1351     0 /usr/bin/stress
stress           17135  1351     0 /usr/bin/stress
stress           17137  1351     0 /usr/bin/stress
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/linux-execsnoop/" />
        </entry>
        <entry>
            <title>
                CPU 平均负载
                
            </title>
            <updated>2024-09-20T13:16:05.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/CPU 平均负载/</id>
            <content type="html">
                &lt;h1 id=&quot;cpu&quot; tabindex=&quot;-1&quot;&gt;CPU 平均负载&lt;/h1&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 什么是平均负载?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;System load averages is the average number of processes that are&lt;br /&gt;
either in a runnable or uninterruptable state.  A process in a&lt;br /&gt;
runnable state is either using the CPU or waiting to use the CPU.&lt;br /&gt;
A process in uninterruptable state is waiting for some I/O&lt;br /&gt;
access, eg waiting for disk.  The averages are taken over the&lt;br /&gt;
three time intervals.  Load averages are not normalized for the&lt;br /&gt;
number of CPUs in a system, so a load average of 1 means a single&lt;br /&gt;
CPU system is loaded all the time while on a 4 CPU system it&lt;br /&gt;
means it was idle 75% of the time.&lt;br /&gt;
&lt;a href=&quot;https://man7.org/linux/man-pages/man1/uptime.1.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://man7.org/linux/man-pages/man1/uptime.1.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;简单来说，平均负载是指单位时间内，系统处于可运行状态和不可中断状态的平均进程数，也就是&lt;strong&gt;平均活跃进程数&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-linux&quot; tabindex=&quot;-1&quot;&gt;2 如何查看linux平均负载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;top&lt;/li&gt;
&lt;li&gt;uptime&lt;/li&gt;
&lt;li&gt;w&lt;/li&gt;
&lt;li&gt;cat &lt;code&gt;/proc/loadavg&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;# CPU 平均负载
load average: 0.62, 0.72, 0.76
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 平均负载的高低判断标准&lt;/h2&gt;
&lt;p&gt;最理想的，就是每个 CPU 上都刚好运行着一个进程&lt;/p&gt;
&lt;p&gt;所以说平均负载高不高，需要看你的 CPU 到底有几个&lt;/p&gt;
&lt;p&gt;CPU个数查询： &lt;code&gt;cat /proc/cpuinfo&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4 参考&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;CPU比喻成一辆地铁，正在使用CPU的进程就是在地铁上的人；等待CPU的进程就是在下一站等地铁来的人；等待I/O的进程就是在下一站要上车和下车的人，虽然现在对CPU没影响，可未来会影响，所以也要考虑到平均负载上。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;02 | 基础篇：到底应该怎么理解“平均负载”？-Linux 性能优化实战-极客时间: &lt;a href=&quot;https://time.geekbang.org/column/article/69618&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://time.geekbang.org/column/article/69618&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/CPU 平均负载/" />
        </entry>
        <entry>
            <title>
                CPU 使用率
                
            </title>
            <updated>2024-09-25T10:51:53.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/CPU 使用率/</id>
            <content type="html">
                &lt;h1 id=&quot;cpu&quot; tabindex=&quot;-1&quot;&gt;CPU 使用率&lt;/h1&gt;
&lt;p&gt;CPU 使用率（CPU Utilization）是指在一段时间内，处理器用于执行任务的时间占总时间的比例。它反映了 CPU 的繁忙程度，通常以百分比表示。&lt;/p&gt;
&lt;h2 id=&quot;1-strong-strong&quot; tabindex=&quot;-1&quot;&gt;1 &lt;strong&gt;基本概念&lt;/strong&gt;：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;用户态（User Mode）CPU 使用率&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 在用户态（用户空间）运行用户应用程序的时间。&lt;/li&gt;
&lt;li&gt;例如，当你运行一个程序（如文本编辑器、浏览器等）时，CPU 会在用户态处理这些任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;系统态（System Mode）CPU 使用率&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 在内核态（内核空间）执行系统调用、驱动程序等操作的时间。&lt;/li&gt;
&lt;li&gt;例如，文件读写操作、网络请求处理等属于内核态。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;空闲态（Idle）CPU 使用率&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 处于空闲状态，没有任务要执行的时间。&lt;/li&gt;
&lt;li&gt;这个数值越大，表示 CPU 越空闲。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;等待 I/O（I/O Wait）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 等待输入输出（如硬盘、网络）的时间。这种情况下，CPU 可能是空闲的，但由于等待 I/O 完成而无法进行其他任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中断时间（IRQ &amp;amp; SoftIRQ）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 处理硬件中断（IRQ）和软件中断（SoftIRQ）的时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;高 CPU 使用率的含义&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高 CPU 使用率意味着系统在执行大量的计算任务，可能是正常现象（例如运行密集型计算任务），也可能是系统负载过高。&lt;/li&gt;
&lt;li&gt;低 CPU 使用率则表明系统相对空闲，CPU 大部分时间处于空闲状态。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如何查看 CPU 使用率&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;top&lt;/code&gt; 或 &lt;code&gt;htop&lt;/code&gt; 等工具可以实时监控 CPU 的使用情况。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;mpstat&lt;/code&gt; 可以更详细地查看每个 CPU 核心的使用率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-cpu&quot; tabindex=&quot;-1&quot;&gt;2 如何查看CPU时间&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;cat /proc/stat&lt;/code&gt; 查看开机以来的系统CPU时间 &lt;a href=&quot;https://man7.org/linux/man-pages/man5/proc_stat.5.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;/proc/stat&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The amount of time, measured in units of USER_HZ&lt;br /&gt;
(1/100ths of a second on most architectures, use&lt;br /&gt;
&lt;em&gt;sysconf(&lt;em&gt;SC_CLK_TCK)&lt;/em&gt; to obtain the right value),&lt;br /&gt;
that the system (&amp;quot;cpu&amp;quot; line) or the specific CPU&lt;br /&gt;
(&amp;quot;cpu_N&lt;/em&gt;&amp;quot; line) spent in various states&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;单位为时间数量，一般是 1/100 秒，具体值根据 USER_HZ 确定。&lt;/p&gt;
&lt;h2 id=&quot;3-cpu&quot; tabindex=&quot;-1&quot;&gt;3 CPU 使用率的计算方法&lt;/h2&gt;
&lt;p&gt;总CPU使用率（开机以来）&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; display=&quot;true&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -2.059ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;32.923ex&quot; height=&quot;5.285ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -1426 14552 2336&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;path data-c=&quot;43&quot; d=&quot;M56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;50&quot; d=&quot;M130 622Q123 629 119 631T103 634T60 637H27V683H214Q237 683 276 683T331 684Q419 684 471 671T567 616Q624 563 624 489Q624 421 573 372T451 307Q429 302 328 301H234V181Q234 62 237 58Q245 47 304 46H337V0H326Q305 3 182 3Q47 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM507 488Q507 514 506 528T500 564T483 597T450 620T397 635Q385 637 307 637H286Q237 637 234 628Q231 624 231 483V342H302H339Q390 342 423 349T481 382Q507 411 507 488Z&quot; transform=&quot;translate(722,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;55&quot; d=&quot;M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 418V291Q232 189 240 145T280 67Q325 24 389 24Q454 24 506 64T571 183Q575 206 575 410V598Q569 608 565 613T541 627T489 637H472V683H481Q496 680 598 680T715 683H724V637H707Q634 633 622 598L621 399Q620 194 617 180Q617 179 615 171Q595 83 531 31T389 -22Q304 -22 226 33T130 192Q129 201 128 412V622Z&quot; transform=&quot;translate(1403,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;20&quot; d=&quot;&quot; transform=&quot;translate(2153,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(2403,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;使&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(3403,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;用&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(4403,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;率&lt;/text&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5680.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(6736.6,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7458.8,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mfrac&quot; transform=&quot;translate(8459,0)&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot; transform=&quot;translate(1046.5,676)&quot;&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;空&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(1000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;闲&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(2000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;时&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(3000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;间&lt;/text&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mtext&quot; transform=&quot;translate(220,-710)&quot;&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;总&lt;/text&gt;&lt;path data-c=&quot;20&quot; d=&quot;&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;43&quot; d=&quot;M56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342Z&quot; transform=&quot;translate(1250,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;50&quot; d=&quot;M130 622Q123 629 119 631T103 634T60 637H27V683H214Q237 683 276 683T331 684Q419 684 471 671T567 616Q624 563 624 489Q624 421 573 372T451 307Q429 302 328 301H234V181Q234 62 237 58Q245 47 304 46H337V0H326Q305 3 182 3Q47 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM507 488Q507 514 506 528T500 564T483 597T450 620T397 635Q385 637 307 637H286Q237 637 234 628Q231 624 231 483V342H302H339Q390 342 423 349T481 382Q507 411 507 488Z&quot; transform=&quot;translate(1972,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;55&quot; d=&quot;M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 418V291Q232 189 240 145T280 67Q325 24 389 24Q454 24 506 64T571 183Q575 206 575 410V598Q569 608 565 613T541 627T489 637H472V683H481Q496 680 598 680T715 683H724V637H707Q634 633 622 598L621 399Q620 194 617 180Q617 179 615 171Q595 83 531 31T389 -22Q304 -22 226 33T130 192Q129 201 128 412V622Z&quot; transform=&quot;translate(2653,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;20&quot; d=&quot;&quot; transform=&quot;translate(3403,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(3653,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;时&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(4653,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;间&lt;/text&gt;&lt;/g&gt;&lt;rect width=&quot;5853&quot; height=&quot;60&quot; x=&quot;120&quot; y=&quot;220&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtext&gt;CPU 使用率&lt;/mtext&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mfrac&gt;&lt;mtext&gt;空闲时间&lt;/mtext&gt;&lt;mtext&gt;总 CPU 时间&lt;/mtext&gt;&lt;/mfrac&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;p&gt;一段时间内的平均CPU使用率&lt;/p&gt;
&lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; display=&quot;true&quot; style=&quot;direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -2.156ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;58.833ex&quot; height=&quot;5.444ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -1453.1 26004.4 2406.3&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;平&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(1000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;均&lt;/text&gt;&lt;path data-c=&quot;20&quot; d=&quot;&quot; transform=&quot;translate(2000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;43&quot; d=&quot;M56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342Z&quot; transform=&quot;translate(2250,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;50&quot; d=&quot;M130 622Q123 629 119 631T103 634T60 637H27V683H214Q237 683 276 683T331 684Q419 684 471 671T567 616Q624 563 624 489Q624 421 573 372T451 307Q429 302 328 301H234V181Q234 62 237 58Q245 47 304 46H337V0H326Q305 3 182 3Q47 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM507 488Q507 514 506 528T500 564T483 597T450 620T397 635Q385 637 307 637H286Q237 637 234 628Q231 624 231 483V342H302H339Q390 342 423 349T481 382Q507 411 507 488Z&quot; transform=&quot;translate(2972,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;55&quot; d=&quot;M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 418V291Q232 189 240 145T280 67Q325 24 389 24Q454 24 506 64T571 183Q575 206 575 410V598Q569 608 565 613T541 627T489 637H472V683H481Q496 680 598 680T715 683H724V637H707Q634 633 622 598L621 399Q620 194 617 180Q617 179 615 171Q595 83 531 31T389 -22Q304 -22 226 33T130 192Q129 201 128 412V622Z&quot; transform=&quot;translate(3653,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;20&quot; d=&quot;&quot; transform=&quot;translate(4403,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(4653,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;使&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(5653,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;用&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(6653,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;率&lt;/text&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7930.8,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mn&quot; transform=&quot;translate(8986.6,0)&quot;&gt;&lt;path data-c=&quot;31&quot; d=&quot;M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(9708.8,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mfrac&quot; transform=&quot;translate(10709,0)&quot;&gt;&lt;g data-mml-node=&quot;mrow&quot; transform=&quot;translate(1873,703.1)&quot;&gt;&lt;g data-mml-node=&quot;msub&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;空&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(1000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;闲&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(2000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;时&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(3000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;间&lt;/text&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; transform=&quot;translate(4033,-235.4) scale(0.707)&quot; data-mjx-texclass=&quot;ORD&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;path data-c=&quot;6E&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;65&quot; d=&quot;M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z&quot; transform=&quot;translate(556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;77&quot; d=&quot;M90 368Q84 378 76 380T40 385H18V431H24L43 430Q62 430 84 429T116 428Q206 428 221 431H229V385H215Q177 383 177 368Q177 367 221 239L265 113L339 328L333 345Q323 374 316 379Q308 384 278 385H258V431H264Q270 428 348 428Q439 428 454 431H461V385H452Q404 385 404 369Q404 366 418 324T449 234T481 143L496 100L537 219Q579 341 579 347Q579 363 564 373T530 385H522V431H529Q541 428 624 428Q692 428 698 431H703V385H697Q696 385 691 385T682 384Q635 377 619 334L559 161Q546 124 528 71Q508 12 503 1T487 -11H479Q460 -11 456 -4Q455 -3 407 133L361 267Q359 263 266 -4Q261 -11 243 -11H238Q225 -11 220 -3L90 368Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5522.9,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;msub&quot; transform=&quot;translate(6523.1,0)&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;空&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(1000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;闲&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(2000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;时&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(3000,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;间&lt;/text&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; transform=&quot;translate(4033,-235.4) scale(0.707)&quot; data-mjx-texclass=&quot;ORD&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;path data-c=&quot;6F&quot; d=&quot;M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6C&quot; d=&quot;M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;64&quot; d=&quot;M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z&quot; transform=&quot;translate(778,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mrow&quot; transform=&quot;translate(220,-710)&quot;&gt;&lt;g data-mml-node=&quot;msub&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;总&lt;/text&gt;&lt;path data-c=&quot;20&quot; d=&quot;&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;43&quot; d=&quot;M56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342Z&quot; transform=&quot;translate(1250,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;50&quot; d=&quot;M130 622Q123 629 119 631T103 634T60 637H27V683H214Q237 683 276 683T331 684Q419 684 471 671T567 616Q624 563 624 489Q624 421 573 372T451 307Q429 302 328 301H234V181Q234 62 237 58Q245 47 304 46H337V0H326Q305 3 182 3Q47 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM507 488Q507 514 506 528T500 564T483 597T450 620T397 635Q385 637 307 637H286Q237 637 234 628Q231 624 231 483V342H302H339Q390 342 423 349T481 382Q507 411 507 488Z&quot; transform=&quot;translate(1972,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;55&quot; d=&quot;M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 418V291Q232 189 240 145T280 67Q325 24 389 24Q454 24 506 64T571 183Q575 206 575 410V598Q569 608 565 613T541 627T489 637H472V683H481Q496 680 598 680T715 683H724V637H707Q634 633 622 598L621 399Q620 194 617 180Q617 179 615 171Q595 83 531 31T389 -22Q304 -22 226 33T130 192Q129 201 128 412V622Z&quot; transform=&quot;translate(2653,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;20&quot; d=&quot;&quot; transform=&quot;translate(3403,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(3653,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;时&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(4653,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;间&lt;/text&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; transform=&quot;translate(5686,-235.4) scale(0.707)&quot; data-mjx-texclass=&quot;ORD&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;path data-c=&quot;6E&quot; d=&quot;M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;65&quot; d=&quot;M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z&quot; transform=&quot;translate(556,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;77&quot; d=&quot;M90 368Q84 378 76 380T40 385H18V431H24L43 430Q62 430 84 429T116 428Q206 428 221 431H229V385H215Q177 383 177 368Q177 367 221 239L265 113L339 328L333 345Q323 374 316 379Q308 384 278 385H258V431H264Q270 428 348 428Q439 428 454 431H461V385H452Q404 385 404 369Q404 366 418 324T449 234T481 143L496 100L537 219Q579 341 579 347Q579 363 564 373T530 385H522V431H529Q541 428 624 428Q692 428 698 431H703V385H697Q696 385 691 385T682 384Q635 377 619 334L559 161Q546 124 528 71Q508 12 503 1T487 -11H479Q460 -11 456 -4Q455 -3 407 133L361 267Q359 263 266 -4Q261 -11 243 -11H238Q225 -11 220 -3L90 368Z&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(7175.9,0)&quot;&gt;&lt;path data-c=&quot;2212&quot; d=&quot;M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;msub&quot; transform=&quot;translate(8176.1,0)&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;总&lt;/text&gt;&lt;path data-c=&quot;20&quot; d=&quot;&quot; transform=&quot;translate(1000,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;43&quot; d=&quot;M56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342Z&quot; transform=&quot;translate(1250,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;50&quot; d=&quot;M130 622Q123 629 119 631T103 634T60 637H27V683H214Q237 683 276 683T331 684Q419 684 471 671T567 616Q624 563 624 489Q624 421 573 372T451 307Q429 302 328 301H234V181Q234 62 237 58Q245 47 304 46H337V0H326Q305 3 182 3Q47 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM507 488Q507 514 506 528T500 564T483 597T450 620T397 635Q385 637 307 637H286Q237 637 234 628Q231 624 231 483V342H302H339Q390 342 423 349T481 382Q507 411 507 488Z&quot; transform=&quot;translate(1972,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;55&quot; d=&quot;M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 418V291Q232 189 240 145T280 67Q325 24 389 24Q454 24 506 64T571 183Q575 206 575 410V598Q569 608 565 613T541 627T489 637H472V683H481Q496 680 598 680T715 683H724V637H707Q634 633 622 598L621 399Q620 194 617 180Q617 179 615 171Q595 83 531 31T389 -22Q304 -22 226 33T130 192Q129 201 128 412V622Z&quot; transform=&quot;translate(2653,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;20&quot; d=&quot;&quot; transform=&quot;translate(3403,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(3653,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;时&lt;/text&gt;&lt;text data-variant=&quot;normal&quot; transform=&quot;translate(4653,0) scale(1,-1)&quot; font-size=&quot;884px&quot; font-family=&quot;serif&quot;&gt;间&lt;/text&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;TeXAtom&quot; transform=&quot;translate(5686,-235.4) scale(0.707)&quot; data-mjx-texclass=&quot;ORD&quot;&gt;&lt;g data-mml-node=&quot;mtext&quot;&gt;&lt;path data-c=&quot;6F&quot; d=&quot;M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;6C&quot; d=&quot;M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z&quot; transform=&quot;translate(500,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;path data-c=&quot;64&quot; d=&quot;M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z&quot; transform=&quot;translate(778,0)&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;rect width=&quot;15055.4&quot; height=&quot;60&quot; x=&quot;120&quot; y=&quot;220&quot;&gt;&lt;/rect&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;block&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;mtext&gt;平均 CPU 使用率&lt;/mtext&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;空闲时间&lt;/mtext&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mtext&gt;new&lt;/mtext&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mtext&gt;空闲时间&lt;/mtext&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mtext&gt;old&lt;/mtext&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;总 CPU 时间&lt;/mtext&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mtext&gt;new&lt;/mtext&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mtext&gt;总 CPU 时间&lt;/mtext&gt;&lt;mrow data-mjx-texclass=&quot;ORD&quot;&gt;&lt;mtext&gt;old&lt;/mtext&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;&lt;h2 id=&quot;4-cpu&quot; tabindex=&quot;-1&quot;&gt;4 获得CPU使用率的几种方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;top&lt;/code&gt;命令&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240919184300.png&quot; alt=&quot;Pasted image 20240919184300.png|600&quot; width=&quot;600px&quot; /&gt;&lt;br /&gt;
按&lt;code&gt;1&lt;/code&gt;可以看每个CPU单独的数据 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/Linux/linux-top/&quot;&gt;linux-top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;htop&lt;/code&gt; 命令 &lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240919184348.png&quot; alt=&quot;Pasted image 20240919184348.png|600&quot; width=&quot;600px&quot; /&gt;&lt;br /&gt;
优势：可以响应鼠标点击事件，滚动查看，查看进程树&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vmstat 1&lt;/code&gt;  每秒输出一次 &lt;code&gt;vmstat reports information about processes, memory, paging, block IO, traps, disks and cpu activity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mpstat&lt;/code&gt; 或者 &lt;code&gt;mpstat -u 1 10&lt;/code&gt; 获取一段时间内的CPU使用率&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;transclusion internal-embed is-loaded&quot;&gt;&lt;a class=&quot;markdown-embed-link&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/mpstat%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA/&quot; aria-label=&quot;Open link&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-link&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;div class=&quot;markdown-embed&quot;&gt;
&lt;h1 id=&quot;mpstat&quot; tabindex=&quot;-1&quot;&gt;mpstat命令输出&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;Linux 6.8.0-44-generic (dy-turbo-vm) 	09/19/2024 	_aarch64_	(8 CPU)

10:52:27 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
10:52:27 AM  all    0.02    0.00    0.05    0.01    0.00    0.00    0.00    0.00    0.00   99.91
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;code&gt;sar 1 5&lt;/code&gt; 此命令每秒采集一次数据，连续采集 5 次。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;transclusion internal-embed is-loaded&quot;&gt;&lt;a class=&quot;markdown-embed-link&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/sar%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA/&quot; aria-label=&quot;Open link&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-link&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;div class=&quot;markdown-embed&quot;&gt;
&lt;h1 id=&quot;sar&quot; tabindex=&quot;-1&quot;&gt;sar命令输出&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;Linux 6.8.0-44-generic (dy-turbo-vm) 	09/19/2024 	_aarch64_	(8 CPU)

10:54:49 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:54:50 AM     all      0.12      0.00      0.12      0.00      0.00     99.75
10:54:51 AM     all      0.00      0.00      0.25      0.00      0.00     99.75
10:54:52 AM     all      0.00      0.00      0.12      0.00      0.00     99.88
10:54:53 AM     all      0.00      0.00      0.12      0.00      0.00     99.88
10:54:54 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
Average:        all      0.03      0.00      0.13      0.00      0.00     99.85
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;&lt;code&gt;ps&lt;/code&gt;： &lt;code&gt;ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat /proc/stat&lt;/code&gt; 通过读取CPU时间，自行计算CPU使用率&lt;/li&gt;
&lt;li&gt;查看指定进程的CPU使用情况： &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/Linux/linux-pidstat/&quot;&gt;linux-pidstat&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/CPU 使用率/" />
        </entry>
        <entry>
            <title>
                CPU 上下文切换
                
            </title>
            <updated>2024-09-20T13:17:31.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/CPU 上下文切换/</id>
            <content type="html">
                &lt;h1 id=&quot;cpu&quot; tabindex=&quot;-1&quot;&gt;CPU 上下文切换&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;上下文切换（Context Switch）&lt;/strong&gt; 是操作系统中，当 CPU 在多个进程或线程之间切换执行时发生的操作。它是多任务系统实现并发执行的核心机制之一。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;上下文&lt;/strong&gt; 是指 CPU 运行一个进程或线程时的状态，包括以下内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;寄存器&lt;/strong&gt;：存储当前进程的运行状态（如指令指针、程序计数器、栈指针等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存映射&lt;/strong&gt;：包括进程的地址空间、虚拟内存页表等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU 状态&lt;/strong&gt;：进程当前的运行模式（用户态或内核态）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进程控制块（PCB）&lt;/strong&gt;：保存进程的上下文信息。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;上下文切换的场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;进程上下文切换&lt;/strong&gt;：当操作系统调度器决定暂停一个进程并切换到另一个进程时，需要保存当前进程的上下文，并恢复目标进程的上下文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;线程上下文切换&lt;/strong&gt;：线程属于同一个进程，但每个线程有自己独立的执行上下文（如寄存器状态、栈指针），切换时也会涉及上下文保存与恢复。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中断上下文处理&lt;/strong&gt;：当硬件或软件中断发生时，CPU 会暂停当前进程处理中断，完成后恢复原进程的上下文。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;上下文切换的步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;保存上下文&lt;/strong&gt;：将当前进程/线程的寄存器、栈指针等信息保存到进程控制块（PCB）中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加载新上下文&lt;/strong&gt;：从目标进程的 PCB 中加载该进程的寄存器状态、栈指针等信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切换内存映射&lt;/strong&gt;：切换虚拟内存的页表，以确保 CPU 访问的是新进程的内存空间。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;上下文切换的开销&lt;/strong&gt;： 上下文切换涉及保存和恢复进程状态、切换内存映射等操作，这需要 CPU 额外的时间。频繁的上下文切换会导致性能下降，因为每次切换时，CPU 需要停下来保存/加载状态，而不是执行有用的工作。因此，系统设计通常会尽量减少不必要的上下文切换。&lt;/p&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 进程上下文切换&lt;/h2&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E8%BF%9B%E7%A8%8B%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E8%AF%A6%E6%83%85/&quot;&gt;进程上下文切换详情&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;调度的时机：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进程进行系统调用时，可能会发生&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E6%97%B6%E4%B8%8A%E4%B8%8B%E6%96%87%E8%B0%83%E5%BA%A6/&quot;&gt;系统调用时上下文调度&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;时间片耗尽&lt;/li&gt;
&lt;li&gt;进程阻塞&lt;/li&gt;
&lt;li&gt;优先级调度&lt;/li&gt;
&lt;li&gt;中断&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 线程上下文切换&lt;/h2&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E7%BA%BF%E7%A8%8B%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E8%AF%A6%E6%83%85/&quot;&gt;线程上下文切换详情&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;线程属于不同的进程
&lt;ul&gt;
&lt;li&gt;同进程上下文调度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;线程间属于同一进程
&lt;ul&gt;
&lt;li&gt;共享相同的虚拟内存、全局变量等资源&lt;/li&gt;
&lt;li&gt;切换栈、寄存器等线程私有数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 中断上下文切换&lt;/h2&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E4%B8%AD%E6%96%AD%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E8%AF%A6%E6%83%85/&quot;&gt;中断上下文切换详情&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;硬件&amp;amp;软件中断时&lt;/li&gt;
&lt;li&gt;优先级比进程、线程优先级高&lt;/li&gt;
&lt;li&gt;中断只需要内核态的状态，CPU 寄存器，内核堆栈，硬件中断参数等&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-cpu&quot; tabindex=&quot;-1&quot;&gt;4 CPU 上下文切换的问题&lt;/h2&gt;
&lt;p&gt;会将大量的CPU时间浪费保存和恢复程序状态上面，缩短真正的运行时间，导致系统整体性能大幅下降&lt;/p&gt;
&lt;h2 id=&quot;5-cpu&quot; tabindex=&quot;-1&quot;&gt;5 查看CPU上下文切换&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;# CPU 上下文切换
vmstat 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出内容：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 1  0      0 3230412  44980 526092    0    0     5     8   49    0  0  0 99  0  0  0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内容含义查看：&lt;/p&gt;
&lt;p&gt;vmstat(8) - Linux 手册页 --- vmstat(8) - Linux manual page: &lt;a href=&quot;https://man7.org/linux/man-pages/man8/vmstat.8.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://man7.org/linux/man-pages/man8/vmstat.8.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;重要字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cs（context switch）是每秒上下文切换的次数。&lt;/li&gt;
&lt;li&gt;in（interrupt）则是每秒中断的次数。&lt;/li&gt;
&lt;li&gt;r（Running or Runnable）是就绪队列的长度，也就是正在运行和等待 CPU 的进程数。&lt;/li&gt;
&lt;li&gt;b（Blocked）则是处于不可中断睡眠状态的进程数。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;pidstat -w 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内容输出：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;Linux 6.8.0-44-generic (dy-turbo-vm) 	09/14/2024 	_aarch64_	(2 CPU)

11:54:39 AM   UID       PID   cswch/s nvcswch/s  Command
11:54:44 AM     0        16      0.20      0.00  ksoftirqd/0
11:54:44 AM     0        17      0.40      0.00  rcu_preempt
11:54:44 AM     0        18      0.40      0.00  migration/0
11:54:44 AM     0        23      0.40      0.00  migration/1
11:54:44 AM     0        34      1.98      0.00  kcompactd0
11:54:44 AM     0        48      0.20      0.00  kworker/0:1H-kblockd
11:54:44 AM     0       470      1.39      0.00  multipathd
11:54:44 AM     0       712     10.69      0.00  vmtoolsd
11:54:44 AM     0      5892      3.17      0.00  kworker/0:1-events
11:54:44 AM     0      6488      1.98      0.00  kworker/u4:0-events_power_efficient
11:54:44 AM     0      6501      6.34      0.00  kworker/1:3-events
11:54:44 AM     0      6677      4.75      0.00  kworker/u4:2-events_unbound
11:54:44 AM  1000      6969     18.22      0.00  sshd
11:54:44 AM  1000      7085      0.20      0.00  pidstat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;pidstat(1) - Linux manual page: &lt;a href=&quot;https://man7.org/linux/man-pages/man1/pidstat.1.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://man7.org/linux/man-pages/man1/pidstat.1.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;重要字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cswch/s ： 每秒自愿上下文切换次数（自愿：I/O等待，申请内存等需要等待资源ready的操作）&lt;/li&gt;
&lt;li&gt;nvcswch/s ： 每秒非自愿上下文切换次数（非资源：时间片达到等）&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/CPU 上下文切换/" />
        </entry>
        <entry>
            <title>
                202409121624 Linux 性能分析优化-CPU
                
            </title>
            <updated>2025-01-24T09:11:52.000Z</updated>
            <id>https://grove-trees.netlify.app/card/操作系统/CPU性能优化/202409121624 Linux 性能分析优化-CPU/</id>
            <content type="html">
                &lt;h1 id=&quot;202409121624-linux-cpu&quot; tabindex=&quot;-1&quot;&gt;202409121624 Linux 性能分析优化-CPU&lt;/h1&gt;
&lt;h2 id=&quot;1-linux&quot; tabindex=&quot;-1&quot;&gt;1 Linux 系统概览&lt;/h2&gt;
&lt;h3 id=&quot;1-1-cpu&quot; tabindex=&quot;-1&quot;&gt;1.1 CPU 概览&lt;/h3&gt;
&lt;p&gt;冯诺依曼结构：&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240925184443.png&quot; alt=&quot;Pasted image 20240925184443.png|600&quot; width=&quot;600px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;CPU大概内部结构：&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240920211004.png&quot; alt=&quot;Pasted image 20240920211004.png|600&quot; width=&quot;600px&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;1-2-linux&quot; tabindex=&quot;-1&quot;&gt;1.2 Linux 内核概览&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240919000041.png&quot; alt=&quot;Pasted image 20240919000041.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 基本概念&lt;/h2&gt;
&lt;h3 id=&quot;2-1&quot; tabindex=&quot;-1&quot;&gt;2.1 平均负载&lt;/h3&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/CPU%20%E5%B9%B3%E5%9D%87%E8%B4%9F%E8%BD%BD/&quot;&gt;CPU 平均负载&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-2-cpu&quot; tabindex=&quot;-1&quot;&gt;2.2 CPU 使用率&lt;/h3&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87/&quot;&gt;CPU 使用率&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-3-cpu&quot; tabindex=&quot;-1&quot;&gt;2.3 CPU 上下文切换&lt;/h3&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/CPU%20%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2/&quot;&gt;CPU 上下文切换&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-4&quot; tabindex=&quot;-1&quot;&gt;2.4 中断&lt;/h3&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%AD%E6%96%AD/&quot;&gt;计算机中断&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;3-cpu&quot; tabindex=&quot;-1&quot;&gt;3 CPU 使用率过高如何排查&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;通过&lt;code&gt;top&lt;/code&gt; &lt;code&gt;ps&lt;/code&gt; &lt;code&gt;pidstat&lt;/code&gt; 找到 CPU 使用率过高的进程 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87/#4-cpu&quot;&gt;CPU 使用率#4) 获得CPU使用率的几种方法&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;找到占用 CPU 最多的函数
&lt;ul&gt;
&lt;li&gt;使用GDB或者其他Debug工具进行调试&lt;/li&gt;
&lt;li&gt;使用 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/linux-perf/&quot;&gt;linux-perf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;针对突发进程如何处理呢？
&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E6%A8%A1%E6%8B%9F%E7%AA%81%E5%8F%91%E8%BF%9B%E7%A8%8B%E7%89%B9%E5%88%AB%E5%A4%9A%E7%9A%84%E6%83%85%E5%86%B5/&quot;&gt;模拟突发进程特别多的情况&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;开启终端，演示突发进程的现象&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;top 直接查看，无法发现具体哪个进程的问题&lt;/li&gt;
&lt;li&gt;几种观测突发进程的方法
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;top -b -c&lt;/code&gt; 输出到文件，然后分析文件内容&lt;/li&gt;
&lt;li&gt;使用 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/linux-perf/&quot;&gt;linux-perf&lt;/a&gt;  记录一段时间的内容，然后通过 &lt;code&gt;report&lt;/code&gt; 查看 cpu 使用率
&lt;ul&gt;
&lt;li&gt;观察到了CPU使用率比较高的command之后，可以使用 &lt;code&gt;pstree&lt;/code&gt; 找到对应的父进程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/linux-execsnoop/&quot;&gt;linux-execsnoop&lt;/a&gt;  观测 &lt;code&gt;exec&lt;/code&gt; 生成的新进程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;软中断CPU使用率升高如何排查
&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E6%A8%A1%E6%8B%9F%E8%BD%AF%E4%B8%AD%E6%96%AD%E7%89%B9%E5%88%AB%E5%A4%9A%E7%9A%84%E6%83%85%E5%86%B5/&quot;&gt;模拟软中断特别多的情况&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;top 看 &lt;code&gt;si&lt;/code&gt; &lt;code&gt;st&lt;/code&gt; 使用率
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /proc/softirqs&lt;/code&gt; 查看软硬中断的情况，观察是什么类型的中断上涨比较多 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%AD%E6%96%AD/#3-3-1&quot;&gt;计算机中断#3.3.1) 查看中断&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一般情况下，都是网络问题，可以使用 &lt;code&gt;sar -n DEV 1&lt;/code&gt; 观察输入输出包的速度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/CPU%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E5%BF%AB%E9%80%9F%E5%88%86%E6%9E%90%E7%B3%BB%E7%BB%9FCPU%E7%93%B6%E9%A2%88%E7%9A%84%E5%91%BD%E4%BB%A4%E5%B7%A5%E5%85%B7/&quot;&gt;快速分析系统CPU瓶颈的命令工具&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4 性能优化的思路&lt;/h2&gt;
&lt;p&gt;参考之前的分享： &lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;QB性能优化指南&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;5&quot; tabindex=&quot;-1&quot;&gt;5 参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Linux 性能优化实战: &lt;a href=&quot;https://time.geekbang.org/column/intro/100020901?tab=catalog&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://time.geekbang.org/column/intro/100020901?tab=catalog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux man pages online: &lt;a href=&quot;https://man7.org/linux/man-pages/index.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://man7.org/linux/man-pages/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;第八章 CPU的结构和功能_排队器是在cpu中的吗-CSDN博客: &lt;a href=&quot;https://blog.csdn.net/qq_45091353/article/details/127096768&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://blog.csdn.net/qq_45091353/article/details/127096768&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/操作系统/CPU性能优化/202409121624 Linux 性能分析优化-CPU/" />
        </entry>
        <entry>
            <title>
                当前状态和下一状态的随想.excalidraw
                
            </title>
            <updated>2024-10-18T05:01:57.000Z</updated>
            <id>https://grove-trees.netlify.app/card/思考/当前状态和下一状态的随想.excalidraw/</id>
            <content type="html">
                &lt;style&gt; .container {font-family: sans-serif; text-align: center;} .button-wrapper button {z-index: 1;height: 40px; width: 100px; margin: 10px;padding: 5px;} .excalidraw .App-menu_top .buttonList { display: flex;} .excalidraw-wrapper { height: 800px; margin: 50px; position: relative;} :root[dir=&quot;ltr&quot;] .excalidraw .layer-ui__wrapper .zen-mode-transition.App-menu_bottom--transition-left {transform: none;} &lt;/style&gt;&lt;script src=&quot;https://cdn.jsdelivr.net/npm/react@17/umd/react.production.min.js&quot;&gt;&lt;/script&gt;&lt;script src=&quot;https://cdn.jsdelivr.net/npm/react-dom@17/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.jsdelivr.net/npm/@excalidraw/excalidraw@0/dist/excalidraw.production.min.js&quot;&gt;&lt;/script&gt;&lt;div id=&quot;当前状态和下一状态的随想excalidraw.md&quot;&gt;&lt;/div&gt;&lt;script&gt;(function(){const InitialData={&quot;type&quot;:&quot;excalidraw&quot;,&quot;version&quot;:2,&quot;source&quot;:&quot;https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.5.0&quot;,&quot;elements&quot;:[{&quot;type&quot;:&quot;rectangle&quot;,&quot;version&quot;:211,&quot;versionNonce&quot;:2065638821,&quot;index&quot;:&quot;a0&quot;,&quot;isDeleted&quot;:false,&quot;id&quot;:&quot;XgjAPiQ47fqEwl-LpfWxA&quot;,&quot;fillStyle&quot;:&quot;hachure&quot;,&quot;strokeWidth&quot;:1,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;angle&quot;:0,&quot;x&quot;:-121.26171875,&quot;y&quot;:-226.197265625,&quot;strokeColor&quot;:&quot;#000000&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;width&quot;:153,&quot;height&quot;:160,&quot;seed&quot;:1809355819,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;lcXa25o6&quot;},{&quot;id&quot;:&quot;90yz_m0kH4RaMUXRgR-Br&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1728746919791,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;type&quot;:&quot;text&quot;,&quot;version&quot;:203,&quot;versionNonce&quot;:2044012805,&quot;index&quot;:&quot;a1&quot;,&quot;isDeleted&quot;:false,&quot;id&quot;:&quot;lcXa25o6&quot;,&quot;fillStyle&quot;:&quot;hachure&quot;,&quot;strokeWidth&quot;:1,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;angle&quot;:0,&quot;x&quot;:-85.47768127918243,&quot;y&quot;:-158.697265625,&quot;strokeColor&quot;:&quot;#000000&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;width&quot;:81.43192505836487,&quot;height&quot;:25,&quot;seed&quot;:1671257323,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;roundness&quot;:null,&quot;boundElements&quot;:[],&quot;updated&quot;:1728746919791,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:1,&quot;text&quot;:&quot;当前状态&quot;,&quot;rawText&quot;:&quot;当前状态&quot;,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;XgjAPiQ47fqEwl-LpfWxA&quot;,&quot;originalText&quot;:&quot;当前状态&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;type&quot;:&quot;rectangle&quot;,&quot;version&quot;:126,&quot;versionNonce&quot;:543312287,&quot;index&quot;:&quot;a2&quot;,&quot;isDeleted&quot;:false,&quot;id&quot;:&quot;GZ7hQS78e5Q1siEvK33Lx&quot;,&quot;fillStyle&quot;:&quot;hachure&quot;,&quot;strokeWidth&quot;:1,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;angle&quot;:0,&quot;x&quot;:375.140625,&quot;y&quot;:-190.029296875,&quot;strokeColor&quot;:&quot;#000000&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;width&quot;:153,&quot;height&quot;:97,&quot;seed&quot;:1586660869,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;boundElements&quot;:[{&quot;id&quot;:&quot;90yz_m0kH4RaMUXRgR-Br&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Ymxj0WWT&quot;}],&quot;updated&quot;:1724947112689,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;type&quot;:&quot;text&quot;,&quot;version&quot;:117,&quot;versionNonce&quot;:1157096401,&quot;index&quot;:&quot;a3&quot;,&quot;isDeleted&quot;:false,&quot;id&quot;:&quot;Ymxj0WWT&quot;,&quot;fillStyle&quot;:&quot;hachure&quot;,&quot;strokeWidth&quot;:1,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;angle&quot;:0,&quot;x&quot;:411.533450961113,&quot;y&quot;:-154.029296875,&quot;strokeColor&quot;:&quot;#000000&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;width&quot;:80.21434807777405,&quot;height&quot;:25,&quot;seed&quot;:1849985227,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;roundness&quot;:null,&quot;boundElements&quot;:[],&quot;updated&quot;:1724947112689,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:1,&quot;text&quot;:&quot;下一状态&quot;,&quot;rawText&quot;:&quot;下一状态&quot;,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;GZ7hQS78e5Q1siEvK33Lx&quot;,&quot;originalText&quot;:&quot;下一状态&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;type&quot;:&quot;arrow&quot;,&quot;version&quot;:496,&quot;versionNonce&quot;:1840496741,&quot;index&quot;:&quot;a4&quot;,&quot;isDeleted&quot;:false,&quot;id&quot;:&quot;90yz_m0kH4RaMUXRgR-Br&quot;,&quot;fillStyle&quot;:&quot;hachure&quot;,&quot;strokeWidth&quot;:1,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;angle&quot;:0,&quot;x&quot;:38.078125,&quot;y&quot;:-137.1313921370243,&quot;strokeColor&quot;:&quot;#000000&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;width&quot;:325.7734375,&quot;height&quot;:0.6381046601462117,&quot;seed&quot;:343810891,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;boundElements&quot;:[],&quot;updated&quot;:1728746919791,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;XgjAPiQ47fqEwl-LpfWxA&quot;,&quot;gap&quot;:6.33984375,&quot;focus&quot;:0.11513603277860894,&quot;fixedPoint&quot;:null},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;GZ7hQS78e5Q1siEvK33Lx&quot;,&quot;gap&quot;:11.2890625,&quot;focus&quot;:-0.056492919794349276,&quot;fixedPoint&quot;:null},&quot;lastCommittedPoint&quot;:null,&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;points&quot;:[[0,0],[325.7734375,-0.6381046601462117]]},{&quot;type&quot;:&quot;text&quot;,&quot;version&quot;:169,&quot;versionNonce&quot;:617431473,&quot;index&quot;:&quot;a5&quot;,&quot;isDeleted&quot;:false,&quot;id&quot;:&quot;LIFeX9WH&quot;,&quot;fillStyle&quot;:&quot;hachure&quot;,&quot;strokeWidth&quot;:1,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;angle&quot;:0,&quot;x&quot;:95.265625,&quot;y&quot;:-171.51171875,&quot;strokeColor&quot;:&quot;#000000&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;width&quot;:180.88591957092285,&quot;height&quot;:25,&quot;seed&quot;:591423115,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;roundness&quot;:null,&quot;boundElements&quot;:[],&quot;updated&quot;:1724947112689,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:1,&quot;text&quot;:&quot;中间可能过了亿万年&quot;,&quot;rawText&quot;:&quot;中间可能过了亿万年&quot;,&quot;textAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;containerId&quot;:null,&quot;originalText&quot;:&quot;中间可能过了亿万年&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25}],&quot;appState&quot;:{&quot;theme&quot;:&quot;light&quot;,&quot;viewBackgroundColor&quot;:&quot;#ffffff&quot;,&quot;currentItemStrokeColor&quot;:&quot;#000000&quot;,&quot;currentItemBackgroundColor&quot;:&quot;transparent&quot;,&quot;currentItemFillStyle&quot;:&quot;hachure&quot;,&quot;currentItemStrokeWidth&quot;:1,&quot;currentItemStrokeStyle&quot;:&quot;solid&quot;,&quot;currentItemRoughness&quot;:1,&quot;currentItemOpacity&quot;:100,&quot;currentItemFontFamily&quot;:1,&quot;currentItemFontSize&quot;:20,&quot;currentItemTextAlign&quot;:&quot;left&quot;,&quot;currentItemStartArrowhead&quot;:null,&quot;currentItemEndArrowhead&quot;:&quot;arrow&quot;,&quot;currentItemArrowType&quot;:&quot;round&quot;,&quot;scrollX&quot;:257.345703125,&quot;scrollY&quot;:518.73046875,&quot;zoom&quot;:{&quot;value&quot;:1},&quot;currentItemRoundness&quot;:&quot;round&quot;,&quot;gridSize&quot;:20,&quot;gridStep&quot;:5,&quot;gridModeEnabled&quot;:false,&quot;gridColor&quot;:{&quot;Bold&quot;:&quot;rgba(217, 217, 217, 0.5)&quot;,&quot;Regular&quot;:&quot;rgba(230, 230, 230, 0.5)&quot;},&quot;colorPalette&quot;:{},&quot;currentStrokeOptions&quot;:null,&quot;frameRendering&quot;:{&quot;enabled&quot;:true,&quot;clip&quot;:true,&quot;name&quot;:true,&quot;outline&quot;:true},&quot;objectsSnapModeEnabled&quot;:false,&quot;activeTool&quot;:{&quot;type&quot;:&quot;selection&quot;,&quot;customType&quot;:null,&quot;locked&quot;:false,&quot;lastActiveTool&quot;:null}},&quot;files&quot;:{}};InitialData.scrollToContent=true;App=()=&gt;{const e=React.useRef(null),t=React.useRef(null),[n,i]=React.useState({width:void 0,height:void 0});return React.useEffect(()=&gt;{i({width:t.current.getBoundingClientRect().width,height:t.current.getBoundingClientRect().height});const e=()=&gt;{i({width:t.current.getBoundingClientRect().width,height:t.current.getBoundingClientRect().height})};return window.addEventListener(&quot;resize&quot;,e),()=&gt;window.removeEventListener(&quot;resize&quot;,e)},[t]),React.createElement(React.Fragment,null,React.createElement(&quot;div&quot;,{className:&quot;excalidraw-wrapper&quot;,ref:t},React.createElement(ExcalidrawLib.Excalidraw,{ref:e,width:n.width,height:n.height,initialData:InitialData,viewModeEnabled:!0,zenModeEnabled:!0,gridModeEnabled:!1})))},excalidrawWrapper=document.getElementById(&quot;当前状态和下一状态的随想excalidraw.md&quot;);ReactDOM.render(React.createElement(App),excalidrawWrapper);})();&lt;/script&gt;
            </content>
            <link href="https://grove-trees.netlify.app/card/思考/当前状态和下一状态的随想.excalidraw/" />
        </entry>
        <entry>
            <title>
                如何追查线上问题
                
            </title>
            <updated>2024-10-12T15:29:04.000Z</updated>
            <id>https://grove-trees.netlify.app/card/思考/如何追查线上问题/</id>
            <content type="html">
                &lt;h1 id=&quot;如何追查线上问题&quot; tabindex=&quot;-1&quot;&gt;如何追查线上问题&lt;/h1&gt;
&lt;h2 id=&quot;止损优先&quot; tabindex=&quot;-1&quot;&gt;止损优先&lt;/h2&gt;
&lt;p&gt;不能先追查问题根源， 首先应该&lt;code&gt;止损&lt;/code&gt;，不让问题进一步扩大，&lt;code&gt;代码回滚&lt;/code&gt;、&lt;code&gt;服务降级&lt;/code&gt;等都可以起到止损的效果。&lt;br /&gt;
对于止损有一个比较好的实践，新业务或者重构业务上线时，可以加一个 &lt;code&gt;配置开关 &lt;/code&gt;控制是否启用逻辑，在发现有损时，可以及时关掉业务逻辑，比重新上线要快特别多&lt;/p&gt;
&lt;h2 id=&quot;及时通告&quot; tabindex=&quot;-1&quot;&gt;及时通告&lt;/h2&gt;
&lt;p&gt;在问题发生之后，要及时对处理问题的过程进行&lt;code&gt;通告&lt;/code&gt;。特别是应对线上有损的问题时，更应该及时通告。在内部群中，简单描述一下问题与可能的原因，处理的进度。而在外部群里，可以只说一下处理的进度。如果有必要，可以将问题上诉到领导，如果还解决不了问题，可以逐级继续上诉。&lt;/p&gt;
&lt;h1 id=&quot;追查问题的方法&quot; tabindex=&quot;-1&quot;&gt;追查问题的方法&lt;/h1&gt;
&lt;h2 id=&quot;逻辑方法:&quot; tabindex=&quot;-1&quot;&gt;逻辑方法:&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;先收集&lt;code&gt;现象&lt;/code&gt;：业务报错、线上报错日志等&lt;br /&gt;
对紧急的问题来说，需要对线上业务、服务器等非常熟悉，才能迅速收集到有用的报错信息。&lt;/li&gt;
&lt;li&gt;针对现象假设&lt;code&gt;原因&lt;/code&gt;：
&lt;ol&gt;
&lt;li&gt;常见问题依据追查手册&lt;/li&gt;
&lt;li&gt;其他问题保持思路开放，大胆假设&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;是否&lt;code&gt;有损&lt;/code&gt;的判断：&lt;br /&gt;
根据现象假设出可能的原因，判断是否是有损的，如果是有损的问题，参考 &lt;strong&gt;止损优先&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;质疑&lt;/code&gt;所有数据：&lt;br /&gt;
各个数据、监控系统等的有效性也需要质疑，不能完全相信，需要小心求证&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;知识准备&quot; tabindex=&quot;-1&quot;&gt;知识准备&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;对线上各种&lt;code&gt;日志&lt;/code&gt;的熟悉，从日志中能看到具体的问题，比如 nginx 日志 php 日志等&lt;/li&gt;
&lt;li&gt;对线上的各种&lt;code&gt;配置&lt;/code&gt;更要做到心中有数&lt;/li&gt;
&lt;li&gt;对&lt;code&gt;细节&lt;/code&gt;的追查，每次都更细一些，这样才能获得更多的信息&lt;/li&gt;
&lt;li&gt;计算机&lt;code&gt;基本功&lt;/code&gt;，有时问题追查不下去，不是没有线索，而是追查到了一个未知的领域，没有相关的知识，无法追查&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;总结经验&quot; tabindex=&quot;-1&quot;&gt;总结经验&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;成熟的方法落地成&lt;code&gt;工具&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;对问题的追查形成&lt;code&gt;文档&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;问题解决之后&quot; tabindex=&quot;-1&quot;&gt;问题解决之后&lt;/h1&gt;
&lt;p&gt;如果问题解决之后，我们就不再跟进了，那么我们就沦为了解决问题的工具，问题也随之越来越多，解决不完。&lt;br /&gt;
那么，我们可以通过思考以下几点来提升自己&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;线上是否恢复了正常？（&lt;code&gt;最基本的&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;问题的原因是什么？（&lt;code&gt;落到追查文档&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;通过什么手段恢复的？（&lt;code&gt;解决方案&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;怎么可以避免下次再次出现问题？（&lt;code&gt;防患未然&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;除了此次出现的问题，会不会有其他的问题出现（&lt;code&gt;举一反三&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;出现此类问题是否是架构问题造成的？（&lt;code&gt;根本原因&lt;/code&gt;）&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/思考/如何追查线上问题/" />
        </entry>
        <entry>
            <title>
                如何做监控
                
            </title>
            <updated>2024-10-12T15:29:18.000Z</updated>
            <id>https://grove-trees.netlify.app/card/思考/如何做监控/</id>
            <content type="html">
                &lt;h1 id=&quot;如何做监控&quot; tabindex=&quot;-1&quot;&gt;如何做监控&lt;/h1&gt;
&lt;p&gt;监控：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;什么是监控？
&lt;ol&gt;
&lt;li&gt;对&lt;em&gt;线上质量&lt;/em&gt;的一个实时检查&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;重要性
&lt;ol&gt;
&lt;li&gt;发现线上问题（早于用户）&lt;/li&gt;
&lt;li&gt;快速止损、定位&lt;/li&gt;
&lt;li&gt;及时发现隐藏的问题，指导策略优化&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;如何做好监控？
&lt;ol&gt;
&lt;li&gt;监控的流程及内容
&lt;ol&gt;
&lt;li&gt;监控需求提出&lt;/li&gt;
&lt;li&gt;监控需求开发&lt;/li&gt;
&lt;li&gt;监控需求测试&lt;/li&gt;
&lt;li&gt;监控指标确认&lt;/li&gt;
&lt;li&gt;监控报警添加&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;确认监控内容
&lt;ol&gt;
&lt;li&gt;新功能添加监控&lt;/li&gt;
&lt;li&gt;补充监控&lt;/li&gt;
&lt;li&gt;围绕
&lt;ol&gt;
&lt;li&gt;系统正确性&lt;/li&gt;
&lt;li&gt;系统异常&lt;/li&gt;
&lt;li&gt;异常定位&lt;/li&gt;
&lt;li&gt;隐藏问题指导策略&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;监控数据获取
&lt;ol&gt;
&lt;li&gt;打点数据&lt;/li&gt;
&lt;li&gt;日志数据&lt;/li&gt;
&lt;li&gt;数据库数据&lt;/li&gt;
&lt;li&gt;redis 数据&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;监控报警添加
&lt;ol&gt;
&lt;li&gt;监控可视化&lt;/li&gt;
&lt;li&gt;确定触发报警策略&lt;/li&gt;
&lt;li&gt;确定报警频率&lt;/li&gt;
&lt;li&gt;确定报警接收人&lt;/li&gt;
&lt;li&gt;配置监控&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;监控处理
&lt;ol&gt;
&lt;li&gt;收到报警&lt;/li&gt;
&lt;li&gt;问题跟进&lt;/li&gt;
&lt;li&gt;问题周知&lt;/li&gt;
&lt;li&gt;问题处理&lt;/li&gt;
&lt;li&gt;定损&lt;/li&gt;
&lt;li&gt;复盘 &amp;amp; casestudy&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;监控报警优化
&lt;ol&gt;
&lt;li&gt;漏报
&lt;ol&gt;
&lt;li&gt;不同报警类型&lt;/li&gt;
&lt;li&gt;突升突降代替固定阈值&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;无效报警太多（准确率）
&lt;ol&gt;
&lt;li&gt;准确性提升
&lt;ol&gt;
&lt;li&gt;放大时间窗口，屏蔽预期内的单点抖动&lt;/li&gt;
&lt;li&gt;工作日、节假日不同阈值&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;推送方式优化
&lt;ol&gt;
&lt;li&gt;连续失败&lt;/li&gt;
&lt;li&gt;通知间隔&lt;/li&gt;
&lt;li&gt;通知依赖&lt;/li&gt;
&lt;li&gt;不同方式报警（短信、电话）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;报警处理不及时
&lt;ol&gt;
&lt;li&gt;自愈脚本等&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;问题定位
&lt;ol&gt;
&lt;li&gt;流量分析
&lt;ol&gt;
&lt;li&gt;流量细分
&lt;ol&gt;
&lt;li&gt;行业&lt;/li&gt;
&lt;li&gt;地域&lt;/li&gt;
&lt;li&gt;机房&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;系统分析
&lt;ol&gt;
&lt;li&gt;线上出现报错、fatal、pvlost&lt;/li&gt;
&lt;li&gt;例行上线功能影响&lt;/li&gt;
&lt;li&gt;数据变更&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;监控发现有问题之后可以了解一下 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%80%9D%E8%80%83/%E5%A6%82%E4%BD%95%E8%BF%BD%E6%9F%A5%E7%BA%BF%E4%B8%8A%E9%97%AE%E9%A2%98/&quot;&gt;如何追查线上问题&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/思考/如何做监控/" />
        </entry>
        <entry>
            <title>
                202404251145 破解软件的成本如果比较高就不要去花时间破解了
                
            </title>
            <updated>2025-02-18T13:43:13.000Z</updated>
            <id>https://grove-trees.netlify.app/card/思考/202404251145 破解软件的成本如果比较高就不要去花时间破解了/</id>
            <content type="html">
                &lt;h1 id=&quot;202404251145&quot; tabindex=&quot;-1&quot;&gt;202404251145 破解软件的成本如果比较高就不要去花时间破解了&lt;/h1&gt;
&lt;p&gt;你的时间值得去做其他的事情，即使是睡觉 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/202404251146%20%E7%A0%B4%E8%A7%A3mindnode/&quot;&gt;202404251146 破解mindnode&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/思考/202404251145 破解软件的成本如果比较高就不要去花时间破解了/" />
        </entry>
        <entry>
            <title>
                202404171707 当你学不下去的时候
                
            </title>
            <updated>2025-02-14T08:40:58.000Z</updated>
            <id>https://grove-trees.netlify.app/card/思考/202404171707 当你学不下去的时候/</id>
            <content type="html">
                &lt;h1 id=&quot;202404171707&quot; tabindex=&quot;-1&quot;&gt;202404171707 当你学不下去的时候&lt;/h1&gt;
&lt;p&gt;当你学不下去的时候，闭上眼，想象高考刚刚出分，没考上，你崩溃大哭，问能不能再给我一次机会。睁开眼，这就是你新的机会。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/思考/202404171707 当你学不下去的时候/" />
        </entry>
        <entry>
            <title>
                202404082353 取乎其上得乎其中
                
            </title>
            <updated>2025-02-13T04:55:34.000Z</updated>
            <id>https://grove-trees.netlify.app/card/思考/202404082353 取乎其上得乎其中/</id>
            <content type="html">
                &lt;h1 id=&quot;202404082353&quot; tabindex=&quot;-1&quot;&gt;202404082353 取乎其上得乎其中&lt;/h1&gt;
&lt;p&gt;将目标定的高一些，最后的结果可能是中间的效果。目标是通过卡片【笔记】【写作】法创作几十本书出来，那么最后应该是可以写出来一本书的吧。&lt;/p&gt;
&lt;p&gt;就如同这个视频中说的，将卡片笔记法一直践行下去：&lt;/p&gt;
&lt;div class=&quot;transclusion internal-embed is-loaded&quot;&gt;&lt;div class=&quot;markdown-embed&quot;&gt;
&lt;h1 id=&quot;神奇的笔记法！你也能轻松开始写作【卡片笔记写作法】 - 哔哩哔哩&quot; tabindex=&quot;-1&quot;&gt;神奇的笔记法！你也能轻松开始写作【卡片笔记写作法】 - 哔哩哔哩&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#Omnivore&quot;&gt;#Omnivore&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://omnivore.app/me/-1927ff742c7&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Read on Omnivore&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.bilibili.com/read/cv13952736/?jump_opus=1&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Read Original&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;Notes&lt;/h2&gt;
&lt;/div&gt;&lt;/div&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/思考/202404082353 取乎其上得乎其中/" />
        </entry>
        <entry>
            <title>
                搜索引擎技巧
                
            </title>
            <updated>2024-09-08T04:37:46.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/搜索引擎技巧/</id>
            <content type="html">
                &lt;h1 id=&quot;搜索引擎技巧&quot; tabindex=&quot;-1&quot;&gt;搜索引擎技巧&lt;/h1&gt;
&lt;p&gt;在使用搜索时，可选用的几个参数&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;双引号限定关键词 &lt;code&gt;图片&amp;quot;你好&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;intitle 标题关键词 &lt;code&gt;intitle:你好&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;allintitle 多个标题关键词 &lt;code&gt;allintitle:你好 世界&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;intext 内容关键词 &lt;code&gt;intext:世界&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;inurl 网址关键词 &lt;code&gt;inurl:nginx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;site 限定网站域名 &lt;code&gt;site:github.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;imagesize 限定尺寸 &lt;code&gt;imagesize:1920x1080 风景&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;filetype 文件格式 &lt;code&gt;filetype:pdf OR filetype:doc 机器学习教程&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/搜索引擎技巧/" />
        </entry>
        <entry>
            <title>
                各种资源国内镜像
                
            </title>
            <updated>2025-02-06T03:26:40.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/各种资源国内镜像/</id>
            <content type="html">
                &lt;h1 id=&quot;各种资源国内镜像&quot; tabindex=&quot;-1&quot;&gt;各种资源国内镜像&lt;/h1&gt;
&lt;p&gt;出现了一个杀死比赛的工具：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/RubyMetric/chsrc&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;RubyMetric/chsrc: chsrc 全平台通用换源工具与框架. Change Source everywhere for every software&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;使用: chsrc &amp;lt;command&amp;gt; [options] [target] [mirror]

help                      # 打印此帮助，或 h, -h, --help
issue                     # 查看相关issue

list (或 ls, 或 l)        # 列出可用镜像源，和可换源目标
list mirror/target        # 列出可用镜像源，或可换源目标
list os/lang/ware         # 列出可换源的操作系统/编程语言/软件

measure &amp;lt;target&amp;gt;          # 对该目标所有源测速
cesu    &amp;lt;target&amp;gt;

list &amp;lt;target&amp;gt;             # 查看该目标可用源与支持功能
get  &amp;lt;target&amp;gt;             # 查看该目标当前源的使用情况

set  &amp;lt;target&amp;gt;             # 换源，自动测速后挑选最快源
set  &amp;lt;target&amp;gt;  first      # 换源，使用维护团队测速第一的源
set  &amp;lt;target&amp;gt; &amp;lt;mirror&amp;gt;    # 换源，指定使用某镜像站 (通过list命令查看)
set  &amp;lt;target&amp;gt; https://url # 换源，用户自定义源URL
reset &amp;lt;target&amp;gt;            # 重置，使用上游默认使用的源

选项:
-dry                      # Dry Run，模拟换源过程，命令仅打印并不运行
-local                    # 仅对某项目而非全局换源 (仅部分软件如bundler,pdm支持)
-ipv6                     # 使用IPv6测速
-en(glish)                # 使用英文输出
-no-color                 # 无颜色输出
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/各种资源国内镜像/" />
        </entry>
        <entry>
            <title>
                创建一个chrome独立APP窗口
                
            </title>
            <updated>2025-01-21T09:27:50.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/创建一个chrome独立APP窗口/</id>
            <content type="html">
                &lt;h1 id=&quot;chrome-app&quot; tabindex=&quot;-1&quot;&gt;创建一个chrome独立APP窗口&lt;/h1&gt;
&lt;p&gt;创建出的窗口本质还是一个 chrome 网页，但是比较方便使用&lt;/p&gt;
&lt;p&gt;按步骤操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击 chrome 右上角的三个点&lt;/li&gt;
&lt;li&gt;点击保存并分享&lt;/li&gt;
&lt;li&gt;点击创建快捷方式&lt;/li&gt;
&lt;li&gt;在弹窗中勾选 &lt;code&gt;在窗口打开&lt;/code&gt;，点击创建&lt;/li&gt;
&lt;li&gt;即可得到一个独立 APP 窗口&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-02-27_159.png&quot; alt=&quot;clop_2024-02-27_159.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;弹窗出来之后，选择 &lt;code&gt;在窗口中打开&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-02-27_160.png&quot; alt=&quot;clop_2024-02-27_160.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;就会得到一个独立软件一样的百度&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-02-27_161.png&quot; alt=&quot;clop_2024-02-27_161.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h2&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/创建一个chrome独立APP窗口/" />
        </entry>
        <entry>
            <title>
                vscode vim 状态下显示提示
                
            </title>
            <updated>2025-02-13T04:59:33.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/vscode vim 状态下显示提示/</id>
            <content type="html">
                &lt;h1 id=&quot;vscode-vim&quot; tabindex=&quot;-1&quot;&gt;vscode vim 状态下显示提示&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/32279384/keyboard-shortcut-to-show-hover-tooltip#:~:text=The%20trick%20is%20timing.,CMD%2FCtrl%20%2B%20press%20K.&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;visual studio code - Keyboard shortcut to show hover tooltip - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&#39;re using the VSCodeVim plugin, you can use &lt;code&gt;gh&lt;/code&gt; to show the tooltip. &lt;a href=&quot;https://stackoverflow.com/a/66860229&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如下图所示，光标所在位置，平常是需要鼠标移动刀红色波浪线位置后才出现这个提示，在使用&lt;code&gt;VSCodeVim&lt;/code&gt;的情况下，按下&lt;code&gt;gh&lt;/code&gt;可以调出此弹窗快速查看错误提示信息&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240319112212.png&quot; alt=&quot;Pasted image 20240319112212.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/vscode vim 状态下显示提示/" />
        </entry>
        <entry>
            <title>
                vscode git 只暂存部分改动
                
            </title>
            <updated>2024-02-29T15:41:01.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/vscode git 只暂存部分改动/</id>
            <content type="html">
                &lt;h1 id=&quot;vscode-git&quot; tabindex=&quot;-1&quot;&gt;vscode git 只暂存部分改动&lt;/h1&gt;
&lt;p&gt;可以只暂存这部分改动&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020230619133256.png&quot; alt=&quot;Pasted image 20230619133256.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/34730585/how-can-i-commit-some-changes-to-a-file-but-not-others-in-vscode&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;visual studio code - How can I commit some changes to a file, but not others, in VSCode? - Stack Overflow&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/vscode git 只暂存部分改动/" />
        </entry>
        <entry>
            <title>
                vim显示列分隔符
                
            </title>
            <updated>2024-04-18T08:06:19.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/vim显示列分隔符/</id>
            <content type="html">
                &lt;h1 id=&quot;vim&quot; tabindex=&quot;-1&quot;&gt;vim显示列分隔符&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;:set list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显示 &lt;code&gt;tab&lt;/code&gt; 和结尾符号 &lt;code&gt;$&lt;/code&gt;，不显示开头的 &lt;code&gt;^&lt;/code&gt; 符号&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020221207155541.png&quot; alt=&quot;Pasted image 20221207155541.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/vim显示列分隔符/" />
        </entry>
        <entry>
            <title>
                phpstorm 两下 ctrl 可以快速运行程序
                
            </title>
            <updated>2024-03-19T03:19:05.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/phpstorm 两下 ctrl 可以快速运行程序/</id>
            <content type="html">
                &lt;h1 id=&quot;phpstorm-ctrl&quot; tabindex=&quot;-1&quot;&gt;phpstorm 两下 ctrl 可以快速运行程序&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201127112108.png&quot; alt=&quot;Pasted image 20201127112108.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;phpstorm&lt;/code&gt; 中的工具栏中，有一个绿色的按钮，可以运行已经定义好的配置&lt;/p&gt;
&lt;p&gt;但是每次切换的时候，都需要点一下切换到具体的程序&lt;/p&gt;
&lt;p&gt;但是如果双击 &lt;code&gt;ctrl&lt;/code&gt; 就可以直接弹出运行的搜索栏&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201127112303.png&quot; alt=&quot;Pasted image 20201127112303.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在搜索栏中输入你想运行的程序，上下键选中，然后 &lt;code&gt;enter&lt;/code&gt; 即可运行&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/phpstorm 两下 ctrl 可以快速运行程序/" />
        </entry>
        <entry>
            <title>
                mermaid 图表自动生成
                
            </title>
            <updated>2025-01-16T05:35:31.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/mermaid 图表自动生成/</id>
            <content type="html">
                &lt;h1 id=&quot;mermaid&quot; tabindex=&quot;-1&quot;&gt;mermaid 图表自动生成&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.min2k.com/tools/mermaid/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.min2k.com/tools/mermaid/&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/mermaid 图表自动生成/" />
        </entry>
        <entry>
            <title>
                marginnote 使用方法
                
            </title>
            <updated>2024-10-21T08:57:13.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/marginnote/marginnote 使用方法/</id>
            <content type="html">
                &lt;h1 id=&quot;marginnote&quot; tabindex=&quot;-1&quot;&gt;marginnote 使用方法&lt;/h1&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 标记&lt;/h2&gt;
&lt;p&gt;跟红绿灯联系起来，应该会比较好记住&lt;/p&gt;
&lt;p&gt;红色：理解并记住&lt;br /&gt;
黄色：理解&lt;br /&gt;
绿色：了解&lt;br /&gt;
灰色：稍微注意一下&lt;/p&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 网页内容剪藏&lt;/h2&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/202409021102%20marginnote%20%E4%BB%8E%20Web%20%E7%BD%91%E9%A1%B5%E5%AF%BC%E5%85%A5%E5%86%85%E5%AE%B9/&quot;&gt;202409021102 marginnote 从 Web 网页导入内容&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/marginnote/marginnote 使用方法/" />
        </entry>
        <entry>
            <title>
                marginnote 实现阅读历史跳转
                
            </title>
            <updated>2024-10-21T04:48:12.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/marginnote 实现阅读历史跳转/</id>
            <content type="html">
                &lt;h1 id=&quot;marginnote&quot; tabindex=&quot;-1&quot;&gt;marginnote 实现阅读历史跳转&lt;/h1&gt;
&lt;p&gt;进入系统设置=键盘=快捷键=App快捷键&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020220827233551.png&quot; alt=&quot;Pasted image 20220827233551.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bbs.marginnote.cn/t/topic/1241&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;【全局自定义快捷键方法】MarginNote 3 阅读跳转的 Back 功能快捷键 - 方法、技巧、工作流 - MarginNote 中文社区&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/marginnote 实现阅读历史跳转/" />
        </entry>
        <entry>
            <title>
                网易云音乐mac端回退到2.x版本
                
            </title>
            <updated>2025-02-13T15:08:44.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/mac/网易云音乐mac端回退到2.x版本/</id>
            <content type="html">
                &lt;h1 id=&quot;mac-2-x&quot; tabindex=&quot;-1&quot;&gt;网易云音乐mac端回退到2.x版本&lt;/h1&gt;
&lt;p&gt;3.x版本，进入播放页面时，还需要滑动一下（非常吃力的滑动），才能看到精彩评论&lt;/p&gt;
&lt;p&gt;决定回退到老版本&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://music.163.com/#/download&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://music.163.com/#/download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020250213230806.png&quot; alt=&quot;怀旧版客户端&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/mac/网易云音乐mac端回退到2.x版本/" />
        </entry>
        <entry>
            <title>
                接入外置键盘时如何关掉内置键盘
                
            </title>
            <updated>2024-09-26T10:50:58.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/mac/接入外置键盘时如何关掉内置键盘/</id>
            <content type="html">
                &lt;h1 id=&quot;接入外置键盘时如何关掉内置键盘&quot; tabindex=&quot;-1&quot;&gt;接入外置键盘时如何关掉内置键盘&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;下载： &lt;a href=&quot;https://karabiner-elements.pqrs.org/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Karabiner-Elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;连接外接设备后，点击 &lt;code&gt;Disable the built-in keyboard while this device is connected&lt;/code&gt; 后面的按钮，即可达到此功能&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240926184907.png&quot; alt=&quot;Pasted image 20240926184907.png|500&quot; width=&quot;500px&quot; /&gt;&lt;/li&gt;
&lt;li&gt;我主要是用在外置键盘放到mac键盘上面，防止误触&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/mac/接入外置键盘时如何关掉内置键盘/" />
        </entry>
        <entry>
            <title>
                mac-鼠须管-使用lua脚本
                
            </title>
            <updated>2024-09-26T07:32:50.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/mac/mac-鼠须管-使用lua脚本/</id>
            <content type="html">
                &lt;h1 id=&quot;mac-lua&quot; tabindex=&quot;-1&quot;&gt;mac-鼠须管-使用lua脚本&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;lua&lt;/code&gt; 目录中，添加脚本，以 &lt;code&gt;date&lt;/code&gt; 日期文件为例：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;--[[
date_translator: 将 `date` 翻译为当前日期

translator 的功能是将分好段的输入串翻译为一系列候选项。

欲定义的 translator 包含三个输入参数：
 - input: 待翻译的字符串
 - seg: 包含 `start` 和 `_end` 两个属性，分别表示当前串在输入框中的起始和结束位置
 - env: 可选参数，表示 translator 所处的环境（本例没有体现）

translator 的输出是若干候选项。
与通常的函数使用 `return` 返回不同，translator 要求您使用 `yield` 产生候选项。

`yield` 每次只能产生一个候选项。有多个候选时，可以多次使用 `yield` 。

请看如下示例：
--]]

local function translator(input, seg)
   -- 如果输入串为 `date` 则翻译
   if (input == &amp;quot;date&amp;quot; or input == &amp;quot;shijian&amp;quot;) then
      --[[ 用 `yield` 产生一个候选项
           候选项的构造函数是 `Candidate`，它有五个参数：
            - type: 字符串，表示候选项的类型
            - start: 候选项对应的输入串的起始位置
            - _end:  候选项对应的输入串的结束位置
            - text:  候选项的文本
            - comment: 候选项的注释
       --]]
      yield(Candidate(&amp;quot;date&amp;quot;, seg.start, seg._end, os.date(&amp;quot;%Y年%m月%d日&amp;quot;), &amp;quot;日期&amp;quot;))
      --[[ 用 `yield` 再产生一个候选项
           最终的效果是输入法候选框中出现两个格式不同的当前日期的候选项。
      --]]
      yield(Candidate(&amp;quot;date&amp;quot;, seg.start, seg._end, os.date(&amp;quot;%Y-%m-%d&amp;quot;), &amp;quot;日期&amp;quot;))
      yield(Candidate(&amp;quot;date&amp;quot;, seg.start, seg._end, os.date(&amp;quot;%Y-%m-%d %H:%M:%S&amp;quot;), &amp;quot;日期时间&amp;quot;))
   end
end

-- 将上述定义导出
return translator

&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;rime.lua&lt;/code&gt; 中引入此脚本:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- date_translator: 将 `date` 翻译为当前日期
-- 详见 `lua/date.lua`:
date_translator = require(&amp;quot;date&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;double_pinyin.custom.yaml&lt;/code&gt; 或 &lt;code&gt;double_pinyin.schema.yaml&lt;/code&gt; 中配置上此处理程序&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;  engine/translators:
    - lua_translator@date_translator
    - lua_translator@week_translator
    - lua_translator@time_translator
    - lua_translator@number_translator
    - lua_translator@reverse_lookup_filter
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;最终效果&quot; tabindex=&quot;-1&quot;&gt;最终效果&lt;/h1&gt;
&lt;h2 id=&quot;1-date&quot; tabindex=&quot;-1&quot;&gt;1 date&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/%E9%BC%A0%E9%A1%BB%E7%AE%A1-date%E6%95%88%E6%9E%9C%2020211226003919.png&quot; alt=&quot;鼠须管-date效果 20211226003919.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-time&quot; tabindex=&quot;-1&quot;&gt;2 time&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/%E9%BC%A0%E9%A1%BB%E7%AE%A1-time%E6%95%88%E6%9E%9C%2020211226004010.png&quot; alt=&quot;鼠须管-time效果 20211226004010.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;3-number&quot; tabindex=&quot;-1&quot;&gt;3 number&lt;/h2&gt;
&lt;p&gt;输入 &lt;code&gt;/&lt;/code&gt; ，然后输入数字 &lt;code&gt;1&lt;/code&gt;，会显示大写数字&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/%E9%BC%A0%E9%A1%BB%E7%AE%A1-%E6%95%B0%E5%AD%97%E5%B1%95%E7%A4%BA%E6%95%88%E6%9E%9C%2020211226012849.png&quot; alt=&quot;鼠须管-数字展示效果 20211226012849.png&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hchunhui/librime-lua&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/hchunhui/librime-lua&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/mac/mac-鼠须管-使用lua脚本/" />
        </entry>
        <entry>
            <title>
                mac-获取程序名称-系统名称
                
            </title>
            <updated>2024-09-26T07:32:07.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/mac/mac-获取程序名称-系统名称/</id>
            <content type="html">
                &lt;h1 id=&quot;mac&quot; tabindex=&quot;-1&quot;&gt;mac-获取程序名称-系统名称&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#mac&quot;&gt;#mac&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/%E6%B4%BB%E5%8A%A8%E7%9B%91%E8%A7%86%E5%99%A8-%E5%8F%96%E6%A0%B7%E8%BF%9B%E7%A8%8B.png&quot; alt=&quot;活动监视器-取样进程.png|300&quot; width=&quot;300px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 raycast 中，可以更方便的取到进程名称，如，图中软件 copy 出来之后是： &lt;code&gt;com.culturedcode.ThingsMac&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020231129223443.png&quot; alt=&quot;Pasted image 20231129223443.png|500&quot; width=&quot;500px&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/%E6%B4%BB%E5%8A%A8%E7%9B%91%E8%A7%86%E5%99%A8-%E7%A8%8B%E5%BA%8F%E5%90%8D%E7%A7%B0.png&quot; alt=&quot;活动监视器-程序名称.png|600&quot; width=&quot;600px&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/mac/mac-获取程序名称-系统名称/" />
        </entry>
        <entry>
            <title>
                mac-自定义快捷键
                
            </title>
            <updated>2024-11-05T04:49:57.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/mac/mac-自定义快捷键/</id>
            <content type="html">
                &lt;h1 id=&quot;mac&quot; tabindex=&quot;-1&quot;&gt;mac-自定义快捷键&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020221116142140.png&quot; alt=&quot;Pasted image 20221116142140.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/mac/mac-自定义快捷键/" />
        </entry>
        <entry>
            <title>
                mac-合上盖子不断网
                
            </title>
            <updated>2024-09-26T07:31:56.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/mac/mac-合上盖子不断网/</id>
            <content type="html">
                &lt;h1 id=&quot;mac&quot; tabindex=&quot;-1&quot;&gt;mac-合上盖子不断网&lt;/h1&gt;
&lt;p&gt;将电池的设置 【唤醒以供网络访问】改成【始终】就会生效了&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020230203154729.png&quot; alt=&quot;Pasted image 20230203154729.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/mac/mac-合上盖子不断网/" />
        </entry>
        <entry>
            <title>
                202506172251 mac 强制程序使用代理
                
            </title>
            <updated>2025-06-17T14:53:59.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/mac/202506172251 mac 强制程序使用代理/</id>
            <content type="html">
                &lt;h1 id=&quot;202506172251-mac&quot; tabindex=&quot;-1&quot;&gt;202506172251 mac 强制程序使用代理&lt;/h1&gt;
&lt;p&gt;不知道为什么有时候 obsidian 无法使用到代理&lt;/p&gt;
&lt;p&gt;可以在命令行启动&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
open /Applications/Obsidian.app
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以使用到代理了&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/mac/202506172251 mac 强制程序使用代理/" />
        </entry>
        <entry>
            <title>
                202404231624 如何在 Finder 中拷贝文件路径全称
                
            </title>
            <updated>2024-10-12T10:33:06.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/mac/202404231624 如何在 Finder 中拷贝文件路径全称/</id>
            <content type="html">
                &lt;h1 id=&quot;202404231624-finder&quot; tabindex=&quot;-1&quot;&gt;202404231624 如何在 Finder 中拷贝文件路径全称&lt;/h1&gt;
&lt;p&gt;在文件上右键，按住 opt 键，点击&amp;quot;将xxx拷贝为路径名称&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240427203958.png&quot; alt=&quot;Pasted image 20240427203958.png|526&quot; width=&quot;526px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;拷贝为下面的字符串：&lt;/p&gt;
&lt;p&gt;/Users/wudanyang/Downloads/WeTypeInstaller_1.1.0_322.zip&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/mac/202404231624 如何在 Finder 中拷贝文件路径全称/" />
        </entry>
        <entry>
            <title>
                ithoughtx破产了
                
            </title>
            <updated>2024-09-14T07:53:04.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/ithoughtx破产了/</id>
            <content type="html">
                &lt;h1 id=&quot;ithoughtx&quot; tabindex=&quot;-1&quot;&gt;ithoughtx破产了&lt;/h1&gt;
&lt;p&gt;ithoughtx 思维导图软件的公司 &lt;a href=&quot;https://www.toketaware.com/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;toketaWare&lt;/a&gt; 破产了。一个十几年的软件公司就这么没了，这个软件我觉得是非常好用的。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.toketaware.com/about&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.toketaware.com/about&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240914155303.png&quot; alt=&quot;Pasted image 20240914155303.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/ithoughtx破产了/" />
        </entry>
        <entry>
            <title>
                ai-动画制作
                
            </title>
            <updated>2025-06-05T12:57:59.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/ai-动画制作/</id>
            <content type="html">
                &lt;h1 id=&quot;ai&quot; tabindex=&quot;-1&quot;&gt;ai-动画制作&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://sketch.metademolab.com/canvas&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Animated Drawings | Meta FAIR&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/ai-动画制作/" />
        </entry>
        <entry>
            <title>
                202506171613 vscode 如何粘贴文件不覆盖
                
            </title>
            <updated>2025-06-17T15:07:42.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/202506171613 vscode 如何粘贴文件不覆盖/</id>
            <content type="html">
                &lt;h1 id=&quot;202506171613-vscode&quot; tabindex=&quot;-1&quot;&gt;202506171613 vscode 如何粘贴文件不覆盖&lt;/h1&gt;
&lt;p&gt;vscode 配置， Incremental Naming   选 default =&amp;gt; simple&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020250617230716.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重复文件自动命名&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/202506171613 vscode 如何粘贴文件不覆盖/" />
        </entry>
        <entry>
            <title>
                202409022100 things3 与 mac 备忘录联动
                
            </title>
            <updated>2024-09-02T14:07:50.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/202409022100 things3 与 mac 备忘录联动/</id>
            <content type="html">
                &lt;h1 id=&quot;202409022100-things3-mac&quot; tabindex=&quot;-1&quot;&gt;202409022100 things3 与 mac 备忘录联动&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240902210102.png&quot; alt=&quot;Pasted image 20240902210102.png|511&quot; width=&quot;511px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在备忘录中选择【添加App链接】后，当打开对应的页面时，对应的备忘录会在右下角露出一个小图标&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240902210326.png&quot; alt=&quot;Pasted image 20240902210326.png|521&quot; width=&quot;521px&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/202409022100 things3 与 mac 备忘录联动/" />
        </entry>
        <entry>
            <title>
                202409021102 marginnote 从 Web 网页导入内容
                
            </title>
            <updated>2024-09-26T07:30:40.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/202409021102 marginnote 从 Web 网页导入内容/</id>
            <content type="html">
                &lt;h1 id=&quot;202409021102-marginnote-web&quot; tabindex=&quot;-1&quot;&gt;202409021102 marginnote 从 Web 网页导入内容&lt;/h1&gt;
&lt;p&gt;选择学习集或文件夹，点击导入按钮，选择【从Web网页】&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240902110611.png&quot; alt=&quot;Pasted image 20240902110611.png|492&quot; width=&quot;492px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用原始的页面样式，会比较难看，但是 MN 没有抓取页面部分的功能&lt;/p&gt;
&lt;p&gt;有一个折中方案，拖动右边的边框，将软件框变小，就变成了下面这样的图片，会比较好看一些&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240902110726.png&quot; alt=&quot;Pasted image 20240902110726.png|312&quot; width=&quot;312px&quot; /&gt;&lt;br /&gt;
点击软件下面中间的按钮，下载下来即可&lt;/p&gt;
&lt;p&gt;有时候代码片段等渲染不是很好 &lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240902110953.png&quot; alt=&quot;Pasted image 20240902110953.png|332&quot; width=&quot;332px&quot; /&gt;&lt;br /&gt;
这种情况只能使用 chrome 截图来解决了，在chrome中，可以开启开发者工具进行长截图&lt;/p&gt;
&lt;div class=&quot;transclusion internal-embed is-loaded&quot;&gt;&lt;div class=&quot;markdown-embed&quot;&gt;
&lt;h1 id=&quot;chrome&quot; tabindex=&quot;-1&quot;&gt;利用 Chrome 原生工具进行网页长截图 - 一日一技 - 少数派&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#Omnivore&quot;&gt;#Omnivore&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://omnivore.app/me/chrome-1915a0dcd73&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Read on Omnivore&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sspai.com/post/42193&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Read Original&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;notes&quot; tabindex=&quot;-1&quot;&gt;Notes&lt;/h2&gt;
&lt;/div&gt;&lt;/div&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/202409021102 marginnote 从 Web 网页导入内容/" />
        </entry>
        <entry>
            <title>
                202405081331 mac 鼠须管 - rime 如何使用命令行执行同步操作
                
            </title>
            <updated>2024-09-25T16:07:16.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/202405081331 mac 鼠须管 - rime 如何使用命令行执行同步操作/</id>
            <content type="html">
                &lt;h1 id=&quot;202405081331-mac-rime&quot; tabindex=&quot;-1&quot;&gt;202405081331 mac 鼠须管 - rime 如何使用命令行执行同步操作&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;/Library/Input&#92; Methods/Squirrel.app/Contents/MacOS/Squirrel --sync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置一个定时任务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;# crontab -e
0 22 * * * /Library/Input&#92; Methods/Squirrel.app/Contents/MacOS/Squirrel --sync
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/202405081331 mac 鼠须管 - rime 如何使用命令行执行同步操作/" />
        </entry>
        <entry>
            <title>
                202404251146 破解mindnode
                
            </title>
            <updated>2024-10-21T08:49:53.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/202404251146 破解mindnode/</id>
            <content type="html">
                &lt;h1 id=&quot;202404251146-mindnode&quot; tabindex=&quot;-1&quot;&gt;202404251146 破解mindnode&lt;/h1&gt;
&lt;p&gt;下载mindnode：&lt;br /&gt;
MindNode Pro 2023.3.1 思维导图工具 - 精品MAC应用分享&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://xclient.info/s/mind-node-pro.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://xclient.info/s/mind-node-pro.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如遇：&lt;code&gt;「xxx.app已损坏，打不开。你应该将它移到废纸篓」&lt;/code&gt;，请参考：&lt;a href=&quot;https://xclient.info/a/b4d2370e-f0e0-8011-aa0e-81391ad11d1f.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;《新手常见问题》&lt;/a&gt;中“下载好的DMG 打不开”第二项中内容；如果仅是部分TNT软件闪退打不开，参考&lt;a href=&quot;https://xclient.info/a/e66ab41a-62a9-cbe6-656c-f818044cd738.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;《修复TNT和谐软件闪退问题》&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/202404251146 破解mindnode/" />
        </entry>
        <entry>
            <title>
                10x程序员工作法
                
            </title>
            <updated>2024-10-12T15:16:46.000Z</updated>
            <id>https://grove-trees.netlify.app/card/工具/10x程序员工作法/</id>
            <content type="html">
                &lt;h1 id=&quot;10x&quot; tabindex=&quot;-1&quot;&gt;10x程序员工作法&lt;/h1&gt;
&lt;h2 id=&quot;1-content&quot; tabindex=&quot;-1&quot;&gt;1 Content&lt;/h2&gt;
&lt;h3 id=&quot;1-1&quot; tabindex=&quot;-1&quot;&gt;1.1 以终为始&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;倒着想&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;DoD（Definition of Done 完成的定义）
&lt;ul&gt;
&lt;li&gt;弥合差异&lt;/li&gt;
&lt;li&gt;个人的DoD，团队的DoD&lt;/li&gt;
&lt;li&gt;DoD 是一个思维模式，是一种尽可能消除不确定性，达成共识的方式。&lt;/li&gt;
&lt;li&gt;DoD 让我们能够在一开始就把“终”清晰地定义出来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在做任何事之前，先定义完成的标准。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;用户故事（User Story）
&lt;ul&gt;
&lt;li&gt;标题&lt;/li&gt;
&lt;li&gt;概述&lt;/li&gt;
&lt;li&gt;详述&lt;/li&gt;
&lt;li&gt;验收标准&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在做任何需求或任务之前，先定好验收标准。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;持续集成
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;尽早提交代码去集成。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精益创业：产品经理不靠谱，你该怎么办？&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;MVP 最小可行产品&lt;/li&gt;
&lt;li&gt;比较早成型的面向不确定创造新事物的方法论是精益创业，它提出了“开发（build）-测量（measure）-认知（learn）”这样一个反馈循环和最小可行产品的概念。&lt;br /&gt;
如何试出来经过验证的认知 &lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240419163240.png&quot; alt=&quot;Pasted image 20240419163240.png&quot; /&gt;&lt;/li&gt;
&lt;li&gt;精益创业提供给我们的是一个做产品的思考框架，我们能够接触到的大多数产品都可以放在这个框架内思考。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认所有需求都不做，直到弄清楚为什么要做这件事。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;上下文
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;扩大自己工作的上下文，别把自己局限在一个“程序员”的角色上。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在动手做一件事之前，先推演一番。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;数字衡量
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;从数字中发现问题，让系统更稳定。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问一下自己，我的工作是不是可以用数字衡量。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;开发前的准备
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;设计你的迭代0清单，给自己的项目做体检。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1-2&quot; tabindex=&quot;-1&quot;&gt;1.2 任务分解&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;动手做一个工作之前，请先对它进行任务分解。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;测试
&lt;ul&gt;
&lt;li&gt;测试模型：冰淇淋蛋卷： &lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/1ac9ed05304d4009a1064dae764f1592.jpg&quot; alt=&quot;img&quot; /&gt;&lt;/li&gt;
&lt;li&gt;金字塔模型：&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/28d88fea0c894ba19321c844fe4d31ab.jpg&quot; alt=&quot;img&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小事反馈周期短，而大事反馈周期长。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多写单元测试。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;我们应该编写可测的代码。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;将任务拆小，越小越好。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按照完整实现一个需求的顺序去安排分解出来的任务。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;什么是好的测试
&lt;ul&gt;
&lt;li&gt;怎么衡量测试是否做好了呢？有一个标准：A-TRIP，这是五个单词的缩写，分别是Automatic（自动化）、Thorough（全面）、Repeatable（可重复的）、Independent（独立的）和 Professional（专业的）。&lt;/li&gt;
&lt;li&gt;要想写好测试，就要写简单的测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;需求分解
&lt;ul&gt;
&lt;li&gt;需求估算-大小标准&lt;/li&gt;
&lt;li&gt;发现大的需求，一个迭代内做不完&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;想要管理好需求，先把需求拆小。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;尽量做最重要的事。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;做好产品开发，最可行的方式是采用 MVP。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1-3&quot; tabindex=&quot;-1&quot;&gt;1.3 沟通反馈&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对齐？信息对齐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通过沟通反馈，不断升级自己的编解码能力。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用业务的语言写代码。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多面对面沟通，少开会。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多尝试用可视化的方式进行沟通。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期复盘，找准问题根因，不断改善。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多走近用户。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事情往前做，有问题尽早暴露。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;金字塔原理 &lt;img src=&quot;https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/10x%e7%a8%8b%e5%ba%8f%e5%91%98%e5%b7%a5%e4%bd%9c%e6%b3%95/assets/afdfd15d142d4732a2b6b87f4dae4450.jpg&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多输出，让知识更有结构。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1-4&quot; tabindex=&quot;-1&quot;&gt;1.4 自动化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;请谨慎地将工作自动化。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有体系地学习运维知识。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;将验收测试自动化。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把函数写短。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;&lt;strong&gt;构建好你的领域模型。&lt;/strong&gt;&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用简单技术解决问题，直到问题变复杂。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;学习领域驱动设计。再去拆分微服务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1-5&quot; tabindex=&quot;-1&quot;&gt;1.5 综合&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;了解一个项目，从大图景开始。&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;业务&lt;/li&gt;
&lt;li&gt;技术&lt;/li&gt;
&lt;li&gt;团队运作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小步改造遗留系统，不要回到老路上。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;什么叫 T 型人？简言之，一专多能。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在学习区工作和成长。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-reference&quot; tabindex=&quot;-1&quot;&gt;2 Reference&lt;/h2&gt;
&lt;h3 id=&quot;2-1-a-href-https-learn-lianglianglee-com-e4-b8-93-e6-a0-8f-10x-e7-a8-8b-e5-ba-8f-e5-91-98-e5-b7-a5-e4-bd-9c-e6-b3-95-39-20-e9-9d-a2-e5-af-b9-e9-81-97-e7-95-99-e7-b3-bb-e7-bb-9f-ef-bc-8c-e4-bd-a0-e5-ba-94-e8-af-a5-e8-bf-99-e6-a0-b7-e5-81-9a-md-target-blank-class-external-link-39-a&quot; tabindex=&quot;-1&quot;&gt;2.1 &lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;39 面对遗留系统，你应该这样做&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;2-2-a-href-https-learn-lianglianglee-com-e4-b8-93-e6-a0-8-f-10x-e7-a8-8-b-e5-ba-8-f-e5-91-98-e5-b7-a5-e4-bd-9-c-e6-b3-95-e6-80-bb-e5-a4-8-d-e4-b9-a0-20-e9-87-8-d-e6-96-b0-e6-9-d-a5-e2-80-9-c-e7-9-c-8-b-e4-b9-a6-e2-80-9-d-md-target-blank-class-external-link-https-learn-lianglianglee-com-10x-md-a&quot; tabindex=&quot;-1&quot;&gt;2.2 &lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;https://learn.lianglianglee.com/专栏/10x程序员工作法/总复习 重新来“看书”.md&lt;/a&gt;&lt;/h3&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/工具/10x程序员工作法/" />
        </entry>
        <entry>
            <title>
                202409022041 神经网络过拟合了怎么办？
                
            </title>
            <updated>2024-10-12T14:17:56.000Z</updated>
            <id>https://grove-trees.netlify.app/card/学习/202409022041 神经网络过拟合了怎么办？/</id>
            <content type="html">
                &lt;h1 id=&quot;202409022041&quot; tabindex=&quot;-1&quot;&gt;202409022041 神经网络过拟合了怎么办？&lt;/h1&gt;
&lt;p&gt;(2 封私信 / 25 条消息) 【寻径06】如何突破学习瓶颈，为何打了10年游戏还是那么菜？ - 知乎: &lt;a href=&quot;https://www.zhihu.com/zvideo/1447996778805714944?utm_source=ZHShareTargetIDMore&amp;amp;utm_medium=social&amp;amp;utm_oi=649223696263417856&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.zhihu.com/zvideo/1447996778805714944?utm_source=ZHShareTargetIDMore&amp;amp;utm_medium=social&amp;amp;utm_oi=649223696263417856&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240902204142.png&quot; alt=&quot;Pasted image 20240902204142.png&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对应到人身上，
&lt;ul&gt;
&lt;li&gt;第一个基本是别想了&lt;/li&gt;
&lt;li&gt;第二个是最好的方法&lt;/li&gt;
&lt;li&gt;第三个没看懂什么意思，不知道怎么操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/学习/202409022041 神经网络过拟合了怎么办？/" />
        </entry>
        <entry>
            <title>
                如果一生只读6本书，推荐哪几本？
                
            </title>
            <updated>2025-02-06T15:05:29.000Z</updated>
            <id>https://grove-trees.netlify.app/card/如果一生只读6本书，推荐哪几本？/</id>
            <content type="html">
                &lt;h1 id=&quot;6&quot; tabindex=&quot;-1&quot;&gt;如果一生只读6本书，推荐哪几本？&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;嗯，用户问如果一生只能读六本书，推荐哪几本。这个问题看起来简单，但实际上要考虑很多因素。首先，得确定用户的需求是什么。他们可能是在寻找能够全面涵盖人生不同方面的书籍，或者希望这些书能带来深刻的思考和长久的价值。不过，也有可能用户只是想要一些经典中的经典，节省时间，直接读最有价值的书。

接下来要考虑的是书籍的多样性和覆盖领域。文学、哲学、科学、心理学、历史、个人成长这些方面都应该涵盖到，这样才能全面。但六本的数量限制很大，必须精选再精选。比如，文学方面可能选一本小说，哲学选一本基础又深刻的，科学选一本能改变世界观的书，心理学选理解人性的，历史选宏观视角的，个人成长选实用又有深度的。

然后，得想哪些书是经久不衰的，被广泛认可的。比如《活着》这样的中国文学作品，反映了人性和历史，可能比较合适。哲学方面，《苏菲的世界》作为入门书，可能更适合大众，但如果是更深刻的，可能选《存在与时间》之类的，但后者可能太难了。科学方面，《人类简史》虽然不算纯科学，但综合了历史和社会科学，容易引发思考。心理学的话，《思考，快与慢》是行为经济学的经典，但像《影响力》可能更实用。历史可能需要一本更宏观的，比如《枪炮、病菌与钢铁》。个人成长方面，《少有人走的路》结合心理学，可能比《高效能人士的七个习惯》更有深度。

还要考虑不同文化和视角的平衡。比如《百年孤独》代表拉美文学，《沉思录》是西方古典哲学，《道德经》则是东方智慧。这样组合起来，可能更全面。但六本的限制下，可能需要更精炼的选择。

另外，用户可能的背景也很重要。如果是普通读者，可能需要易懂且启发性强的书；如果是学术型，可能需要更专业的著作。但问题中没有说明，所以得假设是普通读者，希望这些书既有深度又不过于晦涩。

然后，还要考虑每本书的独特性和不可替代性。比如《1984》这样的反乌托邦小说，探讨权力与自由，可能比一般小说更具思想性。或者《小王子》这样的寓言，虽然简短但深刻，适合不同年龄层。

不过，可能有些书虽然经典，但内容有重叠。比如《人类简史》和《枪炮、病菌与钢铁》都涉及历史发展，可能需要选其一。或者哲学方面，《道德经》和《沉思录》都是哲学，但来自不同传统，可以互补。

还要考虑书籍的可读性和影响力。比如《百年孤独》虽然文学价值高，但魔幻现实主义可能让部分读者难以进入。而《活着》相对更易读，情感冲击力强。

最后，综合这些因素，可能需要平衡文学、哲学、科学、心理学、历史和个人成长，每类一本，同时兼顾东西方视角，既有小说也有非虚构，既有理论也有实用建议。可能最终的推荐需要覆盖这些方面，同时每本书都能引发深层次的思考，具有持久的影响力。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果一生只能读6本书，我会推荐涵盖哲学、人性、科学、文学、历史与生活智慧的经典，兼顾东西方思想平衡与深度。以下是我的精选书单及理由：&lt;/p&gt;
&lt;h2 id=&quot;1-strong-strong&quot; tabindex=&quot;-1&quot;&gt;1. &lt;strong&gt;《道德经》&lt;/strong&gt;（老子）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心价值&lt;/strong&gt;：东方哲学之源&lt;br /&gt;
这部5000字的短篇浓缩了道家对自然、社会与生命的终极思考。&amp;quot;上善若水&amp;quot;的柔性智慧、&amp;quot;无为而无不为&amp;quot;的辩证思维，在当代社会竞争中提供反直觉的生存策略。相比西方哲学的系统性，它更像思维种子，每次重读都能在人生不同阶段萌芽新解。&lt;/p&gt;
&lt;h2 id=&quot;2-strong-strong&quot; tabindex=&quot;-1&quot;&gt;2. &lt;strong&gt;《卡拉马佐夫兄弟》&lt;/strong&gt;（陀思妥耶夫斯基）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心价值&lt;/strong&gt;：人性的百科全书&lt;br /&gt;
这部未完成的巨著通过弑父案展开信仰与理性的终极辩论。伊万&amp;quot;宗教大法官&amp;quot;的寓言直指自由与幸福的悖论，阿廖沙的圣徒之路展现救赎可能。书中每个角色都是人性碎片的放大镜，读它等于经历一次灵魂解剖实验。&lt;/p&gt;
&lt;h2 id=&quot;3-strong-strong&quot; tabindex=&quot;-1&quot;&gt;3. &lt;strong&gt;《存在与时间》&lt;/strong&gt;（海德格尔）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心价值&lt;/strong&gt;：现代性困境的解码&lt;br /&gt;
这部晦涩的哲学经典揭示了&amp;quot;被抛入世&amp;quot;的生存本质。当技术理性将人异化为工具，海德格尔提出的&amp;quot;向死而生&amp;quot;与&amp;quot;本真性生存&amp;quot;，为焦虑的现代人提供了存在主义锚点。建议搭配《禅与摩托车维修艺术》辅助理解。&lt;/p&gt;
&lt;h2 id=&quot;4-strong-strong&quot; tabindex=&quot;-1&quot;&gt;4. &lt;strong&gt;《哥德尔、艾舍尔、巴赫》&lt;/strong&gt;（侯世达）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心价值&lt;/strong&gt;：认知科学的元思考&lt;br /&gt;
这部跨界奇书通过数学、音乐与艺术的互文，揭示自我意识与智能的本质。书中&amp;quot;怪圈&amp;quot;概念预示了后来的人工智能困境，读三次才能初窥门径：第一次被创意震撼，第二次理解形式系统，第三次看见认知的边界。&lt;/p&gt;
&lt;h2 id=&quot;5-strong-strong&quot; tabindex=&quot;-1&quot;&gt;5. &lt;strong&gt;《黑天鹅》&lt;/strong&gt;（塔勒布）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心价值&lt;/strong&gt;：不确定时代的生存指南&lt;br /&gt;
在概率统治的现代世界，本书颠覆了传统认知框架。作者提出的&amp;quot;反脆弱&amp;quot;概念比&amp;quot;韧性&amp;quot;更具建设性，建议配合《易经》对照阅读，你会发现概率思维与东方变易哲学的奇妙共鸣。&lt;/p&gt;
&lt;h2 id=&quot;6-strong-strong&quot; tabindex=&quot;-1&quot;&gt;6. &lt;strong&gt;《追忆似水年华》&lt;/strong&gt;（普鲁斯特）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;核心价值&lt;/strong&gt;：时间维度的生命实验&lt;br /&gt;
这部意识流巨著不是小说，而是用文字构建的时间晶体。当玛德琳蛋糕的味道触发记忆洪流，普鲁斯特示范了如何从碎片中重建生命整体性。建议五十岁后重读，你会惊觉它预言了每个人的记忆重构过程。&lt;/p&gt;
&lt;h2 id=&quot;选书逻辑：&quot; tabindex=&quot;-1&quot;&gt;选书逻辑：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;思维维度互补&lt;/strong&gt;：覆盖形而上（道德经）、存在论（海德格尔）、认知科学（GEB）、概率哲学（黑天鹅）四重思维框架&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时空平衡&lt;/strong&gt;：东方智慧（道德经）与西方理性（存在与时间）对冲，历史纵深（追忆）与未来预见（黑天鹅）交织&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阅读挑战梯度&lt;/strong&gt;：从叙事文本（卡拉马佐夫）渐进到哲学思辨（存在与时间），最终抵达意识流的认知极限（追忆）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这6本书构成完整的思维生态系统：前3本锻造认知武器，后3本提供应用场景。每十年重读一次，随着阅历增长，同一文本会显现不同维度的智慧，如同六面棱镜折射出人生的光谱。真正的经典不是答案之书，而是培养提出关键问题能力的思维催化剂。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/如果一生只读6本书，推荐哪几本？/" />
        </entry>
        <entry>
            <title>
                202404151420 哲学的分支
                
            </title>
            <updated>2024-10-12T09:05:31.000Z</updated>
            <id>https://grove-trees.netlify.app/card/哲学/202404151420 哲学的分支/</id>
            <content type="html">
                &lt;h1 id=&quot;202404151420&quot; tabindex=&quot;-1&quot;&gt;202404151420 哲学的分支&lt;/h1&gt;
&lt;p&gt;哲学是一个广泛的学科，包含多个分支，除了形而上学之外，还包括以下主要领域：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;认识论（Epistemology）&lt;/strong&gt;：研究知识的性质、起源、范围和极限。认识论探讨我们如何知道什么是真实的，什么可以被认为是知识，以及我们如何获取知识。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;伦理学（Ethics）&lt;/strong&gt;：探讨行为的道德性，即什么是对的，什么是错的。伦理学涉及到道德原则、价值观和好的生活方式的探讨。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;逻辑学（Logic）&lt;/strong&gt;：研究有效推理的原则。逻辑学关注于如何构建有效的论证，以及如何区分有效论证和无效论证。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;政治哲学（Political Philosophy）&lt;/strong&gt;：探讨政府、公民、政治权利、公正、法律、自由、正义等概念。政治哲学试图理解人类社会和政治结构的理想形态。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;美学（Aesthetics）&lt;/strong&gt;：研究美和艺术的本质、经验和价值。美学涵盖了艺术作品的创造、欣赏和批评等方面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;存在主义（Existentialism）&lt;/strong&gt;：虽然更多被视为哲学的一个流派，但存在主义对个体存在、自由和选择的探讨对整个哲学领域有深远影响。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;心灵哲学（Philosophy of Mind）&lt;/strong&gt;：研究心灵本质、心灵与身体的关系等问题。心灵哲学试图理解意识、感觉、感知和思维的本质。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;语言哲学（Philosophy of Language）&lt;/strong&gt;：探索语言的本质、使用以及语言与现实之间的关系。语言哲学关注如何通过语言表达思想以及语言如何影响我们的理解和认识世界。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;科学哲学（Philosophy of Science）&lt;/strong&gt;：分析科学的方法、目的和理论基础。它探讨了科学如何工作，以及科学知识的性质和局限性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这些领域相互交织，共同构成了哲学这一广泛的学科。每个领域都有其特定的研究问题和方法，但它们共同探讨人类知识和存在的基本问题。&lt;/p&gt;
&lt;p&gt;形而上学是哲学的一个核心分支，&lt;strong&gt;它探讨现实的最基本结构和本质&lt;/strong&gt;。 词语“形而上学”（Metaphysics）源自拉丁语“Metaphysica”，最早可追溯到亚里士多德的作品集，意味着“超越自然之学”。形而上学关注那些超越物理科学研究范畴的问题，试图理解和解释存在的根本性质、宇宙的本质、事物存在的原因以及它们是如何存在的。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/哲学/202404151420 哲学的分支/" />
        </entry>
        <entry>
            <title>
                20240415141933 什么是哲学
                
            </title>
            <updated>2024-10-12T05:38:19.000Z</updated>
            <id>https://grove-trees.netlify.app/card/哲学/20240415141933 什么是哲学/</id>
            <content type="html">
                &lt;h1 id=&quot;20240415141933&quot; tabindex=&quot;-1&quot;&gt;20240415141933 什么是哲学&lt;/h1&gt;
&lt;p&gt;哲学是在探究根本性的问题，【为什么】这个问题要问到根本&lt;/p&gt;
&lt;p&gt;比如，为什么要吃饭，因为要活着，为什么活着。。。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/哲学/20240415141933 什么是哲学/" />
        </entry>
        <entry>
            <title>
                生成
                
            </title>
            <updated>2024-04-16T15:18:10.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/生成/</id>
            <content type="html">
                &lt;p&gt;tags: &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#how-to-learn&quot;&gt;#how-to-learn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一句话简单描述：自己想出一个答案，如果错了就给出反馈，纠正答案&lt;/p&gt;
&lt;h1 id=&quot;生成&quot; tabindex=&quot;-1&quot;&gt;生成&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;自己想出答案&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;认知天性&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/生成/" />
        </entry>
        <entry>
            <title>
                20240417103919 卡片盒笔记法的标题是对内容的一句话描述
                
            </title>
            <updated>2024-10-12T14:44:01.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/20240417103919 卡片盒笔记法的标题是对内容的一句话描述/</id>
            <content type="html">
                &lt;h1 id=&quot;20240417103919&quot; tabindex=&quot;-1&quot;&gt;20240417103919 卡片盒笔记法的标题是对内容的一句话描述&lt;/h1&gt;
&lt;p&gt;补充 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011192023%20-%20%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%85%83%E7%B4%A0/&quot;&gt;202011192023 - 卡片盒笔记法的基本元素&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/20240417103919 卡片盒笔记法的标题是对内容的一句话描述/" />
        </entry>
        <entry>
            <title>
                20240408201701 卡片盒笔记法
                
            </title>
            <updated>2024-10-12T15:45:41.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/20240408201701 卡片盒笔记法/</id>
            <content type="html">
                &lt;h1 id=&quot;20240408201701&quot; tabindex=&quot;-1&quot;&gt;20240408201701 卡片盒笔记法&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#zettelkasten&quot;&gt;#zettelkasten&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011192022%20-%20%E4%BB%80%E4%B9%88%E6%98%AF%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/&quot;&gt;202011192022 - 什么是卡片盒笔记法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011201016%20-%20%E4%BB%80%E4%B9%88%E6%98%AF%E7%9F%A5%E8%AF%86%E5%92%8C%E4%BF%A1%E6%81%AF/&quot;&gt;202011201016 - 什么是知识和信息&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011201301%20-%20%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5/&quot;&gt;202011201301 - 基础概念&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011192023%20-%20%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%85%83%E7%B4%A0/&quot;&gt;202011192023 - 卡片盒笔记法的基本元素&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011210003%20-%20%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%B5%81%E7%A8%8B/&quot;&gt;202011210003 - 卡片盒笔记法的基本流程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011201315%20-%20%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95%E4%B8%BB%E8%A6%81%E5%85%B3%E6%B3%A8%E4%BB%80%E4%B9%88/&quot;&gt;202011201315 - 卡片盒笔记法主要关注什么&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zhihu.com/question/384309878/answer/1120682799&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;什么是 zettelkasten 笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.jimmylv.info/2020-06-03-zettelkasten-in-action/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;基于 obsidian 的 zettelkasten 实践&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flynngao.github.io/2020/07/18/zettelkasten-1&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;拆解Zettelkasten | 卡片盒知识管理体系实践反思&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/136427760&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;聪明人怎么做笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://book.douban.com/subject/30216624/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;卡片盒笔记法豆瓣小组&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/20240408201701 卡片盒笔记法/" />
        </entry>
        <entry>
            <title>
                202404081818 为什么建立笔记时要指明原因
                
            </title>
            <updated>2024-10-12T15:45:36.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202404081818 为什么建立笔记时要指明原因/</id>
            <content type="html">
                &lt;h1 id=&quot;202404081818&quot; tabindex=&quot;-1&quot;&gt;202404081818 为什么建立笔记时要指明原因&lt;/h1&gt;
&lt;p&gt;建立笔记连接的同时，还需要指明原因，不然回顾的时候会感觉到困惑&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;p&gt;什么是知识： &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011222324%20-%20%E7%9F%A5%E8%AF%86/&quot;&gt;202011222324 - 知识&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在链接前面增加解释语言&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202404081818 为什么建立笔记时要指明原因/" />
        </entry>
        <entry>
            <title>
                202404081701 针对过时的想法怎么处理
                
            </title>
            <updated>2024-10-12T15:45:15.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202404081701 针对过时的想法怎么处理/</id>
            <content type="html">
                &lt;h1 id=&quot;202404081701&quot; tabindex=&quot;-1&quot;&gt;202404081701 针对过时的想法怎么处理&lt;/h1&gt;
&lt;p&gt;一些过时的想法，该删就删，别犹豫&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202404081701 针对过时的想法怎么处理/" />
        </entry>
        <entry>
            <title>
                202404081646 卡片笔记应该记录什么
                
            </title>
            <updated>2024-10-12T15:45:03.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202404081646 卡片笔记应该记录什么/</id>
            <content type="html">
                &lt;h1 id=&quot;202404081646&quot; tabindex=&quot;-1&quot;&gt;202404081646 卡片笔记应该记录什么&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/20240408201701%20%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/&quot;&gt;20240408201701 卡片盒笔记法&lt;/a&gt; 应该是记录知识&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011222324%20-%20%E7%9F%A5%E8%AF%86/&quot;&gt;202011222324 - 知识&lt;/a&gt;而不是&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011222325%20-%20%E4%BF%A1%E6%81%AF/&quot;&gt;202011222325 - 信息&lt;/a&gt; 的&lt;/p&gt;
&lt;p&gt;知识，也许应该就是想法，思考，或者闪念&lt;/p&gt;
&lt;p&gt;但是信息怎么记录呢？记录到哪里呢？比较有疑问&lt;/p&gt;
&lt;h2 id=&quot;1-reference&quot; tabindex=&quot;-1&quot;&gt;1 Reference&lt;/h2&gt;
&lt;p&gt;卢曼卡片盒笔记法介绍 (Introduction to the Zettelkasten Method) • Zettelkasten Method: &lt;a href=&quot;https://zettelkasten.de/introduction/zh/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://zettelkasten.de/introduction/zh/&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202404081646 卡片笔记应该记录什么/" />
        </entry>
        <entry>
            <title>
                202011230004 - 如何写出容易理解的卡片
                
            </title>
            <updated>2025-02-13T04:56:42.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011230004 - 如何写出容易理解的卡片/</id>
            <content type="html">
                &lt;p&gt;tags: &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#zettelkasten&quot;&gt;#zettelkasten&lt;/a&gt; &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#communicate&quot;&gt;#communicate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一句话简单描述这张卡片：几年之后，你可能无法理解这张卡片，&lt;br /&gt;
那么如何能做到更容易理解呢？&lt;/p&gt;
&lt;h1 id=&quot;202011230004&quot; tabindex=&quot;-1&quot;&gt;202011230004 - 如何写出容易理解的卡片&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;一个好的标题，可以是一种注释&lt;/li&gt;
&lt;li&gt;第一句话应该是关于此卡片的&lt;/li&gt;
&lt;li&gt;写的话要简单&lt;/li&gt;
&lt;li&gt;你是在教育你的卡片盒，他会在以后的某个时间点出来跟你对话&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;想象一下，你是在跟以后的自己在对话&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://zettelkasten.de/posts/how-to-write-notes-you-can-understand/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://zettelkasten.de/posts/how-to-write-notes-you-can-understand/&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011230004 - 如何写出容易理解的卡片/" />
        </entry>
        <entry>
            <title>
                202011222338 - 使用卡片盒笔记法输出的流程
                
            </title>
            <updated>2024-04-21T03:08:27.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011222338 - 使用卡片盒笔记法输出的流程/</id>
            <content type="html">
                &lt;p&gt;tags: &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#output&quot;&gt;#output&lt;/a&gt; &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#process&quot;&gt;#process&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;202011222338&quot; tabindex=&quot;-1&quot;&gt;202011222338 - 使用卡片盒笔记法输出的流程&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;整体看一下相关的知识&lt;/li&gt;
&lt;li&gt;为写作列出需要的大纲&lt;/li&gt;
&lt;li&gt;把永久笔记放到大纲中&lt;/li&gt;
&lt;li&gt;使用更多的知识（研究）填补空白，重复3-4步，直到满意为止&lt;/li&gt;
&lt;li&gt;根据提纲复制笔记到文档中&lt;/li&gt;
&lt;li&gt;重写你的手稿&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://zettelkasten.de/posts/ease-into-writing/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://zettelkasten.de/posts/ease-into-writing/&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011222338 - 使用卡片盒笔记法输出的流程/" />
        </entry>
        <entry>
            <title>
                202011222325 - 信息
                
            </title>
            <updated>2024-07-03T16:06:51.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011222325 - 信息/</id>
            <content type="html">
                &lt;h1 id=&quot;202011222325&quot; tabindex=&quot;-1&quot;&gt;202011222325 - 信息&lt;/h1&gt;
&lt;p&gt;信息是死的，一系列数据的陈列&lt;/p&gt;
&lt;p&gt;信息是 what/when/where/who&lt;/p&gt;
&lt;p&gt;信息是你应该被告诉什么是事情&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011222325 - 信息/" />
        </entry>
        <entry>
            <title>
                202011222324 - 知识
                
            </title>
            <updated>2024-05-14T06:26:19.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011222324 - 知识/</id>
            <content type="html">
                &lt;h1 id=&quot;202011222324&quot; tabindex=&quot;-1&quot;&gt;202011222324 - 知识&lt;/h1&gt;
&lt;p&gt;知识拿到之后，能让你有借鉴意义，能指导你的下一步工作，是活的&lt;/p&gt;
&lt;p&gt;知识是 how/why&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011222324 - 知识/" />
        </entry>
        <entry>
            <title>
                202011222310 - 卡片盒笔记法的模块
                
            </title>
            <updated>2024-02-01T04:53:19.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011222310 - 卡片盒笔记法的模块/</id>
            <content type="html">
                &lt;h1 id=&quot;202011222310&quot; tabindex=&quot;-1&quot;&gt;202011222310 - 卡片盒笔记法的模块&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Inbox&lt;/li&gt;
&lt;li&gt;Archive&lt;/li&gt;
&lt;li&gt;Reference Database&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201122231637.png&quot; alt=&quot;Pasted image 20201122231637.png| 总体流程&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Information is the Basic Unit of Your Throughput&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果没有输入，那么知识库就不会成长&lt;/p&gt;
&lt;p&gt;如果没有输出，那么知识库的增长就毫无意义&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://zettelkasten.de/posts/zettelkasten-building-blocks/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;卡片盒的构建模块&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011222310 - 卡片盒笔记法的模块/" />
        </entry>
        <entry>
            <title>
                202011222209 - 卡片盒笔记法的步骤
                
            </title>
            <updated>2024-04-17T05:14:30.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011222209 - 卡片盒笔记法的步骤/</id>
            <content type="html">
                &lt;h1 id=&quot;202011222209&quot; tabindex=&quot;-1&quot;&gt;202011222209 - 卡片盒笔记法的步骤&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201122220943.png&quot; alt=&quot;Pasted image 20201122220943.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;卡片盒笔记法的步骤？&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011210003%20-%20%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%B5%81%E7%A8%8B/&quot;&gt;202011210003 - 卡片盒笔记法的基本流程&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.jimmylv.info/2020-06-03-zettelkasten-in-action/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://blog.jimmylv.info/2020-06-03-zettelkasten-in-action/&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011222209 - 卡片盒笔记法的步骤/" />
        </entry>
        <entry>
            <title>
                202011220028 - 从输出的角度看卡片盒笔记法的优势
                
            </title>
            <updated>2024-04-21T03:01:11.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011220028 - 从输出的角度看卡片盒笔记法的优势/</id>
            <content type="html">
                &lt;h1 id=&quot;202011220028&quot; tabindex=&quot;-1&quot;&gt;202011220028 - 从输出的角度看卡片盒笔记法的优势&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;从输出层面看，如果你在写作的时候才去找资料，那么很容易脱离主线，而如果你之前都整理好了资料，那么在写作的时候，只要顺着自己的卡片写下去就行了&lt;/li&gt;
&lt;li&gt;在输出的时候能够补全自己的盲点&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/20240408201701%20%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/&quot;&gt;20240408201701 卡片盒笔记法&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zhihu.com/search?type=content&amp;amp;q=Zettelkasten&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.zhihu.com/search?type=content&amp;amp;q=Zettelkasten&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011220028 - 从输出的角度看卡片盒笔记法的优势/" />
        </entry>
        <entry>
            <title>
                202011210003 - 卡片盒笔记法的基本流程
                
            </title>
            <updated>2024-04-17T05:13:13.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011210003 - 卡片盒笔记法的基本流程/</id>
            <content type="html">
                &lt;h1 id=&quot;202011210003&quot; tabindex=&quot;-1&quot;&gt;202011210003 - 卡片盒笔记法的基本流程&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#process&quot;&gt;#process&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;记录：将自己的想法记录到临时卡片&lt;/li&gt;
&lt;li&gt;提炼：阅读书籍、资料的时候将内容记录到临时卡片&lt;/li&gt;
&lt;li&gt;参考：将参考目录加上一个简介&lt;/li&gt;
&lt;li&gt;整理：将记录的临时卡片和文献卡片通过链接联系起来
&lt;ol&gt;
&lt;li&gt;建立链接，看一下你的永久笔记，有哪些能连接起来&lt;/li&gt;
&lt;li&gt;提炼&lt;mark&gt;索引&lt;/mark&gt;&lt;/li&gt;
&lt;li&gt;建立&lt;mark&gt;入口&lt;/mark&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;回顾：定期进行回顾，通过双向链接回顾全篇文章&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;产出&lt;/mark&gt;：将卡片内容产出成文章
&lt;ol&gt;
&lt;li&gt;选定一个主题，沿着链接将内容(链接)提炼出来&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011210003 - 卡片盒笔记法的基本流程/" />
        </entry>
        <entry>
            <title>
                202011201315 - 卡片盒笔记法主要关注什么
                
            </title>
            <updated>2024-04-20T16:07:54.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011201315 - 卡片盒笔记法主要关注什么/</id>
            <content type="html">
                &lt;h1 id=&quot;202011201315&quot; tabindex=&quot;-1&quot;&gt;202011201315 - 卡片盒笔记法主要关注什么&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;链接 linking&lt;/li&gt;
&lt;li&gt;回顾 recalling&lt;/li&gt;
&lt;li&gt;索引 indexing&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=e3YKQ7JTqwU&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Zettelkasten In Notion &amp;amp; How I Use Its Principles&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011201315 - 卡片盒笔记法主要关注什么/" />
        </entry>
        <entry>
            <title>
                202011201301 - 基础概念
                
            </title>
            <updated>2024-04-16T14:35:51.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011201301 - 基础概念/</id>
            <content type="html">
                &lt;h1 id=&quot;202011201301&quot; tabindex=&quot;-1&quot;&gt;202011201301 - 基础概念&lt;/h1&gt;
&lt;h2 id=&quot;四种卡片&quot; tabindex=&quot;-1&quot;&gt;四种卡片&lt;/h2&gt;
&lt;ol id=&quot;0fnr3ul&quot;&gt;
&lt;li&gt;&lt;mark&gt;临时卡片&lt;/mark&gt;，把自己的&lt;mark&gt;想法&lt;/mark&gt;记录下来&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;文献卡片&lt;/mark&gt;，看书或者其他信息，觉得自己能用到就记录下来，注意，用自己的话来描述，不能复制粘贴或者剪藏&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;永久卡片&lt;/mark&gt;，将临时笔记和文献笔记组织成文，找出笔记之间的联系，将笔记放到卡片盒中&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;项目卡片&lt;/mark&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;两种卡片盒&quot; tabindex=&quot;-1&quot;&gt;两种卡片盒&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;知识卡片盒&lt;/li&gt;
&lt;li&gt;文献笔记盒&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011201301 - 基础概念/" />
        </entry>
        <entry>
            <title>
                202011201016 - 什么是知识和信息
                
            </title>
            <updated>2024-04-27T12:32:55.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011201016 - 什么是知识和信息/</id>
            <content type="html">
                &lt;h1 id=&quot;202011201016&quot; tabindex=&quot;-1&quot;&gt;202011201016 - 什么是知识和信息&lt;/h1&gt;
&lt;div class=&quot;transclusion internal-embed is-loaded&quot;&gt;&lt;a class=&quot;markdown-embed-link&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011222324%20-%20%E7%9F%A5%E8%AF%86/&quot; aria-label=&quot;Open link&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-link&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;div class=&quot;markdown-embed&quot;&gt;
&lt;h1 id=&quot;202011222324&quot; tabindex=&quot;-1&quot;&gt;202011222324 - 知识&lt;/h1&gt;
&lt;p&gt;知识拿到之后，能让你有借鉴意义，能指导你的下一步工作，是活的&lt;/p&gt;
&lt;p&gt;知识是 how/why&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;transclusion internal-embed is-loaded&quot;&gt;&lt;a class=&quot;markdown-embed-link&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/202011222325%20-%20%E4%BF%A1%E6%81%AF/&quot; aria-label=&quot;Open link&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-link&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;div class=&quot;markdown-embed&quot;&gt;
&lt;h1 id=&quot;202011222325&quot; tabindex=&quot;-1&quot;&gt;202011222325 - 信息&lt;/h1&gt;
&lt;p&gt;信息是死的，一系列数据的陈列&lt;/p&gt;
&lt;p&gt;信息是 what/when/where/who&lt;/p&gt;
&lt;p&gt;信息是你应该被告诉什么是事情&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;transclusion internal-embed is-loaded&quot;&gt;&lt;div class=&quot;markdown-embed&quot;&gt;
&lt;blockquote&gt;
&lt;p&gt;信息是回答“when，where，what，who”的问题，形成回答某个特定问题的文本，以及被解释具有某些意义的数字、事实、图像等形式的信息，更多关注对事实和数据的陈述。而知识是回答“how，why”的问题，能移积极地指导任务的执行和管理，进行决策和解决问题，更多关注人们如何解释信息的经验、偏见、运用的法则和价值标准。知识与信息的效用处于并列地位，没有层次之分。 &lt;a href=&quot;https://omnivore.app/me/-18efbfe2e54#fb1c5abf-53a8-47cd-9f4a-52e1c0b9abba&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;⤴️&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;&lt;/div&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011201016 - 什么是知识和信息/" />
        </entry>
        <entry>
            <title>
                202011192023 - 卡片盒笔记法的基本元素
                
            </title>
            <updated>2024-09-24T11:00:29.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011192023 - 卡片盒笔记法的基本元素/</id>
            <content type="html">
                &lt;h1 id=&quot;202011192023&quot; tabindex=&quot;-1&quot;&gt;202011192023 - 卡片盒笔记法的基本元素&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;唯一 id ， id后面的标题： &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95/20240417103919%20%E5%8D%A1%E7%89%87%E7%9B%92%E7%AC%94%E8%AE%B0%E6%B3%95%E7%9A%84%E6%A0%87%E9%A2%98%E6%98%AF%E5%AF%B9%E5%86%85%E5%AE%B9%E7%9A%84%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%8F%8F%E8%BF%B0/&quot;&gt;20240417103919 卡片盒笔记法的标题是对内容的一句话描述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;tags 标签&lt;/li&gt;
&lt;li&gt;内容
&lt;ol&gt;
&lt;li&gt;links 连接到其他的笔记&lt;/li&gt;
&lt;li&gt;content，使用自己的话写下这个想法&lt;/li&gt;
&lt;li&gt;citation，引用，这个想法是从哪里得到的&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;参考（对书籍等信息的参考）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201119205351.png&quot; alt=&quot;attachs/Pasted image 20201119205351.png&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The most important aspect of the body of the Zettel is that you write it in your own words.&lt;/p&gt;
&lt;/blockquote&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011192023 - 卡片盒笔记法的基本元素/" />
        </entry>
        <entry>
            <title>
                202011192022 - 什么是卡片盒笔记法
                
            </title>
            <updated>2024-04-16T15:15:08.000Z</updated>
            <id>https://grove-trees.netlify.app/card/卡片盒笔记法/202011192022 - 什么是卡片盒笔记法/</id>
            <content type="html">
                &lt;h1 id=&quot;202011192022&quot; tabindex=&quot;-1&quot;&gt;202011192022 - 什么是卡片盒笔记法&lt;/h1&gt;
&lt;p&gt;卡片盒笔记法是德国的一个社会学家发明的&lt;/p&gt;
&lt;p&gt;是一种处理笔记的流程&lt;/p&gt;
&lt;p&gt;将自己的想法感悟收集起来，&lt;br /&gt;
然后使用卡片盒笔记法进行整理，&lt;br /&gt;
建立笔记之间的联系&lt;/p&gt;
&lt;p&gt;以便于以后检索和使用&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/卡片盒笔记法/202011192022 - 什么是卡片盒笔记法/" />
        </entry>
        <entry>
            <title>
                redis-rdb 文件分析
                
            </title>
            <updated>2024-10-07T04:15:55.000Z</updated>
            <id>https://grove-trees.netlify.app/card/redis/redis-rdb 文件分析/</id>
            <content type="html">
                &lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/redis/202011281031%20-%20%E5%AE%89%E8%A3%85%20rdbtools%20%E5%B7%A5%E5%85%B7/&quot;&gt;202011281031 - 安装 rdbtools 工具&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;redis-rdb&quot; tabindex=&quot;-1&quot;&gt;redis-rdb 文件分析&lt;/h1&gt;
&lt;h2 id=&quot;code-help-code&quot; tabindex=&quot;-1&quot;&gt;命令行工具使用，先看 &lt;code&gt;--help&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;usage: usage: rdb [options] /path/to/dump.rdb

Example : rdb --command json -k &amp;quot;user.*&amp;quot; /var/redis/6379/dump.rdb

positional arguments:
  dump_file             RDB Dump file to process

optional arguments:
  -h, --help            show this help message and exit
  -c CMD, --command CMD     
                        Command to execute. Valid commands are json, diff,
                        justkeys, justkeyvals, memory and protocol
  -f FILE, --file FILE  Output file
  -n DBS, --db DBS      Database Number. Multiple databases can be provided.
                        If not specified, all databases will be included.
  -k KEYS, --key KEYS   Keys to export. This can be a regular expression
  -o NOT_KEYS, --not-key NOT_KEYS
                        Keys Not to export. This can be a regular expression
  -t TYPES, --type TYPES
                        Data types to include. Possible values are string,
                        hash, set, sortedset, list. Multiple typees can be
                        provided. If not specified, all data types will be
                        returned
  -b BYTES, --bytes BYTES
                        Limit memory output to keys greater to or equal to
                        this value (in bytes)
  -l LARGEST, --largest LARGEST
                        Limit memory output to only the top N keys (by size)
  -e {raw,print,utf8,base64}, --escape {raw,print,utf8,base64}
                        Escape strings to encoding: raw (default), print,
                        utf8, or base64.
  -x, --no-expire       With protocol command, remove expiry from all keys
  -a N, --amend-expire N
                        With protocol command, add N seconds to key expiry
                        time
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数解析&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;-c 执行命令 输出不同格式的数据
&lt;ol&gt;
&lt;li&gt;json; 输出 json 格式的字符串  如： &lt;code&gt;[{&amp;quot;int&amp;quot;:&amp;quot;1&amp;quot;}]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;diff; 导出可供 diff 、kdiff 、 vimdiff  比较的数据&lt;/li&gt;
&lt;li&gt;justkeys; 只输出 key&lt;/li&gt;
&lt;li&gt;justkeyvals; 只输出键值对，以空格分隔&lt;/li&gt;
&lt;li&gt;memory; 输出内存分布状态&lt;/li&gt;
&lt;li&gt;protocol; 输出原始的 RESP 协议&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;-f 指定输出到文件&lt;/li&gt;
&lt;li&gt;-n 指定输出的 db&lt;/li&gt;
&lt;li&gt;-k 指定输出哪些 key; 可以使用正则表达式， 如： &lt;code&gt;&#39;^users_&#92;d+$&#39;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;-o 排除哪些 key; 可以使用正则表达式&lt;/li&gt;
&lt;li&gt;-t 指定输出 value 的类型&lt;/li&gt;
&lt;li&gt;-b 指定大于此字节数的 key 输出&lt;/li&gt;
&lt;li&gt;-l 输出最大的多少个 key&lt;/li&gt;
&lt;li&gt;-e 转义字符串到其他格式
&lt;ol&gt;
&lt;li&gt;raw 原始字符串&lt;/li&gt;
&lt;li&gt;print&lt;/li&gt;
&lt;li&gt;utf8 输出原始 utf8 格式字符串&lt;/li&gt;
&lt;li&gt;base64 对于二进制数据来说，可以先 base64 存储到文件，然后在程序中 decode 出来&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;-x 在导出 RESP 协议内容时，去掉过期时间&lt;/li&gt;
&lt;li&gt;-a 导出 RESP 协议内容时，给有过期时间的 key 加上几秒钟过期时间&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面看一下一些常见用法：&lt;/p&gt;
&lt;h2 id=&quot;生成内存报告&quot; tabindex=&quot;-1&quot;&gt;生成内存报告&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rdb --command memory dump.rdb &amp;gt; memory.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生成 CSV 格式的内存报告。包含的列有：&lt;br /&gt;
数据库 ID，数据类型，key，内存使用量(byte)，编码。内存使用量包含 key、value 和其他值，结果：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csv&quot;&gt;database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
0,set,fruit,252,hashtable,2,6,
0,hash,webset,81,ziplist,1,13,
0,string,baiduyun,64,string,5,5,
0,list,languages,161,quicklist,2,6,
0,sortedset,page_rank,80,ziplist,1,9
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;使用参数过滤想要的数据&quot; tabindex=&quot;-1&quot;&gt;使用参数过滤想要的数据&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# 使用这个命令会将存储的 int 值显示为 json 的字符串
&amp;gt; rdb -c json --db 2 --type hash --key &amp;quot;a.*&amp;quot; /var/redis/6379/dump.rdb

[{},{
&amp;quot;aroma&amp;quot;:{&amp;quot;pungent&amp;quot;:&amp;quot;vinegar&amp;quot;,&amp;quot;putrid&amp;quot;:&amp;quot;rotten eggs&amp;quot;,&amp;quot;floral&amp;quot;:&amp;quot;roses&amp;quot;}}]

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;rdb&quot; tabindex=&quot;-1&quot;&gt;比较两个 rdb 文件&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&amp;gt; rdb --command diff /var/redis/6379/dump1.rdb | sort &amp;gt; dump1.txt
&amp;gt; rdb --command diff /var/redis/6379/dump2.rdb | sort &amp;gt; dump2.txt

# 使用 diff 软件查看 diff
&amp;gt; kdiff3 dump1.txt dump2.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;key&quot; tabindex=&quot;-1&quot;&gt;查看一个 key 的内存使用情况&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&amp;gt; redis-memory-for-key person:1

&amp;gt; redis-memory-for-key -s localhost -p 6379 -a mypassword person:1

Key 			person:1
Bytes				111
Type				hash
Encoding			ziplist
Number of Elements		2
Length of Largest Element	8          # hash 中占用内存最大的那个 value 的占用字节数
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;faq&quot; tabindex=&quot;-1&quot;&gt;常见问题 FAQ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;内存报告的精确度如何？&lt;/p&gt;
&lt;p&gt;答：最多有 10% 的误差&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;存储了一个二进制 binary 数据，但是输出的时候是乱码，不可读，怎么处理？&lt;/p&gt;
&lt;p&gt;答：可以使用 -e 命令先输出 base64 编码的字符串，然后程序中解码之后使用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这个工具能解析哪个版本的 rdb 文件？&lt;/p&gt;
&lt;p&gt;答：2~6 版本&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;我不想用 python，有其他的解析方案吗？&lt;/p&gt;
&lt;p&gt;答：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nrk/redis-rdb&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;redis-rdb&lt;/a&gt; is written in Ruby&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/esmooov/rdbhs&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;rdbhs&lt;/a&gt; is written in Haskell&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pconstr/rdb-parser&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;rdb-parser&lt;/a&gt; is written in Node.js&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/titanous/rdb&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;rdb&lt;/a&gt; is written in Go&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/badboy/rdb-rs&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;rdb-rs&lt;/a&gt; is written in Rust&lt;/li&gt;
&lt;li&gt;参阅 &lt;a href=&quot;https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;rdb 文件格式&lt;/a&gt; 自己写一个解析&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sripathikrishnan/redis-rdb-tools&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/sripathikrishnan/redis-rdb-tools&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/redis/redis-rdb 文件分析/" />
        </entry>
        <entry>
            <title>
                202011281031 - 安装 rdbtools 工具
                
            </title>
            <updated>2024-04-25T03:15:37.000Z</updated>
            <id>https://grove-trees.netlify.app/card/redis/202011281031 - 安装 rdbtools 工具/</id>
            <content type="html">
                &lt;h1 id=&quot;202011281031-rdbtools&quot; tabindex=&quot;-1&quot;&gt;202011281031 - 安装 rdbtools 工具&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;pip install rdbtools python-lzf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
sudo python setup.py install
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/redis/202011281031 - 安装 rdbtools 工具/" />
        </entry>
        <entry>
            <title>
                python-为什么 {} 不能作为默认参数？
                
            </title>
            <updated>2025-02-11T14:48:01.000Z</updated>
            <id>https://grove-trees.netlify.app/card/python/python-为什么 {} 不能作为默认参数？/</id>
            <content type="html">
                &lt;h1 id=&quot;python&quot; tabindex=&quot;-1&quot;&gt;python-为什么 {} 不能作为默认参数？&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020250210145605.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里会有个提示，但不是报错&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么 {} 不能作为默认参数？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 Python 中，&lt;strong&gt;函数的默认参数只在函数定义时计算一次&lt;/strong&gt;，所以如果你使用 {} 作为默认值，它会在所有函数调用之间&lt;strong&gt;共享&lt;/strong&gt;。这意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多次调用 resp_success() 时，data 会共享同一个字典&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;如果 data 在一个调用中被修改，后续调用也会受到影响&lt;/strong&gt;（因为所有调用都引用同一个 {}）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比如下面的代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def add_item(item, items=[]):
    items.append(item)
    return items

# 第一次调用，期望返回 [1]
print(add_item(1))  # 输出 [1]

# 第二次调用，期望返回 [2]，但实际输出 [1, 2]
print(add_item(2))  # 输出 [1, 2]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解决方法，默认参数改成不可变的变量，或者 &lt;code&gt;None&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def add_item_fixed(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

# 第一次调用返回 [1]
print(add_item_fixed(1))  # 输出 [1]

# 第二次调用返回 [2]
print(add_item_fixed(2))  # 输出 [2]
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/python/python-为什么 {} 不能作为默认参数？/" />
        </entry>
        <entry>
            <title>
                python-Asyncer
                
            </title>
            <updated>2025-04-25T11:03:19.000Z</updated>
            <id>https://grove-trees.netlify.app/card/python/python-Asyncer/</id>
            <content type="html">
                &lt;h1 id=&quot;python-asyncer&quot; tabindex=&quot;-1&quot;&gt;python-Asyncer&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fastapi/asyncer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;fastapi/asyncer: Asyncer, async and await, focused on developer experience.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;raise_sync_error=False&lt;/code&gt;，如果 syncify 在 worker thread（异步的线程池上下文） 中执行，可以将异步函数从worker thread 中发送到主异步线程运行。&lt;/p&gt;
&lt;p&gt;如果程序不是异步的，也就是不在 worker thread，那么会使用 &lt;code&gt;anyio.run&lt;/code&gt; 重新开启一个事件循环，这个过程比较耗费资源，需要谨慎使用&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import time

import anyio
from asyncer import asyncify, syncify


async def do_async_work(name: str):
    await anyio.sleep(1)
    return f&amp;quot;Hello, {name}&amp;quot;


def do_sync_work(name: str):
    time.sleep(1)
    message = syncify(do_async_work, raise_sync_error=False)(name=name)
    return message


async def main():
    message = await asyncify(do_sync_work)(name=&amp;quot;World&amp;quot;)
    print(message)


def sync_main():
    message = do_sync_work(name=&amp;quot;Sync World&amp;quot;)
    print(message)


anyio.run(main)
sync_main()
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/python/python-Asyncer/" />
        </entry>
        <entry>
            <title>
                python 虚拟环境
                
            </title>
            <updated>2025-05-13T14:32:53.000Z</updated>
            <id>https://grove-trees.netlify.app/card/python/python 虚拟环境/</id>
            <content type="html">
                &lt;h1 id=&quot;python&quot; tabindex=&quot;-1&quot;&gt;python 虚拟环境&lt;/h1&gt;
&lt;p&gt;venv： python 内置的模块，用于创建隔离的python环境&lt;/p&gt;
&lt;p&gt;Conda：一个开源的包管理系统和环境管理系统，用于安装多种包，且可以创建多个独立的环境&lt;/p&gt;
&lt;h2 id=&quot;venv&quot; tabindex=&quot;-1&quot;&gt;venv&lt;/h2&gt;
&lt;p&gt;jetbrains 会自动创建 venv 环境&lt;/p&gt;
&lt;p&gt;vscode中，需要执行命令&lt;code&gt;Python: Create Environment&lt;/code&gt; 进行创建&lt;/p&gt;
&lt;p&gt;创建完之后，会在项目根目录创建一个文件夹 &lt;code&gt;.venv&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;# 终端开启虚拟环境
source .venv/bin/activate
# 安装依赖， -i 使用镜像
pip3 install -r requirements.txt -i 镜像源 https://pip.baidu-int.com/simple/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;vscode 的python扩展会在打开内置terminal的时候自动加载虚拟环境&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020250328151348.png&quot; alt=&quot;594&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1eM411D7rR/?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=cdeb63885c1e7687c8d443ba7d3f4fd9&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Python虚拟环境venv（和我一起玩Python）_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/python/python 虚拟环境/" />
        </entry>
        <entry>
            <title>
                python fastapi 默认线程数
                
            </title>
            <updated>2025-06-19T05:34:56.000Z</updated>
            <id>https://grove-trees.netlify.app/card/python/python fastapi 默认线程数/</id>
            <content type="html">
                &lt;h1 id=&quot;python-fastapi&quot; tabindex=&quot;-1&quot;&gt;python fastapi 默认线程数&lt;/h1&gt;
&lt;p&gt;默认的线程数限制：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020250217170200.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;code&gt;asyncio&lt;/code&gt; 事件循环的默认线程池执行器（&lt;code&gt;ThreadPoolExecutor&lt;/code&gt;） 默认是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;max_workers = min(32, (os.cpu_count() or 1) + 4)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;fastapi 修改线程数&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同步函数的线程池大小&lt;/strong&gt;：可以通过 &lt;code&gt;anyio.to_thread.current_default_thread_limiter().total_tokens&lt;/code&gt; 获取。默认是40个。&lt;/p&gt;
&lt;p&gt;修改线程池大小：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from anyio import to_thread

async def foo():
    # Set the maximum number of worker threads to 60
    to_thread.current_default_thread_limiter().total_tokens = 60
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/python/python fastapi 默认线程数/" />
        </entry>
        <entry>
            <title>
                gunicorn+uvicorn+fastapi 进程模型.excalidraw
                
            </title>
            <updated>2025-05-27T06:12:43.000Z</updated>
            <id>https://grove-trees.netlify.app/card/python/gunicorn+uvicorn+fastapi 进程模型.excalidraw/</id>
            <content type="html">
                &lt;style&gt; .container {font-family: sans-serif; text-align: center;} .button-wrapper button {z-index: 1;height: 40px; width: 100px; margin: 10px;padding: 5px;} .excalidraw .App-menu_top .buttonList { display: flex;} .excalidraw-wrapper { height: 800px; margin: 50px; position: relative;} :root[dir=&quot;ltr&quot;] .excalidraw .layer-ui__wrapper .zen-mode-transition.App-menu_bottom--transition-left {transform: none;} &lt;/style&gt;&lt;script src=&quot;https://cdn.jsdelivr.net/npm/react@17/umd/react.production.min.js&quot;&gt;&lt;/script&gt;&lt;script src=&quot;https://cdn.jsdelivr.net/npm/react-dom@17/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.jsdelivr.net/npm/@excalidraw/excalidraw@0/dist/excalidraw.production.min.js&quot;&gt;&lt;/script&gt;&lt;div id=&quot;gunicorn+uvicorn+fastapi_进程模型excalidraw.md&quot;&gt;&lt;/div&gt;&lt;script&gt;(function(){const InitialData={&quot;type&quot;:&quot;excalidraw&quot;,&quot;version&quot;:2,&quot;source&quot;:&quot;https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.12.4&quot;,&quot;elements&quot;:[{&quot;id&quot;:&quot;S4gUjxN4&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-531.95703125,&quot;y&quot;:-584.3515625,&quot;width&quot;:1012,&quot;height&quot;:50,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a0&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1214529693,&quot;version&quot;:228,&quot;versionNonce&quot;:598635485,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748272628702,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;&#92;ngunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80&quot;,&quot;rawText&quot;:&quot;&#92;ngunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;containerId&quot;:null,&quot;originalText&quot;:&quot;&#92;ngunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;9FBfKqTT7v9kGyTNumEUj&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:277.8014831542969,&quot;y&quot;:-107.359375,&quot;width&quot;:119.46484375,&quot;height&quot;:64.3515625,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#e03131&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;dashed&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a5&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:864042077,&quot;version&quot;:848,&quot;versionNonce&quot;:2041314941,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;mHgbpbCq&quot;},{&quot;id&quot;:&quot;p3HOzwb7YH7E_8EdBIrYd&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;kgFwNPtbK84w_pHfyxrMM&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748272672535,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;mHgbpbCq&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:304.5339050292969,&quot;y&quot;:-87.68359375,&quot;width&quot;:66,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#e03131&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a6&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1146267837,&quot;version&quot;:871,&quot;versionNonce&quot;:1879123677,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748272672535,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;worker&quot;,&quot;rawText&quot;:&quot;worker&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;9FBfKqTT7v9kGyTNumEUj&quot;,&quot;originalText&quot;:&quot;worker&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;lVx-AMgblG54Lt8erWAvo&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-132.26101684570312,&quot;y&quot;:126.55859375,&quot;width&quot;:119.46484375,&quot;height&quot;:85,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a64&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:2017317459,&quot;version&quot;:820,&quot;versionNonce&quot;:904078899,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;ZJTVR45q&quot;},{&quot;id&quot;:&quot;kgFwNPtbK84w_pHfyxrMM&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;FWPrvrXL4XjXoYo4q93lh&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;l3-szXt3A9_wTuw_OSuiH&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;9pj_kIxky1z41QNhkkXzi&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;-FjPr4NV5C9WonQJ_4dnf&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748318118796,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;ZJTVR45q&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-116.52859497070312,&quot;y&quot;:131.55859375,&quot;width&quot;:88,&quot;height&quot;:75,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a68&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:471207923,&quot;version&quot;:851,&quot;versionNonce&quot;:1168500691,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748318118796,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;gunicorn&#92;n&#92;nMaster&quot;,&quot;rawText&quot;:&quot;gunicorn&#92;n&#92;nMaster&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;lVx-AMgblG54Lt8erWAvo&quot;,&quot;originalText&quot;:&quot;gunicorn&#92;n&#92;nMaster&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;YIHvLs4eZBiL5vXm8s5PA&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-87.8263976815299,&quot;y&quot;:-106.26535646816808,&quot;width&quot;:119.46484375,&quot;height&quot;:64.3515625,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a6G&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:1296783987,&quot;version&quot;:633,&quot;versionNonce&quot;:1134454627,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;AiVRAhYO&quot;},{&quot;id&quot;:&quot;WUG1G4sxyfCy9kbuzQPBl&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;FWPrvrXL4XjXoYo4q93lh&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1750735975675,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;AiVRAhYO&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-61.0939758065299,&quot;y&quot;:-86.58957521816808,&quot;width&quot;:66,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a6V&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1652397075,&quot;version&quot;:655,&quot;versionNonce&quot;:1723958019,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735975675,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;worker&quot;,&quot;rawText&quot;:&quot;worker&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;YIHvLs4eZBiL5vXm8s5PA&quot;,&quot;originalText&quot;:&quot;worker&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;os9Zn4verPJ9k1rb7fS_y&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:84.19992065429688,&quot;y&quot;:-106.65625,&quot;width&quot;:119.46484375,&quot;height&quot;:64.3515625,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a6X&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:400950685,&quot;version&quot;:678,&quot;versionNonce&quot;:302796893,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;OXJG6CAO&quot;},{&quot;id&quot;:&quot;ZWfrumVJFtqawHcJmTrXY&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;l3-szXt3A9_wTuw_OSuiH&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748272673384,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;OXJG6CAO&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:110.93234252929688,&quot;y&quot;:-86.98046875,&quot;width&quot;:66,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a6Z&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1135430141,&quot;version&quot;:699,&quot;versionNonce&quot;:540818621,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748272673384,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;worker&quot;,&quot;rawText&quot;:&quot;worker&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;os9Zn4verPJ9k1rb7fS_y&quot;,&quot;originalText&quot;:&quot;worker&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;APeF_8BMTw-rp_iimGAQv&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:463.7624206542969,&quot;y&quot;:-108.26953125,&quot;width&quot;:119.46484375,&quot;height&quot;:64.3515625,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#2f9e44&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a6d&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:738957437,&quot;version&quot;:846,&quot;versionNonce&quot;:468581395,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;ZxC1pOEg&quot;},{&quot;id&quot;:&quot;fuyyWOyAF4plKqGs6f455&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;9pj_kIxky1z41QNhkkXzi&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748272671135,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;ZxC1pOEg&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:490.4948425292969,&quot;y&quot;:-88.59375,&quot;width&quot;:66,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#2f9e44&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;a6l&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:660439261,&quot;version&quot;:868,&quot;versionNonce&quot;:865796531,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748272671135,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;worker&quot;,&quot;rawText&quot;:&quot;worker&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;APeF_8BMTw-rp_iimGAQv&quot;,&quot;originalText&quot;:&quot;worker&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;7nNy3mIVCKHgm_lWvufPQ&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-101.00160217285156,&quot;y&quot;:-331.73828125,&quot;width&quot;:148.578125,&quot;height&quot;:71.8984375,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;aO&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:1130394717,&quot;version&quot;:158,&quot;versionNonce&quot;:152068989,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;a1TEPwC0&quot;},{&quot;id&quot;:&quot;WUG1G4sxyfCy9kbuzQPBl&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;fuyyWOyAF4plKqGs6f455&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;ZWfrumVJFtqawHcJmTrXY&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;p3HOzwb7YH7E_8EdBIrYd&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;ewiNG8IFZYiTcf2VQ4r8c&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;BhypayHPZ9_MGvVX1WUFt&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748272986202,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;a1TEPwC0&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-65.21253967285156,&quot;y&quot;:-308.2890625,&quot;width&quot;:77,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;aP&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1552546291,&quot;version&quot;:70,&quot;versionNonce&quot;:1837102867,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748272633903,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;IP:PORT&quot;,&quot;rawText&quot;:&quot;IP:PORT&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;7nNy3mIVCKHgm_lWvufPQ&quot;,&quot;originalText&quot;:&quot;IP:PORT&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;DIqMUlW2GW47rp5vSM0zS&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-98.93910217285156,&quot;y&quot;:-499.44140625,&quot;width&quot;:148.578125,&quot;height&quot;:71.8984375,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;aPV&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:1928846813,&quot;version&quot;:220,&quot;versionNonce&quot;:1822724083,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;WSnHMVgr&quot;},{&quot;id&quot;:&quot;ewiNG8IFZYiTcf2VQ4r8c&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748272641752,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;WSnHMVgr&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-57.65003967285156,&quot;y&quot;:-475.9921875,&quot;width&quot;:66,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;aQ&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1197087293,&quot;version&quot;:141,&quot;versionNonce&quot;:1041573747,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748272638853,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;Client&quot;,&quot;rawText&quot;:&quot;Client&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;DIqMUlW2GW47rp5vSM0zS&quot;,&quot;originalText&quot;:&quot;Client&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;BhypayHPZ9_MGvVX1WUFt&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-89.88548221263866,&quot;y&quot;:-254.21505783964992,&quot;width&quot;:267.6204038467097,&quot;height&quot;:145.45836999640053,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;ae&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:1400197565,&quot;version&quot;:621,&quot;versionNonce&quot;:923344845,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735940522,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[-267.6204038467097,145.45836999640053]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;7nNy3mIVCKHgm_lWvufPQ&quot;,&quot;focus&quot;:-0.09482774842106187,&quot;gap&quot;:6.2734375},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;JtUUqvbE4jUBrRaKxZbBF&quot;,&quot;focus&quot;:-0.19613845916586353,&quot;gap&quot;:5.03515625},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;Sn8lqm9jePBpI49ZJ630-&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-487.9697746329468,&quot;y&quot;:-115.60471744535046,&quot;width&quot;:322.35703994009197,&quot;height&quot;:79.16015624999999,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;YrhkoWvYWO3Zf13E7rxSx&quot;,&quot;b2KYPkLUZC1Qin9DGCq_b&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;af&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:1692909277,&quot;version&quot;:912,&quot;versionNonce&quot;:2010959709,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;id&quot;:&quot;-FjPr4NV5C9WonQJ_4dnf&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748273056926,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;JtUUqvbE4jUBrRaKxZbBF&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-477.6892348602195,&quot;y&quot;:-103.7215315932494,&quot;width&quot;:173.1478946374622,&quot;height&quot;:55.88451726002471,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;YrhkoWvYWO3Zf13E7rxSx&quot;,&quot;b2KYPkLUZC1Qin9DGCq_b&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;ag&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:2029249971,&quot;version&quot;:676,&quot;versionNonce&quot;:1802263581,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;id&quot;:&quot;FiKWqKFIkrbQu7yDkCRz5&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;BhypayHPZ9_MGvVX1WUFt&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748273056926,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;Urams_Ui7Mj_ocIG__wYQ&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-239.3442825444333,&quot;y&quot;:-103.07669770861298,&quot;width&quot;:70.73228776864185,&quot;height&quot;:52.73668431148722,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;YrhkoWvYWO3Zf13E7rxSx&quot;,&quot;b2KYPkLUZC1Qin9DGCq_b&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;ah&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:1169353277,&quot;version&quot;:883,&quot;versionNonce&quot;:1675398141,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;id&quot;:&quot;jMOlumm9&quot;,&quot;type&quot;:&quot;text&quot;},{&quot;id&quot;:&quot;FiKWqKFIkrbQu7yDkCRz5&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;QJI8-w3JAij6HDQ2cUQcs&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748273098309,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;jMOlumm9&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-219.2818801151905,&quot;y&quot;:-81.67780076022999,&quot;width&quot;:30.60748291015625,&quot;height&quot;:9.938890414721227,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;YrhkoWvYWO3Zf13E7rxSx&quot;,&quot;b2KYPkLUZC1Qin9DGCq_b&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;ai&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1658812371,&quot;version&quot;:860,&quot;versionNonce&quot;:1329501501,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748273056926,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;fastapi&quot;,&quot;rawText&quot;:&quot;fastapi&quot;,&quot;fontSize&quot;:7.951112331776982,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;Urams_Ui7Mj_ocIG__wYQ&quot;,&quot;originalText&quot;:&quot;fastapi&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;7JfyulYV&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-469.2070130719058,&quot;y&quot;:-96.5065183328127,&quot;width&quot;:34.97998046875,&quot;height&quot;:9.938890414721227,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;YrhkoWvYWO3Zf13E7rxSx&quot;,&quot;b2KYPkLUZC1Qin9DGCq_b&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;aj&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1632899709,&quot;version&quot;:467,&quot;versionNonce&quot;:1337862653,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748273056926,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;gunicorn&quot;,&quot;rawText&quot;:&quot;gunicorn&quot;,&quot;fontSize&quot;:7.951112331776982,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;containerId&quot;:null,&quot;originalText&quot;:&quot;gunicorn&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;9KAEkrWM&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-472.25856301955065,&quot;y&quot;:-73.36598613441252,&quot;width&quot;:157.409912109375,&quot;height&quot;:9.938890414721227,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;YrhkoWvYWO3Zf13E7rxSx&quot;,&quot;b2KYPkLUZC1Qin9DGCq_b&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;ak&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1026156051,&quot;version&quot;:552,&quot;versionNonce&quot;:700572253,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;id&quot;:&quot;FiKWqKFIkrbQu7yDkCRz5&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1748273056926,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;import uvicorn.workers.UvicornWorker&quot;,&quot;rawText&quot;:&quot;import uvicorn.workers.UvicornWorker&quot;,&quot;fontSize&quot;:7.951112331776982,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;containerId&quot;:null,&quot;originalText&quot;:&quot;import uvicorn.workers.UvicornWorker&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;FiKWqKFIkrbQu7yDkCRz5&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-302.06091135687586,&quot;y&quot;:-72.19453696498874,&quot;width&quot;:61.111264916856385,&quot;height&quot;:2.489372160985738,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;YrhkoWvYWO3Zf13E7rxSx&quot;,&quot;b2KYPkLUZC1Qin9DGCq_b&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;al&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:1111201427,&quot;version&quot;:1547,&quot;versionNonce&quot;:1748193421,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735940524,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[61.111264916856385,-2.489372160985738]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;9KAEkrWM&quot;,&quot;focus&quot;:-0.008688635386196934,&quot;gap&quot;:12.787739553299787},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;Urams_Ui7Mj_ocIG__wYQ&quot;,&quot;focus&quot;:-0.018641786698389236,&quot;gap&quot;:1.60536389558618},&quot;startArrowhead&quot;:&quot;triangle_outline&quot;,&quot;endArrowhead&quot;:&quot;triangle_outline&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;r8ZG4TSX&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-289.0190263376443,&quot;y&quot;:-108.22669421214881,&quot;width&quot;:31.844970703125,&quot;height&quot;:12.062520366519385,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;b2KYPkLUZC1Qin9DGCq_b&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;an&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:414699155,&quot;version&quot;:409,&quot;versionNonce&quot;:346884381,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748273055611,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;worker&quot;,&quot;rawText&quot;:&quot;worker&quot;,&quot;fontSize&quot;:9.650016293215508,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;containerId&quot;:null,&quot;originalText&quot;:&quot;worker&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;WUG1G4sxyfCy9kbuzQPBl&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-54.52615128130463,&quot;y&quot;:-252.87500000000003,&quot;width&quot;:36.67833359187334,&quot;height&quot;:130.92604978183198,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;ao&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:2076030621,&quot;version&quot;:221,&quot;versionNonce&quot;:1514154659,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735975686,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[36.67833359187334,130.92604978183198]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;7nNy3mIVCKHgm_lWvufPQ&quot;,&quot;focus&quot;:0.47272851819246026,&quot;gap&quot;:6.96484375},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;YIHvLs4eZBiL5vXm8s5PA&quot;,&quot;focus&quot;:0.3440728618549619,&quot;gap&quot;:15.68359375},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;fuyyWOyAF4plKqGs6f455&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:8.173023200157331,&quot;y&quot;:-258.83984375,&quot;width&quot;:497.72152801873597,&quot;height&quot;:144.8359375,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#2f9e44&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;ap&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:1725641491,&quot;version&quot;:275,&quot;versionNonce&quot;:506801741,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735940494,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[497.72152801873597,144.8359375]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;7nNy3mIVCKHgm_lWvufPQ&quot;,&quot;focus&quot;:0.46550118878701685,&quot;gap&quot;:1},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;APeF_8BMTw-rp_iimGAQv&quot;,&quot;focus&quot;:0.6616216337397371,&quot;gap&quot;:5.734375},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;ZWfrumVJFtqawHcJmTrXY&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-26.919985796585024,&quot;y&quot;:-251.39453125,&quot;width&quot;:172.96212516909418,&quot;height&quot;:135.375,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;aq&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:1241509299,&quot;version&quot;:143,&quot;versionNonce&quot;:24370349,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735940504,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[172.96212516909418,135.375]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;7nNy3mIVCKHgm_lWvufPQ&quot;,&quot;focus&quot;:0.4735349262658192,&quot;gap&quot;:8.4453125},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;os9Zn4verPJ9k1rb7fS_y&quot;,&quot;focus&quot;:0.5472157435438478,&quot;gap&quot;:9.36328125},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;p3HOzwb7YH7E_8EdBIrYd&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:41.18245064111119,&quot;y&quot;:-254.8530752896957,&quot;width&quot;:233.4823137631857,&quot;height&quot;:169.87857997153554,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#e03131&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;dashed&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;ar&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:709357619,&quot;version&quot;:294,&quot;versionNonce&quot;:965590797,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735940513,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[233.4823137631857,169.87857997153554]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;7nNy3mIVCKHgm_lWvufPQ&quot;,&quot;focus&quot;:-0.09403778791618672,&quot;gap&quot;:7.0243889888422775},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;9FBfKqTT7v9kGyTNumEUj&quot;,&quot;focus&quot;:-0.4753252553424164,&quot;gap&quot;:3.13671875},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;kgFwNPtbK84w_pHfyxrMM&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-18.661103093347066,&quot;y&quot;:122.82908605702461,&quot;width&quot;:291.2438362476439,&quot;height&quot;:196.64513600606352,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#e03131&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;dashed&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;as&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:1042080211,&quot;version&quot;:264,&quot;versionNonce&quot;:375183821,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;HebC4SkJ&quot;}],&quot;updated&quot;:1750735940381,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[291.2438362476439,-196.64513600606352]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;lVx-AMgblG54Lt8erWAvo&quot;,&quot;focus&quot;:-0.11902190622204285,&quot;gap&quot;:7.05308561251697},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;9FBfKqTT7v9kGyTNumEUj&quot;,&quot;focus&quot;:0.5867477457301011,&quot;gap&quot;:5.21875},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;HebC4SkJ&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:83.53393227259625,&quot;y&quot;:13.461928009361753,&quot;width&quot;:88,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#e03131&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;dashed&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;asV&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1691676453,&quot;version&quot;:21,&quot;versionNonce&quot;:1090445515,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748326473512,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;Shutdown&quot;,&quot;rawText&quot;:&quot;Shutdown&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;kgFwNPtbK84w_pHfyxrMM&quot;,&quot;originalText&quot;:&quot;Shutdown&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;-FjPr4NV5C9WonQJ_4dnf&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-113.96389256605134,&quot;y&quot;:124.75013712225342,&quot;width&quot;:147.52592686299064,&quot;height&quot;:152.89782331760387,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;at&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:670853213,&quot;version&quot;:151,&quot;versionNonce&quot;:1849625421,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735940423,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[-147.52592686299064,-152.89782331760387]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;lVx-AMgblG54Lt8erWAvo&quot;,&quot;focus&quot;:0.013069489317624312,&quot;gap&quot;:1.9133943445542279},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;Sn8lqm9jePBpI49ZJ630-&quot;,&quot;focus&quot;:-0.09580584894302578,&quot;gap&quot;:8.296875000000014},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;FWPrvrXL4XjXoYo4q93lh&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-83.81192468354159,&quot;y&quot;:123.58943158318013,&quot;width&quot;:87.9068967952561,&quot;height&quot;:155.42119430134824,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;au&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:448191859,&quot;version&quot;:103,&quot;versionNonce&quot;:583589443,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735975697,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[87.9068967952561,-155.42119430134824]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;lVx-AMgblG54Lt8erWAvo&quot;,&quot;focus&quot;:-0.44187519137075315,&quot;gap&quot;:2.969162166819853},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;YIHvLs4eZBiL5vXm8s5PA&quot;,&quot;focus&quot;:-0.7197394801742868,&quot;gap&quot;:10.08203125},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;l3-szXt3A9_wTuw_OSuiH&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-66.83217475023548,&quot;y&quot;:121.24426664464616,&quot;width&quot;:210.07625333122047,&quot;height&quot;:155.57239164464616,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;av&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:1357492381,&quot;version&quot;:143,&quot;versionNonce&quot;:146570445,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735940461,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[210.07625333122047,-155.57239164464616]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;lVx-AMgblG54Lt8erWAvo&quot;,&quot;focus&quot;:-0.5026327227860383,&quot;gap&quot;:5.31432710535386},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;os9Zn4verPJ9k1rb7fS_y&quot;,&quot;focus&quot;:-0.5188098586222556,&quot;gap&quot;:7.976562499999993},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;9pj_kIxky1z41QNhkkXzi&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-2.277741584338969,&quot;y&quot;:190.14670365265232,&quot;width&quot;:535.8950266610178,&quot;height&quot;:232.58029740265232,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#2f9e44&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;aw&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:323024083,&quot;version&quot;:260,&quot;versionNonce&quot;:1618177421,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;B93WEGv1&quot;}],&quot;updated&quot;:1750735940479,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[535.8950266610178,-232.58029740265232]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;lVx-AMgblG54Lt8erWAvo&quot;,&quot;focus&quot;:0.7537876300237375,&quot;gap&quot;:10.518431511364156},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;APeF_8BMTw-rp_iimGAQv&quot;,&quot;focus&quot;:-0.655175971530495,&quot;gap&quot;:1.484375},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;B93WEGv1&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:238.83385357281145,&quot;y&quot;:60.85836787685204,&quot;width&quot;:44,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#2f9e44&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;dashed&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;awV&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1573646507,&quot;version&quot;:20,&quot;versionNonce&quot;:1911168939,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748326487218,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;Fork&quot;,&quot;rawText&quot;:&quot;Fork&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;9pj_kIxky1z41QNhkkXzi&quot;,&quot;originalText&quot;:&quot;Fork&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;ewiNG8IFZYiTcf2VQ4r8c&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-20.923477172851594,&quot;y&quot;:-420.08984375,&quot;width&quot;:4.421874999999972,&quot;height&quot;:81.53515625,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;ax&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:310431133,&quot;version&quot;:47,&quot;versionNonce&quot;:231579181,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750735940522,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[-4.421874999999972,81.53515625]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;DIqMUlW2GW47rp5vSM0zS&quot;,&quot;focus&quot;:-0.07975465983878265,&quot;gap&quot;:7.453125},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;7nNy3mIVCKHgm_lWvufPQ&quot;,&quot;focus&quot;:-0.012488535595382442,&quot;gap&quot;:6.81640625},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;6XeL3FS8eEBQyBalU13ND&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-978.2282756737985,&quot;y&quot;:162.50254551249395,&quot;width&quot;:203.2421875,&quot;height&quot;:92.20312500000001,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1971c2&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0A8&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:390370771,&quot;version&quot;:270,&quot;versionNonce&quot;:1111507235,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;E9NwlGap&quot;},{&quot;id&quot;:&quot;rr_powStz00aN0x7KgWg0&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;td_uKOlp8-mBFKOWlXNUi&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1750736002918,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;E9NwlGap&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-931.6071819237985,&quot;y&quot;:183.60410801249395,&quot;width&quot;:110,&quot;height&quot;:50,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1971c2&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0AG&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1396371613,&quot;version&quot;:278,&quot;versionNonce&quot;:1870800067,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002918,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;ASGI Async&#92;nHandler&quot;,&quot;rawText&quot;:&quot;ASGI Async Handler&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;6XeL3FS8eEBQyBalU13ND&quot;,&quot;originalText&quot;:&quot;ASGI Async Handler&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;etTE-fOBKQ9NbuPCPzRnS&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-999.9633355619685,&quot;y&quot;:133.7124689928695,&quot;width&quot;:627.45703125,&quot;height&quot;:417.2734375,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;qZy9y8gqMWCofeqmT6i25&quot;,&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0AO&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:1962649363,&quot;version&quot;:247,&quot;versionNonce&quot;:1614878627,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;id&quot;:&quot;QJI8-w3JAij6HDQ2cUQcs&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1750736002918,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;rBwGQJ2t&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-980.8422418119685,&quot;y&quot;:105.3804377428695,&quot;width&quot;:77,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;qZy9y8gqMWCofeqmT6i25&quot;,&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0AV&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1052801235,&quot;version&quot;:196,&quot;versionNonce&quot;:765709027,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002931,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;fastapi&quot;,&quot;rawText&quot;:&quot;fastapi&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;containerId&quot;:null,&quot;originalText&quot;:&quot;fastapi&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;ITap3Hce&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-574.0563041940707,&quot;y&quot;:463.8726252428695,&quot;width&quot;:110,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#2f9e44&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;qZy9y8gqMWCofeqmT6i25&quot;,&quot;BIv2nNORnFLNeRSt989pr&quot;,&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0Ad&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1465418707,&quot;version&quot;:225,&quot;versionNonce&quot;:1095661187,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002931,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;Logic Code&quot;,&quot;rawText&quot;:&quot;Logic Code&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;containerId&quot;:null,&quot;originalText&quot;:&quot;Logic Code&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;ukW_1SuAtdkE5i_ZQZbgN&quot;,&quot;type&quot;:&quot;ellipse&quot;,&quot;x&quot;:-964.8820795884782,&quot;y&quot;:390.4039460798183,&quot;width&quot;:148.0703125,&quot;height&quot;:137.28515625,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0Al&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:620763187,&quot;version&quot;:322,&quot;versionNonce&quot;:1306701347,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;HjpkTiGA&quot;},{&quot;id&quot;:&quot;rr_powStz00aN0x7KgWg0&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;7tLyhouPWr3EHIriOpjLb&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1750736002931,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;HjpkTiGA&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-929.1976843690588,&quot;y&quot;:446.50889173450344,&quot;width&quot;:77,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0At&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1960101981,&quot;version&quot;:209,&quot;versionNonce&quot;:374272451,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002931,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;Request&quot;,&quot;rawText&quot;:&quot;Request&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;ukW_1SuAtdkE5i_ZQZbgN&quot;,&quot;originalText&quot;:&quot;Request&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;No71Pg7-VUn059S1yHryY&quot;,&quot;type&quot;:&quot;ellipse&quot;,&quot;x&quot;:-581.8962444237985,&quot;y&quot;:190.25254551249395,&quot;width&quot;:148.0703125,&quot;height&quot;:137.28515625,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0B&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:897076349,&quot;version&quot;:431,&quot;versionNonce&quot;:1422197923,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;8xfyprDc&quot;},{&quot;id&quot;:&quot;LsNi7YLaM1lAvaNwT-Abu&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;td_uKOlp8-mBFKOWlXNUi&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1750736002931,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;8xfyprDc&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-551.7118492043792,&quot;y&quot;:246.3574911671791,&quot;width&quot;:88,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0BG&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1226028253,&quot;version&quot;:329,&quot;versionNonce&quot;:1805809731,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002931,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;Response&quot;,&quot;rawText&quot;:&quot;Response&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;center&quot;,&quot;verticalAlign&quot;:&quot;middle&quot;,&quot;containerId&quot;:&quot;No71Pg7-VUn059S1yHryY&quot;,&quot;originalText&quot;:&quot;Response&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;zc5eohugb-U3foby8Hg5n&quot;,&quot;type&quot;:&quot;rectangle&quot;,&quot;x&quot;:-620.7899943059007,&quot;y&quot;:425.95567051249395,&quot;width&quot;:203.2421875,&quot;height&quot;:92.20312500000001,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#2f9e44&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;BIv2nNORnFLNeRSt989pr&quot;,&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0BV&quot;,&quot;roundness&quot;:{&quot;type&quot;:3},&quot;seed&quot;:1473920787,&quot;version&quot;:400,&quot;versionNonce&quot;:1854413603,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[{&quot;id&quot;:&quot;7tLyhouPWr3EHIriOpjLb&quot;,&quot;type&quot;:&quot;arrow&quot;},{&quot;id&quot;:&quot;LsNi7YLaM1lAvaNwT-Abu&quot;,&quot;type&quot;:&quot;arrow&quot;}],&quot;updated&quot;:1750736002931,&quot;link&quot;:null,&quot;locked&quot;:false},{&quot;id&quot;:&quot;rr_powStz00aN0x7KgWg0&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-880.5302164782222,&quot;y&quot;:257.2025967536137,&quot;width&quot;:1.9901619214066386,&quot;height&quot;:128.8254490025065,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0Bl&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:1487133139,&quot;version&quot;:195,&quot;versionNonce&quot;:504741773,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002978,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[1.9901619214066386,128.8254490025065]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;6XeL3FS8eEBQyBalU13ND&quot;,&quot;focus&quot;:0.045672418514774535,&quot;gap&quot;:2.496926241119752},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;ukW_1SuAtdkE5i_ZQZbgN&quot;,&quot;focus&quot;:0.17890394449200353,&quot;gap&quot;:5.270981849601763},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;7tLyhouPWr3EHIriOpjLb&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-805.3778216759583,&quot;y&quot;:474.9471150446393,&quot;width&quot;:181.12094418760148,&quot;height&quot;:3.490454379936523,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0C&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:1500896605,&quot;version&quot;:257,&quot;versionNonce&quot;:1357578317,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002978,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[181.12094418760148,-3.490454379936523]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;ukW_1SuAtdkE5i_ZQZbgN&quot;,&quot;focus&quot;:0.25043336153877777,&quot;gap&quot;:13.097178721107307},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;zc5eohugb-U3foby8Hg5n&quot;,&quot;focus&quot;:0.054635206116899156,&quot;gap&quot;:3.466883182456172},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;LsNi7YLaM1lAvaNwT-Abu&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-508.70525159816873,&quot;y&quot;:421.28796491218435,&quot;width&quot;:1.5816188145682872,&quot;height&quot;:78.41828223714083,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0CG&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:2088985501,&quot;version&quot;:131,&quot;versionNonce&quot;:1383534861,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002978,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[-1.5816188145682872,-78.41828223714083]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;zc5eohugb-U3foby8Hg5n&quot;,&quot;focus&quot;:0.11201864434728742,&quot;gap&quot;:4.667705600309603},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;No71Pg7-VUn059S1yHryY&quot;,&quot;focus&quot;:0.054620617877799746,&quot;gap&quot;:15.362887550074277},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;td_uKOlp8-mBFKOWlXNUi&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-575.3432529271395,&quot;y&quot;:222.94407188899302,&quot;width&quot;:192.04517899665916,&quot;height&quot;:10.437620126499013,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;49yVSCOOEPZSlEfZ6GGvD&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0CV&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:102617885,&quot;version&quot;:155,&quot;versionNonce&quot;:1598419405,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002978,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[-192.04517899665916,-10.437620126499013]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;No71Pg7-VUn059S1yHryY&quot;,&quot;focus&quot;:0.44426887140492716,&quot;gap&quot;:3.7197547221936387},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;6XeL3FS8eEBQyBalU13ND&quot;,&quot;focus&quot;:-0.03939349124770368,&quot;gap&quot;:7.597656249999886},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;deKgnWHa&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-293.52646414029033,&quot;y&quot;:-65.6580027286375,&quot;width&quot;:44,&quot;height&quot;:25,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#1e1e1e&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[&quot;YrhkoWvYWO3Zf13E7rxSx&quot;,&quot;b2KYPkLUZC1Qin9DGCq_b&quot;],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0G&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:703477011,&quot;version&quot;:56,&quot;versionNonce&quot;:1642830259,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748273059501,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;ASGI&quot;,&quot;rawText&quot;:&quot;ASGI&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;containerId&quot;:null,&quot;originalText&quot;:&quot;ASGI&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25},{&quot;id&quot;:&quot;QJI8-w3JAij6HDQ2cUQcs&quot;,&quot;type&quot;:&quot;arrow&quot;,&quot;x&quot;:-218.0583122641634,&quot;y&quot;:-48.95651768789955,&quot;width&quot;:277.54195387077095,&quot;height&quot;:177.69922377810684,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#2f9e44&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0H&quot;,&quot;roundness&quot;:{&quot;type&quot;:2},&quot;seed&quot;:638924403,&quot;version&quot;:67,&quot;versionNonce&quot;:1948527427,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1750736002931,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;points&quot;:[[0,0],[-277.54195387077095,177.69922377810684]],&quot;lastCommittedPoint&quot;:null,&quot;startBinding&quot;:{&quot;elementId&quot;:&quot;Urams_Ui7Mj_ocIG__wYQ&quot;,&quot;focus&quot;:-0.38243603113641167,&quot;gap&quot;:1.383495709226203},&quot;endBinding&quot;:{&quot;elementId&quot;:&quot;etTE-fOBKQ9NbuPCPzRnS&quot;,&quot;focus&quot;:-0.22356431771341473,&quot;gap&quot;:4.969762902662239},&quot;startArrowhead&quot;:null,&quot;endArrowhead&quot;:&quot;arrow&quot;,&quot;elbowed&quot;:false},{&quot;id&quot;:&quot;0R5XnjKI&quot;,&quot;type&quot;:&quot;text&quot;,&quot;x&quot;:-1124.0696266615828,&quot;y&quot;:-109.78973405530371,&quot;width&quot;:544,&quot;height&quot;:125,&quot;angle&quot;:0,&quot;strokeColor&quot;:&quot;#2f9e44&quot;,&quot;backgroundColor&quot;:&quot;transparent&quot;,&quot;fillStyle&quot;:&quot;solid&quot;,&quot;strokeWidth&quot;:2,&quot;strokeStyle&quot;:&quot;solid&quot;,&quot;roughness&quot;:1,&quot;opacity&quot;:100,&quot;groupIds&quot;:[],&quot;frameId&quot;:null,&quot;index&quot;:&quot;b0I&quot;,&quot;roundness&quot;:null,&quot;seed&quot;:1947090589,&quot;version&quot;:287,&quot;versionNonce&quot;:1759171877,&quot;isDeleted&quot;:false,&quot;boundElements&quot;:[],&quot;updated&quot;:1748326429835,&quot;link&quot;:null,&quot;locked&quot;:false,&quot;text&quot;:&quot;gunicorn 本身只支持 WSGI&#92;n&#92;n但是可以通过 import uvicorn.workers.UvicornWorker&#92;n&#92;n执行Uvicorn的兼容Worker类，从而支持ASGI与fastapi通信&quot;,&quot;rawText&quot;:&quot;gunicorn 本身只支持 WSGI&#92;n&#92;n但是可以通过 import uvicorn.workers.UvicornWorker&#92;n&#92;n执行Uvicorn的兼容Worker类，从而支持ASGI与fastapi通信&quot;,&quot;fontSize&quot;:20,&quot;fontFamily&quot;:8,&quot;textAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;containerId&quot;:null,&quot;originalText&quot;:&quot;gunicorn 本身只支持 WSGI&#92;n&#92;n但是可以通过 import uvicorn.workers.UvicornWorker&#92;n&#92;n执行Uvicorn的兼容Worker类，从而支持ASGI与fastapi通信&quot;,&quot;autoResize&quot;:true,&quot;lineHeight&quot;:1.25}],&quot;appState&quot;:{&quot;theme&quot;:&quot;light&quot;,&quot;viewBackgroundColor&quot;:&quot;#ffffff&quot;,&quot;currentItemStrokeColor&quot;:&quot;#2f9e44&quot;,&quot;currentItemBackgroundColor&quot;:&quot;transparent&quot;,&quot;currentItemFillStyle&quot;:&quot;solid&quot;,&quot;currentItemStrokeWidth&quot;:2,&quot;currentItemStrokeStyle&quot;:&quot;dashed&quot;,&quot;currentItemRoughness&quot;:1,&quot;currentItemOpacity&quot;:100,&quot;currentItemFontFamily&quot;:8,&quot;currentItemFontSize&quot;:20,&quot;currentItemTextAlign&quot;:&quot;left&quot;,&quot;currentItemStartArrowhead&quot;:null,&quot;currentItemEndArrowhead&quot;:&quot;arrow&quot;,&quot;currentItemArrowType&quot;:&quot;round&quot;,&quot;scrollX&quot;:1347.7131277316298,&quot;scrollY&quot;:701.17843984053,&quot;zoom&quot;:{&quot;value&quot;:0.599251},&quot;currentItemRoundness&quot;:&quot;round&quot;,&quot;gridSize&quot;:20,&quot;gridStep&quot;:5,&quot;gridModeEnabled&quot;:false,&quot;gridColor&quot;:{&quot;Bold&quot;:&quot;rgba(217, 217, 217, 0.5)&quot;,&quot;Regular&quot;:&quot;rgba(230, 230, 230, 0.5)&quot;},&quot;currentStrokeOptions&quot;:null,&quot;frameRendering&quot;:{&quot;enabled&quot;:true,&quot;clip&quot;:true,&quot;name&quot;:true,&quot;outline&quot;:true},&quot;objectsSnapModeEnabled&quot;:false,&quot;activeTool&quot;:{&quot;type&quot;:&quot;selection&quot;,&quot;customType&quot;:null,&quot;locked&quot;:false,&quot;fromSelection&quot;:false,&quot;lastActiveTool&quot;:null}},&quot;files&quot;:{}};InitialData.scrollToContent=true;App=()=&gt;{const e=React.useRef(null),t=React.useRef(null),[n,i]=React.useState({width:void 0,height:void 0});return React.useEffect(()=&gt;{i({width:t.current.getBoundingClientRect().width,height:t.current.getBoundingClientRect().height});const e=()=&gt;{i({width:t.current.getBoundingClientRect().width,height:t.current.getBoundingClientRect().height})};return window.addEventListener(&quot;resize&quot;,e),()=&gt;window.removeEventListener(&quot;resize&quot;,e)},[t]),React.createElement(React.Fragment,null,React.createElement(&quot;div&quot;,{className:&quot;excalidraw-wrapper&quot;,ref:t},React.createElement(ExcalidrawLib.Excalidraw,{ref:e,width:n.width,height:n.height,initialData:InitialData,viewModeEnabled:!0,zenModeEnabled:!0,gridModeEnabled:!1})))},excalidrawWrapper=document.getElementById(&quot;gunicorn+uvicorn+fastapi_进程模型excalidraw.md&quot;);ReactDOM.render(React.createElement(App),excalidrawWrapper);})();&lt;/script&gt;
            </content>
            <link href="https://grove-trees.netlify.app/card/python/gunicorn+uvicorn+fastapi 进程模型.excalidraw/" />
        </entry>
        <entry>
            <title>
                php-xml 如何解析 cdata
                
            </title>
            <updated>2024-04-18T08:27:43.000Z</updated>
            <id>https://grove-trees.netlify.app/card/php/php-xml 如何解析 cdata/</id>
            <content type="html">
                &lt;h1 id=&quot;php-xml-cdata&quot; tabindex=&quot;-1&quot;&gt;php-xml 如何解析 cdata&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$content = simplexml_load_string(
    &#39;&amp;lt;content&amp;gt;&amp;lt;![CDATA[Hello, world!]]&amp;gt;&amp;lt;/content&amp;gt;&#39;
    , null
    , LIBXML_NOCDATA // merge cdata as text node
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2970602/php-how-to-handle-cdata-with-simplexmlelement&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://stackoverflow.com/questions/2970602/php-how-to-handle-cdata-with-simplexmlelement&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/php/php-xml 如何解析 cdata/" />
        </entry>
        <entry>
            <title>
                PHP生成zip压缩包
                
            </title>
            <updated>2024-10-20T09:53:15.000Z</updated>
            <id>https://grove-trees.netlify.app/card/php/PHP生成zip压缩包/</id>
            <content type="html">
                &lt;h1 id=&quot;php-zip&quot; tabindex=&quot;-1&quot;&gt;PHP生成zip压缩包&lt;/h1&gt;
&lt;h2 id=&quot;1-zip&quot; tabindex=&quot;-1&quot;&gt;1 将文件压缩成zip格式&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
$path = &amp;quot;file.txt&amp;quot;;
$filename = &amp;quot;file.zip&amp;quot;;

$zip = new ZipArchive();
$zip-&amp;gt;open($filename, ZipArchive::CREATE); //打开压缩包
$zip-&amp;gt;addFile($path, basename($path)); //向压缩包中添加文件
$zip-&amp;gt;close(); //关闭压缩包
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/php/PHP生成zip压缩包/" />
        </entry>
        <entry>
            <title>
                202012081017 - php8.0 新特性
                
            </title>
            <updated>2025-02-13T05:11:20.000Z</updated>
            <id>https://grove-trees.netlify.app/card/php/202012081017 - php8.0 新特性/</id>
            <content type="html">
                &lt;h1 id=&quot;202012081017-php8-0&quot; tabindex=&quot;-1&quot;&gt;202012081017 - php8.0 新特性&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;把 youtube 中的 php8.0 的新特性看完了
&lt;ol&gt;
&lt;li&gt;doc 属性&lt;/li&gt;
&lt;li&gt;jit&lt;/li&gt;
&lt;li&gt;?-&amp;gt; null 安全运算符&lt;/li&gt;
&lt;li&gt;WeakMap&lt;/li&gt;
&lt;li&gt;string 的函数 str_contain&lt;/li&gt;
&lt;li&gt;命名参数&lt;/li&gt;
&lt;li&gt;构造函数成员提升&lt;/li&gt;
&lt;li&gt;match 表达式匹配&lt;/li&gt;
&lt;li&gt;mixed 类型&lt;/li&gt;
&lt;li&gt;使用对象进行 ::class 调用&lt;/li&gt;
&lt;li&gt;联合类型   float|int&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/php/202012081017 - php8.0 新特性/" />
        </entry>
        <entry>
            <title>
                不打开obsidian的情况下记录当前事件
                
            </title>
            <updated>2024-10-12T15:16:21.000Z</updated>
            <id>https://grove-trees.netlify.app/card/obsidian/不打开obsidian的情况下记录当前事件/</id>
            <content type="html">
                &lt;h1 id=&quot;obsidian&quot; tabindex=&quot;-1&quot;&gt;不打开obsidian的情况下记录当前事件&lt;/h1&gt;
&lt;p&gt;将输入设置成你想附带的文本，传入内容改成“作为参数”&lt;/p&gt;
&lt;p&gt;加上 &lt;code&gt;open --background &amp;quot;$1&amp;quot;&lt;/code&gt; 即可实现在不将 &lt;code&gt;obsidian&lt;/code&gt; 放到前台的情况下记录日志。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020220925234214.png&quot; alt=&quot;Pasted image 20220925234214.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用这种方法 obsidian 不会到前台占用注意力，不过仍然会将对应的操作完成&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://forum.obsidian.md/t/leave-obsidian-in-background-when-making-uri-call/34091&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Leave Obsidian in background when making URI call? - Developers &amp;amp; API - Obsidian Forum&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/obsidian/不打开obsidian的情况下记录当前事件/" />
        </entry>
        <entry>
            <title>
                obsidian 开发过程支持的ICON
                
            </title>
            <updated>2024-02-01T07:25:33.000Z</updated>
            <id>https://grove-trees.netlify.app/card/obsidian/obsidian 开发过程支持的ICON/</id>
            <content type="html">
                &lt;h1 id=&quot;obsidian-icon&quot; tabindex=&quot;-1&quot;&gt;obsidian 开发过程支持的ICON&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!info]- Icons&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;add-note-glyph&lt;/li&gt;
&lt;li&gt;any-key&lt;/li&gt;
&lt;li&gt;audio-file&lt;/li&gt;
&lt;li&gt;blocks&lt;/li&gt;
&lt;li&gt;bold-glyph&lt;/li&gt;
&lt;li&gt;box-glyph&lt;/li&gt;
&lt;li&gt;bracket-glyph&lt;/li&gt;
&lt;li&gt;broken-link&lt;/li&gt;
&lt;li&gt;bullet-list&lt;/li&gt;
&lt;li&gt;bullet-list-glyph&lt;/li&gt;
&lt;li&gt;calendar-glyph&lt;/li&gt;
&lt;li&gt;calendar-with-checkmark&lt;/li&gt;
&lt;li&gt;check-in-circle&lt;/li&gt;
&lt;li&gt;check-small&lt;/li&gt;
&lt;li&gt;checkbox-glyph&lt;/li&gt;
&lt;li&gt;checkmark&lt;/li&gt;
&lt;li&gt;clock&lt;/li&gt;
&lt;li&gt;clock-glyph&lt;/li&gt;
&lt;li&gt;cloud&lt;/li&gt;
&lt;li&gt;code-glyph&lt;/li&gt;
&lt;li&gt;command-glyph&lt;/li&gt;
&lt;li&gt;compress-glyph&lt;/li&gt;
&lt;li&gt;create-new&lt;/li&gt;
&lt;li&gt;cross&lt;/li&gt;
&lt;li&gt;cross-in-box&lt;/li&gt;
&lt;li&gt;crossed-star&lt;/li&gt;
&lt;li&gt;dice&lt;/li&gt;
&lt;li&gt;dice-glyph&lt;/li&gt;
&lt;li&gt;document&lt;/li&gt;
&lt;li&gt;documents&lt;/li&gt;
&lt;li&gt;dot-network&lt;/li&gt;
&lt;li&gt;double-down-arrow-glyph&lt;/li&gt;
&lt;li&gt;double-up-arrow-glyph&lt;/li&gt;
&lt;li&gt;down-arrow-with-tail&lt;/li&gt;
&lt;li&gt;down-chevron-glyph&lt;/li&gt;
&lt;li&gt;down-curly-arrow-glyph&lt;/li&gt;
&lt;li&gt;duplicate-glyph&lt;/li&gt;
&lt;li&gt;enlarge-glyph&lt;/li&gt;
&lt;li&gt;enter&lt;/li&gt;
&lt;li&gt;exit-fullscreen&lt;/li&gt;
&lt;li&gt;expand-vertically&lt;/li&gt;
&lt;li&gt;file-explorer-glyph&lt;/li&gt;
&lt;li&gt;filled-pin&lt;/li&gt;
&lt;li&gt;folder&lt;/li&gt;
&lt;li&gt;forward-arrow&lt;/li&gt;
&lt;li&gt;fullscreen&lt;/li&gt;
&lt;li&gt;gear&lt;/li&gt;
&lt;li&gt;github-glyph&lt;/li&gt;
&lt;li&gt;go-to-file&lt;/li&gt;
&lt;li&gt;graph-glyph&lt;/li&gt;
&lt;li&gt;hashtag&lt;/li&gt;
&lt;li&gt;heading-glyph&lt;/li&gt;
&lt;li&gt;help&lt;/li&gt;
&lt;li&gt;highlight-glyph&lt;/li&gt;
&lt;li&gt;horizontal-split&lt;/li&gt;
&lt;li&gt;image-file&lt;/li&gt;
&lt;li&gt;image-glyph&lt;/li&gt;
&lt;li&gt;import-glyph&lt;/li&gt;
&lt;li&gt;indent-glyph&lt;/li&gt;
&lt;li&gt;info&lt;/li&gt;
&lt;li&gt;install&lt;/li&gt;
&lt;li&gt;italic-glyph&lt;/li&gt;
&lt;li&gt;keyboard-glyph&lt;/li&gt;
&lt;li&gt;languages&lt;/li&gt;
&lt;li&gt;left-arrow&lt;/li&gt;
&lt;li&gt;left-arrow-with-tail&lt;/li&gt;
&lt;li&gt;left-chevron-glyph&lt;/li&gt;
&lt;li&gt;lines-of-text&lt;/li&gt;
&lt;li&gt;link&lt;/li&gt;
&lt;li&gt;link-glyph&lt;/li&gt;
&lt;li&gt;links-coming-in&lt;/li&gt;
&lt;li&gt;links-going-out&lt;/li&gt;
&lt;li&gt;logo-crystal&lt;/li&gt;
&lt;li&gt;magnifying-glass&lt;/li&gt;
&lt;li&gt;merge-files&lt;/li&gt;
&lt;li&gt;merge-files-glyph&lt;/li&gt;
&lt;li&gt;microphone&lt;/li&gt;
&lt;li&gt;microphone-filled&lt;/li&gt;
&lt;li&gt;minus-with-circle&lt;/li&gt;
&lt;li&gt;navigate-glyph&lt;/li&gt;
&lt;li&gt;note-glyph&lt;/li&gt;
&lt;li&gt;number-list-glyph&lt;/li&gt;
&lt;li&gt;open-elsewhere-glyph&lt;/li&gt;
&lt;li&gt;open-vault&lt;/li&gt;
&lt;li&gt;pane-layout&lt;/li&gt;
&lt;li&gt;paper-plane&lt;/li&gt;
&lt;li&gt;paper-plane-glyph&lt;/li&gt;
&lt;li&gt;paste&lt;/li&gt;
&lt;li&gt;paste-text&lt;/li&gt;
&lt;li&gt;paused&lt;/li&gt;
&lt;li&gt;pdf-file&lt;/li&gt;
&lt;li&gt;pencil&lt;/li&gt;
&lt;li&gt;percent-sign-glyph&lt;/li&gt;
&lt;li&gt;pin&lt;/li&gt;
&lt;li&gt;play-audio-glyph&lt;/li&gt;
&lt;li&gt;plus-minus-glyph&lt;/li&gt;
&lt;li&gt;plus-with-circle&lt;/li&gt;
&lt;li&gt;popup-open&lt;/li&gt;
&lt;li&gt;presentation&lt;/li&gt;
&lt;li&gt;presentation-glyph&lt;/li&gt;
&lt;li&gt;price-tag-glyph&lt;/li&gt;
&lt;li&gt;question-mark-glyph&lt;/li&gt;
&lt;li&gt;quote-glyph&lt;/li&gt;
&lt;li&gt;reading-glasses&lt;/li&gt;
&lt;li&gt;redo-glyph&lt;/li&gt;
&lt;li&gt;reset&lt;/li&gt;
&lt;li&gt;restore-file-glyph&lt;/li&gt;
&lt;li&gt;right-arrow&lt;/li&gt;
&lt;li&gt;right-arrow-with-tail&lt;/li&gt;
&lt;li&gt;right-chevron-glyph&lt;/li&gt;
&lt;li&gt;right-triangle&lt;/li&gt;
&lt;li&gt;run-command&lt;/li&gt;
&lt;li&gt;scissors&lt;/li&gt;
&lt;li&gt;scissors-glyph&lt;/li&gt;
&lt;li&gt;search&lt;/li&gt;
&lt;li&gt;search-glyph&lt;/li&gt;
&lt;li&gt;select-all-text&lt;/li&gt;
&lt;li&gt;sheets-in-box&lt;/li&gt;
&lt;li&gt;split&lt;/li&gt;
&lt;li&gt;stacked-levels&lt;/li&gt;
&lt;li&gt;star&lt;/li&gt;
&lt;li&gt;star-glyph&lt;/li&gt;
&lt;li&gt;star-list&lt;/li&gt;
&lt;li&gt;stop-audio-glyph&lt;/li&gt;
&lt;li&gt;strikethrough-glyph&lt;/li&gt;
&lt;li&gt;switch&lt;/li&gt;
&lt;li&gt;sync&lt;/li&gt;
&lt;li&gt;sync-small&lt;/li&gt;
&lt;li&gt;tag-glyph&lt;/li&gt;
&lt;li&gt;three-horizontal-bars&lt;/li&gt;
&lt;li&gt;tomorrow-glyph&lt;/li&gt;
&lt;li&gt;trash&lt;/li&gt;
&lt;li&gt;two-blank-pages&lt;/li&gt;
&lt;li&gt;undo-glyph&lt;/li&gt;
&lt;li&gt;unindent-glyph&lt;/li&gt;
&lt;li&gt;up-and-down-arrows&lt;/li&gt;
&lt;li&gt;up-arrow-with-tail&lt;/li&gt;
&lt;li&gt;up-chevron-glyph&lt;/li&gt;
&lt;li&gt;up-curly-arrow-glyph&lt;/li&gt;
&lt;li&gt;uppercase-lowercase-a&lt;/li&gt;
&lt;li&gt;vault&lt;/li&gt;
&lt;li&gt;vertical-split&lt;/li&gt;
&lt;li&gt;vertical-three-dots&lt;/li&gt;
&lt;li&gt;wand&lt;/li&gt;
&lt;li&gt;wand-glyph&lt;/li&gt;
&lt;li&gt;workspace-glyph&lt;/li&gt;
&lt;li&gt;wrench-screwdriver-glyph&lt;/li&gt;
&lt;li&gt;yesterday-glyph&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;div&gt;&lt;table class=&quot;dataview table-view-table&quot;&gt;&lt;thead class=&quot;table-view-thead&quot;&gt;&lt;tr class=&quot;table-view-tr-header&quot;&gt;&lt;th class=&quot;table-view-th&quot;&gt;&lt;span&gt;Icon&lt;/span&gt;&lt;span class=&quot;dataview small-text&quot;&gt;148&lt;/span&gt;&lt;/th&gt;&lt;th class=&quot;table-view-th&quot;&gt;&lt;span&gt;Name&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody class=&quot;table-view-tbody&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-file-plus&quot;&gt;&lt;path d=&quot;M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 2v4a2 2 0 0 0 2 2h4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 15h6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 18v-6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;add-note-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-plus-circle&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M8 12h8&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 8v8&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;any-key&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-file-audio&quot;&gt;&lt;path d=&quot;M17.5 22h.5a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 2v4a2 2 0 0 0 2 2h4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M2 19a2 2 0 1 1 4 0v1a2 2 0 1 1-4 0v-4a6 6 0 0 1 12 0v4a2 2 0 1 1-4 0v-1a2 2 0 1 1 4 0&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;audio-file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-layout-list&quot;&gt;&lt;rect x=&quot;3&quot; y=&quot;3&quot; width=&quot;7&quot; height=&quot;7&quot; rx=&quot;1&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;3&quot; y=&quot;14&quot; width=&quot;7&quot; height=&quot;7&quot; rx=&quot;1&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M14 4h7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 9h7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 15h7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 20h7&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;blocks&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-bold&quot;&gt;&lt;path d=&quot;M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;bold-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon box-glyph&quot;&gt;&lt;path d=&quot;M21 13V12.5714C21 11.8964 20.8189 11 19.7143 11L4.28571 11C3.18114 11 3 11.8964 3 12.5714V20.4286C3 21.1036 3.18114 22 4.28571 22H14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 4.14286C21 3.65194 20.8189 3 19.7143 3L4.28571 3C3.18114 3 3 3.65194 3 4.14286&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 8.14286C21 7.65194 20.8189 7 19.7143 7L4.28571 7C3.18114 7 3 7.65194 3 8.14286&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 16V22&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 19H22&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;box-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon bracket-glyph&quot;&gt;&lt;path d=&quot;M9 21C7.89336 21 5 21 5 21C5 21 5 6.79076 5 3C5 3 8.21882 3.00004 9 3.00004&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M15 2.99996C16.1066 2.99996 19 2.99996 19 2.99996C19 2.99996 19 17.2092 19 21C19 21 15.7812 21 15 21&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;bracket-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon broken-link&quot;&gt;&lt;path d=&quot;M12 18.26L10.4886 19.7786L10.4886 19.761C9.64543 20.5738 8.51382 21.0192 7.34221 20.9994C6.17061 20.9795 5.05478 20.496 4.23971 19.655C3.44441 18.8312 3 17.7313 3 16.5868C3 15.4423 3.44441 14.3425 4.23971 13.5186L5.75111 12&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 5.75153L13.5114 4.24023C14.3546 3.42658 15.4862 2.98075 16.6578 3.00064C17.8294 3.02052 18.9452 3.50449 19.7603 4.34629C20.5556 5.17092 21 6.27188 21 7.4175C21 8.56311 20.5556 9.66407 19.7603 10.4887L18.2489 12&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 8L6 8&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 3L8 6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18 16L21 16&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 18L16 21&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;broken-link&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-list&quot;&gt;&lt;line x1=&quot;8&quot; y1=&quot;6&quot; x2=&quot;21&quot; y2=&quot;6&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;8&quot; y1=&quot;12&quot; x2=&quot;21&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;8&quot; y1=&quot;18&quot; x2=&quot;21&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; y1=&quot;6&quot; x2=&quot;3.01&quot; y2=&quot;6&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; y1=&quot;12&quot; x2=&quot;3.01&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; y1=&quot;18&quot; x2=&quot;3.01&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;bullet-list&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-list&quot;&gt;&lt;line x1=&quot;8&quot; y1=&quot;6&quot; x2=&quot;21&quot; y2=&quot;6&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;8&quot; y1=&quot;12&quot; x2=&quot;21&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;8&quot; y1=&quot;18&quot; x2=&quot;21&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; y1=&quot;6&quot; x2=&quot;3.01&quot; y2=&quot;6&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; y1=&quot;12&quot; x2=&quot;3.01&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; y1=&quot;18&quot; x2=&quot;3.01&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;bullet-list-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-calendar-days&quot;&gt;&lt;path d=&quot;M8 2v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 2v4&quot;&gt;&lt;/path&gt;&lt;rect x=&quot;3&quot; y=&quot;4&quot; width=&quot;18&quot; height=&quot;18&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M3 10h18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 14h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 14h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 14h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 18h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 18h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 18h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;calendar-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-calendar-check&quot;&gt;&lt;path d=&quot;M8 2v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 2v4&quot;&gt;&lt;/path&gt;&lt;rect x=&quot;3&quot; y=&quot;4&quot; width=&quot;18&quot; height=&quot;18&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M3 10h18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m9 16 2 2 4-4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;calendar-with-checkmark&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-check-circle-2&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;m9 12 2 2 4-4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;check-in-circle&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon check-small&quot;&gt;&lt;path d=&quot;M12 21C16.9707 21 21 16.9707 21 12C21 7.0293 16.9707 3 12 3C7.0293 3 3 7.0293 3 12C3 16.9707 7.0293 21 12 21Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M7.5 12.5L10.5 15.5L16 10&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;check-small&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-check-square&quot;&gt;&lt;path d=&quot;M21 10.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m9 11 3 3L22 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;checkbox-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-check&quot;&gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;checkmark&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-clock&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;polyline points=&quot;12 6 12 12 16 14&quot;&gt;&lt;/polyline&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;clock&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-clock&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;polyline points=&quot;12 6 12 12 16 14&quot;&gt;&lt;/polyline&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;clock-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-cloud&quot;&gt;&lt;path d=&quot;M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;cloud&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-code-2&quot;&gt;&lt;path d=&quot;m18 16 4-4-4-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m6 8-4 4 4 4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m14.5 4-5 16&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;code-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-terminal-square&quot;&gt;&lt;path d=&quot;m7 11 2-2-2-2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M11 13h4&quot;&gt;&lt;/path&gt;&lt;rect x=&quot;3&quot; y=&quot;3&quot; width=&quot;18&quot; height=&quot;18&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;command-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-minimize-2&quot;&gt;&lt;polyline points=&quot;4 14 10 14 10 20&quot;&gt;&lt;/polyline&gt;&lt;polyline points=&quot;20 10 14 10 14 4&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;14&quot; y1=&quot;10&quot; x2=&quot;21&quot; y2=&quot;3&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; y1=&quot;21&quot; x2=&quot;10&quot; y2=&quot;14&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;compress-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-edit&quot;&gt;&lt;path d=&quot;M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;create-new&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-x&quot;&gt;&lt;path d=&quot;M18 6 6 18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m6 6 12 12&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;cross&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-x-square&quot;&gt;&lt;rect x=&quot;3&quot; y=&quot;3&quot; width=&quot;18&quot; height=&quot;18&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;m15 9-6 6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m9 9 6 6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;cross-in-box&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-star-off&quot;&gt;&lt;path d=&quot;M8.34 8.34 2 9.27l5 4.87L5.82 21 12 17.77 18.18 21l-.59-3.43&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18.42 12.76 22 9.27l-6.91-1L12 2l-1.44 2.91&quot;&gt;&lt;/path&gt;&lt;line x1=&quot;2&quot; y1=&quot;2&quot; x2=&quot;22&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;crossed-star&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon dice&quot;&gt;&lt;path d=&quot;M19 3H5C3.89543 3 3 3.89543 3 5V19C3 20.1046 3.89543 21 5 21H19C20.1046 21 21 20.1046 21 19V5C21 3.89543 20.1046 3 19 3Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M17 16C17 16.5523 16.5523 17 16 17C15.4477 17 15 16.5523 15 16C15 15.4477 15.4477 15 16 15C16.5523 15 17 15.4477 17 16Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M13 12C13 12.5523 12.5523 13 12 13C11.4477 13 11 12.5523 11 12C11 11.4477 11.4477 11 12 11C12.5523 11 13 11.4477 13 12Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 8C9 8.55228 8.55228 9 8 9C7.44772 9 7 8.55228 7 8C7 7.44772 7.44772 7 8 7C8.55228 7 9 7.44772 9 8Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;dice&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon dice-glyph&quot;&gt;&lt;path d=&quot;M19 3H5C3.89543 3 3 3.89543 3 5V19C3 20.1046 3.89543 21 5 21H19C20.1046 21 21 20.1046 21 19V5C21 3.89543 20.1046 3 19 3Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M17 16C17 16.5523 16.5523 17 16 17C15.4477 17 15 16.5523 15 16C15 15.4477 15.4477 15 16 15C16.5523 15 17 15.4477 17 16Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M13 12C13 12.5523 12.5523 13 12 13C11.4477 13 11 12.5523 11 12C11 11.4477 11.4477 11 12 11C12.5523 11 13 11.4477 13 12Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 8C9 8.55228 8.55228 9 8 9C7.44772 9 7 8.55228 7 8C7 7.44772 7.44772 7 8 7C8.55228 7 9 7.44772 9 8Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;dice-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-file&quot;&gt;&lt;path d=&quot;M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 2v4a2 2 0 0 0 2 2h4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;document&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-files&quot;&gt;&lt;path d=&quot;M20 7h-3a2 2 0 0 1-2-2V2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 18a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h7l4 4v10a2 2 0 0 1-2 2Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 7.6v12.8A1.6 1.6 0 0 0 4.6 22h9.8&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;documents&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-git-fork&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;18&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;6&quot; cy=&quot;6&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;18&quot; cy=&quot;6&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 12v3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;dot-network&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-chevrons-down&quot;&gt;&lt;path d=&quot;m7 6 5 5 5-5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m7 13 5 5 5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;double-down-arrow-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-chevrons-up&quot;&gt;&lt;path d=&quot;m17 11-5-5-5 5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m17 18-5-5-5 5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;double-up-arrow-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-arrow-down&quot;&gt;&lt;path d=&quot;M12 5v14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m19 12-7 7-7-7&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;down-arrow-with-tail&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-chevron-down&quot;&gt;&lt;path d=&quot;m6 9 6 6 6-6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;down-chevron-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-corner-right-down&quot;&gt;&lt;polyline points=&quot;10 15 15 20 20 15&quot;&gt;&lt;/polyline&gt;&lt;path d=&quot;M4 4h7a4 4 0 0 1 4 4v12&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;down-curly-arrow-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-copy&quot;&gt;&lt;rect x=&quot;8&quot; y=&quot;8&quot; width=&quot;14&quot; height=&quot;14&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;duplicate-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-maximize-2&quot;&gt;&lt;polyline points=&quot;15 3 21 3 21 9&quot;&gt;&lt;/polyline&gt;&lt;polyline points=&quot;9 21 3 21 3 15&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;21&quot; y1=&quot;3&quot; x2=&quot;14&quot; y2=&quot;10&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; y1=&quot;21&quot; x2=&quot;10&quot; y2=&quot;14&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;enlarge-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-log-in&quot;&gt;&lt;path d=&quot;M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4&quot;&gt;&lt;/path&gt;&lt;polyline points=&quot;10 17 15 12 10 7&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;15&quot; y1=&quot;12&quot; x2=&quot;3&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;enter&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-minimize&quot;&gt;&lt;path d=&quot;M8 3v3a2 2 0 0 1-2 2H3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 8h-3a2 2 0 0 1-2-2V3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 16h3a2 2 0 0 1 2 2v3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 21v-3a2 2 0 0 1 2-2h3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;exit-fullscreen&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-move-vertical&quot;&gt;&lt;polyline points=&quot;8 18 12 22 16 18&quot;&gt;&lt;/polyline&gt;&lt;polyline points=&quot;8 6 12 2 16 6&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;12&quot; y1=&quot;2&quot; x2=&quot;12&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;expand-vertically&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-files&quot;&gt;&lt;path d=&quot;M20 7h-3a2 2 0 0 1-2-2V2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 18a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h7l4 4v10a2 2 0 0 1-2 2Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 7.6v12.8A1.6 1.6 0 0 0 4.6 22h9.8&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;file-explorer-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-pin&quot;&gt;&lt;path d=&quot;M12 17v5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;filled-pin&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-folder-open&quot;&gt;&lt;path d=&quot;m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;folder&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-forward&quot;&gt;&lt;polyline points=&quot;15 17 20 12 15 7&quot;&gt;&lt;/polyline&gt;&lt;path d=&quot;M4 18v-2a4 4 0 0 1 4-4h12&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;forward-arrow&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-maximize&quot;&gt;&lt;path d=&quot;M8 3H5a2 2 0 0 0-2 2v3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 8V5a2 2 0 0 0-2-2h-3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 16v3a2 2 0 0 0 2 2h3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 21h3a2 2 0 0 0 2-2v-3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;fullscreen&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-settings&quot;&gt;&lt;path d=&quot;M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z&quot;&gt;&lt;/path&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;gear&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-file-code&quot;&gt;&lt;path d=&quot;M10 12.5 8 15l2 2.5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m14 12.5 2 2.5-2 2.5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 2v4a2 2 0 0 0 2 2h4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;github-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-file-input&quot;&gt;&lt;path d=&quot;M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 2v4a2 2 0 0 0 2 2h4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M2 15h10&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m9 18 3-3-3-3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;go-to-file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-git-fork&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;18&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;6&quot; cy=&quot;6&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;18&quot; cy=&quot;6&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 12v3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;graph-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-hash&quot;&gt;&lt;line x1=&quot;4&quot; y1=&quot;9&quot; x2=&quot;20&quot; y2=&quot;9&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;4&quot; y1=&quot;15&quot; x2=&quot;20&quot; y2=&quot;15&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;10&quot; y1=&quot;3&quot; x2=&quot;8&quot; y2=&quot;21&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;16&quot; y1=&quot;3&quot; x2=&quot;14&quot; y2=&quot;21&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;hashtag&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon heading-glyph&quot;&gt;&lt;path d=&quot;M9 4H4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M20 4H15&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M20 20H15&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 20H4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18 12L6 12&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M6 20L6 4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18 20L18 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;heading-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon help&quot;&gt;&lt;path d=&quot;M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9.09009 9.00003C9.32519 8.33169 9.78924 7.76813 10.4 7.40916C11.0108 7.05019 12.079 6.94542 12.7773 7.06519C13.9093 7.25935 14.9767 8.25497 14.9748 9.49073C14.9748 11.9908 12 11.2974 12 14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 17H12.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;help&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-highlighter&quot;&gt;&lt;path d=&quot;m9 11-6 6v3h9l3-3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;highlight-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-separator-horizontal&quot;&gt;&lt;line x1=&quot;3&quot; y1=&quot;12&quot; x2=&quot;21&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;polyline points=&quot;8 8 12 4 16 8&quot;&gt;&lt;/polyline&gt;&lt;polyline points=&quot;16 16 12 20 8 16&quot;&gt;&lt;/polyline&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;horizontal-split&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-image&quot;&gt;&lt;rect x=&quot;3&quot; y=&quot;3&quot; width=&quot;18&quot; height=&quot;18&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;circle cx=&quot;9&quot; cy=&quot;9&quot; r=&quot;2&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;image-file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-paperclip&quot;&gt;&lt;path d=&quot;m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;image-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-download&quot;&gt;&lt;path d=&quot;M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4&quot;&gt;&lt;/path&gt;&lt;polyline points=&quot;7 10 12 15 17 10&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;12&quot; y1=&quot;15&quot; x2=&quot;12&quot; y2=&quot;3&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;import-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-indent&quot;&gt;&lt;polyline points=&quot;3 8 7 12 3 16&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;21&quot; y1=&quot;12&quot; x2=&quot;11&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;21&quot; y1=&quot;6&quot; x2=&quot;11&quot; y2=&quot;6&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;21&quot; y1=&quot;18&quot; x2=&quot;11&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;indent-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-info&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M12 16v-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 8h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;info&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-download-cloud&quot;&gt;&lt;path d=&quot;M12 13v8l-4-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m12 21 4-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M4.393 15.269A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.436 8.284&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;install&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-italic&quot;&gt;&lt;line x1=&quot;19&quot; y1=&quot;4&quot; x2=&quot;10&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;14&quot; y1=&quot;20&quot; x2=&quot;5&quot; y2=&quot;20&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;15&quot; y1=&quot;4&quot; x2=&quot;9&quot; y2=&quot;20&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;italic-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-keyboard&quot;&gt;&lt;path d=&quot;M10 8h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 12h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 8h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 12h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18 8h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M6 8h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M7 16h10&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 12h.01&quot;&gt;&lt;/path&gt;&lt;rect x=&quot;2&quot; y=&quot;4&quot; width=&quot;20&quot; height=&quot;16&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;keyboard-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-languages&quot;&gt;&lt;path d=&quot;m5 8 6 6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m4 14 6-6 2-3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M2 5h12&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M7 2h1&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m22 22-5-10-5 10&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 18h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;languages&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon left-arrow&quot;&gt;&lt;path d=&quot;M16.5 3.5L7.5 12.5L16.5 21.5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;left-arrow&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-arrow-left&quot;&gt;&lt;path d=&quot;m12 19-7-7 7-7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 12H5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;left-arrow-with-tail&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-chevron-left&quot;&gt;&lt;path d=&quot;m15 18-6-6 6-6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;left-chevron-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-align-left&quot;&gt;&lt;line x1=&quot;21&quot; y1=&quot;6&quot; x2=&quot;3&quot; y2=&quot;6&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;15&quot; y1=&quot;12&quot; x2=&quot;3&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;17&quot; y1=&quot;18&quot; x2=&quot;3&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;lines-of-text&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon link&quot;&gt;&lt;path d=&quot;M13.1404 10C13.6728 10.3955 14.1134 10.9001 14.4322 11.4796C14.7511 12.0591 14.9407 12.6999 14.9882 13.3586C15.0357 14.0172 14.94 14.6783 14.7076 15.297C14.4751 15.9157 14.1115 16.4775 13.6412 16.9443L10.8588 19.7073C9.98423 20.5462 8.81284 21.0103 7.59697 20.9998C6.38109 20.9893 5.21801 20.505 4.35822 19.6512C3.49844 18.7974 3.01074 17.6424 3.00018 16.435C2.98961 15.2276 3.45702 14.0644 4.30173 13.1959L5.88768 11.6117&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10.8596 14C10.3272 13.6045 9.88658 13.0999 9.56776 12.5204C9.24894 11.9409 9.05935 11.3001 9.01185 10.6414C8.96435 9.98279 9.06004 9.32171 9.29245 8.70302C9.52486 8.08433 9.88853 7.52251 10.3588 7.05567L13.1412 4.29268C14.0158 3.45384 15.1872 2.98968 16.403 3.00017C17.6189 3.01067 18.782 3.49497 19.6418 4.34877C20.5016 5.20257 20.9893 6.35756 20.9998 7.56498C21.0104 8.77239 20.543 9.93562 19.6983 10.8041L18.1123 12.379&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;link&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon link-glyph&quot;&gt;&lt;path d=&quot;M13.1404 10C13.6728 10.3955 14.1134 10.9001 14.4322 11.4796C14.7511 12.0591 14.9407 12.6999 14.9882 13.3586C15.0357 14.0172 14.94 14.6783 14.7076 15.297C14.4751 15.9157 14.1115 16.4775 13.6412 16.9443L10.8588 19.7073C9.98423 20.5462 8.81284 21.0103 7.59697 20.9998C6.38109 20.9893 5.21801 20.505 4.35822 19.6512C3.49844 18.7974 3.01074 17.6424 3.00018 16.435C2.98961 15.2276 3.45702 14.0644 4.30173 13.1959L5.88768 11.6117&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10.8596 14C10.3272 13.6045 9.88658 13.0999 9.56776 12.5204C9.24894 11.9409 9.05935 11.3001 9.01185 10.6414C8.96435 9.98279 9.06004 9.32171 9.29245 8.70302C9.52486 8.08433 9.88853 7.52251 10.3588 7.05567L13.1412 4.29268C14.0158 3.45384 15.1872 2.98968 16.403 3.00017C17.6189 3.01067 18.782 3.49497 19.6418 4.34877C20.5016 5.20257 20.9893 6.35756 20.9998 7.56498C21.0104 8.77239 20.543 9.93562 19.6983 10.8041L18.1123 12.379&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;link-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon links-coming-in&quot;&gt;&lt;path d=&quot;M8.70467 12C8.21657 11.6404 7.81269 11.1817 7.52044 10.6549C7.22819 10.1281 7.0544 9.54553 7.01086 8.94677C6.96732 8.348 7.05504 7.74701 7.26808 7.18456C7.48112 6.62212 7.81449 6.11138 8.24558 5.68697L10.7961 3.17516C11.5978 2.41258 12.6716 1.99062 13.7861 2.00016C14.9007 2.0097 15.9668 2.44997 16.755 3.22615C17.5431 4.00234 17.9902 5.05233 17.9998 6.14998C18.0095 7.24763 17.5811 8.30511 16.8067 9.09467L15.9014 10&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M11.2953 8C11.7834 8.35957 12.1873 8.81831 12.4796 9.34512C12.7718 9.87192 12.9456 10.4545 12.9891 11.0532C13.0327 11.652 12.945 12.253 12.7319 12.8154C12.5189 13.3779 12.1855 13.8886 11.7544 14.313L9.20392 16.8248C8.40221 17.5874 7.32844 18.0094 6.21389 17.9998C5.09933 17.9903 4.03318 17.55 3.24504 16.7738C2.4569 15.9977 2.00985 14.9477 2.00016 13.85C1.99047 12.7524 2.41893 11.6949 3.19326 10.9053L4.09859 10&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M17 21L14 18L17 15&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 18H14&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;links-coming-in&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon links-going-out&quot;&gt;&lt;path d=&quot;M8.70467 12C8.21657 11.6404 7.81269 11.1817 7.52044 10.6549C7.22819 10.1281 7.0544 9.54553 7.01086 8.94677C6.96732 8.348 7.05504 7.74701 7.26808 7.18456C7.48112 6.62212 7.81449 6.11138 8.24558 5.68697L10.7961 3.17516C11.5978 2.41258 12.6716 1.99062 13.7861 2.00016C14.9007 2.0097 15.9668 2.44997 16.755 3.22615C17.5431 4.00234 17.9902 5.05233 17.9998 6.14998C18.0095 7.24763 17.5811 8.30511 16.8067 9.09467L15.9014 10&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M11.2953 8C11.7834 8.35957 12.1873 8.81831 12.4796 9.34512C12.7718 9.87192 12.9456 10.4545 12.9891 11.0532C13.0327 11.652 12.945 12.253 12.7319 12.8154C12.5189 13.3779 12.1855 13.8886 11.7544 14.313L9.20392 16.8248C8.40221 17.5874 7.32844 18.0094 6.21389 17.9998C5.09933 17.9903 4.03318 17.55 3.24504 16.7738C2.4569 15.9977 2.00985 14.9477 2.00016 13.85C1.99047 12.7524 2.41893 11.6949 3.19326 10.9053L4.09859 10&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18 21L21 18L18 15&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 18H21&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;links-going-out&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;logo-crystal&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-search&quot;&gt;&lt;circle cx=&quot;11&quot; cy=&quot;11&quot; r=&quot;8&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;m21 21-4.3-4.3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;magnifying-glass&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-git-merge&quot;&gt;&lt;circle cx=&quot;18&quot; cy=&quot;18&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;6&quot; cy=&quot;6&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6 21V9a9 9 0 0 0 9 9&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;merge-files&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-git-merge&quot;&gt;&lt;circle cx=&quot;18&quot; cy=&quot;18&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;6&quot; cy=&quot;6&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6 21V9a9 9 0 0 0 9 9&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;merge-files-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-mic&quot;&gt;&lt;path d=&quot;M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 10v2a7 7 0 0 1-14 0v-2&quot;&gt;&lt;/path&gt;&lt;line x1=&quot;12&quot; y1=&quot;19&quot; x2=&quot;12&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;microphone&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-mic&quot;&gt;&lt;path d=&quot;M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 10v2a7 7 0 0 1-14 0v-2&quot;&gt;&lt;/path&gt;&lt;line x1=&quot;12&quot; y1=&quot;19&quot; x2=&quot;12&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;microphone-filled&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-minus-circle&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M8 12h8&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;minus-with-circle&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-navigation&quot;&gt;&lt;polygon points=&quot;3 11 22 2 13 21 11 13 3 11&quot;&gt;&lt;/polygon&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;navigate-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-sticky-note&quot;&gt;&lt;path d=&quot;M16 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V8Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M15 3v4a2 2 0 0 0 2 2h4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;note-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-list-ordered&quot;&gt;&lt;line x1=&quot;10&quot; y1=&quot;6&quot; x2=&quot;21&quot; y2=&quot;6&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;10&quot; y1=&quot;12&quot; x2=&quot;21&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;10&quot; y1=&quot;18&quot; x2=&quot;21&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;path d=&quot;M4 6h1v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M4 10h2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M6 18H4c0-1 2-2 2-3s-1-1.5-2-1&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;number-list-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-arrow-up-right&quot;&gt;&lt;path d=&quot;M7 7h10v10&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M7 17 17 7&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;open-elsewhere-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon open-vault&quot;&gt;&lt;path d=&quot;M10 21L4.5 21C3.39543 21 3 20.5255 3 19.2L3 4.80001C3 3.47452 3.39543 3.00001 4.5 3.00001L10 3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 7L22.5 7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 16L22.5 16&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 18.9104L21 5.09381C21 5.09381 21 3.94236 19.5 3.36674L11.5 1.06397C11.5 1.06397 10 0.488257 10 2.79104L10 21.0928C10 23.5159 11.5 22.9403 11.5 22.9403L19.5 20.6375C21 20.0618 21 18.9104 21 18.9104Z&quot;&gt;&lt;/path&gt;&lt;ellipse cx=&quot;16&quot; cy=&quot;11&quot; rx=&quot;1.5&quot; ry=&quot;3&quot;&gt;&lt;/ellipse&gt;&lt;path d=&quot;M16 14L16 17&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;open-vault&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-layout&quot;&gt;&lt;rect x=&quot;3&quot; y=&quot;3&quot; width=&quot;18&quot; height=&quot;18&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M3 9h18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 21V9&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;pane-layout&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-send&quot;&gt;&lt;path d=&quot;M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m21.854 2.147-10.94 10.939&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;paper-plane&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-send&quot;&gt;&lt;path d=&quot;M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m21.854 2.147-10.94 10.939&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;paper-plane-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-clipboard-check&quot;&gt;&lt;rect x=&quot;8&quot; y=&quot;2&quot; width=&quot;8&quot; height=&quot;4&quot; rx=&quot;1&quot; ry=&quot;1&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m9 14 2 2 4-4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;paste&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-clipboard-type&quot;&gt;&lt;rect x=&quot;8&quot; y=&quot;2&quot; width=&quot;8&quot; height=&quot;4&quot; rx=&quot;1&quot; ry=&quot;1&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 12v-1h6v1&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M11 17h2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 11v6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;paste-text&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon paused&quot;&gt;&lt;path d=&quot;M12 21C16.9707 21 21 16.9707 21 12C21 7.0293 16.9707 3 12 3C7.0293 3 3 7.0293 3 12C3 16.9707 7.0293 21 12 21Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10 15V9&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 15V9&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;paused&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-file-text&quot;&gt;&lt;path d=&quot;M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 2v4a2 2 0 0 0 2 2h4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10 9H8&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 13H8&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 17H8&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;pdf-file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-edit-3&quot;&gt;&lt;path d=&quot;M12 20h9&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;pencil&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-percent&quot;&gt;&lt;line x1=&quot;19&quot; y1=&quot;5&quot; x2=&quot;5&quot; y2=&quot;19&quot;&gt;&lt;/line&gt;&lt;circle cx=&quot;6.5&quot; cy=&quot;6.5&quot; r=&quot;2.5&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;17.5&quot; cy=&quot;17.5&quot; r=&quot;2.5&quot;&gt;&lt;/circle&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;percent-sign-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-pin&quot;&gt;&lt;path d=&quot;M12 17v5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;pin&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-play-circle&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;polygon points=&quot;10 8 16 12 10 16 10 8&quot;&gt;&lt;/polygon&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;play-audio-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-diff&quot;&gt;&lt;path d=&quot;M12 3v14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 10h14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 21h14&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;plus-minus-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-plus-circle&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M8 12h8&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 8v8&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;plus-with-circle&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-arrow-up-right&quot;&gt;&lt;path d=&quot;M7 7h10v10&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M7 17 17 7&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;popup-open&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-monitor&quot;&gt;&lt;rect x=&quot;2&quot; y=&quot;3&quot; width=&quot;20&quot; height=&quot;14&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;&lt;line x1=&quot;8&quot; y1=&quot;21&quot; x2=&quot;16&quot; y2=&quot;21&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;12&quot; y1=&quot;17&quot; x2=&quot;12&quot; y2=&quot;21&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;presentation&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-monitor&quot;&gt;&lt;rect x=&quot;2&quot; y=&quot;3&quot; width=&quot;20&quot; height=&quot;14&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;&lt;line x1=&quot;8&quot; y1=&quot;21&quot; x2=&quot;16&quot; y2=&quot;21&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;12&quot; y1=&quot;17&quot; x2=&quot;12&quot; y2=&quot;21&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;presentation-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-tag&quot;&gt;&lt;path d=&quot;M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z&quot;&gt;&lt;/path&gt;&lt;circle cx=&quot;7.5&quot; cy=&quot;7.5&quot; r=&quot;0.5&quot;&gt;&lt;/circle&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;price-tag-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon question-mark-glyph&quot;&gt;&lt;path d=&quot;M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9.09009 9.00003C9.32519 8.33169 9.78924 7.76813 10.4 7.40916C11.0108 7.05019 12.079 6.94542 12.7773 7.06519C13.9093 7.25935 14.9767 8.25497 14.9748 9.49073C14.9748 11.9908 12 11.2974 12 14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 17H12.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;question-mark-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-quote&quot;&gt;&lt;path d=&quot;M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;quote-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-glasses&quot;&gt;&lt;circle cx=&quot;6&quot; cy=&quot;15&quot; r=&quot;4&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;18&quot; cy=&quot;15&quot; r=&quot;4&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M14 15a2 2 0 0 0-2-2 2 2 0 0 0-2 2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M2.5 13 5 7c.7-1.3 1.4-2 3-2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21.5 13 19 7c-.7-1.3-1.5-2-3-2&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;reading-glasses&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-redo-2&quot;&gt;&lt;path d=&quot;m15 14 5-5-5-5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;redo-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-rotate-ccw&quot;&gt;&lt;path d=&quot;M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 3v5h5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;reset&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-rotate-ccw&quot;&gt;&lt;path d=&quot;M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 3v5h5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;restore-file-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon right-arrow&quot;&gt;&lt;path d=&quot;M7.5 21.5L16.5 12.5L7.5 3.5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;right-arrow&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-arrow-right&quot;&gt;&lt;path d=&quot;M5 12h14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m12 5 7 7-7 7&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;right-arrow-with-tail&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-chevron-right&quot;&gt;&lt;path d=&quot;m9 18 6-6-6-6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;right-chevron-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon right-triangle&quot;&gt;&lt;path d=&quot;M3 8L12 17L21 8&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;right-triangle&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-terminal&quot;&gt;&lt;polyline points=&quot;4 17 10 11 4 5&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;12&quot; y1=&quot;19&quot; x2=&quot;20&quot; y2=&quot;19&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;run-command&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-scissors&quot;&gt;&lt;circle cx=&quot;6&quot; cy=&quot;6&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M8.12 8.12 12 12&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M20 4 8.12 15.88&quot;&gt;&lt;/path&gt;&lt;circle cx=&quot;6&quot; cy=&quot;18&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M14.8 14.8 20 20&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;scissors&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-scissors&quot;&gt;&lt;circle cx=&quot;6&quot; cy=&quot;6&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M8.12 8.12 12 12&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M20 4 8.12 15.88&quot;&gt;&lt;/path&gt;&lt;circle cx=&quot;6&quot; cy=&quot;18&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M14.8 14.8 20 20&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;scissors-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-search&quot;&gt;&lt;circle cx=&quot;11&quot; cy=&quot;11&quot; r=&quot;8&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;m21 21-4.3-4.3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;search&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-search&quot;&gt;&lt;circle cx=&quot;11&quot; cy=&quot;11&quot; r=&quot;8&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;m21 21-4.3-4.3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;search-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-box-select&quot;&gt;&lt;path d=&quot;M5 3a2 2 0 0 0-2 2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 3a2 2 0 0 1 2 2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 19a2 2 0 0 1-2 2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 21a2 2 0 0 1-2-2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 3h1&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 21h1&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 3h1&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 21h1&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 9v1&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 9v1&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 14v1&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 14v1&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;select-all-text&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon sheets-in-box&quot;&gt;&lt;path d=&quot;M19 16V22&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 19H22&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M20.7297 13.0005C20.7297 12.4701 20.519 11.9613 20.1439 11.5863C19.7689 11.2112 19.2602 11.0005 18.7297 11.0005H4.72974C4.1993 11.0005 3.6906 11.2112 3.31552 11.5863C2.94045 11.9613 2.72974 12.4701 2.72974 13.0005L2.72974 19.9886C2.72974 20.519 2.94045 21.0277 3.31552 21.4028C3.6906 21.7779 4.1993 21.9886 4.72974 21.9886H13&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 8C21 8 21 7 20 7H4C3.00199 7 3 7.99347 3 7.99347&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 4C21 4 21.0066 3 20 3L4 3C3 3 3 4 3 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;sheets-in-box&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-git-branch-plus&quot;&gt;&lt;path d=&quot;M6 3v12&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M6 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M15 6a9 9 0 0 0-9 9&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18 15v6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 18h-6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;split&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-folder-tree&quot;&gt;&lt;path d=&quot;M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 5a2 2 0 0 0 2 2h3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 3v13a2 2 0 0 0 2 2h3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;stacked-levels&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-star&quot;&gt;&lt;polygon points=&quot;12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2&quot;&gt;&lt;/polygon&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;star&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-star&quot;&gt;&lt;polygon points=&quot;12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2&quot;&gt;&lt;/polygon&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;star-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon star-list&quot;&gt;&lt;path d=&quot;M10 12H3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 6H3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10 18H3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M17 11L18.236 13.3039L21 13.6756L19 15.4679L19.472 18L17 16.8039L14.528 18L15 15.4679L13 13.6756L15.764 13.3039L17 11Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;star-list&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-stop-circle&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;rect x=&quot;9&quot; y=&quot;9&quot; width=&quot;6&quot; height=&quot;6&quot; rx=&quot;1&quot;&gt;&lt;/rect&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;stop-audio-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-strikethrough&quot;&gt;&lt;path d=&quot;M16 4H9a3 3 0 0 0-2.83 4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 12a4 4 0 0 1 0 8H6&quot;&gt;&lt;/path&gt;&lt;line x1=&quot;4&quot; y1=&quot;12&quot; x2=&quot;20&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;strikethrough-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-repeat&quot;&gt;&lt;path d=&quot;m17 2 4 4-4 4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 11v-1a4 4 0 0 1 4-4h14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m7 22-4-4 4-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 13v1a4 4 0 0 1-4 4H3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;switch&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-refresh-cw&quot;&gt;&lt;path d=&quot;M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 3v5h-5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 16H3v5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;sync&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon sync-small&quot;&gt;&lt;path d=&quot;M12 21C16.9707 21 21 16.9707 21 12C21 7.0293 16.9707 3 12 3C7.0293 3 3 7.0293 3 12C3 16.9707 7.0293 21 12 21Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 21C16.9707 21 21 16.9707 21 12C21 7.0293 16.9707 3 12 3C7.0293 3 3 7.0293 3 12C3 16.9707 7.0293 21 12 21Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M7.6394 11.0114C8.08785 9.01426 9.87182 7.52222 12.0044 7.52222C14 7.52222 15 9 16.0121 10.0057M8.00579 14.0042C9 15 10 16.4695 12.0044 16.4695C14.1282 16.4695 15.9062 14.9897 16.3638 13.0049&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16.5 8.5V10.5H14.5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 16L8 14L10 14&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;sync-small&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-tag&quot;&gt;&lt;path d=&quot;M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z&quot;&gt;&lt;/path&gt;&lt;circle cx=&quot;7.5&quot; cy=&quot;7.5&quot; r=&quot;0.5&quot;&gt;&lt;/circle&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;tag-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-menu&quot;&gt;&lt;line x1=&quot;4&quot; y1=&quot;12&quot; x2=&quot;20&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;4&quot; y1=&quot;6&quot; x2=&quot;20&quot; y2=&quot;6&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;4&quot; y1=&quot;18&quot; x2=&quot;20&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;three-horizontal-bars&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-calendar-plus&quot;&gt;&lt;path d=&quot;M8 2v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 2v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 13V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 10h18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 19h6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 16v6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;tomorrow-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-trash-2&quot;&gt;&lt;path d=&quot;M3 6h18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2&quot;&gt;&lt;/path&gt;&lt;line x1=&quot;10&quot; y1=&quot;11&quot; x2=&quot;10&quot; y2=&quot;17&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;14&quot; y1=&quot;11&quot; x2=&quot;14&quot; y2=&quot;17&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;trash&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-copy&quot;&gt;&lt;rect x=&quot;8&quot; y=&quot;8&quot; width=&quot;14&quot; height=&quot;14&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;two-blank-pages&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-undo-2&quot;&gt;&lt;path d=&quot;M9 14 4 9l5-5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;undo-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-outdent&quot;&gt;&lt;polyline points=&quot;7 8 3 12 7 16&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;21&quot; y1=&quot;12&quot; x2=&quot;11&quot; y2=&quot;12&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;21&quot; y1=&quot;6&quot; x2=&quot;11&quot; y2=&quot;6&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;21&quot; y1=&quot;18&quot; x2=&quot;11&quot; y2=&quot;18&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;unindent-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-move-vertical&quot;&gt;&lt;polyline points=&quot;8 18 12 22 16 18&quot;&gt;&lt;/polyline&gt;&lt;polyline points=&quot;8 6 12 2 16 6&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;12&quot; y1=&quot;2&quot; x2=&quot;12&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;up-and-down-arrows&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-arrow-up&quot;&gt;&lt;path d=&quot;m5 12 7-7 7 7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 19V5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;up-arrow-with-tail&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-chevron-up&quot;&gt;&lt;path d=&quot;m18 15-6-6-6 6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;up-chevron-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-corner-right-up&quot;&gt;&lt;polyline points=&quot;10 9 15 4 20 9&quot;&gt;&lt;/polyline&gt;&lt;path d=&quot;M4 20h7a4 4 0 0 0 4-4V4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;up-curly-arrow-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon uppercase-lowercase-a&quot;&gt;&lt;path d=&quot;M10.5 14L4.5 14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12.5 18L7.5 6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 18L7.5 6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M15.9526 10.8322C15.9526 10.8322 16.6259 10 18.3832 10C20.1406 9.99999 20.9986 11.0587 20.9986 11.9682V16.7018C20.9986 17.1624 21.2815 17.7461 21.7151 18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M20.7151 13.5C18.7151 13.5 15.7151 14.2837 15.7151 16C15.7151 17.7163 17.5908 18.2909 18.7151 18C19.5635 17.7804 20.5265 17.3116 20.889 16.6199&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;uppercase-lowercase-a&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon vault&quot;&gt;&lt;path d=&quot;M21 19.2L21 4.8C21 3.47452 20.6046 3 19.5 3L4.5 3C3.39543 3 3 3.47452 3 4.8L3 19.2C3 20.5255 3.39543 21 4.5 21L19.5 21C20.6046 21 21 20.5255 21 19.2Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14.9675 10.56C15.0601 11.1841 14.9535 11.8216 14.6629 12.3817C14.3722 12.9418 13.9124 13.396 13.3488 13.6797C12.7851 13.9634 12.1464 14.0621 11.5234 13.9619C10.9004 13.8616 10.3249 13.5675 9.87868 13.1213C9.43249 12.6751 9.13835 12.0996 9.0381 11.4766C8.93786 10.8536 9.0366 10.2149 9.3203 9.65123C9.60399 9.08759 10.0582 8.62776 10.6183 8.33713C11.1784 8.04651 11.8159 7.93989 12.4401 8.03245C13.0767 8.12687 13.6662 8.42355 14.1213 8.87868C14.5765 9.33381 14.8731 9.92326 14.9675 10.56Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 14L12 17&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 7L22.5 7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 16L22.5 16&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;vault&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-separator-vertical&quot;&gt;&lt;line x1=&quot;12&quot; y1=&quot;3&quot; x2=&quot;12&quot; y2=&quot;21&quot;&gt;&lt;/line&gt;&lt;polyline points=&quot;8 8 4 12 8 16&quot;&gt;&lt;/polyline&gt;&lt;polyline points=&quot;16 16 20 12 16 8&quot;&gt;&lt;/polyline&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;vertical-split&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-more-vertical&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;1&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;12&quot; cy=&quot;5&quot; r=&quot;1&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;12&quot; cy=&quot;19&quot; r=&quot;1&quot;&gt;&lt;/circle&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;vertical-three-dots&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-wand-2&quot;&gt;&lt;path d=&quot;m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m14 7 3 3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 6v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 14v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10 2v2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M7 8H3&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 16h-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M11 3H9&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;wand&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-wand&quot;&gt;&lt;path d=&quot;M15 4V2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M15 16v-2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 9h2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M20 9h2&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M17.8 11.8 19 13&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M15 9h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M17.8 6.2 19 5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m3 21 9-9&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12.2 6.2 11 5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;wand-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-layout&quot;&gt;&lt;rect x=&quot;3&quot; y=&quot;3&quot; width=&quot;18&quot; height=&quot;18&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M3 9h18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 21V9&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;workspace-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-wrench&quot;&gt;&lt;path d=&quot;M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;wrench-screwdriver-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;svg-icon lucide-calendar-minus&quot;&gt;&lt;path d=&quot;M16 19h6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M16 2v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 15V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8.5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 10h18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 2v4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;yesterday-glyph&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h2 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h2&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/obsidian/obsidian 开发过程支持的ICON/" />
        </entry>
        <entry>
            <title>
                digital-garden 在 windows 上面 diff 出错
                
            </title>
            <updated>2024-10-12T15:16:11.000Z</updated>
            <id>https://grove-trees.netlify.app/card/obsidian/digital-garden 在 windows 上面 diff 出错/</id>
            <content type="html">
                &lt;h1 id=&quot;digital-garden-windows-diff&quot; tabindex=&quot;-1&quot;&gt;digital-garden 在 windows 上面 diff 出错&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/oleeskild/obsidian-digital-garden&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/oleeskild/obsidian-digital-garden&lt;/a&gt;&lt;br /&gt;
obsidian 插件 digital-garden 在windows上面有个 bug，会将我的 frontmatter 全部透传&lt;br /&gt;
推到代码库中是这样的： &lt;a href=&quot;https://github.com/wudanyang6/dy_turbo/commit/7b66296c349fb067d3d62c43d5f04b6a784a2197&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/wudanyang6/dy_turbo/commit/7b66296c349fb067d3d62c43d5f04b6a784a2197&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240906005252.png&quot; alt=&quot;Pasted image 20240906005252.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到，格式完全变了&lt;/p&gt;
&lt;p&gt;所以千万不要在 windows 上面使用，不过也可能是我的机器问题&lt;/p&gt;
&lt;p&gt;从而导致的问题是，我的网站上面所有的文章全都使用新路径重新发布了一遍&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/obsidian/digital-garden 在 windows 上面 diff 出错/" />
        </entry>
        <entry>
            <title>
                dg-publish=true的标签云
                
            </title>
            <updated>2024-10-23T12:28:06.000Z</updated>
            <id>https://grove-trees.netlify.app/card/obsidian/dg-publish=true的标签云/</id>
            <content type="html">
                &lt;h1 id=&quot;dg-publish-true&quot; tabindex=&quot;-1&quot;&gt;dg-publish=true的标签云&lt;/h1&gt;
&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E6%95%88%E7%8E%87&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;效率&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:14px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:tools&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;tools&lt;/strong&gt; (2)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:14px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:things3&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;things3&lt;/strong&gt; (2)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:26px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:linux&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;linux&lt;/strong&gt; (8)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:16px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:shell&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;shell&lt;/strong&gt; (3)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:22px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:aigc&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;aigc&lt;/strong&gt; (6)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;压力测试&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:aigc-kimi&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;aigc-kimi&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E6%96%87%E4%BB%B6&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;文件&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;操作系统&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E6%8F%8F%E8%BF%B0%E7%AC%A6&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;描述符&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;文件描述符&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E7%94%B2%E6%B2%9F%E7%82%8E&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;甲沟炎&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:20px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:Go&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;Go&lt;/strong&gt; (5)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:16px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;&lt;/strong&gt; (3)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:chatgpt&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;chatgpt&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:kafka&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;kafka&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E5%AD%A6%E4%B9%A0&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;学习&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:mysql&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;mysql&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:18px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:nginx&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;nginx&lt;/strong&gt; (4)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:master&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;master&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:14px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:Process&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;Process&lt;/strong&gt; (2)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:14px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:source-code&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;source-code&lt;/strong&gt; (2)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:14px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:php&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;php&lt;/strong&gt; (2)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E5%8E%8B%E7%BC%A9&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;压缩&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:14px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:excalidraw&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;excalidraw&lt;/strong&gt; (2)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:redis&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;redis&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:rdb&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;rdb&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:zettelkasten&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;zettelkasten&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:14px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E5%93%B2%E5%AD%A6&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;哲学&lt;/strong&gt; (2)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:aigc-deepseek&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;aigc-deepseek&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;思维导图&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:rime&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;rime&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:marginnote&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;marginnote&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E9%98%85%E8%AF%BB%E5%99%A8&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;阅读器&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:18px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:mac&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;mac&lt;/strong&gt; (4)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E8%BE%93%E5%85%A5%E6%B3%95&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;输入法&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:phpstorm&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;phpstorm&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:ide&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;ide&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:chrome&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;chrome&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E9%95%9C%E5%83%8F&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;镜像&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E5%BC%80%E5%8F%91%E7%BB%8F%E9%AA%8C&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;开发经验&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:linux%E5%91%BD%E4%BB%A4&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;linux命令&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E6%A0%91%E8%8E%93%E6%B4%BE&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;树莓派&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:40px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:leetcode&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;leetcode&lt;/strong&gt; (15)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:14px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E5%89%8D%E7%BC%80%E5%92%8C&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;前缀和&lt;/strong&gt; (2)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:dp&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;dp&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:network&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;network&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;&lt;span style=&quot;font-size:12px; margin-right:20px;&quot;&gt;
                    &lt;a href=&quot;obsidian://search?query=tag:%E5%AE%B6&quot; style=&quot;text-decoration:none; color:inherit;&quot;&gt;
                        &lt;strong&gt;家&lt;/strong&gt; (1)
                    &lt;/a&gt;
                &lt;/span&gt;
&lt;p&gt;digital-garden 还是很牛的，居然是能用的&lt;/p&gt;
&lt;p&gt;贴一下完整代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;``dataviewjs
let tagCounts = {};

// 遍历所有包含标签的笔记，收集标签并统计出现次数
for (let page of dv.pages().where(p =&amp;gt; p.tags &amp;amp;&amp;amp; p[&amp;quot;dg-publish&amp;quot;] === true)) {  // 只处理包含标签的页面
	let tags = page.tags.toString()
	let tagArr = tags.split(&#39;,&#39;)
	
    for (let tag of tagArr) {
        tagCounts[tag] = (tagCounts[tag] || 0) + 1;
    }
}

// 找到标签的最大频次，以便调整大小
let maxCount = Math.max(...Object.values(tagCounts));

// 设置字体大小范围（最小10px，最大40px）
const minSize = 10;
const maxSize = 40;

// 生成标签云，根据频次调整标签字体大小
dv.container.innerHTML = Object.entries(tagCounts)
    .map(([tag, count]) =&amp;gt; {
        // 根据标签出现的频次计算字体大小
        let size = minSize + ((count / maxCount) * (maxSize - minSize));
        // 创建可点击的链接，链接到搜索栏
        return `&amp;lt;span style=&amp;quot;font-size:${size}px; margin-right:20px;&amp;quot;&amp;gt;
                    &amp;lt;a href=&amp;quot;obsidian://search?query=tag:${encodeURIComponent(tag)}&amp;quot; style=&amp;quot;text-decoration:none; color:inherit;&amp;quot;&amp;gt;
                        &amp;lt;strong&amp;gt;${tag}&amp;lt;/strong&amp;gt; (${count})
                    &amp;lt;/a&amp;gt;
                &amp;lt;/span&amp;gt;`;
    })
    .join(&#39;&#39;);  // 每个标签后换行
``
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/obsidian/dg-publish=true的标签云/" />
        </entry>
        <entry>
            <title>
                202409052343 github 部署任务设置 reviewer
                
            </title>
            <updated>2024-10-12T14:22:13.000Z</updated>
            <id>https://grove-trees.netlify.app/card/obsidian/202409052343 github 部署任务设置 reviewer/</id>
            <content type="html">
                &lt;h1 id=&quot;202409052343-github-reviewer&quot; tabindex=&quot;-1&quot;&gt;202409052343 github 部署任务设置 reviewer&lt;/h1&gt;
&lt;p&gt;之前用 windows 机器部署的时候出了问题，大概率是 digital 插件兼容问题：&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/obsidian/digital-garden%20%E5%9C%A8%20windows%20%E4%B8%8A%E9%9D%A2%20diff%20%E5%87%BA%E9%94%99/&quot;&gt;digital-garden 在 windows 上面 diff 出错&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;所以在站点部署时，增加了一个 review 环节，防止站点陷入瘫痪状态&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240906005953.png&quot; alt=&quot;Pasted image 20240906005953.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/obsidian/202409052343 github 部署任务设置 reviewer/" />
        </entry>
        <entry>
            <title>
                202404181240 快捷指令-记录今天的事情 obsidian
                
            </title>
            <updated>2024-05-14T06:25:00.000Z</updated>
            <id>https://grove-trees.netlify.app/card/obsidian/202404181240 快捷指令-记录今天的事情 obsidian/</id>
            <content type="html">
                &lt;h1 id=&quot;202404181240-obsidian&quot; tabindex=&quot;-1&quot;&gt;202404181240 快捷指令-记录今天的事情 obsidian&lt;/h1&gt;
&lt;p&gt;快捷指令地址： &lt;a href=&quot;https://www.icloud.com/shortcuts/6f0552b8622c4b3389b0f53a7af1e919&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.icloud.com/shortcuts/6f0552b8622c4b3389b0f53a7af1e919&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装快捷指令&lt;/p&gt;
&lt;p&gt;修改快捷指令中的参数&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240418124319.png&quot; alt=&quot;Pasted image 20240418124319.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终效果：&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240418124550.png&quot; alt=&quot;Pasted image 20240418124550.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;obsidian 不会到前台占用你的注意力 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/obsidian/%E4%B8%8D%E6%89%93%E5%BC%80obsidian%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E8%AE%B0%E5%BD%95%E5%BD%93%E5%89%8D%E4%BA%8B%E4%BB%B6/&quot;&gt;不打开obsidian的情况下记录当前事件&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/obsidian/202404181240 快捷指令-记录今天的事情 obsidian/" />
        </entry>
        <entry>
            <title>
                202404181228 使用 open --background 的形式打开 obsidian 不够轻便
                
            </title>
            <updated>2024-10-16T11:00:21.000Z</updated>
            <id>https://grove-trees.netlify.app/card/obsidian/202404181228 使用 open --background 的形式打开 obsidian 不够轻便/</id>
            <content type="html">
                &lt;h1 id=&quot;202404181228-open-background-obsidian&quot; tabindex=&quot;-1&quot;&gt;202404181228 使用 open --background 的形式打开 obsidian 不够轻便&lt;/h1&gt;
&lt;p&gt;mac 的快捷指令执行太慢，所以 &lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/obsidian/%E4%B8%8D%E6%89%93%E5%BC%80obsidian%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E8%AE%B0%E5%BD%95%E5%BD%93%E5%89%8D%E4%BA%8B%E4%BB%B6/&quot;&gt;不打开obsidian的情况下记录当前事件&lt;/a&gt; 虽然能够实现后台记录日志，但是对流程太过打扰，所以我现在使用了 &lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;202404181237 Raycast&lt;/a&gt; 的 floating note 进行简单记录一些一闪而过的想法，或者使用 &lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;202404181237 Things&lt;/a&gt; 的快速捕获功能进行记录&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/obsidian/202404181228 使用 open --background 的形式打开 obsidian 不够轻便/" />
        </entry>
        <entry>
            <title>
                编译 nginx
                
            </title>
            <updated>2024-10-21T11:13:29.000Z</updated>
            <id>https://grove-trees.netlify.app/card/nginx/编译 nginx/</id>
            <content type="html">
                &lt;h1 id=&quot;nginx&quot; tabindex=&quot;-1&quot;&gt;编译 nginx&lt;/h1&gt;
&lt;h2 id=&quot;1-mac&quot; tabindex=&quot;-1&quot;&gt;1 在 mac 上面编译&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./configure --with-debug --with-cc=/usr/bin/cc --with-cc-opt=&#39;-O0 -g&#39; --prefix=&amp;quot;/Users/wudanyang/workspace/reading-code-of-nginx-1.9.2/nginx-compile&amp;quot; --with-stream

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 vagrant 上面编译&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;在 vagrant 上面安装
./configure &#92;
--with-debug &#92;
--with-cc=/usr/bin/cc &#92;
--with-cc-opt=&#39;-O0 -g&#39; &#92;
--prefix=&amp;quot;/vagrant/reading-code-of-nginx-1.9.2/nginx-compile/&amp;quot; &#92;
--with-stream &#92;
--with-file-aio

./configure &#92;
--with-debug &#92;
--with-cc=/usr/bin/cc &#92;
--with-cc-opt=&#39;-O0 -g&#39; &#92;
--prefix=&amp;quot;/mnt/mydisk/var/nginx&amp;quot; &#92;
--with-stream &#92;
--with-file-aio
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装 pcre 库，http rewrite module 需要使用&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install libpcre3 libpcre3-dev&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;make&lt;/p&gt;
&lt;p&gt;make install&lt;/p&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 树莓派上面编译&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;auto/configure --prefix=/home/ubuntu/mydisk/var/nginx-debug-1 --with-http_v2_module --with-http_ssl_module
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-1&quot; tabindex=&quot;-1&quot;&gt;2.1 编译时遇到的报错&lt;/h3&gt;
&lt;h4 id=&quot;2-1-1-implicit-fallthrough-error&quot; tabindex=&quot;-1&quot;&gt;2.1.1 implicit fallthrough error&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/jaybill/article/details/80164370&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;linux下编译nginx1.0.15报错：Implicit fallthrough error&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;https://img-blog.csdn.net/2018050211282675?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWJpbGw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70&quot; alt=&quot;这里写图片描述&quot; /&gt;&lt;br /&gt;
CFLAGS表示编译的可选参数，我们只需要在后面加上**-Wno-implicit-fallthrough**，即可忽略gcc7编译时switch-case中缺少break的错误。&lt;/p&gt;
&lt;h4 id=&quot;2-1-2-struct-crypt-data-has-no-member-named-current-salt&quot; tabindex=&quot;-1&quot;&gt;2.1.2 &#39;struct crypt_data&#39; has no member named &#39;current_salt&#39;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/hxlinux/p/12900503.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;编译nginx时struct crypt_data’没有名为‘current_salt’的成员：cd.current_salt[0] = ~salt[0]；的解决方案&lt;/a&gt;&lt;br /&gt;
在源码中注释掉那行代码&lt;/p&gt;
&lt;h4 id=&quot;2-1-3-cast-between-incompatible-function-types&quot; tabindex=&quot;-1&quot;&gt;2.1.3 cast between incompatible function types&lt;/h4&gt;
&lt;p&gt;cast function type&lt;br /&gt;
&lt;a href=&quot;https://github.com/SELinuxProject/setools/issues/2&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/SELinuxProject/setools/issues/2&lt;/a&gt;&lt;br /&gt;
&lt;code&gt;-Wno-cast-function-type&lt;/code&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/nginx/编译 nginx/" />
        </entry>
        <entry>
            <title>
                如何查看 nginx 的rewrite记录
                
            </title>
            <updated>2024-04-25T11:06:19.000Z</updated>
            <id>https://grove-trees.netlify.app/card/nginx/如何查看 nginx 的rewrite记录/</id>
            <content type="html">
                &lt;h1 id=&quot;nginx-rewrite&quot; tabindex=&quot;-1&quot;&gt;如何查看 nginx 的rewrite记录&lt;/h1&gt;
&lt;p&gt;设置 &lt;code&gt;rewrite_log on;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;并且将&lt;code&gt;error_log&lt;/code&gt; 的报错等级改成 &lt;code&gt;notice&lt;/code&gt;;&lt;/p&gt;
&lt;p&gt;官网对 &lt;code&gt;rewrite_log&lt;/code&gt; 的解释：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plain&quot;&gt;Syntax:	rewrite_log on | off;
Default:	
rewrite_log off;
Context:	http, server, location, if
Enables or disables logging of ngx_http_rewrite_module module directives processing results into the error_log at the notice level.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，这个指令只能在 &lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if&lt;/code&gt; 配置指令中使用，日志等级是 &lt;code&gt;notice&lt;/code&gt; 写入到 &lt;code&gt;error_log&lt;/code&gt; 配置的文件中。&lt;/p&gt;
&lt;h1 id=&quot;示例&quot; tabindex=&quot;-1&quot;&gt;示例&lt;/h1&gt;
&lt;p&gt;url： &lt;code&gt;/q?someparams&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;2021/04/22 18:21:28 [notice] 18131#0: *102982 &amp;quot;^/+m/question(.*)?qid=&#92;d+(.*)?$&amp;quot; does not match ...
... 中间省略一些日志
2021/04/22 18:21:28 [notice] 18131#0: *102982 &amp;quot;^/+question/(&#92;w+.*?)$&amp;quot; does not match ...
2021/04/22 18:21:28 [notice] 18131#0: *102982 &amp;quot;^/+q&#92;?(.*)?tn=nsatom_qb_main(.*)?$&amp;quot; matches ...
2021/04/22 18:21:28 [notice] 18131#0: *102982 &amp;quot;^/+q&amp;quot; matches ...
2021/04/22 18:21:28 [notice] 18131#0: *102982 rewritten data: &amp;quot;/q/q/q/q/q&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从上面的日志中可以看出，当触发了重写规则时，会有关键字 &lt;code&gt;matches&lt;/code&gt; 否则会有 &lt;code&gt;does not match&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;最终重写完成之后，访问的地址会有标记：&lt;code&gt;rewritten data&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这里就是 &lt;code&gt;/q/q/q/q/q&lt;/code&gt;&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://serverfault.com/questions/333048/best-way-to-debug-nginx-rewrite-rules-in-config-file&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;best way to debug nginx rewrite rules in config file?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nginx.org/en/docs/http/ngx_http_rewrite_module.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;nginx官方文档：Module ngx_http_rewrite_module&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/nginx/如何查看 nginx 的rewrite记录/" />
        </entry>
        <entry>
            <title>
                vscode 调试nginx代码
                
            </title>
            <updated>2024-10-12T15:02:05.000Z</updated>
            <id>https://grove-trees.netlify.app/card/nginx/vscode 调试nginx代码/</id>
            <content type="html">
                &lt;h1 id=&quot;vscode-nginx&quot; tabindex=&quot;-1&quot;&gt;vscode 调试nginx代码&lt;/h1&gt;
&lt;h2 id=&quot;auto-cc-conf&quot; tabindex=&quot;-1&quot;&gt;修改 auto/cc/conf&lt;/h2&gt;
&lt;p&gt;ngx_compile_opt 中添加 -g&lt;br /&gt;
修改后如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;ngx_compile_opt=&amp;quot;-c -g&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[[#gcc -g 的作用]]&lt;/p&gt;
&lt;h2 id=&quot;and-amp-and-amp&quot; tabindex=&quot;-1&quot;&gt;编译 &amp;amp; 安装 &amp;amp; 运行&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# prefix 是想要安装到的目录
auto/configure --prefix=/home/ubuntu/mydisk/var/nginx-debug-1

# 编译安装
make
make install
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;修改配置&quot; tabindex=&quot;-1&quot;&gt;修改配置&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;vim /home/ubuntu/mydisk/var/nginx-debug-1/conf/nginx.conf&lt;/code&gt;&lt;br /&gt;
将监听端口号改成 &lt;code&gt;8080&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;worker_processes&lt;/code&gt; 改成 1 (方便调试)&lt;/p&gt;
&lt;h3 id=&quot;nginx&quot; tabindex=&quot;-1&quot;&gt;启动 nginx&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;/home/ubuntu/mydisk/var/nginx-debug-1/sbin/nginx&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;nginx 的进程：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;ps aux | grep nginx
ubuntu     17093  0.0  0.0   4184   372 ?        Ss   Mar30   0:00 nginx: master process /home/ubuntu/mydisk/var/nginx-debug-1/sbin/nginx
ubuntu     17094  0.0  0.0   4620  2316 ?        S    Mar30   0:00 nginx: worker process
ubuntu     46072  0.0  0.0   7692   648 pts/0    S+   11:21   0:00 grep --color=auto nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;vscode&quot; tabindex=&quot;-1&quot;&gt;配置 vscode 调试&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息，请访问: https://go.microsoft.com/fwlink/?linkid=830387
    &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,
    &amp;quot;configurations&amp;quot;: [
        {
            &amp;quot;name&amp;quot;: &amp;quot;debug master&amp;quot;,
            &amp;quot;type&amp;quot;: &amp;quot;cppdbg&amp;quot;,
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,
            &amp;quot;program&amp;quot;: &amp;quot;/home/ubuntu/mydisk/var/nginx-debug-1/sbin/nginx&amp;quot;,
            &amp;quot;args&amp;quot;: [],
            &amp;quot;stopAtEntry&amp;quot;: true,
            &amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}&amp;quot;,
            &amp;quot;environment&amp;quot;: [],
            &amp;quot;externalConsole&amp;quot;: false,
            &amp;quot;MIMode&amp;quot;: &amp;quot;gdb&amp;quot;,
            &amp;quot;setupCommands&amp;quot;: [
                {
                    &amp;quot;description&amp;quot;: &amp;quot;为 gdb 启用整齐打印&amp;quot;,
                    &amp;quot;text&amp;quot;: &amp;quot;-enable-pretty-printing&amp;quot;,
                    &amp;quot;ignoreFailures&amp;quot;: true
                }
            ]
        },
        {
            &amp;quot;name&amp;quot;: &amp;quot;debug worker&amp;quot;,
            &amp;quot;type&amp;quot;: &amp;quot;cppdbg&amp;quot;,
            &amp;quot;request&amp;quot;: &amp;quot;attach&amp;quot;,
            &amp;quot;program&amp;quot;: &amp;quot;/home/ubuntu/mydisk/var/nginx-debug-1/sbin/nginx&amp;quot;,
            &amp;quot;processId&amp;quot;: 17094,
            &amp;quot;MIMode&amp;quot;: &amp;quot;gdb&amp;quot;,
            &amp;quot;setupCommands&amp;quot;: [
                {
                    &amp;quot;description&amp;quot;: &amp;quot;为 gdb 启用整齐打印&amp;quot;,
                    &amp;quot;text&amp;quot;: &amp;quot;-enable-pretty-printing&amp;quot;,
                    &amp;quot;ignoreFailures&amp;quot;: true
                }
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 worker 上调试需要改成 attach 的形式，并且使用了一次 attach 之后，就不能使用 strace -p 17094 查看系统调用了&lt;/p&gt;
&lt;p&gt;然后就可以打断点，进行单步调试了&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jianshu.com/p/51b726b56e2f&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Mac上用Visual Studio Code调试Nginx&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;gcc-g&quot; tabindex=&quot;-1&quot;&gt;gcc -g 的作用&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.runoob.com/w3cnote/gcc-parameter-detail.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;GCC 参数详解-runoob&lt;/a&gt;&lt;br /&gt;
在编译的时候会产生调试信息&lt;/p&gt;
&lt;h2 id=&quot;kernel-yama-ptrace-scope&quot; tabindex=&quot;-1&quot;&gt;kernel.yama.ptrace_scope&lt;/h2&gt;
&lt;p&gt;sysctl -a 查看内核参数&lt;br /&gt;
kernel.yama.ptrace_scope&lt;br /&gt;
&lt;a href=&quot;https://www.kernel.org/doc/Documentation/security/Yama.txt&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.kernel.org/doc/Documentation/security/Yama.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;sudo vim /etc/sysctl.d/10-ptrace.conf&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/yihuajack/article/details/107151801&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;VSCode调试出现无法打开glibc库的“raise.c“或“abort.c“等文件的错误&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;sudo-strace&quot; tabindex=&quot;-1&quot;&gt;sudo strace 报 操作不被允许&lt;/h2&gt;
&lt;p&gt;sudo strace -p 17094&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;strace: Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf: Operation not permitted
strace: attach: ptrace(PTRACE_SEIZE, 17094): Operation not permitted
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/19215177/how-to-solve-ptrace-operation-not-permitted-when-trying-to-attach-gdb-to-a-pro&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://stackoverflow.com/questions/19215177/how-to-solve-ptrace-operation-not-permitted-when-trying-to-attach-gdb-to-a-pro&lt;/a&gt;&lt;br /&gt;
Maybe someone has attached this process with gdb.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ps -ef | grep gdb&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;can&#39;t gdb attach the same process twice.&lt;/strong&gt;&lt;br /&gt;
将 vscode 中的 调试关掉，就可以使用 strace 了&lt;br /&gt;
如下图，可以看到，子进程停在了 epoll_pwait 系统调用上了&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020210330203413.png&quot; alt=&quot;attachs/Pasted image 20210330203413.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/nginx/vscode 调试nginx代码/" />
        </entry>
        <entry>
            <title>
                nginx-master-start-worker
                
            </title>
            <updated>2025-01-20T13:13:27.000Z</updated>
            <id>https://grove-trees.netlify.app/card/nginx/nginx-master-start-worker/</id>
            <content type="html">
                &lt;h1 id=&quot;nginx-master-start-worker&quot; tabindex=&quot;-1&quot;&gt;nginx-master-start-worker&lt;/h1&gt;
&lt;h2 id=&quot;入口&quot; tabindex=&quot;-1&quot;&gt;入口&lt;/h2&gt;
&lt;p&gt;启动子进程的流程在&lt;code&gt;ngx_start_worker_processes&lt;/code&gt;函数中，具体代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;static void
ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
{
    ngx_int_t  i;

    ngx_log_error(NGX_LOG_NOTICE, cycle-&amp;gt;log, 0, &amp;quot;start worker processes&amp;quot;);

    for (i = 0; i &amp;lt; n; i++) {

        ngx_spawn_process(cycle, ngx_worker_process_cycle,
                          (void *) (intptr_t) i, &amp;quot;worker process&amp;quot;, type);

        ngx_pass_open_channel(cycle);
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;创建子进程&quot; tabindex=&quot;-1&quot;&gt;创建子进程&lt;/h2&gt;
&lt;p&gt;其中创建子进程的函数为 &lt;code&gt;ngx_spawn_process&lt;/code&gt;，主要就是封装了 &lt;code&gt;fork&lt;/code&gt; 函数。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;ngx_pid_t
ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,
    char *name, ngx_int_t respawn)
{
    // ...
    pid = fork();

    switch (pid) {

    case -1:
        ngx_log_error(NGX_LOG_ALERT, cycle-&amp;gt;log, ngx_errno,
                      &amp;quot;fork() failed while spawning &#92;&amp;quot;%s&#92;&amp;quot;&amp;quot;, name);
        ngx_close_channel(ngx_processes[s].channel, cycle-&amp;gt;log);
        return NGX_INVALID_PID;

    case 0:
        ngx_parent = ngx_pid;
        ngx_pid = ngx_getpid();
        proc(cycle, data);
        break;

    default:
        break;
    }

    ngx_log_error(NGX_LOG_NOTICE, cycle-&amp;gt;log, 0, &amp;quot;start %s %P&amp;quot;, name, pid);

    ngx_processes[s].pid = pid;
    ngx_processes[s].exited = 0;

  // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;fork&lt;/code&gt; 函数的返回值：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;子进程返回0，父进程返回子进程id，若出错，返回 -1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;子进程在 &lt;code&gt;case 0&lt;/code&gt; 中执行 &lt;code&gt;proc&lt;/code&gt; 函数，&lt;code&gt;proc&lt;/code&gt; 函数是 &lt;code&gt;ngx_start_worker_processes&lt;/code&gt; 函数中传进来的第二个参数 &lt;code&gt;ngx_worker_process_cycle&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ngx_worker_process_cycle&lt;/code&gt; 函数，就是 worker 进程的主要流程，以后会继续分析。&lt;/p&gt;
&lt;h2 id=&quot;最大子进程数量&quot; tabindex=&quot;-1&quot;&gt;最大子进程数量&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;if (s == NGX_MAX_PROCESSES) {
    ngx_log_error(NGX_LOG_ALERT, cycle-&amp;gt;log, 0,
                    &amp;quot;no more than %d processes can be spawned&amp;quot;,
                    NGX_MAX_PROCESSES);
    return NGX_INVALID_PID;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#define&quot;&gt;#define&lt;/a&gt; NGX_MAX_PROCESSES         1024
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最大子进程数量定义成了 &lt;code&gt;NGX_MAX_PROCESSES&lt;/code&gt; 也就是 1024，如果超过了 1024个进程，就会报错&lt;/p&gt;
&lt;h2 id=&quot;code-respawn-code&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;respawn&lt;/code&gt; 参数的意义&lt;/h2&gt;
&lt;h3 id=&quot;code-respawn-code-0&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;respawn&lt;/code&gt; 大于等于0时&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;respawn&lt;/code&gt; 大于等于0时，代表重启子进程，respawn 代表给 &lt;code&gt;ngx_processes&lt;/code&gt; 数组的下标&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;if (respawn &amp;gt;= 0) {
    s = respawn;
} else {
    ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;code-respawn-code-0-1&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;respawn&lt;/code&gt; 小于0时&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;respawn&lt;/code&gt; 小于0时，代表启动的子进程的属性，子进程的几种属性：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#define&quot;&gt;#define&lt;/a&gt; NGX_PROCESS_NORESPAWN     -1
&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#define&quot;&gt;#define&lt;/a&gt; NGX_PROCESS_JUST_SPAWN    -2
&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#define&quot;&gt;#define&lt;/a&gt; NGX_PROCESS_RESPAWN       -3
&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#define&quot;&gt;#define&lt;/a&gt; NGX_PROCESS_JUST_RESPAWN  -4
&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#define&quot;&gt;#define&lt;/a&gt; NGX_PROCESS_DETACHED      -5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么 &lt;code&gt;respawn&lt;/code&gt; 小于0时，子进程在 &lt;code&gt;ngx_processes&lt;/code&gt;数组中的下标是多少呢？&lt;/p&gt;
&lt;p&gt;看下面这段代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;for (s = 0; s &amp;lt; ngx_last_process; s++) {
    if (ngx_processes[s].pid == -1) {
        break;
    }
}

if (s == NGX_MAX_PROCESSES) {
    ngx_log_error(NGX_LOG_ALERT, cycle-&amp;gt;log, 0,
                  &amp;quot;no more than %d processes can be spawned&amp;quot;,
                  NGX_MAX_PROCESSES);
    return NGX_INVALID_PID;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实际上就是在找 &lt;code&gt;ngx_processes&lt;/code&gt; 数组中未使用的最小下标。&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;《UNIX 环境高级编程》&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ivanzz1001.github.io/records/post/nginx/2017/12/02/nginx-source_part15_2&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;os/unix/ngx_process.c源代码分析&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/nginx/nginx-master-start-worker/" />
        </entry>
        <entry>
            <title>
                nginx 进程模型-整体架构
                
            </title>
            <updated>2024-10-12T15:03:04.000Z</updated>
            <id>https://grove-trees.netlify.app/card/nginx/nginx 进程模型-整体架构/</id>
            <content type="html">
                &lt;h1 id=&quot;nginx&quot; tabindex=&quot;-1&quot;&gt;nginx 进程模型-整体架构&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/713751-20221106220927618-2090658482.png&quot; alt=&quot;713751-20221106220927618-2090658482.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从网上找了一个非常好的图片，从图中可以看到很多东西&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Nginx&lt;/code&gt; 会生成多个进程&lt;/li&gt;
&lt;li&gt;&lt;code&gt;worker&lt;/code&gt; 使用了 &lt;code&gt;io&lt;/code&gt; 多路复用的事件驱动框架&lt;/li&gt;
&lt;li&gt;&lt;code&gt;worker&lt;/code&gt; 内部有很多模块&lt;/li&gt;
&lt;li&gt;&lt;code&gt;worker&lt;/code&gt; 处理磁盘 &lt;code&gt;I/O&lt;/code&gt; 时，使用了标准 &lt;code&gt;I/O&lt;/code&gt; ， &lt;code&gt;sendfile&lt;/code&gt; ， &lt;code&gt;AIO&lt;/code&gt; ，&lt;code&gt;mmap&lt;/code&gt; 等 &lt;code&gt;I/O&lt;/code&gt; 技术&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cache loader&lt;/code&gt; 和 &lt;code&gt;Cache manager&lt;/code&gt; 操作 proxy cache&lt;/li&gt;
&lt;li&gt;后端支持多种基于 &lt;code&gt;tcp&lt;/code&gt; 的网络协议&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/nginx/nginx 进程模型-整体架构/" />
        </entry>
        <entry>
            <title>
                nginx master 进程
                
            </title>
            <updated>2024-04-18T08:30:16.000Z</updated>
            <id>https://grove-trees.netlify.app/card/nginx/nginx master 进程/</id>
            <content type="html">
                &lt;h1 id=&quot;nginx-master&quot; tabindex=&quot;-1&quot;&gt;nginx master 进程&lt;/h1&gt;
&lt;p&gt;之前有说到 &lt;a href=&quot;https://wudanyang.top/post/nginx/nginx-process/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;nginx 进程模型-整体架构&lt;/a&gt;，下面来看一下 &lt;code&gt;nginx master&lt;/code&gt; 进程的主要工作&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nginx&lt;/code&gt; 的入口 &lt;code&gt;main&lt;/code&gt; 函数在 &lt;code&gt;nginx.c&lt;/code&gt; 文件中&lt;/p&gt;
&lt;p&gt;函数原型为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int ngx_cdecl
main(int argc, char *const *argv)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个函数中，&lt;code&gt;master&lt;/code&gt; 做了一系列的初始化操作&lt;/p&gt;
&lt;p&gt;最终在下面这个地方进入了主流程中：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;//...
    if (ngx_process == NGX_PROCESS_SINGLE) {
        ngx_single_process_cycle(cycle);

    } else {
        ngx_master_process_cycle(cycle);
    }
//...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为我们主要看 &lt;code&gt;master-worker&lt;/code&gt; 这种进程模型，所以进入 &lt;code&gt;ngx_master_process_cycle&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;设置信号屏蔽字，防止创建子进程过程中被信号中断&quot; tabindex=&quot;-1&quot;&gt;设置信号屏蔽字，防止创建子进程过程中被信号中断&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 先清空信号集
    sigemptyset(&amp;amp;set);
    sigaddset(&amp;amp;set, SIGCHLD);
    sigaddset(&amp;amp;set, SIGALRM);
    sigaddset(&amp;amp;set, SIGIO);
    sigaddset(&amp;amp;set, SIGINT);
    sigaddset(&amp;amp;set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));
    sigaddset(&amp;amp;set, ngx_signal_value(NGX_REOPEN_SIGNAL));
    sigaddset(&amp;amp;set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));
    sigaddset(&amp;amp;set, ngx_signal_value(NGX_TERMINATE_SIGNAL));
    sigaddset(&amp;amp;set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
    sigaddset(&amp;amp;set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));

// 设置信号屏蔽字，将 set 中的信号设置为阻塞状态，防止创建worker 的过程中，被进来的信号打断
    if (sigprocmask(SIG_BLOCK, &amp;amp;set, NULL) == -1) {
        ngx_log_error(NGX_LOG_ALERT, cycle-&amp;gt;log, ngx_errno,
                      &amp;quot;sigprocmask() failed&amp;quot;);
    }

// 将 set 清空
    sigemptyset(&amp;amp;set);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置信号屏蔽字，防止在创建子进程的过程中被信号处理程序中断&lt;/p&gt;
&lt;p&gt;关于信号屏蔽字，引用 &lt;code&gt;《UNIX 环境高级编程》 &lt;/code&gt;中信号一节的部分内容：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;进程可以选用&lt;code&gt;“阻塞信号递送”&lt;/code&gt;。如果为进程产生了一个&lt;code&gt;阻塞&lt;/code&gt;的信号,而且对该信号的动作是系统默认动作或捕捉该信号, 则为该进程将此信号保持为&lt;code&gt;未决状态&lt;/code&gt;,直到该进程对此信号解除了阻塞, 或者将对此信号的动作更改为忽略。内核在&lt;code&gt;递送&lt;/code&gt;一个原来被阻塞的信号给进程时(而不是在产生该信号时),才决定对它的处理方式。于是进程在信号递送给它之前仍可改变对该信号的动作。进程调用 &lt;code&gt;sigpending&lt;/code&gt; 函数(见10.13节)来判定哪些信号是设置为阻塞并处于未决状态的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;每个进程都有一个&lt;code&gt;信号屏蔽字( signal mask)&lt;/code&gt;,它规定了当前要阻塞递送到该进程的&lt;code&gt;信号集&lt;/code&gt;。对于每种可能的信号,该屏蔽字中都有一位与之对应。对于某种信号,若其对应位已设置,则它当前是被阻塞的。进程可以调用 &lt;code&gt;sigprocmask&lt;/code&gt;(在10.12节中说明)来检测和更改其当前信号屏蔽字。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当然，在下面创建完子进程之后，会使用 &lt;code&gt;sigsuspend&lt;/code&gt; 解除信号屏蔽，并使 master 进程进入休眠&lt;/p&gt;
&lt;p&gt;关于 &lt;code&gt;sigsuspend&lt;/code&gt; 函数，简单来说，它是一个 &lt;code&gt;sigprocmask(SIG_SETMASK, &amp;amp;emptyset, NULL)&lt;/code&gt; 和 &lt;code&gt;pause()&lt;/code&gt; 函数的结合体，不过相对于使用两个函数完成上述操作，&lt;code&gt;sigsuspend&lt;/code&gt; 是 &lt;code&gt;原子操作&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;具体的操作如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用新的信号集合设置屏蔽字，在这里是清空屏蔽字&lt;/li&gt;
&lt;li&gt;调用信号处理函数，并从信号处理程序返回&lt;/li&gt;
&lt;li&gt;屏蔽字恢复成调用 &lt;code&gt;sigsuspend&lt;/code&gt; 之前的值（再次不让进程被信号打断）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;master-title&quot; tabindex=&quot;-1&quot;&gt;设置 master 进程的 title&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;static u_char  master_process[] = &amp;quot;master process&amp;quot;;

    size = sizeof(master_process);

    for (i = 0; i &amp;lt; ngx_argc; i++) {
        size += ngx_strlen(ngx_argv[i]) + 1;
    }

    title = ngx_pnalloc(cycle-&amp;gt;pool, size);
    if (title == NULL) {
        /* fatal */
        exit(2);
    }

    p = ngx_cpymem(title, master_process, sizeof(master_process) - 1);
    for (i = 0; i &amp;lt; ngx_argc; i++) {
        *p++ = &#39; &#39;;
        p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size);
    }

    ngx_setproctitle(title);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将进程&lt;code&gt;title&lt;/code&gt;设置成三个部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;固定字符：&lt;code&gt;nginx:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;主进程标志: &lt;code&gt;master process&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;命令行启动的命令，如：&lt;code&gt;/home/ubuntu/mydisk/var/nginx-debug-1/sbin/nginx&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以进程刚开始是这样显示的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;$ ps aux | grep nginx | grep -v grep
root      183117  0.0  0.0   4324  2680 ?        ts   17:07   0:00 /home/ubuntu/mydisk/var/nginx-debug-1/sbin/nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置了 title 之后，变成了下面这样：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;$ ps aux | grep nginx | grep -v grep
root      183117  0.0  0.0   4324  2680 ?        ts   17:07   0:00 nginx: master process /home/ubuntu/mydisk/var/nginx-debug-1/sbin/nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;code-worker-code-code-cache-code&quot; tabindex=&quot;-1&quot;&gt;根据配置启动相应数量的 &lt;code&gt;worker&lt;/code&gt; 和 &lt;code&gt;cache&lt;/code&gt; 管理进程&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;ccf = (ngx_core_conf_t *) ngx_get_conf(cycle-&amp;gt;conf_ctx, ngx_core_module);

ngx_start_worker_processes(cycle, ccf-&amp;gt;worker_processes,
                           NGX_PROCESS_RESPAWN);
ngx_start_cache_manager_processes(cycle, 0);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;监听信号，并作出响应&quot; tabindex=&quot;-1&quot;&gt;监听信号，并作出响应&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;ngx_init_signals&lt;/code&gt; 函数中，对原始信号做了变量名映射，具体映射如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;信号&lt;/th&gt;
&lt;th&gt;对应进程中的标志位变量&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;QUIT&lt;/td&gt;
&lt;td&gt;ngx_quit&lt;/td&gt;
&lt;td&gt;优雅关闭服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TERM 或 INT&lt;/td&gt;
&lt;td&gt;ngx_terminate&lt;/td&gt;
&lt;td&gt;强制关闭服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USR1&lt;/td&gt;
&lt;td&gt;ngx_reopen&lt;/td&gt;
&lt;td&gt;重新打开服务中的所有文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WINCH&lt;/td&gt;
&lt;td&gt;ngx_noaccept&lt;/td&gt;
&lt;td&gt;所有子进程不再接受处理新的连接，实际相当于对所有的子进程发送 QUIT 信号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USR2&lt;/td&gt;
&lt;td&gt;ngx_change_binary&lt;/td&gt;
&lt;td&gt;平滑升级到新版本的 Nginx 程序&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HUP&lt;/td&gt;
&lt;td&gt;ngx_reconfigure&lt;/td&gt;
&lt;td&gt;重新读取配置文件并使服务对新配置项生效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CHLD&lt;/td&gt;
&lt;td&gt;ngx_reap&lt;/td&gt;
&lt;td&gt;有子进程意外结束&lt;br /&gt;master 会监控所有子进程，并在子进程意外退出时调用 ngx_reap_children 方法重启子进程&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;master 并不是时刻不停的执行循环检测这些标志位，而是通过 &lt;code&gt;sigsuspend&lt;/code&gt; 进入休眠，等待有信号唤醒进程时，再循环检测所有信号并处理。&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/midion9/article/details/50605337&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;nginx中的ngx_cdecl&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jianshu.com/p/33a7502de6e6&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Nginx源码|Nginx信号处理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://knifefly.cn/2017/09/15/nginx-%E4%BF%A1%E5%8F%B7%E5%A4%84%E7%90%86/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;nginx 信号处理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/ShaoLiang_Ge/article/details/57984123&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;LINUX C中sigprocmask()函数用法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/linux_ever/article/details/50344837&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;linux信号的阻塞和未决&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;《UNIX 环境高级编程》&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/nginx/nginx-master-start-worker/&quot;&gt;nginx-master-start-worker&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/nginx/nginx master 进程/" />
        </entry>
        <entry>
            <title>
                mysql5.7json支持
                
            </title>
            <updated>2024-07-03T16:09:01.000Z</updated>
            <id>https://grove-trees.netlify.app/card/mysql/mysql5.7json支持/</id>
            <content type="html">
                &lt;h1 id=&quot;mysql5-7json&quot; tabindex=&quot;-1&quot;&gt;mysql5.7json支持&lt;/h1&gt;
&lt;h2 id=&quot;内容&quot; tabindex=&quot;-1&quot;&gt;内容&lt;/h2&gt;
&lt;h3 id=&quot;json&quot; tabindex=&quot;-1&quot;&gt;原生支持 json&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;create table user ( uid int auto_increment, data json,primary key(uid)) engine=innodb;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以选择使用 json 类型来创建列&lt;/p&gt;
&lt;h3 id=&quot;虚拟列，可以创建索引&quot; tabindex=&quot;-1&quot;&gt;虚拟列，可以创建索引&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 先创建一个虚拟列
alter table user add user_name varchar(128) generated always as (json_extract(data,&#39;$.name&#39;)) virtual;

-- 然后在虚拟列上创建索引
alter table user add index idx_username (user_name);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里存疑一点，虚拟列的维护可能会耗费比较多的资源，会导致插入性能降低&lt;/p&gt;
&lt;p&gt;虽然虚拟列的值在实际查询时动态计算，节省了磁盘存储空间，但这种计算确实可能在一定程度上影响插入和更新性能。每次插入或更新记录时，MySQL 都需要计算或重新计算虚拟列的值。&lt;/p&gt;
&lt;p&gt;如果在虚拟列上建立索引，这种效果可能会更加显著，因为每次插入或更新操作还需要更新索引。此外，创建索引本身也会消耗磁盘空间。&lt;/p&gt;
&lt;p&gt;然而，这些影响因情况而异。虚拟列表达式的计算性能，以及查询虚拟列和索引所带来的性能提升，可能会抵消甚至超过额外的插入和更新成本。特别是在对存储空间有严格要求，或者需要频繁查询 JSON 属性的场景中，使用虚拟列和索引可能是一个好的选择。&lt;/p&gt;
&lt;p&gt;总的来说，是否使用虚拟列和在其上建立索引，需要根据实际的数据特性、查询模式和性能要求综合考虑决定。在实际应用中，可能需要进行一些性能测试和调优来找到最适合的解决方案。&lt;/p&gt;
&lt;h2 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.tencent.com/developer/article/1114387&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;MySQL 5.7原生JSON格式支持 - 腾讯云开发者社区-腾讯云&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/json.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;MySQL :: MySQL 5.7 Reference Manual :: 11.5 The JSON Data Type&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/mysql/mysql5.7json支持/" />
        </entry>
        <entry>
            <title>
                mac 运行 kafka
                
            </title>
            <updated>2024-05-14T06:22:38.000Z</updated>
            <id>https://grove-trees.netlify.app/card/kafka/mac 运行 kafka/</id>
            <content type="html">
                &lt;h1 id=&quot;mac-kafka&quot; tabindex=&quot;-1&quot;&gt;mac 运行 kafka&lt;/h1&gt;
&lt;h2 id=&quot;安装&quot; tabindex=&quot;-1&quot;&gt;安装&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install kafka
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;broker&quot; tabindex=&quot;-1&quot;&gt;启动 broker&lt;/h2&gt;
&lt;p&gt;手动启动 kafka， 同时启动一个使用 2181 端口的 zookeeper&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/homebrew/opt/kafka/bin/zookeeper-server-start /opt/homebrew/etc/kafka/zookeeper.properties
/opt/homebrew/opt/kafka/bin/kafka-server-start /opt/homebrew/etc/kafka/server.properties
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;启动生产者&quot; tabindex=&quot;-1&quot;&gt;启动生产者&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/homebrew/opt/kafka/bin/kafka-console-producer --topic test --bootstrap-server localhost:9092 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;启动消费者&quot; tabindex=&quot;-1&quot;&gt;启动消费者&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/homebrew/opt/kafka/bin/kafka-console-consumer --topic test --bootstrap-server localhost:9092  --from-beginning
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;topic&quot; tabindex=&quot;-1&quot;&gt;创建 topic&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kafka-topics --create  --replication-factor 1 --partitions 5 --topic myTopic --bootstrap-server localhost:9092
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;topic-1&quot; tabindex=&quot;-1&quot;&gt;查看 topic 列表&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/homebrew/opt/kafka/bin/kafka-topics --bootstrap-server localhost:9092   --list
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;数据文件目录&quot; tabindex=&quot;-1&quot;&gt;数据文件目录&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/homebrew/var/lib/kafka-logs/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;go&quot; tabindex=&quot;-1&quot;&gt;简易 go 程序&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-GO&quot;&gt;package main

import (
	&amp;quot;fmt&amp;quot;

	&amp;quot;github.com/confluentinc/confluent-kafka-go/v2/kafka&amp;quot;
)

func main() {

	p, err := kafka.NewProducer(&amp;amp;kafka.ConfigMap{&amp;quot;bootstrap.servers&amp;quot;: &amp;quot;localhost&amp;quot;})
	if err != nil {
		panic(err)
	}

	defer p.Close()

	// Delivery report handler for produced messages
	go func() {
		for e := range p.Events() {
			switch ev := e.(type) {
			case *kafka.Message:
				if ev.TopicPartition.Error != nil {
					fmt.Printf(&amp;quot;Delivery failed: %v&#92;n&amp;quot;, ev.TopicPartition)
				} else {
					fmt.Printf(&amp;quot;Delivered message to %v&#92;n&amp;quot;, ev.TopicPartition)
				}
			}
		}
	}()

	// Produce messages to topic (asynchronously)
	topic := &amp;quot;myTopic&amp;quot;
	for _, word := range []string{&amp;quot;Welcome&amp;quot;, &amp;quot;to&amp;quot;, &amp;quot;the&amp;quot;, &amp;quot;Confluent&amp;quot;, &amp;quot;Kafka&amp;quot;, &amp;quot;Golang&amp;quot;, &amp;quot;client&amp;quot;} {
		p.Produce(&amp;amp;kafka.Message{
			TopicPartition: kafka.TopicPartition{Topic: &amp;amp;topic, Partition: kafka.PartitionAny},
			Value:          []byte(word),
		}, nil)
	}

	// Wait for message deliveries before shutting down
	p.Flush(15 * 1000)
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;kafka&quot; tabindex=&quot;-1&quot;&gt;《Kafka 权威指南》章节列表&lt;/h2&gt;
&lt;p&gt;《kafka 权威指南》&lt;br /&gt;
章节列表：&lt;br /&gt;
第 1 章 初识 kafka&lt;br /&gt;
第 2 章 安装 Kafka&lt;br /&gt;
第 3 章 Kafka 生产者——向 Kafka 写入数据&lt;br /&gt;
第 4 章 Kafka 消费者——从 Kafka 读取数据&lt;br /&gt;
第 5 章 深入 Kafka&lt;br /&gt;
第 6 章 可靠的数据传递&lt;br /&gt;
第 7 章 构建数据管道&lt;br /&gt;
第 8 章 跨集群数据镜像&lt;br /&gt;
第 9 章 管理 Kafka&lt;br /&gt;
第 10 章 监控 Kafka&lt;br /&gt;
第 11 章 流式处理&lt;/p&gt;
&lt;h2 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/li1669852599/article/details/113254934&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;mac环境下使用brew安装Kafka(详细过程)_brew kafka-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/xyqlrjm/p/14939453.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Kafka整体架构、工作流程与文件存储机制 - 细雨骑驴入剑门 - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/jingdongkeji/p/17879177.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;扫盲Kafka？看这一篇就够了！ - 京东云技术团队 - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/huxi2b/p/8440429.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Kafka元数据缓存(metadata cache) - huxihx - 博客园&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/kafka/mac 运行 kafka/" />
        </entry>
        <entry>
            <title>
                Kafka入门
                
            </title>
            <updated>2025-02-13T05:12:00.000Z</updated>
            <id>https://grove-trees.netlify.app/card/kafka/Kafka入门/</id>
            <content type="html">
                &lt;h1 id=&quot;kafka&quot; tabindex=&quot;-1&quot;&gt;Kafka入门&lt;/h1&gt;
&lt;h2 id=&quot;1-kafka&quot; tabindex=&quot;-1&quot;&gt;1 什么是 Kafka&lt;/h2&gt;
&lt;p&gt;Apache Kafka 是一个分布式流处理平台，被设计用来高效地处理高吞吐量的数据流。它广泛应用于实时数据管道和流式应用程序中。以下是 Kafka 的一些主要优点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;高吞吐量&lt;/strong&gt;：Kafka 支持高吞吐量的数据处理，即使是非常大的数据量也能够快速处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展性&lt;/strong&gt;：Kafka 集群可以横向扩展以处理更多的数据，可以在不停机的情况下动态添加更多的 Broker。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持久性和可靠性&lt;/strong&gt;：Kafka 可以将数据持久化到磁盘，因此即使系统发生故障，数据也不会丢失。它使用分区和副本机制来确保数据的高可用性和耐用性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容错能力&lt;/strong&gt;：通过数据副本，Kafka 可以在节点故障时保证数据不丢失，从而提供高可靠性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低延迟&lt;/strong&gt;：Kafka 能够在保持高吞吐量的同时实现低延迟的消息传递。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可靠的消息传递保证&lt;/strong&gt;：Kafka 支持几种消息传递保证，包括最多一次、至少一次和精确一次（事务性传递）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多客户端支持&lt;/strong&gt;：Kafka 提供多种编程语言的客户端库，方便不同开发环境下的集成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流处理&lt;/strong&gt;：Kafka Streams API 允许构建实时流处理应用，可以进行复杂的数据处理和分析。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可观测性&lt;/strong&gt;：Kafka 提供了监控数据流和系统性能的工具，有助于性能调优和问题诊断。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大型社区和生态系统&lt;/strong&gt;：Kafka 拥有一个庞大的社区和丰富的生态系统，提供了大量的工具和插件以及集成方案，可以帮助用户更好地开发和维护 Kafka 系统。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 使用场景&lt;/h2&gt;
&lt;p&gt;Kafka 的这些优点使它在需要处理大量实时数据的系统中特别有价值，包括日志聚合、流式处理、事件源、实时监控和分析等场景。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-01-16_812.png&quot; alt=&quot;clop_2024-01-16_812.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;3-kafka&quot; tabindex=&quot;-1&quot;&gt;3 kafka 生产消费流程&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-01-16_813.png&quot; alt=&quot;clop_2024-01-16_813.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;../100 Programmer/mac 运行 kafka&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;2-kafka&quot; tabindex=&quot;-1&quot;&gt;2 Kafka 整体架构&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Resources/drawio/Kafka%20%E6%95%B0%E6%8D%AE%E6%B5%81.png&quot; alt=&quot;../../attachs/Resources/drawio/Kafka 数据流.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kafka 系统的核心概念包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Producer（生产者）&lt;/strong&gt;：负责发布消息到 Kafka 的 Topic（主题）中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer（消费者）&lt;/strong&gt;：订阅 Topic，并处理发布到这些 Topic 的消息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer Group（消费者组）&lt;/strong&gt;：一个消费者组可以有一个或多个消费者实例。当多个消费者实例属于同一个消费者组时，它们会在组内共享 Topic 的 Partition。这意味着，每个 Partition 只会被消费者组中的一个消费者实例消费，这样可以保证每条消息只被组内的一个消费者处理，从而实现消息的负载均衡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Broker（代理）&lt;/strong&gt;：Kafka 集群中的服务器，负责存储数据并处理 Producer 和 Consumer 的请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Topic（主题）&lt;/strong&gt;：消息的分类，Producer 发布消息到指定的 Topic，Consumer 订阅并消费 Topic 中的消息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partition（分区）&lt;/strong&gt;：Topic 的物理分割，每个 Partition 在存储层面是独立的，可以在不同的 Broker 上。Partition 内的消息是有序的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offset（偏移量）&lt;/strong&gt;：Partition 中每条消息的唯一标识，可以看作是消息在 Partition 中的索引。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replica（副本）&lt;/strong&gt;：Partition 的副本，用于提高数据的可靠性和容错性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zookeeper&lt;/strong&gt;：Kafka 使用 Zookeeper 来进行集群管理和协调。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stream Processing（流处理）&lt;/strong&gt;：Kafka Streams 是 Kafka 的流处理库，用于构建流式应用程序。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connect（连接器）&lt;/strong&gt;：Kafka Connect 是用于构建和运行可重用的数据导入和导出连接器的工具。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kafka 生产者将消息发送到负责存储目标 Topic 的 Partition 的 Broker 上。在 Kafka 集群中，每个 Topic 可以分为多个 Partition，而每个 Partition 可能分布在不同的 Broker 上。每个 Partition 有一个 Broker 充当 Leader，其他的 Broker 充当 Follower。所有的读写操作都是通过 Leader Broker 进行的，Follower 负责同步数据以保证高可用性和数据的冗余。&lt;/p&gt;
&lt;h1 id=&quot;3-kafka-1&quot; tabindex=&quot;-1&quot;&gt;3 Kafka 核心逻辑&lt;/h1&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 物理存储&lt;/h2&gt;
&lt;p&gt;Kafka 的基本存储单元是分区。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Resources/drawio/kafka%E5%AD%98%E5%82%A8.drawio.png&quot; alt=&quot;kafka存储.drawio.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;kafka 存储的时候也是使用同样的格式存储到磁盘上，这样可以利用到零拷贝技术&lt;/p&gt;
&lt;h2 id=&quot;2-1&quot; tabindex=&quot;-1&quot;&gt;2 生产者&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-01-16_814-kafka%E7%94%9F%E4%BA%A7%E8%80%85%E7%BB%84%E4%BB%B6%E5%9B%BE.png&quot; alt=&quot;clop_2024-01-16_814-kafka生产者组件图.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先，我们需要创建一个 &lt;code&gt;ProducerRecord&lt;/code&gt;，这个对象需要包含消息的主题（topic）和值（value），可以选择性指定一个键值（key）或者分区（partition）。&lt;/li&gt;
&lt;li&gt;发送消息时，生产者会对键值和值&lt;strong&gt;序列化&lt;/strong&gt;成字节数组，然后发送到&lt;strong&gt;分配器&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;如果我们指定了分区，那么分配器返回该分区即可；否则，分配器将会基于键来选择一个分区并返回。&lt;/li&gt;
&lt;li&gt;选择完分区后，生产者知道了消息所属的主题和分区，它将这条记录添加到相同主题和分区的同一批次消息中，另一个线程负责发送这些批量消息到对应的 Kafka Broker。&lt;/li&gt;
&lt;li&gt;当 Broker 接收到消息后，如果成功写入则返回一个包含消息的主题、分区及位移的 RecordMetadata 对象，否则返回异常。&lt;/li&gt;
&lt;li&gt;生产者接收到结果后，对于异常可能会进行重试。重试几次还是失败会返回错误。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;生产者并不是将消息发送到任意的 Broker，而是发送到管理特定 Partition 的 Leader Broker 上，以确保消息的正确存储和分发。&lt;/p&gt;
&lt;p&gt;消息写入多个分区&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-01-18_844.png&quot; alt=&quot;clop_2024-01-18_844.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 消费者&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-01-17_818-%E4%B8%BB%E9%A2%98%E5%92%8C%E6%B6%88%E8%B4%B9%E8%80%85%E7%BE%A4%E7%BB%84%E7%9A%84%E5%85%B3%E7%B3%BB.png&quot; alt=&quot;clop_2024-01-17_818-主题和消费者群组的关系.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Resources/drawio/kafka%E6%B6%88%E8%B4%B9%E8%80%85.drawio.png&quot; alt=&quot;kafka消费者.drawio&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-1-offset&quot; tabindex=&quot;-1&quot;&gt;3.1 提交 offset&lt;/h3&gt;
&lt;p&gt;Kafka 消费者提交偏移量的过程是为了记录消费者在消费 Topic 的 Partition 时当前的位置，以便在消费者重启或发生故障时能从上次处理的位置继续消费，保证消息不会丢失也不会被重复消费。提交偏移量的过程主要包括以下步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;消费消息&lt;/strong&gt;：消费者从 Broker 拉取数据并进行处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提交偏移量&lt;/strong&gt;：在成功处理完一批消息后，消费者会将最新的偏移量提交给 Kafka。提交的偏移量是消费者下一次预期读取的起始位置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;偏移量存储&lt;/strong&gt;：提交的偏移量存储在 Kafka 内的一个特殊的 Topic 中，名为 &lt;code&gt;__consumer_offsets&lt;/code&gt;。每个消费者组的偏移量都会在这个 Topic 中维护。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;偏移量读取&lt;/strong&gt;：如果消费者发生重启或故障，它会从 &lt;code&gt;__consumer_offsets&lt;/code&gt; Topic 中读取上次提交的偏移量，从而恢复其消费状态。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;提交偏移量的方式主要有两种：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;自动提交偏移量&lt;/strong&gt;：Kafka 消费者默认的偏移量提交方式是自动提交。这是通过在消费者配置中设置 &lt;code&gt;enable.auto.commit=true&lt;/code&gt; 来实现的，并且可以通过 &lt;code&gt;auto.commit.interval.ms&lt;/code&gt; 配置项来指定提交间隔。这种方式简单方便，但是由于提交是周期性进行的，可能会导致消息重复消费（如果在两次提交间隔内消费者失败）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手动提交偏移量&lt;/strong&gt;：为了更精确地控制消息的消费状态，可以选择手动提交偏移量。手动提交可以是同步的也可以是异步的：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;同步提交&lt;/strong&gt;：通过调用 &lt;code&gt;consumer.commitSync()&lt;/code&gt; 方法，消费者会阻塞直到偏移量提交完成。这种方式会确保偏移量提交成功，如果提交失败，可以立即进行重试处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步提交&lt;/strong&gt;：通过调用 &lt;code&gt;consumer.commitAsync()&lt;/code&gt; 方法，消费者可以在不阻塞当前线程的情况下提交偏移量。异步提交通常会提供一个回调函数来处理可能发生的提交错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步 + 同步&lt;/strong&gt;：针对异步提交偏移量丢失的问题，通过对消费者进行异步批次提交并且在关闭时同步提交的方式，这样即使上一次的异步提交失败，通过同步提交还能够进行补救，同步会一直重试，直到提交成功。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4 复制&lt;/h2&gt;
&lt;h3 id=&quot;4-1&quot; tabindex=&quot;-1&quot;&gt;4.1 控制器&lt;/h3&gt;
&lt;p&gt;有一个概念需要单独阐明：控制器&lt;/p&gt;
&lt;p&gt;控制器其实就是一个 Broker，只不过它除了具有一般 Broker 的功能之外，&lt;strong&gt;还负责分区首领的选举&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;控制器是 Kafka 集群的管理节点。在一个 Kafka 集群中，所有的 Broker 节点中只有一个节点会被选举为控制器。&lt;/p&gt;
&lt;p&gt;每个新选出的控制器通过 Zookeeper 的条件递增操作获得一个全新的、数值更大的 epoch 值，防止脑裂&lt;/p&gt;
&lt;p&gt;简而言之，Kafka 使用 Zookeeper 的临时节点来选举控制器，并在节点加入集群或退出集群时通知控制器。控制器负责在节点加入或离开集群时进行分区首领选举。控制器使用 epoch 来避免“脑裂”。“脑裂”是指两个节点同时认为自己是当前的控制器。&lt;/p&gt;
&lt;h3 id=&quot;4-2&quot; tabindex=&quot;-1&quot;&gt;4.2 与首领保持一致&lt;/h3&gt;
&lt;p&gt;为了与首领保持同步，跟随者向首领发送获取数据的请求，&lt;strong&gt;这种请求与消费者为了读取消息而发送的请求是一样的&lt;/strong&gt;。首领将响应消息发给跟随者。请求消息里包含了跟随者想要获取消息的偏移量，而且这些偏移量总是有序的。&lt;/p&gt;
&lt;h2 id=&quot;5&quot; tabindex=&quot;-1&quot;&gt;5 处理请求&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-01-18_846.png&quot; alt=&quot;clop_2024-01-18_846.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kafka 使用零复制技术向客户端发送消息——也就是说，顺序读写内容，Kafka 直接把消息从文件 (或者更确切地说是 Linux 文件系统缓存) 里发送到网络通道，而不需要经过任何中间缓冲区。&lt;/p&gt;
&lt;p&gt;零拷贝示意图：&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-01-18_848.png&quot; alt=&quot;clop_2024-01-18_848.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;零拷贝省略了数据在内核空间和用户空间之间的重复穿梭；用户态和内核态切换时产生中断，耗时；&lt;/p&gt;
&lt;p&gt;生产请求和获取请求都必须发送给分区的首领副本。&lt;/p&gt;
&lt;p&gt;如何获取分区首领所在的 broker：&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/clop_2024-01-18_847.png&quot; alt=&quot;clop_2024-01-18_847.png&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;4-3&quot; tabindex=&quot;-1&quot;&gt;4 可靠性保证&lt;/h1&gt;
&lt;p&gt;先了解一个概念：不完全的首领选举&lt;/p&gt;
&lt;h2 id=&quot;1-1&quot; tabindex=&quot;-1&quot;&gt;1 消息传递语义&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;最多一次（at most once）：消息可能会丢失，但绝不会被重复发送。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;消费者端配置自动提交偏移量，并且在处理消息之前就提交。如果在提交偏移量后处理消息时发生了故障，那么这些消息可能不会被重新消费。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;至少一次（at least once）：消息不会丢失，但有可能被重复发送。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;手动提交偏移量。如果消费者在成功处理消息之前失败，那么同一消息可能会被再次消费。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;恰好一次（exactly once）：消息不会丢失，也不会被重复发送。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kafka 通过“幂等生产者”（Idempotent Producer）和“事务”（Transactions）来支持恰好一次的语义。幂等生产者确保即使生产者发送重复的消息，Broker 也只会接收一次。事务性生产者可以将消息的发送和偏移量的提交放在同一个事务中，确保它们要么都成功，要么都失败。（恰好一次语义在 Kafka 0.11 版本及以上被引入。）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;2-2&quot; tabindex=&quot;-1&quot;&gt;2 不完全的首领选举&lt;/h2&gt;
&lt;p&gt;是否允许不完全的首领选举：unclean.leader.election&lt;br /&gt;
如果在选举过程中没有丢失数据，也就是说提交的数据同时存在于所有的同步副本上，那么这个选举就是“完全”的。&lt;br /&gt;
如果在首领不可用时其他副本都是不同步的，那么这个选举就是“不完全”的。&lt;/p&gt;
&lt;p&gt;简而言之，如果我们允许不同步的副本成为首领，那么就要承担丢失数据和出现数据不一致的⻛险。如果不允许它们成为首领，那么就要接受较低的可用性，因为我们必须等待原先的首领恢复到可用状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;unclean.leader.election=false&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;3-1&quot; tabindex=&quot;-1&quot;&gt;3 复制&lt;/h2&gt;
&lt;p&gt;复制系数&lt;br /&gt;
&lt;strong&gt;replication.factor &amp;gt;= 2&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;min.insync.replicas &amp;gt; 1&lt;/strong&gt; 则至少有一个同步从副本&lt;/p&gt;
&lt;h2 id=&quot;4-4&quot; tabindex=&quot;-1&quot;&gt;4 使用生产者&lt;/h2&gt;
&lt;p&gt;发送确认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;acks=0 立即返回，不论是否写入&lt;/li&gt;
&lt;li&gt;acks=1 当前首领副本已经写入&lt;/li&gt;
&lt;li&gt;acks=-1 或 all 所有同步的副本已经被写入&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重试&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置重试次数&lt;/li&gt;
&lt;li&gt;设置重试间隔&lt;/li&gt;
&lt;li&gt;程序兜底其他错误&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-1&quot; tabindex=&quot;-1&quot;&gt;5 使用消费者&lt;/h2&gt;
&lt;p&gt;如果消费者提交了偏移量却未能处理完消息，那么就有可能造成消息丢失，这也是消费者丢失消息的主要原因。&lt;/p&gt;
&lt;p&gt;正确的做法是：拉取数据、业务逻辑处理、提交消费 Offset 位移信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;enable.auto.commit = false&lt;/strong&gt; 采用手动提交位移的方式。&lt;/p&gt;
&lt;p&gt;对于消费消息重复的情况，业务自己保证幂等性， 保证只成功消费一次即可。&lt;/p&gt;
&lt;h1 id=&quot;6&quot; tabindex=&quot;-1&quot;&gt;6 思考&lt;/h1&gt;
&lt;p&gt;Q: 知道了 kafka 的物理存储的结构，那么 kafka 通过 offset 查找对应的文件位置的过程是什么样的呢？&lt;/p&gt;
&lt;p&gt;Q: 从副本在什么情况下被认为是不同步 (OSR) ？&lt;/p&gt;
&lt;p&gt;Q: offset 为什么要从 zookeeper 挪到 kafka 本身存储呢？&lt;/p&gt;
&lt;p&gt;Q：分区分成多少比较好？&lt;/p&gt;
&lt;p&gt;Q：在主题流量不是很大的情况下，消费者一直轮询会造成浪费，有没有什么方式能够避免这种情况？&lt;/p&gt;
&lt;p&gt;Q：Kafka 为什么要把自己定位成一个分布式流平台？&lt;/p&gt;
&lt;h1 id=&quot;7&quot; tabindex=&quot;-1&quot;&gt;7 参考&lt;/h1&gt;
&lt;p&gt;《Kafka 权威指南》 Neha Narkhede Gwen Shapira Todd Palino 著 薛命灯译&lt;/p&gt;
&lt;p&gt;官网文档： &lt;a href=&quot;https://kafka.apache.org/documentation/#design&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Apache Kafka&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/li1669852599/article/details/113254934&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;mac环境下使用brew安装Kafka(详细过程)_brew kafka-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/xyqlrjm/p/14939453.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Kafka整体架构、工作流程与文件存储机制 - 细雨骑驴入剑门 - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/jingdongkeji/p/17879177.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;扫盲Kafka？看这一篇就够了！ - 京东云技术团队 - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/huxi2b/p/8440429.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Kafka元数据缓存(metadata cache) - huxihx - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/zhengzhaoxiang/p/13977382.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Kafka 物理存储机制 - Java程序员进阶 - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.tencent.com/developer/article/1787164&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;稀疏索引与其在Kafka和ClickHouse中的应用-腾讯云开发者社区-腾讯云&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/alvinscript/p/17407980.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;8张图带你全面了解kafka的核心机制 - JAVA旭阳 - 博客园&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/459610418&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;进阶，Kafka 如何保证消息不丢失？ - 知乎&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.tencent.com/developer/article/2181009&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Kafka的自我定位&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/kafka/Kafka入门/" />
        </entry>
        <entry>
            <title>
                快速创建一个可访问的服务
                
            </title>
            <updated>2025-02-24T07:29:43.000Z</updated>
            <id>https://grove-trees.netlify.app/card/k8s/快速创建一个可访问的服务/</id>
            <content type="html">
                &lt;h1 id=&quot;快速创建一个可访问的服务&quot; tabindex=&quot;-1&quot;&gt;快速创建一个可访问的服务&lt;/h1&gt;
&lt;h2 id=&quot;1-k8s&quot; tabindex=&quot;-1&quot;&gt;1 创建一个 k8s 集群&lt;/h2&gt;
&lt;p&gt;安装 &lt;code&gt;Docker Desktop&lt;/code&gt;，并在设置中开启&lt;code&gt;Kubernetes&lt;/code&gt; 功能 &lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020241014143603.png&quot; alt=&quot;Pasted image 20241014143603.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这时，你会得到一个单节点的 &lt;code&gt;k8s&lt;/code&gt; 集群&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;kubectl get nodes&lt;/code&gt; 查看，会输出以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;➜  qsk-book git:(main) ✗ kubectl get nodes
NAME             STATUS   ROLES           AGE   VERSION
docker-desktop   Ready    control-plane   14h   v1.30.2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在启动了一个名为 &lt;code&gt;docker-desktop&lt;/code&gt; 的 &lt;code&gt;control-plane&lt;/code&gt; （控制面） 节点&lt;/p&gt;
&lt;h2 id=&quot;2-code-k8s-code&quot; tabindex=&quot;-1&quot;&gt;2 将应用部署到 &lt;code&gt;k8s&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;下载示例文件（示例文件是《Kubernetes 快速入门》一书的附带内容）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git clone https://github.com/nigelpoulton/qsk-book.git
cd qsk-book
ls -l 

# 输出内容
total 24
drwxr-xr-x 7 wudanyang 224 10 13 15:50 App
drwxr-xr-x 8 wudanyang 256 10 13 15:50 Appv1.1
-rw-r--r-- 1 wudanyang 509 10 14 13:04 deploy.yml
-rw-r--r-- 1 wudanyang 225 10 13 15:50 pod.yml
-rw-r--r-- 1 wudanyang 929 10 13 15:50 readme.md
-rw-r--r-- 1 wudanyang 509 10 13 15:50 rolling-update.yml
-rw-r--r-- 1 wudanyang 178 10 13 15:50 svc-cloud.yml
-rw-r--r-- 1 wudanyang 217 10 13 15:50 svc-local.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;部署 Pod：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;kubectl apply -f pod.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;➜  qsk-book git:(main) ✗ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
first-pod                     1/1     Running   0          6s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看部署的 &lt;code&gt;Pod&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;kubectl describe pod first-pod
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，现在 Pod 是运行中了，端口号监听的是 8080&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Name:             first-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             docker-desktop/192.168.65.3
Start Time:       Mon, 14 Oct 2024 14:49:56 +0800
Labels:           project=qsk-book
Annotations:      &amp;lt;none&amp;gt;
Status:           Running
IP:               10.1.0.27
IPs:
  IP:  10.1.0.27
Containers:
  web-ctr:
    Container ID:   docker://d06da3abd9e749933edc798a99571e3540bf8a16059823a78e4483530157e323
    Image:          nigelpoulton/qsk-book:latest
    Image ID:       docker-pullable://nigelpoulton/qsk-book@sha256:ea4422925917a5d957aab20603bbd2521e811088dc68ca3f5703458966733d72
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Mon, 14 Oct 2024 14:50:00 +0800
    Ready:          True
    Restart Count:  0
    Environment:    &amp;lt;none&amp;gt;
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-j8kn6 (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       True
  ContainersReady             True
  PodScheduled                True
Volumes:
  kube-api-access-j8kn6:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       &amp;lt;nil&amp;gt;
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              &amp;lt;none&amp;gt;
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  16m   default-scheduler  Successfully assigned default/first-pod to docker-desktop
  Normal  Pulling    16m   kubelet            Pulling image &amp;quot;nigelpoulton/qsk-book:latest&amp;quot;
  Normal  Pulled     16m   kubelet            Successfully pulled image &amp;quot;nigelpoulton/qsk-book:latest&amp;quot; in 3.231s (3.231s including waiting). Image size: 193578060 bytes.
  Normal  Created    16m   kubelet            Created container web-ctr
  Normal  Started    16m   kubelet            Started container web-ctr
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 连接到应用&lt;/h2&gt;
&lt;p&gt;如果只是部署了一个应用，那么在外部是不能访问到这个应用的，因为它的网络只工作在 k8s 的内部&lt;/p&gt;
&lt;p&gt;要想在外部访问应用，还得使用  &lt;code&gt;Service&lt;/code&gt; 才行&lt;/p&gt;
&lt;p&gt;使用 svc-local.yml 文件部署一个 Service 对象&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;➜  qsk-book git:(main) ✗ kubectl apply -f svc-local.yml
service/svc-local created
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# 2022 version
apiVersion: v1
kind: Service
metadata:
  name: svc-local
spec:
  type: NodePort
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    nodePort: 31111
  selector:
    project: qsk-book
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置文件的内容大概意思就是将 label 为 &lt;em&gt;project: qsk-book&lt;/em&gt; 的应用的8080 端口映射到节点的 31111 端口，细节再去看书&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;➜  qsk-book git:(main) ✗ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       &amp;lt;none&amp;gt;        443/TCP          15h
svc-local    NodePort    10.101.54.180   &amp;lt;none&amp;gt;        8080:31111/TCP   2m34s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;a href=&quot;http://localhost:31111/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;http://localhost:31111/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;出现下面的情况，就代表访问通了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020241014152010.png&quot; alt=&quot;Pasted image 20241014152010.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4 清理应用&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl delete pod first-pod
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;5&quot; tabindex=&quot;-1&quot;&gt;5 应用自我修复&lt;/h2&gt;
&lt;p&gt;自我修复需要一个新的对象：&lt;code&gt;Deployment&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f deploy.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;replicas 副本数 5 个&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# 2022 version
apiVersion: apps/v1
kind: Deployment
metadata:
  name: qsk-deploy
spec:
  replicas: 5
  selector:
    matchLabels:
      project: qsk-book
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        project: qsk-book
    spec:
      containers:
      - name: qsk-pod
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        image: nigelpoulton/qsk-book:1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;➜  qsk-book git:(main) ✗ kubectl get deploy
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
qsk-deploy   5/5     5            5           4h5m
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;➜  qsk-book git:(main) ✗ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
qsk-deploy-668c8bdb95-6cw5d   1/1     Running   0          141m
qsk-deploy-668c8bdb95-dgtx5   1/1     Running   0          140m
qsk-deploy-668c8bdb95-f97mk   1/1     Running   0          140m
qsk-deploy-668c8bdb95-qhzl4   1/1     Running   0          141m
qsk-deploy-668c8bdb95-xssrf   1/1     Running   0          141m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-1-pod&quot; tabindex=&quot;-1&quot;&gt;5.1 Pod 故障重新拉起&lt;/h3&gt;
&lt;p&gt;使用命令删除掉一个 pod，模拟有一个 pod 故障了&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl delete pod qsk-deploy-668c8bdb95-6cw5d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到立刻有一个 pod 被创建&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;➜  qsk-book git:(main) ✗ kubectl get pods
NAME                          READY   STATUS              RESTARTS   AGE
qsk-deploy-668c8bdb95-6cw5d   1/1     Terminating         0          143m
qsk-deploy-668c8bdb95-dgtx5   1/1     Running             0          141m
qsk-deploy-668c8bdb95-f97mk   1/1     Running             0          141m
qsk-deploy-668c8bdb95-qbhtg   0/1     ContainerCreating   0          3s
qsk-deploy-668c8bdb95-qhzl4   1/1     Running             0          142m
qsk-deploy-668c8bdb95-xssrf   1/1     Running             0          142m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-2&quot; tabindex=&quot;-1&quot;&gt;5.2 工作节点故障重新部署&lt;/h3&gt;
&lt;p&gt;本地没有多节点环境，所以无法模拟&lt;/p&gt;
&lt;p&gt;具体现象是，如果故障节点上面有 2 个 pod，那么这 2 个 pod 会被部署到仍存在的节点上&lt;/p&gt;
&lt;p&gt;如果节点机器提供者也有故障恢复，那么故障的节点会重新加入到 k8s 集群中，但是已经被迁移走的 pod 不会重新回来&lt;/p&gt;
&lt;h2 id=&quot;6&quot; tabindex=&quot;-1&quot;&gt;6 应用扩缩容&lt;/h2&gt;
&lt;p&gt;修改 deploy.yml 将 replicas 修改成你想要的数量&lt;/p&gt;
&lt;p&gt;重新执行： &lt;code&gt;kubectl apply -f deploy.yml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;扩容时，会重新创建新 pod&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;➜  qsk-book git:(main) ✗ kubectl get pods
NAME                          READY   STATUS              RESTARTS   AGE
qsk-deploy-668c8bdb95-dgtx5   1/1     Running             0          148m
qsk-deploy-668c8bdb95-f97mk   1/1     Running             0          149m
qsk-deploy-668c8bdb95-fxh4n   0/1     ContainerCreating   0          4s
qsk-deploy-668c8bdb95-hn5bq   0/1     ContainerCreating   0          4s
qsk-deploy-668c8bdb95-qbhtg   1/1     Running             0          7m8s
qsk-deploy-668c8bdb95-qhzl4   1/1     Running             0          149m
qsk-deploy-668c8bdb95-tj4wv   0/1     ContainerCreating   0          4s
qsk-deploy-668c8bdb95-xssrf   1/1     Running             0          149m
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;缩容时，会将多余的 pod 删掉（我发现都是删除的运行时间比较短的 pod）&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;➜  qsk-book git:(main) ✗ kubectl get pods
NAME                          READY   STATUS        RESTARTS   AGE
qsk-deploy-668c8bdb95-dgtx5   1/1     Running       0          149m
qsk-deploy-668c8bdb95-f97mk   1/1     Terminating   0          149m
qsk-deploy-668c8bdb95-fxh4n   1/1     Terminating   0          48s
qsk-deploy-668c8bdb95-hn5bq   1/1     Terminating   0          48s
qsk-deploy-668c8bdb95-qbhtg   1/1     Terminating   0          7m52s
qsk-deploy-668c8bdb95-qhzl4   1/1     Running       0          150m
qsk-deploy-668c8bdb95-tj4wv   1/1     Terminating   0          48s
qsk-deploy-668c8bdb95-xssrf   1/1     Running       0          150m
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;7&quot; tabindex=&quot;-1&quot;&gt;7 应用滚动更新&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f rolling-update.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rolling-update.yml 和 原来的配置的区别：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020241014154350.png&quot; alt=&quot;Pasted image 20241014154350.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;执行之后，会新创建一个新的 Pod，将老的 pod 删掉&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/k8s/快速创建一个可访问的服务/" />
        </entry>
        <entry>
            <title>
                js超长数字溢出问题
                
            </title>
            <updated>2024-10-12T15:19:38.000Z</updated>
            <id>https://grove-trees.netlify.app/card/js/js超长数字溢出问题/</id>
            <content type="html">
                &lt;p&gt;tags: &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#js&quot;&gt;#js&lt;/a&gt; &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#联调&quot;&gt;#联调&lt;/a&gt; &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#踩坑&quot;&gt;#踩坑&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/wudanyang/p/15940613.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.cnblogs.com/wudanyang/p/15940613.html&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;js&quot; tabindex=&quot;-1&quot;&gt;js超长数字溢出问题&lt;/h1&gt;
&lt;p&gt;之前遇到过的一个问题&lt;br /&gt;
接口要返回给前端（js）一个比较长的数字：&lt;code&gt;759830849237899244&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;看了接口返回是没问题的，但是前端拿着数字去取详情的时候，传过来的是另外一个数字：&lt;code&gt;759830849237899300&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一比较，看起来是数字被转换了&lt;/p&gt;
&lt;p&gt;&lt;code&gt;759830849237899244&lt;/code&gt; =&amp;gt; &lt;code&gt;759830849237899300&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在前端控制台执行一下：&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020220226212150.png&quot; alt=&quot;Pasted image 20220226212150.png&quot; /&gt;&lt;br /&gt;
果然被转成了另外一个数字，而且看规律很像是后三位被上取整了&lt;/p&gt;
&lt;h1 id=&quot;原理&quot; tabindex=&quot;-1&quot;&gt;原理&lt;/h1&gt;
&lt;p&gt;后来了解到js会将数字按照下图方式切分后表示数字，以至于最高表示的数字只能到 &lt;code&gt;9007199254740991&lt;/code&gt;  比这个数字更大的数字就会发生进位溢出&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201109201831.png&quot; alt=&quot;Pasted image 20201109201831.png&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;解决方案&quot; tabindex=&quot;-1&quot;&gt;解决方案&lt;/h1&gt;
&lt;p&gt;解决方案很好办，那就是将数字转成字符串，只要前端不强转成数字，那就不会出问题&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/iShot2022-02-26%2021.46.09.jpg&quot; alt=&quot;iShot2022-02-26 21.46.09.jpg&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;参考文档&quot; tabindex=&quot;-1&quot;&gt;参考文档&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.tencent.com/developer/article/1477816&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;JSON Bigint 大数精度丢失的背后&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/10631494/json-parse-parses-converts-big-numbers-incorrectly&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;JSON.parse parses / converts big numbers incorrectly&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/js/js超长数字溢出问题/" />
        </entry>
        <entry>
            <title>
                golang-cobra
                
            </title>
            <updated>2024-12-31T02:27:43.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/golang-cobra/</id>
            <content type="html">
                &lt;h1 id=&quot;golang-cobra&quot; tabindex=&quot;-1&quot;&gt;golang-cobra&lt;/h1&gt;
&lt;h2 id=&quot;简介&quot; tabindex=&quot;-1&quot;&gt;简介&lt;/h2&gt;
&lt;p&gt;cobra 可以帮助快速构建命令行程序&lt;/p&gt;
&lt;h2 id=&quot;用法&quot; tabindex=&quot;-1&quot;&gt;用法&lt;/h2&gt;
&lt;h3 id=&quot;快速搭建脚手架&quot; tabindex=&quot;-1&quot;&gt;快速搭建脚手架&lt;/h3&gt;
&lt;p&gt;安装&lt;code&gt;cobra-cli&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;go install github.com/spf13/cobra-cli@latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在一个已有的代码库中，使用 &lt;code&gt;cobra-cli init&lt;/code&gt; 可以初始化一个代码库，然后执行 &lt;code&gt;go run main.go&lt;/code&gt; 会展示出当前支持的命令&lt;br /&gt;
初始化之后的目录结构如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;  ▾ app/
    ▾ cmd/
        root.go
      main.go
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;新增命令&quot; tabindex=&quot;-1&quot;&gt;新增命令&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cobra-cli add serve
cobra-cli add config
cobra-cli add create -p &#39;configCmd&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;细节安装后查看&lt;/p&gt;
&lt;h3 id=&quot;命令代码编写&quot; tabindex=&quot;-1&quot;&gt;命令代码编写&lt;/h3&gt;
&lt;p&gt;以我的一个代码上传开发机的小程序为例： &lt;a href=&quot;https://github.com/wudanyang6/simple-file-sync.git&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/wudanyang6/simple-file-sync.git&lt;/a&gt;&lt;br /&gt;
我增加了两个命令，一个是&lt;code&gt;client&lt;/code&gt;一个是&lt;code&gt;server&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;拿简单点的 server 来看：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;var serverCmd = &amp;amp;cobra.Command{  
    Use:   &amp;quot;server --port&amp;quot;,  
    Short: &amp;quot;server for simple file sync&amp;quot;,  
    Long:  `A server for simple file sync. For example: simple-file-sync server `,  
    Run: func(cmd *cobra.Command, args []string) {  
       server.NewServer(ServerPort, ServerToken, ServerLimitDir).Start()  
    },  
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Use&lt;/code&gt; 这里代表应该在主命令后面写什么才能运行子命令&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Short&lt;/code&gt; &amp;amp; &lt;code&gt;Long&lt;/code&gt; 代表子命令的描述&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Run&lt;/code&gt; 是真正的代码逻辑，我一般习惯将逻辑写在其他包里面，这里只做命令初始化&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;参数传递&quot; tabindex=&quot;-1&quot;&gt;参数传递&lt;/h4&gt;
&lt;p&gt;参数传递非常方便，并且使用 spf13 大神的 pflag 包，长短命令形式都支持&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;serverCmd.Flags().IntVar(&amp;amp;ServerPort, &amp;quot;port&amp;quot;, 8120, &amp;quot;port to listen on&amp;quot;)  
serverCmd.Flags().StringVar(&amp;amp;ServerToken, &amp;quot;token&amp;quot;, serverToken, &amp;quot;token for authentication&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;效果&quot; tabindex=&quot;-1&quot;&gt;效果&lt;/h2&gt;
&lt;p&gt;-h 命令&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ simple-file-sync server -h
A server for simple file sync. For example: simple-file-sync server

Usage:
  simple-file-sync server --port [flags]

Flags:
  -h, --help               help for server
      --limit-dir string   You can’t upload to anything other than the limit-dir folder, default is your home directory (default &amp;quot;/your/homeDir&amp;quot;)
      --port int           port to listen on (default 8120)
      --token string       token for authentication (default &amp;quot;kfcvme50&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行效果：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;$ simple-file-sync server   
2024/12/31 10:26:34 Starting server at port 8120...
2024/12/31 10:26:34 Limit directory:  /Users/wudanyang
2024/12/31 10:26:34 Token:  kfcvme50
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h2&gt;
&lt;p&gt;官方库：&lt;a href=&quot;https://github.com/spf13/cobra&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;spf13/cobra: A Commander for modern Go CLI interactions&lt;/a&gt;&lt;br /&gt;
cobra 库介绍：&lt;a href=&quot;https://darjun.github.io/2020/01/17/godailylib/cobra/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Go 每日一库之 cobra - 大俊的博客&lt;/a&gt;&lt;br /&gt;
&lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;cobra-cli/README.md at main · spf13/cobra-cli&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/golang-cobra/" />
        </entry>
        <entry>
            <title>
                go-时间处理
                
            </title>
            <updated>2025-02-13T05:03:59.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/go-时间处理/</id>
            <content type="html">
                &lt;h1 id=&quot;go&quot; tabindex=&quot;-1&quot;&gt;go-时间处理&lt;/h1&gt;
&lt;p&gt;golang carbon 库的使用&lt;/p&gt;
&lt;p&gt;Golang 中的 Carbon 库是一个用于处理日期和时间的强大工具，它提供了丰富的功能来简化时间操作。Carbon 库的设计灵感来源于 PHP 的 Carbon 库，但在 Go 语言中进行了优化和扩展，使其更适合 Go 的编程风格和需求。&lt;/p&gt;
&lt;p&gt;首先，Carbon 库可以帮助开发者轻松地解析、格式化和操作日期和时间。例如，你可以使用 &lt;code&gt;carbon.Parse&lt;/code&gt; 函数来解析字符串格式的日期，并将其转换为 Carbon 对象。这个对象可以进一步用于计算时间差、添加或减去时间间隔等操作。例如，你可以使用 &lt;code&gt;carbon.Now().AddDays(5)&lt;/code&gt; 来获取当前时间五天后的日期。&lt;/p&gt;
&lt;p&gt;其次，Carbon 库支持多种时间格式的转换和比较。你可以使用 &lt;code&gt;carbon.Format&lt;/code&gt; 函数将时间对象格式化为指定的字符串格式，如 &lt;code&gt;YYYY-MM-DD HH:mm:ss&lt;/code&gt;。此外，Carbon 还提供了 &lt;code&gt;carbon.DiffInDays&lt;/code&gt;、&lt;code&gt;carbon.DiffInHours&lt;/code&gt; 等函数来计算两个时间点之间的差异。例如，你可以轻松计算两个日期之间相差的天数或小时数。&lt;/p&gt;
&lt;p&gt;Carbon 库还支持时区处理，这对于处理跨时区的应用程序尤为重要。你可以使用 &lt;code&gt;carbon.SetTimezone&lt;/code&gt; 函数来设置时区，确保时间操作在不同时区下保持一致。例如，如果你需要处理一个全球用户的应用程序，Carbon 可以帮助你轻松地将时间转换为用户所在的时区。&lt;/p&gt;
&lt;p&gt;此外，Carbon 库还提供了丰富的工具来处理时间的常见操作，如获取当前时间的开始或结束时间、判断某一天是星期几、计算某个月的天数等。例如，你可以使用 &lt;code&gt;carbon.StartOfDay&lt;/code&gt; 来获取某一天的开始时间，或者使用 &lt;code&gt;carbon.IsWeekend&lt;/code&gt; 来判断某一天是否是周末。&lt;/p&gt;
&lt;p&gt;总的来说，Golang 中的 Carbon 库是一个功能强大且易于使用的工具，特别适合需要频繁处理日期和时间的应用程序。无论是简单的日期格式化，还是复杂的时间计算，Carbon 都能提供简洁而高效的解决方案。通过合理使用 Carbon 库，开发者可以显著减少时间处理相关的代码量，并提高代码的可读性和可维护性。&lt;/p&gt;
&lt;p&gt;官网的示例也非常丰富&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;import &amp;quot;github.com/golang-module/carbon/v2&amp;quot;

func main() {
	cTime := carbon.SetTimezone(carbon.Shanghai)  
	// 获取明天凌晨0点的时间戳
	tomorrowUnixTime := cTime.Tomorrow().StartOfDay().Timestamp()  
	// 获取当前时间的时间戳
	currentUnixTime := cTime.Now().Timestamp()  
	fmt.Println(tomorrowUnixTime, currentUnixTime)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/golang-module/carbon&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/golang-module/carbon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/go-时间处理/" />
        </entry>
        <entry>
            <title>
                go-mod
                
            </title>
            <updated>2024-04-20T14:38:10.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/go-mod/</id>
            <content type="html">
                &lt;h1 id=&quot;go-mod&quot; tabindex=&quot;-1&quot;&gt;go-mod&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;module novel-spider  
  
go 1.16  
  
require (  
   github.com/antchfx/xpath latest  
)

replace (
    golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a =&amp;gt; github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;module 当前包的名字&lt;/p&gt;
&lt;p&gt;require 指定依赖项， 跟  &lt;a class=&quot;internal-link is-unresolved&quot; href=&quot;https://grove-trees.netlify.app/404&quot; target=&quot;&quot;&gt;go-import&lt;/a&gt; 很像&lt;/p&gt;
&lt;p&gt;replace 无法自动获取的资源，可以使用 replace 来用本地资源替代&lt;/p&gt;
&lt;p&gt;参考： &lt;a href=&quot;https://www.jianshu.com/p/760c97ff644c&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.jianshu.com/p/760c97ff644c&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;go mod init [模块名]
go mod tidy
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/go-mod/" />
        </entry>
        <entry>
            <title>
                go-gorm-FindInBatches
                
            </title>
            <updated>2024-10-21T04:44:45.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/go-gorm-FindInBatches/</id>
            <content type="html">
                &lt;h1 id=&quot;go-gorm-find-in-batches&quot; tabindex=&quot;-1&quot;&gt;go-gorm-FindInBatches&lt;/h1&gt;
&lt;p&gt;FindInBatches 用于简化批量操作，防止数据量及过大导致超时&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;	var accountSlice []ainote.UserOnline
	t.DB.Where(&amp;quot;deleted = ?&amp;quot;, ainote.UnDeleted).
		Where(&amp;quot;status = ?&amp;quot;, ainote.Available).
		FindInBatches(&amp;amp;accountSlice, 5, func(tx *gorm.DB, batch int) error {
			resource.LoggerService.Debug(ctx, &amp;quot;debug-wdy&amp;quot;, logit.AutoField(&amp;quot;data&amp;quot;, batch))

			totalCnt += int64(len(accountSlice))
			resource.LoggerService.Debug(ctx, &amp;quot;debug-wdy&amp;quot;, logit.AutoField(&amp;quot;data&amp;quot;, accountSlice))

			// 遍历所有账号，计算其他数据
			for _, v := range accountSlice {
				intervalOfThisAccount := 72000 / v.Bound
				availableUseCnt := (tomorrowUnixTime - currentUnixTime) / int64(intervalOfThisAccount)

				totalRemainCnt += int64(v.Remains)
				AvailableAccountUseCnt += availableUseCnt

				if v.Remains &amp;gt; 0 &amp;amp;&amp;amp; v.AvailableTime &amp;lt; tomorrowUnixTime {
					availableAccountCnt++
				}
			}

			return nil
		})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;FindInBatches&lt;/code&gt; 是 GORM 中的一个函数，用于分批处理记录，避免一次性加载所有数据导致内存占用过高，特别适合处理大数据集。&lt;/p&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 语法：&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func (tx *DB) FindInBatches(dest interface{}, batchSize int, fc func(tx *DB, batch int) error) *DB
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dest&lt;/code&gt;: 目标，查询结果会扫描到这个变量中。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;batchSize&lt;/code&gt;: 每批处理的记录数量。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fc&lt;/code&gt;: 每批处理时执行的回调函数，参数包括当前事务 &lt;code&gt;tx&lt;/code&gt; 和当前批次号 &lt;code&gt;batch&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 示例：&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;type User struct {
    ID   uint
    Name string
}

var users []User
result := db.Model(&amp;amp;User{}).Where(&amp;quot;active = ?&amp;quot;, true).FindInBatches(&amp;amp;users, 100, func(tx *gorm.DB, batch int) error {
    fmt.Printf(&amp;quot;处理第 %d 批数据&#92;n&amp;quot;, batch)
    for _, user := range users {
        // 处理每个用户
    }
    return nil
})

if result.Error != nil {
    fmt.Println(result.Error)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 工作原理：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;目标 (&lt;code&gt;users&lt;/code&gt;)&lt;/strong&gt;：查询结果会存储在这个切片中，每批的数据会覆盖前一批的数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;批量大小 (&lt;code&gt;100&lt;/code&gt;)&lt;/strong&gt;：定义每次处理的记录数量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理函数 (&lt;code&gt;func&lt;/code&gt;)&lt;/strong&gt;：这个函数会在每批数据处理时调用，允许你对每批数据进行操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种方式非常适合处理大数据，避免一次性加载过多数据占用内存，并且能够分批次地进行处理。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/go-gorm-FindInBatches/" />
        </entry>
        <entry>
            <title>
                go-exec
                
            </title>
            <updated>2024-03-13T07:53:18.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/go-exec/</id>
            <content type="html">
                &lt;h1 id=&quot;go-exec&quot; tabindex=&quot;-1&quot;&gt;go-exec&lt;/h1&gt;
&lt;p&gt;在Go语言中，&lt;code&gt;exec&lt;/code&gt; 包提供了执行外部命令的功能。这个包是标准库的一部分，允许你从Go程序中运行外部的系统命令和程序。使用这个包，你可以执行Shell命令，处理命令的输入输出，以及访问命令的返回状态。&lt;/p&gt;
&lt;p&gt;下面是如何使用 &lt;code&gt;exec&lt;/code&gt; 包执行Shell命令的一些基本步骤和示例。&lt;/p&gt;
&lt;h2 id=&quot;1-exec&quot; tabindex=&quot;-1&quot;&gt;1. 导入exec包&lt;/h2&gt;
&lt;p&gt;在你的Go文件中，首先需要导入&lt;code&gt;os/exec&lt;/code&gt;包。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;import &amp;quot;os/exec&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2. 创建命令&lt;/h2&gt;
&lt;p&gt;使用&lt;code&gt;exec.Command&lt;/code&gt;函数创建一个新的&lt;code&gt;*exec.Cmd&lt;/code&gt;对象，该对象用于执行外部命令。这个函数的第一个参数是命令名称，后续参数是命令需要的参数。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;cmd := exec.Command(&amp;quot;echo&amp;quot;, &amp;quot;Hello, World!&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你需要执行的命令需要Shell特性（比如管道、文件重定向等），你可以通过在Shell中执行命令来实现。例如，在Unix系统中，可以使用&lt;code&gt;bash&lt;/code&gt;的&lt;code&gt;-c&lt;/code&gt;选项。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;cmd := exec.Command(&amp;quot;bash&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;ls -l | grep .go&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3. 运行命令&lt;/h2&gt;
&lt;p&gt;有几种方法可以用来运行命令并获取输出。&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/go/go-exec-run/&quot;&gt;go-exec-run&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Run&lt;/strong&gt;：运行命令，并等待命令完成。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;err := cmd.Run()
if err != nil {
    log.Fatalf(&amp;quot;cmd.Run() failed with %s&#92;n&amp;quot;, err)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Output&lt;/strong&gt;：运行命令，并收集命令的标准输出。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;out, err := cmd.Output()
if err != nil {
    log.Fatal(err)
}
fmt.Printf(&amp;quot;The output is %s&#92;n&amp;quot;, out)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CombinedOutput&lt;/strong&gt;：运行命令，并收集标准输出和标准错误。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;out, err := cmd.CombinedOutput()
if err != nil {
    log.Fatal(err)
}
fmt.Printf(&amp;quot;The combined output is %s&#92;n&amp;quot;, out)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start&lt;/strong&gt; 和 &lt;strong&gt;Wait&lt;/strong&gt;：&lt;code&gt;Start&lt;/code&gt; 开始执行命令但不等待它完成，&lt;code&gt;Wait&lt;/code&gt; 等待命令完成。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;err := cmd.Start()
if err != nil {
    log.Fatal(err)
}

err = cmd.Wait()
if err != nil {
    log.Fatal(err)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4. 处理命令的输入输出&lt;/h2&gt;
&lt;p&gt;你可以通过设置&lt;code&gt;Cmd&lt;/code&gt;结构体的&lt;code&gt;Stdin&lt;/code&gt;、&lt;code&gt;Stdout&lt;/code&gt;、&lt;code&gt;Stderr&lt;/code&gt;属性来处理命令的输入输出。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;cmd.Stdin = strings.NewReader(&amp;quot;some input&amp;quot;)
var out bytes.Buffer
cmd.Stdout = &amp;amp;out
err := cmd.Run()
if err != nil {
    log.Fatal(err)
}
fmt.Printf(&amp;quot;The output is %s&#92;n&amp;quot;, out.String())
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;5&quot; tabindex=&quot;-1&quot;&gt;5. 获取命令的返回状态&lt;/h2&gt;
&lt;p&gt;命令的返回状态可以通过检查&lt;code&gt;Run&lt;/code&gt;、&lt;code&gt;Output&lt;/code&gt;或&lt;code&gt;CombinedOutput&lt;/code&gt;方法返回的错误来获取。如果命令以非零状态退出，这些方法会返回一个&lt;code&gt;*exec.ExitError&lt;/code&gt;类型的错误。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;if exitErr, ok := err.(*exec.ExitError); ok {
    // 这里可以获取到非零退出状态和更多信息
    fmt.Printf(&amp;quot;Command exited with status %d&#92;n&amp;quot;, exitErr.ExitCode())
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;总结&quot; tabindex=&quot;-1&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;通过Go的&lt;code&gt;exec&lt;/code&gt;包，你可以方便地执行外部命令和处理Shell命令。这对于需要与系统层面交互的程序来说非常有用。记得总是仔细处理命令的输出和错误，以及考虑安全性，避免执行不受信任的命令。&lt;/p&gt;
&lt;h1 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h1&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/go-exec/" />
        </entry>
        <entry>
            <title>
                go-exec-run
                
            </title>
            <updated>2024-03-22T10:43:31.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/go-exec-run/</id>
            <content type="html">
                &lt;h1 id=&quot;go-exec-run&quot; tabindex=&quot;-1&quot;&gt;go-exec-run&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Run&lt;/code&gt; 和 &lt;code&gt;Wait&lt;/code&gt; 都是 &lt;code&gt;os/exec&lt;/code&gt; 包中 &lt;code&gt;Cmd&lt;/code&gt; 结构体的方法，用于执行外部命令，但它们在执行方式上有一些关键的区别。&lt;/p&gt;
&lt;h2 id=&quot;run&quot; tabindex=&quot;-1&quot;&gt;Run 方法&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Run&lt;/code&gt; 方法会启动外部命令，等待它完成，并返回一个错误值。如果命令成功执行（即退出状态为0），&lt;code&gt;Run&lt;/code&gt; 返回 &lt;code&gt;nil&lt;/code&gt;。如果命令执行失败（比如命令不存在，或者执行过程中出现了错误），则返回一个非 &lt;code&gt;nil&lt;/code&gt; 的错误值。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Run&lt;/code&gt; 是一个阻塞调用，意味着它会阻塞当前的 Goroutine 直到外部命令执行完成。它实际上是 &lt;code&gt;Start&lt;/code&gt; 和 &lt;code&gt;Wait&lt;/code&gt; 方法的组合。首先，&lt;code&gt;Run&lt;/code&gt; 调用 &lt;code&gt;Start&lt;/code&gt; 方法来启动命令，然后立即调用 &lt;code&gt;Wait&lt;/code&gt; 方法等待命令执行结束。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;cmd := exec.Command(&amp;quot;echo&amp;quot;, &amp;quot;Hello, World!&amp;quot;)
err := cmd.Run()
if err != nil {
    log.Fatalf(&amp;quot;cmd.Run() failed with %s&#92;n&amp;quot;, err)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wait&quot; tabindex=&quot;-1&quot;&gt;Wait 方法&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Wait&lt;/code&gt; 方法会阻塞调用它的 Goroutine，直到 &lt;code&gt;Cmd&lt;/code&gt; 表示的命令执行完成。它必须在 &lt;code&gt;Start&lt;/code&gt; 方法之后调用。&lt;code&gt;Start&lt;/code&gt; 方法启动命令但不等待它结束，这使得你可以在命令执行的同时做一些其他的事情（比如读取命令的输出）。一旦你准备好等待命令执行完成，就可以调用 &lt;code&gt;Wait&lt;/code&gt; 方法。&lt;/p&gt;
&lt;p&gt;如果命令成功执行，&lt;code&gt;Wait&lt;/code&gt; 返回 &lt;code&gt;nil&lt;/code&gt;。如果执行失败，则返回一个非 &lt;code&gt;nil&lt;/code&gt; 的错误值。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;Start&lt;/code&gt; 和 &lt;code&gt;Wait&lt;/code&gt; 的组合，你可以更灵活地控制命令的执行过程。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;cmd := exec.Command(&amp;quot;echo&amp;quot;, &amp;quot;Hello, World!&amp;quot;)
err := cmd.Start()
if err != nil {
    log.Fatal(err)
}

err = cmd.Wait()
if err != nil {
    log.Fatal(err)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;区别总结&quot; tabindex=&quot;-1&quot;&gt;区别总结&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Run&lt;/code&gt; 是一个便利的方法，用于当你只需要简单地执行一个命令并等待它完成时。它是 &lt;code&gt;Start&lt;/code&gt; 和 &lt;code&gt;Wait&lt;/code&gt; 的组合。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;Start&lt;/code&gt; 和 &lt;code&gt;Wait&lt;/code&gt; 可以让你在命令执行的同时做一些其他的处理，比如并发地处理命令的输出。这提供了更高的灵活性，但也需要你手动管理命令的启动和完成等待。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选择使用哪一个方法取决于你的具体需求和你想要的控制级别。对于大多数简单的用例，&lt;code&gt;Run&lt;/code&gt; 方法可能就足够了。但如果你需要更细粒度的控制，比如并发处理命令的输出，那么使用 &lt;code&gt;Start&lt;/code&gt; 和 &lt;code&gt;Wait&lt;/code&gt; 的组合可能更合适。&lt;/p&gt;
&lt;h1 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h1&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/go-exec-run/" />
        </entry>
        <entry>
            <title>
                go- make 和 new 关键字的区别
                
            </title>
            <updated>2024-10-12T02:13:32.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/go- make 和 new 关键字的区别/</id>
            <content type="html">
                &lt;h1 id=&quot;go-make-new&quot; tabindex=&quot;-1&quot;&gt;go- make 和 new 关键字的区别&lt;/h1&gt;
&lt;h2 id=&quot;1-make-new&quot; tabindex=&quot;-1&quot;&gt;1 make 和 new 关键字的区别&lt;/h2&gt;
&lt;h3 id=&quot;1-1-new&quot; tabindex=&quot;-1&quot;&gt;1.1 new&lt;/h3&gt;
&lt;p&gt;Go语言中 new 和 make 是两个内置函数，主要用来创建并分配类型的内存。在我们定义变量的时候，可能会觉得有点迷惑，不知道应该使用哪个函数来声明变量，其实他们的规则很简单，new 只分配内存，而 make 只能用于 slice、map 和 channel 的初始化&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-GO&quot;&gt;// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;new 关键字分配内存，返回指向此内存的指针，并且内存值为此类型的 &lt;a href=&quot;https://grove-trees.netlify.app/card/go.md#%E9%9B%B6%E5%80%BC&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;&lt;code&gt;零值&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这就是 new 函数，它返回的永远是类型的指针，指针指向分配类型的内存地址。&lt;/p&gt;
&lt;h3 id=&quot;1-2-make&quot; tabindex=&quot;-1&quot;&gt;1.2 make&lt;/h3&gt;
&lt;p&gt;make 也是用于内存分配的，但是和 new 不同，它只用于 &lt;code&gt;chan&lt;/code&gt;、&lt;code&gt;map&lt;/code&gt; 以及 &lt;code&gt;slice&lt;/code&gt; 的内存创建，而且它返回的类型就是这三个类型本身，而不是他们的指针类型，因为这三种类型就是引用类型，所以就没有必要返回他们的指针了。&lt;/p&gt;
&lt;p&gt;Go语言中的 new 和 make 主要区别如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make&lt;/code&gt; 只能用来分配及初始化类型为 &lt;code&gt;slice&lt;/code&gt;、&lt;code&gt;map&lt;/code&gt;、&lt;code&gt;chan&lt;/code&gt; 的数据。&lt;code&gt;new&lt;/code&gt; 可以分配任意类型的数据；&lt;/li&gt;
&lt;li&gt;new 分配返回的是指针，即类型 *Type。make 返回引用，即 Type；&lt;/li&gt;
&lt;li&gt;new 分配的空间被清零。make 分配空间后，会进行初始化；&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/go- make 和 new 关键字的区别/" />
        </entry>
        <entry>
            <title>
                go 获取凌晨0点的时间戳
                
            </title>
            <updated>2025-02-18T12:15:16.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/go 获取凌晨0点的时间戳/</id>
            <content type="html">
                &lt;h1 id=&quot;go-0&quot; tabindex=&quot;-1&quot;&gt;go 获取凌晨0点的时间戳&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-GO&quot;&gt;ti := time.Now()  
yy, mm, dd := ti.AddDate(0, 0, 1).Date() // 可选的 
ti = time.Date(yy, mm, dd, 0, 0, 0, 0, ti.Location())
fmt.Println(ti.Unix())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 carbon 库&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;package main

import (
	&amp;quot;fmt&amp;quot;
	&amp;quot;time&amp;quot;

	&amp;quot;github.com/uniplaces/carbon&amp;quot;
)

func main() {
	// 获取当前时间的carbon对象
	now := carbon.Now()

	// 找到今天凌晨0点的时间
	startOfDay := now.StartOfDay()

	// 输出凌晨0点的时间戳
	fmt.Println(&amp;quot;Midnight Timestamp:&amp;quot;, startOfDay.Unix())
}
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/go 获取凌晨0点的时间戳/" />
        </entry>
        <entry>
            <title>
                202506061308 vscode There is no formatter for &#39;go&#39; files installed 报错处理
                
            </title>
            <updated>2025-06-06T05:08:59.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/202506061308 vscode There is no formatter for &#39;go&#39; files installed 报错处理/</id>
            <content type="html">
                &lt;h1 id=&quot;202506061308-vscode-there-is-no-formatter-for-go-files-installed&quot; tabindex=&quot;-1&quot;&gt;202506061308 vscode There is no formatter for &#39;go&#39; files installed 报错处理&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;There is no formatter for &#39;go&#39; files installed.&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br /&gt;
What is the output of &lt;code&gt;go version&lt;/code&gt; and &lt;code&gt;go env&lt;/code&gt;? Also, can you run the &lt;code&gt;Go: Locate Configured Go Tools&lt;/code&gt; command from the Command Palette (Ctrl+Shift+P) and share its output?&lt;br /&gt;
The &amp;quot;Error: TypeError: Cannot read property &#39;lt&#39; of undefined&amp;quot; error might indicate that the extension is not finding your go version.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/golang/vscode-go/issues/633&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;There is no formatter for &#39;go&#39; files installed. · Issue &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#633&quot;&gt;#633&lt;/a&gt; · golang/vscode-go&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/202506061308 vscode There is no formatter for &#39;go&#39; files installed 报错处理/" />
        </entry>
        <entry>
            <title>
                202407251323  go flag 别在init中使用
                
            </title>
            <updated>2024-08-12T06:32:51.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/202407251323  go flag 别在init中使用/</id>
            <content type="html">
                &lt;h1 id=&quot;202407251323-go-flag-init&quot; tabindex=&quot;-1&quot;&gt;202407251323  go flag 别在init中使用&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;flag.StringVar(&amp;amp;appConfig, &amp;quot;conf&amp;quot;, filepath.Join(env.ConfDir(), &amp;quot;app.toml&amp;quot;), &amp;quot;app config file&amp;quot;)
flag.Parse()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;flag 别在 init 中使用，否则在 go test 的时候会强制校验入参&lt;/p&gt;
&lt;p&gt;参考：&lt;br /&gt;
&lt;a href=&quot;https://stackoverflow.com/questions/29699982/go-test-flag-flag-provided-but-not-defined&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;go test flag: flag provided but not defined&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;flag.Parse() is being called before your flag is defined.&lt;br /&gt;
You have to make sure that all flag definitions happen before calling flag.Parse(), usually by defining all flags inside init() functions.&lt;/p&gt;
&lt;/blockquote&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/202407251323  go flag 别在init中使用/" />
        </entry>
        <entry>
            <title>
                202405061043 go 抽象的一个例子
                
            </title>
            <updated>2024-10-21T08:55:53.000Z</updated>
            <id>https://grove-trees.netlify.app/card/go/202405061043 go 抽象的一个例子/</id>
            <content type="html">
                &lt;h1 id=&quot;202405061043-go&quot; tabindex=&quot;-1&quot;&gt;202405061043 go 抽象的一个例子&lt;/h1&gt;
&lt;p&gt;Go 语言的标准库 database/sql 是一个抽象层的经典例子&lt;br /&gt;
虽然关系型数据库的功能相对比较复杂&lt;br /&gt;
但是我们仍然可以通过定义一系列构成树形结构的接口提供合理的抽象&lt;br /&gt;
这也是我们在编写框架和中间层时应该注意的&lt;br /&gt;
即面向接口编程 —— 只依赖抽象的接口，不要依赖具体的实现。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/go/202405061043 go 抽象的一个例子/" />
        </entry>
        <entry>
            <title>
                docker 和 Kubernetes 的异同
                
            </title>
            <updated>2024-10-21T08:52:55.000Z</updated>
            <id>https://grove-trees.netlify.app/card/docker/docker 和 Kubernetes 的异同/</id>
            <content type="html">
                &lt;h1 id=&quot;docker-kubernetes&quot; tabindex=&quot;-1&quot;&gt;docker 和 Kubernetes 的异同&lt;/h1&gt;
&lt;p&gt;Docker 和 Kubernetes 是两个不同的技术，但它们可以一起使用来构建和管理容器化应用程序。下面是 Docker 和 Kubernetes 的异同：&lt;/p&gt;
&lt;p&gt;异同点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;目的不同：Docker 是一种容器化技术，用于打包和部署应用程序。Kubernetes 是一种容器编排平台，用于管理和编排容器化应用程序。&lt;/li&gt;
&lt;li&gt;架构不同：Docker 是一个单节点容器引擎，而 Kubernetes 是一个分布式系统，由多个节点组成。&lt;/li&gt;
&lt;li&gt;功能不同：Docker 提供容器的构建、打包、发布和运行等功能。Kubernetes 提供容器编排、自动扩展、负载均衡、服务发现等功能。&lt;/li&gt;
&lt;li&gt;使用场景不同：Docker 适用于单个应用程序或微服务的部署。Kubernetes 适用于多个应用程序或微服务的管理和编排。&lt;/li&gt;
&lt;li&gt;学习成本不同：Docker 学习成本较低，容易上手。Kubernetes 学习成本较高，需要掌握更多的概念和技术。&lt;/li&gt;
&lt;li&gt;部署方式不同：Docker 可以直接在本地或云端部署。Kubernetes 需要在集群中部署，需要更多的配置和管理。&lt;/li&gt;
&lt;li&gt;可扩展性不同：Docker 可以扩展到多个节点，但需要手动管理。Kubernetes 可以自动扩展和管理多个节点。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;相同点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;都是容器化技术，用于构建和部署应用程序。&lt;/li&gt;
&lt;li&gt;都支持多种编程语言和框架，如 Java、Python、Node.js 等。&lt;/li&gt;
&lt;li&gt;都可以在本地或云端部署。&lt;/li&gt;
&lt;li&gt;都可以提高应用程序的可移植性和可伸缩性。&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/docker/docker 和 Kubernetes 的异同/" />
        </entry>
        <entry>
            <title>
                驾驶证期满换证
                
            </title>
            <updated>2024-11-16T14:48:39.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Personal/驾驶证期满换证/</id>
            <content type="html">
                &lt;ol&gt;
&lt;li&gt;12123 APP 中申请 &lt;code&gt;期满换证&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;驾驶证期满换证&quot; tabindex=&quot;-1&quot;&gt;驾驶证期满换证&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://jtgl.beijing.gov.cn/jgj/lszt/659722/10936724/10936732/10937472/index.html#:~:text=%E5%8A%9E%E7%90%86%E6%B8%A0%E9%81%93%EF%BC%9A%E2%80%9C%E4%BA%A4%E7%AE%A112123%E2%80%9DAPP&amp;amp;text=%E5%A6%82%E8%87%AA%E5%8F%96%EF%BC%8C%E5%88%99%E9%9C%80,%E9%9C%80%E5%A1%AB%E5%86%99%E6%94%B6%E4%BB%B6%E5%9C%B0%E5%9D%80%E3%80%82&amp;amp;text=%E5%8F%96%E4%BB%B6%E6%96%B9%E5%BC%8F%E7%A1%AE%E8%AE%A4%E5%90%8E,%E8%AF%81%E4%B8%9A%E5%8A%A1%E7%94%B3%E8%AF%B7%E4%BF%A1%E6%81%AF%E6%8F%90%E4%BA%A4%E3%80%82&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;http://jtgl.beijing.gov.cn/jgj/lszt/659722/10936724/10936732/10937472/index.html#:~:text=办理渠道：“交管12123”APP&amp;amp;text=如自取，则需,需填写收件地址。&amp;amp;text=取件方式确认后,证业务申请信息提交。&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Personal/驾驶证期满换证/" />
        </entry>
        <entry>
            <title>
                费曼技巧
                
            </title>
            <updated>2024-10-21T11:13:44.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Personal/费曼技巧/</id>
            <content type="html">
                &lt;h1 id=&quot;费曼技巧&quot; tabindex=&quot;-1&quot;&gt;费曼技巧&lt;/h1&gt;
&lt;p&gt;一种有目标的学习技巧，适用于学习【是什么】这类知识&lt;/p&gt;
&lt;h1 id=&quot;步骤&quot; tabindex=&quot;-1&quot;&gt;步骤&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;确定学习目标&lt;/li&gt;
&lt;li&gt;寻找资料（网络、书籍、报刊等）学习&amp;quot;费曼技巧&amp;quot;，直到自己认为已经理解了&amp;quot;费曼技巧&amp;quot;，想象现在要给一个完全没有听说过&amp;quot;费曼技巧&amp;quot;的人，记下来所要讲解的内容。&lt;/li&gt;
&lt;li&gt;在记下内容的时候，会发现有很多讲不通的地方，那么需要重复第2步骤直到通顺。&lt;/li&gt;
&lt;li&gt;简化自己的描述&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;原理&quot; tabindex=&quot;-1&quot;&gt;原理&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;温故而知新，可以为师矣&lt;/li&gt;
&lt;li&gt;从被动到主动的状态&lt;/li&gt;
&lt;li&gt;回忆知识，可以加固神经回路&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Personal/费曼技巧/" />
        </entry>
        <entry>
            <title>
                202408312248 甲沟炎的处理办法
                
            </title>
            <updated>2025-02-08T03:14:51.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Personal/202408312248 甲沟炎的处理办法/</id>
            <content type="html">
                &lt;h1 id=&quot;202408312248&quot; tabindex=&quot;-1&quot;&gt;202408312248 甲沟炎的处理办法&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;去修脚店：有的店承诺修好，费用会贵一些，但是后续修就不要钱了，在北京顺义这边大概一只脚趾需要600块钱。我是两个大拇脚趾，当时应该花了1200，后续一两年内去了很多次，没有另收费。在这之前我去过很多次其他的店，每次修脚都需要一二百块钱。&lt;/li&gt;
&lt;li&gt;去医院拔掉：去过一次医院，医生不建议拔掉，因为拔掉不能保证以后新长出来的不会出现甲沟炎，并且恢复期很长。医生建议是买点消炎的药，等趾甲顶出来以后就好了。我的趾甲太硬，等了一个月，除了疼之外，没有见半点能顶出来的迹象，所以又去了修脚店清理掉了。&lt;/li&gt;
&lt;li&gt;后来突发奇想，在网上买了一个指甲锉，每次疼了就用这个指甲锉磨一磨，竟然神奇的没有再去过修脚店，而且左边的趾甲经过我的良好引导已经不往肉里长了。 &lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240831230016.png&quot; alt=&quot;Pasted image 20240831230016.png|351&quot; width=&quot;351px&quot; /&gt;&lt;br /&gt;
有需要的可以试试： &lt;a href=&quot;https://item.jd.com/100015138940.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://item.jd.com/100015138940.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2025-02-08 更新：&lt;br /&gt;
2025年春节前，因为某次忘了带指甲锉，便使用普通指甲剪剪了一次，导致春节期间右脚大拇指内侧肿成灯笼。&lt;br /&gt;
后来使用指甲锉磨完上了云南白药，几天后消肿了。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Personal/202408312248 甲沟炎的处理办法/" />
        </entry>
        <entry>
            <title>
                获取进程存活时间
                
            </title>
            <updated>2024-04-18T04:54:33.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/获取进程存活时间/</id>
            <content type="html">
                &lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;ps -eo lstart,pid,cmd | grep &amp;quot;php-fpm: pool www&amp;quot; | grep -v &#39;grep&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要在 Linux 中获取子进程的存活时间（以 Unix 时间戳的形式表示），可以使用以下步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;获取子进程的 PID。&lt;/li&gt;
&lt;li&gt;访问 &lt;code&gt;/proc/&amp;lt;PID&amp;gt;/stat&lt;/code&gt; 文件，其中 &lt;code&gt;&amp;lt;PID&amp;gt;&lt;/code&gt; 是子进程的 PID。&lt;/li&gt;
&lt;li&gt;从 &lt;code&gt;/proc/&amp;lt;PID&amp;gt;/stat&lt;/code&gt; 文件中读取进程的启动时间（start_time），该值以时钟滴答数（clock ticks）的形式存储在第 22 列中。&lt;/li&gt;
&lt;li&gt;获取系统的时钟滴答数，可以使用 &lt;code&gt;getconf CLK_TCK&lt;/code&gt; 命令。&lt;/li&gt;
&lt;li&gt;将进程的启动时间除以时钟滴答数，以获取进程的存活时间（单位为秒），然后将其添加到系统启动时间的 Unix 时间戳（即系统启动的时间，以秒为单位）中，即可得到子进程的存活时间（以 Unix 时间戳的形式表示）。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;以下是获取子进程存活时间的 Unix 时间戳的示例命令：
# 获取进程存活时间
PID=&amp;lt;子进程的 PID&amp;gt;

# 获取进程的启动时间（以时钟滴答数的形式存储）
START_TIME=$(awk &#39;{print $22}&#39; /proc/${PID}/stat)

# 获取系统的时钟滴答数
CLK_TCK=$(getconf CLK_TCK)

# 计算进程的存活时间（以秒为单位）
UPTIME=$((($(awk &#39;{print $1}&#39; /proc/uptime) - ${START_TIME} / ${CLK_TCK})))

# 计算子进程的存活时间（以 Unix 时间戳的形式表示）
CHILD_UPTIME=$(( $(date +%s) - ${UPTIME} ))

echo &amp;quot;子进程的存活时间为：${CHILD_UPTIME} 秒（Unix 时间戳形式）&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意，这个方法获取的存活时间不是绝对准确的，因为在读取进程的启动时间和计算子进程的存活时间期间，进程的存活时间可能会发生变化。&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/获取进程存活时间/" />
        </entry>
        <entry>
            <title>
                文件描述符
                
            </title>
            <updated>2025-01-28T14:10:23.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/文件描述符/</id>
            <content type="html">
                &lt;h1 id=&quot;文件描述符&quot; tabindex=&quot;-1&quot;&gt;文件描述符&lt;/h1&gt;
&lt;p&gt;对于内核而言，所有打开的文件都通过&lt;code&gt;文件描述符（file descriptor）&lt;/code&gt;引用。通常也写作 &lt;code&gt;fd&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;文件描述符&lt;/code&gt;是一个非负整数。&lt;/p&gt;
&lt;p&gt;当打开一个现有文件或者创建一个新文件时，内核向进程返回一个&lt;code&gt;文件描述符&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;文件描述符&lt;/code&gt;是跟&lt;code&gt;进程&lt;/code&gt;相关联的。&lt;/p&gt;
&lt;p&gt;按照惯例，&lt;code&gt;UNIX&lt;/code&gt; 系统将 &lt;code&gt;fd 0&lt;/code&gt; 对应进程的标准输入， &lt;code&gt;fd 1&lt;/code&gt; 对应进程的标准输出， &lt;code&gt;fd 2&lt;/code&gt; 对应进程的标准错误。&lt;/p&gt;
&lt;h2 id=&quot;系统调用中的文件描述符&quot; tabindex=&quot;-1&quot;&gt;系统调用中的文件描述符&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;UNIX&lt;/code&gt; 系统中，一切皆文件，所以一切资源都可以使用文件描述符进程引用。&lt;/p&gt;
&lt;p&gt;以 &lt;code&gt;open&lt;/code&gt; 系统调用为例&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;man 2 open&lt;/code&gt; 查看系统 &lt;code&gt;man&lt;/code&gt; 手册&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-man&quot;&gt;NAME
     open, openat -- open or create a file for reading or writing

SYNOPSIS
     &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#include&quot;&gt;#include&lt;/a&gt; &amp;lt;fcntl.h&amp;gt;

     int
     open(const char *path, int oflag, ...);

     int
     openat(int fd, const char *path, int oflag, ...);

DESCRIPTION
     The file name specified by path is opened for reading and/or writing,
     as specified by the argument oflag; the file descriptor is returned to
     the calling process.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在简介中有一段话：&lt;code&gt;the file descriptor is returned to the calling process.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;c&lt;/code&gt; 语言打开一个 文件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#include&quot;&gt;#include&lt;/a&gt; &amp;lt;stdio.h&amp;gt;
&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#include&quot;&gt;#include&lt;/a&gt; &amp;lt;fcntl.h&amp;gt;
&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#include&quot;&gt;#include&lt;/a&gt; &amp;lt;unistd.h&amp;gt;

int main() {
	int fd;
	fd = open(&amp;quot;tmp.txt&amp;quot;, O_RDONLY);
	printf(&amp;quot;%d&amp;quot;, fd);
	sleep(10);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会发现，在进程运行时 &lt;code&gt;fd&lt;/code&gt; 目录下，会出现一个描述符 3 指向了 打开的文件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;$ ll /proc/$(ps aux | grep a.out | grep -v grep | awk &#39;{print $2}&#39;)/fd
total 0
lrwx------ 1 ubuntu ubuntu 64 Apr 13 13:48 0 -&amp;gt; /dev/pts/4
lrwx------ 1 ubuntu ubuntu 64 Apr 13 13:48 1 -&amp;gt; /dev/pts/4
lrwx------ 1 ubuntu ubuntu 64 Apr 13 13:48 2 -&amp;gt; /dev/pts/4
lr-x------ 1 ubuntu ubuntu 64 Apr 13 13:48 3 -&amp;gt; /home/ubuntu/mydisk/yangblog/codes/file/tmp.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以把这个文件描述符当做参数传递给 &lt;code&gt;read&lt;/code&gt; 或者 &lt;code&gt;write&lt;/code&gt; 等等系统调用。&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/文件描述符/" />
        </entry>
        <entry>
            <title>
                使用shell脚本快速并行启动指定数量的进程
                
            </title>
            <updated>2025-02-18T14:06:12.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/使用shell脚本快速并行启动指定数量的进程/</id>
            <content type="html">
                &lt;h1 id=&quot;shell&quot; tabindex=&quot;-1&quot;&gt;使用shell脚本快速并行启动指定数量的进程&lt;/h1&gt;
&lt;p&gt;shell 脚本提升速度&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;i=0
while true;do
    # 此文件里面可以放同时执行的数量
    mod=$(cat process_count.plain.txt)

    # 并行执行数量, 默认为3个进程执行
    if [ -z &amp;quot;$mod&amp;quot; ]; then
        mod=3
    fi

    if [ $((i % mod)) -eq &amp;quot;0&amp;quot; ]; then
        echo &amp;quot;running $i&amp;quot;
	    # 关键在这里，需要等待上一批脚本执行完成
        wait
    fi
    
    nohup sh your_script.sh &amp;gt;&amp;gt; your_script_${i}.log 2&amp;gt;&amp;amp;1 &amp;amp;

    ((i++))
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/Linux/linux-wait/&quot;&gt;linux-wait&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/使用shell脚本快速并行启动指定数量的进程/" />
        </entry>
        <entry>
            <title>
                什么是 mdns
                
            </title>
            <updated>2024-10-12T14:56:45.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/什么是 mdns/</id>
            <content type="html">
                &lt;h1 id=&quot;mdns&quot; tabindex=&quot;-1&quot;&gt;什么是 mdns&lt;/h1&gt;
&lt;p&gt;MultiCast Dns 多播 dns 协议&lt;br /&gt;
使用 5353 端口进行通信&lt;br /&gt;
默认情况下，只解析 .local 顶级域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020210327225420.png&quot; alt=&quot;Pasted image 20210327225420.png&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://notes.leconiot.com/mdns.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;在局域网建立.local域名&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://baike.baidu.com/item/mdns&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;百度百科-mdns&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/什么是 mdns/" />
        </entry>
        <entry>
            <title>
                ubuntu-unminimize
                
            </title>
            <updated>2024-10-19T04:24:31.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/ubuntu-unminimize/</id>
            <content type="html">
                &lt;h1 id=&quot;ubuntu-unminimize&quot; tabindex=&quot;-1&quot;&gt;ubuntu-unminimize&lt;/h1&gt;
&lt;p&gt;unminimize 命令可以将 &lt;code&gt;ubuntu&lt;/code&gt; 的环境切换成正常的环境，会安装很多软件进去&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.ubuntu.com/Minimal&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://wiki.ubuntu.com/Minimal&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &#39;unminimize&#39; command will install the standard Ubuntu Server packages if you want to convert a Minimal instance to a standard Server environment for interactive use.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但是这些软件里面没有 ping 、 traceroute 等网络实用工具&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/ubuntu-unminimize/" />
        </entry>
        <entry>
            <title>
                shell替换字符串
                
            </title>
            <updated>2024-10-21T08:58:59.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/shell/shell替换字符串/</id>
            <content type="html">
                &lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# shell替换字符串
${hellohe/he/ae}

# 全局替换，多了一个斜杠
${hellohe//he/ae}

# sed 命令， 后面修饰的 g 代表全局替换，否则只替换第一个
echo &amp;quot;hellohe&amp;quot; | sed &#39;s/he/ae/g&#39;

#  awk 的函数
echo &amp;quot;hellohe&amp;quot; | awk &#39;{gsub(/he/, &amp;quot;ae&amp;quot;); print $0}&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/whatday/article/details/104963945&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;linux shell 替换字符串的几种方法，变量替换${}，sed，awk_whatday的博客-CSDN博客_shell 字符串替换&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;替换文本&quot; tabindex=&quot;-1&quot;&gt;替换文本&lt;/h1&gt;
&lt;p&gt;每一行最后添加一个逗号&lt;br /&gt;
&lt;code&gt;sed -e &#39;s/$/,/&#39;&lt;/code&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/shell/shell替换字符串/" />
        </entry>
        <entry>
            <title>
                shell-生成随机数
                
            </title>
            <updated>2024-10-20T15:57:33.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/shell/shell-生成随机数/</id>
            <content type="html">
                &lt;h1 id=&quot;shell&quot; tabindex=&quot;-1&quot;&gt;shell-生成随机数&lt;/h1&gt;
&lt;p&gt;变量范围是：&lt;code&gt;[0, 32767]&lt;/code&gt;  &lt;code&gt;echo $RANDOM&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br /&gt;
&lt;strong&gt;RANDOM&lt;/strong&gt; Each time this parameter is referenced, it expands to a&lt;br /&gt;
random integer between 0 and 32767.  Assigning a value to&lt;br /&gt;
&lt;strong&gt;RANDOM&lt;/strong&gt; initializes (seeds) the sequence of random numbers.&lt;br /&gt;
If &lt;strong&gt;RANDOM&lt;/strong&gt; is unset, it loses its special properties, even&lt;br /&gt;
if it is subsequently reset.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 Linux 的 Bash 脚本中，&lt;code&gt;$RANDOM&lt;/code&gt; 是一个特殊的变量，它用于生成一个随机整数。每次引用 &lt;code&gt;$RANDOM&lt;/code&gt; 时，它都会返回一个介于 0 到 32767 之间的随机数。这个变量是由 Bash 内置的，不需要任何外部程序或模块支持。&lt;/p&gt;
&lt;p&gt;以下是一些使用 &lt;code&gt;$RANDOM&lt;/code&gt; 的常见方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生成随机数&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo $RANDOM
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将输出一个 0 到 32767 之间的随机整数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生成特定范围内的随机数&lt;/strong&gt;：&lt;br /&gt;
如果你想要生成一个在特定范围内的随机数，可以使用算术扩展。例如，生成一个 1 到 10 之间的随机数：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo $((RANDOM % 10 + 1))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里，&lt;code&gt;%&lt;/code&gt; 是取模运算符，用于得到除法的余数，&lt;code&gt;+ 1&lt;/code&gt; 是为了将范围从 0 到 9 调整为 1 到 10。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在循环中使用&lt;/strong&gt;：&lt;br /&gt;
你可以在循环中使用 &lt;code&gt;$RANDOM&lt;/code&gt; 来生成一系列随机数：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;for i in {1..5}
do
    echo $((RANDOM % 100))
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将输出 5 个 0 到 99 之间的随机数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生成随机选择&lt;/strong&gt;：&lt;br /&gt;
你可以通过比较 &lt;code&gt;$RANDOM&lt;/code&gt; 和一个上限值来随机选择一个选项：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;choice=$((RANDOM % 2))
if [ $choice -eq 0 ]; then
    echo &amp;quot;Heads&amp;quot;
else
    echo &amp;quot;Tails&amp;quot;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将随机输出 &amp;quot;Heads&amp;quot; 或 &amp;quot;Tails&amp;quot;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;请注意，虽然 &lt;code&gt;$RANDOM&lt;/code&gt; 可以用于简单的随机数生成需求，但它并不适用于需要高质量随机性的场景，比如密码生成或加密应用。对于这些场景，你可能需要使用更专业的随机数生成器，如 &lt;code&gt;/dev/urandom&lt;/code&gt; 或 &lt;code&gt;/dev/random&lt;/code&gt; 设备，或者使用其他编程语言提供的加密安全的随机数生成函数。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.man7.org/linux/man-pages/man1/bash.1.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;bash(1) - Linux manual page&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/shell/shell-生成随机数/" />
        </entry>
        <entry>
            <title>
                shell-循环
                
            </title>
            <updated>2024-09-09T05:32:31.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/shell/shell-循环/</id>
            <content type="html">
                &lt;h1 id=&quot;shell&quot; tabindex=&quot;-1&quot;&gt;shell-循环&lt;/h1&gt;
&lt;h2 id=&quot;for&quot; tabindex=&quot;-1&quot;&gt;for&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;
# 遍历数字
for i in {0..10}; do
    echo 133
done

# 遍历文件
for file in split_??????; do
    echo ${file}
done

# 数组：
arr=(list0 list1 list2 list3)

# 遍历数组
for list in ${arr[@]}; do
	echo ${list}
done
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;while&quot; tabindex=&quot;-1&quot;&gt;while&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;while read line; do
    echo $line
done &amp;lt; file.txt
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/shell/shell-循环/" />
        </entry>
        <entry>
            <title>
                shell 命令，替换逗号为tab符号
                
            </title>
            <updated>2024-10-21T08:59:49.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/shell/shell 命令，替换逗号为tab符号/</id>
            <content type="html">
                &lt;h1 id=&quot;shell-tab&quot; tabindex=&quot;-1&quot;&gt;shell 命令，替换逗号为tab符号&lt;/h1&gt;
&lt;p&gt;&lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#shell&quot;&gt;#shell&lt;/a&gt; &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#linux&quot;&gt;#linux&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cat daily_pushed_data_ori  | grep -v error | sed &#39;s/,/&#92;t/g&#39; &amp;gt; daily_pushed_data
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参考：&lt;br /&gt;
&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/Linux/shell/shell%E6%9B%BF%E6%8D%A2%E5%AD%97%E7%AC%A6%E4%B8%B2/&quot;&gt;shell替换字符串&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/shell/shell 命令，替换逗号为tab符号/" />
        </entry>
        <entry>
            <title>
                linux-查看内存占用情况
                
            </title>
            <updated>2024-02-02T04:07:52.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-查看内存占用情况/</id>
            <content type="html">
                &lt;h1 id=&quot;linux&quot; tabindex=&quot;-1&quot;&gt;linux-查看内存占用情况&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;ps --no-headers -o &amp;quot;rss,cmd&amp;quot; -A | awk &#39;{print $1/1024&amp;quot;M&amp;quot;,&amp;quot;&#92;t&amp;quot;,$0}&#39; | sort -n -k1
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-查看内存占用情况/" />
        </entry>
        <entry>
            <title>
                linux-什么是anon_inode
                
            </title>
            <updated>2025-06-21T15:17:40.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-什么是anon_inode/</id>
            <content type="html">
                &lt;p&gt;无法和文件系统的 inode 关联上的文件描述符，在 &lt;code&gt;/proc&lt;/code&gt; 系统中统称为 anon_inode&lt;/p&gt;
&lt;h1 id=&quot;linux-anon-inode&quot; tabindex=&quot;-1&quot;&gt;linux-什么是anon_inode&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://unix.stackexchange.com/questions/463548/what-is-anon-inode-in-the-output-of-ls-l-proc-pid-fd&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://unix.stackexchange.com/questions/463548/what-is-anon-inode-in-the-output-of-ls-l-proc-pid-fd&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-什么是anon_inode/" />
        </entry>
        <entry>
            <title>
                linux-wrk
                
            </title>
            <updated>2025-03-13T08:47:19.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-wrk/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-wrk&quot; tabindex=&quot;-1&quot;&gt;linux-wrk&lt;/h1&gt;
&lt;p&gt;wrk 是一个压测工具，底层使用 epoll ，多线程执行，性能非常好&lt;/p&gt;
&lt;h1 id=&quot;使用说明：&quot; tabindex=&quot;-1&quot;&gt;使用说明：&lt;/h1&gt;
&lt;p&gt;安装：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/wg/wrk 

make
cp wrk /usr/local/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例用法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数含义：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;Usage: wrk &amp;lt;options&amp;gt; &amp;lt;url&amp;gt;
  Options:
    -c, --connections &amp;lt;N&amp;gt;  Connections to keep open
    -d, --duration    &amp;lt;T&amp;gt;  Duration of test
    -t, --threads     &amp;lt;N&amp;gt;  Number of threads to use

    -s, --script      &amp;lt;S&amp;gt;  Load Lua script file
    -H, --header      &amp;lt;H&amp;gt;  Add header to request
        --latency          Print latency statistics
        --timeout     &amp;lt;T&amp;gt;  Socket/request timeout
    -v, --version          Print version details

  Numeric arguments may include a SI unit (1k, 1M, 1G)
  Time arguments may include a time unit (2s, 2m, 2h)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例 lua 脚本文件位置&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/workspace/wrk/scripts/*.lua&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/wrk-lua%E8%84%9A%E6%9C%AC.png&quot; alt=&quot;wrk-lua脚本.png&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- example HTTP POST script which demonstrates setting the
-- HTTP method, body, and adding a header

wrk.method = &amp;quot;POST&amp;quot;
wrk.body   = &amp;quot;foo=bar&amp;amp;baz=quux&amp;quot;
wrk.headers[&amp;quot;Content-Type&amp;quot;] = &amp;quot;application/x-www-form-urlencoded&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;wrk lua 函数的生命周期&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020220508214336.png&quot; alt=&quot;Pasted image 20220508214336.png&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://juejin.cn/post/6844903550288396296&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;http 性能测试 wrk使用教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://segmentfault.com/a/1190000023212126&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;性能测试神器 wrk 使用教程&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-wrk/" />
        </entry>
        <entry>
            <title>
                linux-wait
                
            </title>
            <updated>2025-02-18T14:05:49.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-wait/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-wait&quot; tabindex=&quot;-1&quot;&gt;linux-wait&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;for pid in $(jobs -p); do
    wait $pid
    status=$?
    if [ $status != 0 ]; then
        echo &amp;quot; $pid status is $status have some error!&amp;quot; &amp;gt;&amp;gt; your_log
    else
        echo &amp;quot;$pid status is $status success!&amp;quot; &amp;gt;&amp;gt; your_log
    fi
done
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;reference&quot; tabindex=&quot;-1&quot;&gt;Reference&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man1/wait.1p.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;wait(1p) - Linux manual page&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-wait/" />
        </entry>
        <entry>
            <title>
                linux-top
                
            </title>
            <updated>2025-01-26T16:00:18.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-top/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-top&quot; tabindex=&quot;-1&quot;&gt;linux-top&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;Help for Interactive Commands - procps-ng UNKNOWN
Window 1:Def: Cumulative mode Off.  System: Delay 3.0 secs; Secure mode Off.

  Z,B,E,e   Global: &#39;Z&#39; colors; &#39;B&#39; bold; &#39;E&#39;/&#39;e&#39; summary/task memory scale
  l,t,m     Toggle Summary: &#39;l&#39; load avg; &#39;t&#39; task/cpu stats; &#39;m&#39; memory info
  0,1,2,3,I Toggle: &#39;0&#39; zeros; &#39;1/2/3&#39; cpus or numa node views; &#39;I&#39; Irix mode
  f,F,X     Fields: &#39;f&#39;/&#39;F&#39; add/remove/order/sort; &#39;X&#39; increase fixed-width

  L,&amp;amp;,&amp;lt;,&amp;gt; . Locate: &#39;L&#39;/&#39;&amp;amp;&#39; find/again; Move sort column: &#39;&amp;lt;&#39;/&#39;&amp;gt;&#39; left/right
  R,H,J,C . Toggle: &#39;R&#39; Sort; &#39;H&#39; Threads; &#39;J&#39; Num justify; &#39;C&#39; Coordinates
  c,i,S,j . Toggle: &#39;c&#39; Cmd name/line; &#39;i&#39; Idle; &#39;S&#39; Time; &#39;j&#39; Str justify
  x,y     . Toggle highlights: &#39;x&#39; sort field; &#39;y&#39; running tasks
  z,b     . Toggle: &#39;z&#39; color/mono; &#39;b&#39; bold/reverse (only if &#39;x&#39; or &#39;y&#39;)
  u,U,o,O . Filter by: &#39;u&#39;/&#39;U&#39; effective/any user; &#39;o&#39;/&#39;O&#39; other criteria
  n,#,^O  . Set: &#39;n&#39;/&#39;#&#39; max tasks displayed; Show: Ctrl+&#39;O&#39; other filter(s)
  V,v     . Toggle: &#39;V&#39; forest view; &#39;v&#39; hide/show forest view children

  k,r       Manipulate tasks: &#39;k&#39; kill; &#39;r&#39; renice
  d or s    Set update interval
  W,Y       Write configuration file &#39;W&#39;; Inspect other output &#39;Y&#39;
  q         Quit
          ( commands shown with &#39;.&#39; require a visible task display window )
Press &#39;h&#39; or &#39;?&#39; for help with Windows,
Type &#39;q&#39; or &amp;lt;Esc&amp;gt; to continue
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;常用指令&quot; tabindex=&quot;-1&quot;&gt;常用指令&lt;/h1&gt;
&lt;p&gt;m 显示内存信息，可以显示成内存条&lt;/p&gt;
&lt;p&gt;x：高亮显示排序字段&lt;/p&gt;
&lt;p&gt;z：彩色显示各个区域&lt;/p&gt;
&lt;p&gt;R：反向排序&lt;/p&gt;
&lt;p&gt;&amp;lt;：排序字段 左移&lt;/p&gt;
&lt;p&gt;&amp;gt;：排序字段 右移&lt;/p&gt;
&lt;p&gt;zx 打开高亮显示排序字段&lt;/p&gt;
&lt;p&gt;可以看到，默认是按照 cpu 使用率排序的&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;gt;&lt;/code&gt; 可以移到内存使用率排序&lt;/p&gt;
&lt;h1 id=&quot;存储到文件&quot; tabindex=&quot;-1&quot;&gt;存储到文件&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;top -c -b -n 10000 -d 3 &amp;gt;&amp;gt;top.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;字段含义&quot; tabindex=&quot;-1&quot;&gt;字段含义&lt;/h1&gt;
&lt;p&gt;top 字段的含义&lt;br /&gt;
&lt;a href=&quot;https://www.cnblogs.com/zhoug2020/p/6336453.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.cnblogs.com/zhoug2020/p/6336453.html&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-top/" />
        </entry>
        <entry>
            <title>
                linux-pidstat
                
            </title>
            <updated>2024-10-24T15:44:35.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-pidstat/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-pidstat&quot; tabindex=&quot;-1&quot;&gt;linux-pidstat&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;$pidstat 1 5                                                                                                                                                         11:46
Linux 5.4.0-1034-raspi (wdy-ubuntu) 	05/20/21 	_aarch64_	(4 CPU)

11:46:13      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
11:46:14        0      1871    0.00    0.97    0.00    0.00    0.97     3  phtunnel
11:46:14     1000      4506    0.97    0.00    0.00    0.00    0.97     0  gsd-xsettings
11:46:14     1000    115573    0.97    2.91    0.00    0.00    3.88     1  pidstat

11:46:14      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
11:46:15     1000    115573    0.00    4.00    0.00    0.00    4.00     1  pidstat

11:46:15      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
11:46:16     1000      4747    1.00    0.00    0.00    0.00    1.00     2  gnome-software
11:46:16        0    115462    0.00    1.00    0.00    0.00    1.00     2  kworker/2:1-events
11:46:16     1000    115573    1.00    3.00    0.00    0.00    4.00     1  pidstat

11:46:16      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
11:46:17        0     93708    0.00    1.00    0.00    0.00    1.00     2  containerd
11:46:17     1000    115573    1.00    3.00    0.00    0.00    4.00     1  pidstat

11:46:17      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
11:46:18     1000    115573    1.00    2.00    0.00    0.00    3.00     1  pidstat

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0      1871    0.00    0.20    0.00    0.00    0.20     -  phtunnel
Average:     1000      4506    0.20    0.00    0.00    0.00    0.20     -  gsd-xsettings
Average:     1000      4747    0.20    0.00    0.00    0.00    0.20     -  gnome-software
Average:        0     93708    0.00    0.20    0.00    0.00    0.20     -  containerd
Average:        0    115462    0.00    0.20    0.00    0.00    0.20     -  kworker/2:1-events
Average:     1000    115573    0.80    2.98    0.00    0.00    3.78     -  pidstat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pidstat&lt;/code&gt; 是 &lt;code&gt;sysstat&lt;/code&gt; 工具包的一部分，可以用来监控特定进程的 CPU、内存、I/O 等使用情况。与其他命令不同，&lt;code&gt;pidstat&lt;/code&gt; 提供了针对单个进程级别的统计信息，非常适合分析某个进程的性能表现。&lt;/p&gt;
&lt;h2 id=&quot;1-strong-code-pidstat-code-strong&quot; tabindex=&quot;-1&quot;&gt;1 &lt;strong&gt;安装 &lt;code&gt;pidstat&lt;/code&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pidstat&lt;/code&gt; 属于 &lt;code&gt;sysstat&lt;/code&gt; 工具包。如果尚未安装，可以使用以下命令进行安装：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get install sysstat  # 对于 Debian/Ubuntu
sudo yum install sysstat      # 对于 CentOS/RHEL
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2-strong-code-pidstat-code-cpu-strong&quot; tabindex=&quot;-1&quot;&gt;2 &lt;strong&gt;使用 &lt;code&gt;pidstat&lt;/code&gt; 查看 CPU 使用情况&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;要查看所有进程的 CPU 使用情况，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pidstat 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中，&lt;code&gt;1&lt;/code&gt; 表示每秒刷新一次 CPU 使用情况。输出示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;Linux 4.15.0-20-generic (hostname)   09/19/2024  _x86_64_  (4 CPU)

09:26:35      PID    %usr %system  %guest   %CPU   CPU  Command
09:26:36     1023    0.00    0.50    0.00    0.50     1  apache2
09:26:36     1234    0.20    0.30    0.00    0.50     0  chrome
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出中的各列解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;%usr&lt;/code&gt;：用户态 CPU 使用率。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%system&lt;/code&gt;：系统态 CPU 使用率。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%CPU&lt;/code&gt;：总 CPU 使用率。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PID&lt;/code&gt;：进程 ID。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Command&lt;/code&gt;：进程名称。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-strong-cpu-strong&quot; tabindex=&quot;-1&quot;&gt;3 &lt;strong&gt;查看特定进程的 CPU 使用情况&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;如果想监控某个特定进程，比如 &lt;code&gt;PID&lt;/code&gt; 为 1234 的进程，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pidstat -p 1234 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4-strong-cpu-strong&quot; tabindex=&quot;-1&quot;&gt;4 &lt;strong&gt;查看线程级别的 CPU 使用情况&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;要查看进程中的每个线程的 CPU 使用情况，可以使用 &lt;code&gt;-t&lt;/code&gt; 参数：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pidstat -t 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样可以分析多线程程序的性能表现。&lt;/p&gt;
&lt;h2 id=&quot;5-strong-i-o-strong&quot; tabindex=&quot;-1&quot;&gt;5 &lt;strong&gt;查看内存和 I/O 使用情况&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pidstat&lt;/code&gt; 还可以查看进程的内存和 I/O 使用情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看内存使用情况：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pidstat -r 1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查看 I/O 使用情况：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pidstat -d 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pidstat&lt;/code&gt; 是一个强大的工具，适合监控和分析单个进程的资源使用情况。&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://time.geekbang.org/column/article/70476&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://time.geekbang.org/column/article/70476&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-pidstat/" />
        </entry>
        <entry>
            <title>
                linux-man命令使用
                
            </title>
            <updated>2024-09-13T12:08:00.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-man命令使用/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-man&quot; tabindex=&quot;-1&quot;&gt;linux-man命令使用&lt;/h1&gt;
&lt;p&gt;1 - commands（普通的命令）&lt;br /&gt;
2 - system calls（系统调用）&lt;/p&gt;
&lt;p&gt;3 - library calls（库函数）&lt;br /&gt;
4 - special files（特殊文件：/dev下设备文件）&lt;br /&gt;
5 - file formats and convertions（文件格式）&lt;/p&gt;
&lt;p&gt;6 - games for linux（游戏和娱乐）&lt;br /&gt;
7 - macro packages and conventions（杂项）&lt;br /&gt;
8 - system management commands（管理员命令）&lt;br /&gt;
9 - 其他（Linux特定， 用来存放内核例行程序的文档）&lt;/p&gt;
&lt;p&gt;可使用 man man 进入此页面&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/zhang_chou_chou/article/details/83589224&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://blog.csdn.net/zhang_chou_chou/article/details/83589224&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;在线 man 手册&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-man命令使用/" />
        </entry>
        <entry>
            <title>
                linux-echo
                
            </title>
            <updated>2024-10-20T15:59:24.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-echo/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-echo&quot; tabindex=&quot;-1&quot;&gt;linux-echo&lt;/h1&gt;
&lt;p&gt;echo &amp;quot;hello&amp;quot;&lt;/p&gt;
&lt;p&gt;echo -n &amp;quot;hello&amp;quot; # 这种会去掉换行&lt;/p&gt;
&lt;p&gt;sh 不支持这个 -n 参数，很奇怪&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ echo -n &amp;quot;hello&amp;quot;
hello%
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;使用 -n 参数 zsh 后面会跟着一个百分号&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;transclusion internal-embed is-loaded&quot;&gt;&lt;div class=&quot;markdown-embed&quot;&gt;
&lt;div class=&quot;markdown-embed-title&quot;&gt;
&lt;h1 id=&quot;printf-puts-a-percent-sign-after-everything-it-prints&quot; tabindex=&quot;-1&quot;&gt;Printf puts a percent sign after everything it prints&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This is &lt;code&gt;zsh&lt;/code&gt;&#39;s way of telling you that the preceding command outputted a partial line and the shell terminated that line to give you a prompt on a new line.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-echo/" />
        </entry>
        <entry>
            <title>
                linux-dnsmasq
                
            </title>
            <updated>2024-10-21T08:52:22.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-dnsmasq/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-dnsmasq&quot; tabindex=&quot;-1&quot;&gt;linux-dnsmasq&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Go&quot;&gt;whatis dnsmasq
dnsmasq (8)          - A lightweight DHCP and caching DNS server.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一个 &lt;code&gt;dns&lt;/code&gt; 缓存&lt;/p&gt;
&lt;p&gt;Dnsmasq是一个轻量级的、易于配置的DNS转发器和DHCP服务器。它适用于小型网络，可以提供DNS缓存和BOOTP/TFTP服务，以帮助网络引导基于网络的操作系统。&lt;/p&gt;
&lt;p&gt;Dnsmasq具有以下主要作用：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DNS 转发与缓存：&lt;/strong&gt; Dnsmasq可以接受DNS查询并将其转发至网络中配置的真实DNS服务器，同时将查询结果缓存起来，提高网络访问速度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DHCP 服务器：&lt;/strong&gt; Dnsmasq可以作为一个DHCP服务器，为网络设备分配IP地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TFTP 服务器：&lt;/strong&gt; Dnsmasq还可以提供TFTP服务，为网络启动的设备提供所需文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dnsmasq的主要应用场景是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;小型网络和家庭网络：&lt;/strong&gt; 对于小型网络和家庭网络，通常无需专门的DNS和DHCP服务器，Dnsmasq就可以满足需求，省去配置和维护复杂设备的麻烦。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟化和容器环境：&lt;/strong&gt; 在虚拟机和容器这样的环境中，Dnsmasq可以提供DNS和DHCP服务，使得虚拟机和容器间的通信更容易。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络引导：&lt;/strong&gt; 对于依赖于网络引导的系统或者设备，例如网络启动的计算机，Dnsmasq的TFTP服务也非常有用。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;http://www.enkichen.com/2017/05/23/dnsmasq-introduce/&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Dnsmasq 介绍与使用 | Enki&#39;s Notes&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-dnsmasq/" />
        </entry>
        <entry>
            <title>
                linux-command-substitution（命令替换）
                
            </title>
            <updated>2024-10-19T05:52:06.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/linux-command-substitution（命令替换）/</id>
            <content type="html">
                &lt;h1 id=&quot;linux-command-substitution&quot; tabindex=&quot;-1&quot;&gt;linux-command-substitution（命令替换）&lt;/h1&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 什么是命令替换&lt;/h2&gt;
&lt;p&gt;在有一下情况的时候，会发生命令替换：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$(command)

或者是反引号
`command`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个命令会在子shell中执行，使用标准输出替换掉上面的命令文本。并且在管道关闭或者子进程终止前，shell会一直等待。&lt;/p&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 命令替换时为什么把换行变成了空格&lt;/h2&gt;
&lt;p&gt;shell读取的输出会以空格作为分隔符进行解析。&lt;br /&gt;
不过你可以通过从新设定 &lt;em&gt;IFS&lt;/em&gt; 字段来重新指定分隔符。&lt;/p&gt;
&lt;p&gt;比如说现在有一个文本文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wudanyang@dy-turbo-vm:~/workspace$ cat links.txt
123
456
789
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把文件内容实用命令替换成一个变量之后，文本输出是以空格分隔的，换行符被替换掉了&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wudanyang@dy-turbo-vm:~/workspace$ a=$(cat links.txt)
wudanyang@dy-turbo-vm:~/workspace$ echo $a
123 456 789
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是如果在输出的时候使用双引号括起来，那么换行符就会被保留下来：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wudanyang@dy-turbo-vm:~/workspace$ a=$(cat links.txt)
wudanyang@dy-turbo-vm:~/workspace$ echo &amp;quot;$a&amp;quot;
123
456
789
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3&quot; tabindex=&quot;-1&quot;&gt;3 读取文件的时候空格被当成了分隔符&lt;/h2&gt;
&lt;p&gt;当有这样一个文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ cat links.txt
hello world
today is weekend
so happy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接输出是这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wudanyang@dy-turbo-vm:~/workspace$ a=$(cat links.txt)
wudanyang@dy-turbo-vm:~/workspace$ echo $a
hello world today is weekend so happy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果直接读取的话，因为默认空格是分隔符，所以会认为这是很多行&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ for i in $(cat links.txt); do echo $i; done
hello
world
today
is
weekend
so
happy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-1&quot; tabindex=&quot;-1&quot;&gt;3.1 使用双引号解决&lt;/h3&gt;
&lt;p&gt;使用双引号可以解决这个问题，不实用shell的字符处理，而是使用双引号的字符处理逻辑：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;for i in &amp;quot;$(cat links.txt)&amp;quot;; do echo &amp;quot;$i&amp;quot;; done
hello world
today is weekend
so happy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-2-ifs&quot; tabindex=&quot;-1&quot;&gt;3.2 使用 IFS 修改默认分隔符&lt;/h3&gt;
&lt;p&gt;当然也可以使用 IFS，&lt;strong&gt;把默认的分隔符修改掉，但是记得要还原回来&lt;/strong&gt;， 不然可能执行别的程序会有问题&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;oriIFS=$IFS;IFS=

### 3.3 使用管道+read指令

&amp;gt; The _read_ utility shall read a single logical line from standard input into one or more shell variables.

```bash
cat links.txt | while read i; do echo $i; done
hello world
today is weekend
so happy
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4&quot; tabindex=&quot;-1&quot;&gt;4 小结&lt;/h2&gt;
&lt;p&gt;可以看到命令替换的字符串还是有一些弯弯绕绕的，所以，一般情况下，就不要使用命令替换，而是直接使用管道，或者就不使用shell了&lt;/p&gt;
&lt;h2 id=&quot;5&quot; tabindex=&quot;-1&quot;&gt;5 参考&lt;/h2&gt;
&lt;p&gt;命令替换 2.6.3 Command Substitution ： &lt;a href=&quot;https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Shell Command Language&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://unix.stackexchange.com/questions/164508/why-do-newline-characters-get-lost-when-using-command-substitution&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;shell - 为什么使用命令替换时换行符会丢失？ - Unix 和 Linux 堆栈交换 --- shell - Why do newline characters get lost when using command substitution? - Unix &amp;amp; Linux Stack Exchange&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man1/read.1p.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;阅读(1p) - Linux 手册页 --- read(1p) - Linux manual page&lt;/a&gt;&lt;br /&gt;
&#92;n&#39;; for i in $(cat links.txt); do echo &lt;mjx-container class=&quot;MathJax&quot; jax=&quot;SVG&quot; style=&quot;direction: ltr; position: relative;&quot;&gt;&lt;svg style=&quot;overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.439ex;&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;14.161ex&quot; height=&quot;2.034ex&quot; role=&quot;img&quot; focusable=&quot;false&quot; viewBox=&quot;0 -705 6259.1 899&quot; aria-hidden=&quot;true&quot;&gt;&lt;g stroke=&quot;currentColor&quot; fill=&quot;currentColor&quot; stroke-width=&quot;0&quot; transform=&quot;scale(1,-1)&quot;&gt;&lt;g data-mml-node=&quot;math&quot;&gt;&lt;g data-mml-node=&quot;mi&quot;&gt;&lt;path data-c=&quot;1D456&quot; d=&quot;M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(345,0)&quot;&gt;&lt;path data-c=&quot;3B&quot; d=&quot;M78 370Q78 394 95 412T138 430Q162 430 180 414T199 371Q199 346 182 328T139 310T96 327T78 370ZM78 60Q78 85 94 103T137 121Q202 121 202 8Q202 -44 183 -94T144 -169T118 -194Q115 -194 106 -186T95 -174Q94 -171 107 -155T137 -107T160 -38Q161 -32 162 -22T165 -4T165 4Q165 5 161 4T142 0Q110 0 94 18T78 60Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(789.7,0)&quot;&gt;&lt;path data-c=&quot;1D451&quot; d=&quot;M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1309.7,0)&quot;&gt;&lt;path data-c=&quot;1D45C&quot; d=&quot;M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(1794.7,0)&quot;&gt;&lt;path data-c=&quot;1D45B&quot; d=&quot;M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(2394.7,0)&quot;&gt;&lt;path data-c=&quot;1D452&quot; d=&quot;M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(2860.7,0)&quot;&gt;&lt;path data-c=&quot;3B&quot; d=&quot;M78 370Q78 394 95 412T138 430Q162 430 180 414T199 371Q199 346 182 328T139 310T96 327T78 370ZM78 60Q78 85 94 103T137 121Q202 121 202 8Q202 -44 183 -94T144 -169T118 -194Q115 -194 106 -186T95 -174Q94 -171 107 -155T137 -107T160 -38Q161 -32 162 -22T165 -4T165 4Q165 5 161 4T142 0Q110 0 94 18T78 60Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(3305.3,0)&quot;&gt;&lt;path data-c=&quot;1D43C&quot; d=&quot;M43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(3809.3,0)&quot;&gt;&lt;path data-c=&quot;1D439&quot; d=&quot;M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mi&quot; transform=&quot;translate(4558.3,0)&quot;&gt;&lt;path data-c=&quot;1D446&quot; d=&quot;M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;g data-mml-node=&quot;mo&quot; transform=&quot;translate(5481.1,0)&quot;&gt;&lt;path data-c=&quot;3D&quot; d=&quot;M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z&quot; style=&quot;stroke-width: 3;&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;mjx-assistive-mml unselectable=&quot;on&quot; display=&quot;inline&quot; style=&quot;top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;;&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo&gt;;&lt;/mo&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/math&gt;&lt;/mjx-assistive-mml&gt;&lt;/mjx-container&gt;oriIFS;&lt;br /&gt;
hello world&lt;br /&gt;
today is weekend&lt;br /&gt;
so happy&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
### 3.3 使用管道+read指令

&amp;gt; The _read_ utility shall read a single logical line from standard input into one or more shell variables.

{{CODE_BLOCK_9}}

## 4 小结

可以看到命令替换的字符串还是有一些弯弯绕绕的，所以，一般情况下，就不要使用命令替换，而是直接使用管道，或者就不使用shell了

## 5 参考

命令替换 2.6.3 Command Substitution ： [Shell Command Language](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03)
[shell - 为什么使用命令替换时换行符会丢失？ - Unix 和 Linux 堆栈交换 --- shell - Why do newline characters get lost when using command substitution? - Unix &amp;amp; Linux Stack Exchange](https://unix.stackexchange.com/questions/164508/why-do-newline-characters-get-lost-when-using-command-substitution)

[阅读(1p) - Linux 手册页 --- read(1p) - Linux manual page](https://man7.org/linux/man-pages/man1/read.1p.html)
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/linux-command-substitution（命令替换）/" />
        </entry>
        <entry>
            <title>
                iso-日期表示法
                
            </title>
            <updated>2024-10-12T15:19:09.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/iso-日期表示法/</id>
            <content type="html">
                &lt;p&gt;&lt;strong&gt;国际标准化组织的日期时间表示法&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;iso&quot; tabindex=&quot;-1&quot;&gt;iso-日期表示法&lt;/h1&gt;
&lt;h2 id=&quot;1&quot; tabindex=&quot;-1&quot;&gt;1 零时区&lt;/h2&gt;
&lt;p&gt;在最后加上大写 的 Z&lt;br /&gt;
2004-05-03T17:30:08Z&lt;/p&gt;
&lt;h2 id=&quot;2&quot; tabindex=&quot;-1&quot;&gt;2 其他时区&lt;/h2&gt;
&lt;p&gt;合并表示时，要在时间前面加一大写字母T，如要表示东八区时间2004年5月3日下午5点30分8秒，可以写成&lt;strong&gt;2004-05-03T17:30:08+08:00&lt;/strong&gt;或&lt;strong&gt;20040503T173008+08&lt;/strong&gt;。&lt;/p&gt;
&lt;h1 id=&quot;时间点表示法&quot; tabindex=&quot;-1&quot;&gt;时间点表示法&lt;/h1&gt;
&lt;p&gt;首字母为 P，其他字母为年月日时分秒，中间加上 T&lt;br /&gt;
&lt;strong&gt;P1Y3M5DT6H7M30S&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;时间间隔表示法&quot; tabindex=&quot;-1&quot;&gt;时间间隔表示法&lt;/h1&gt;
&lt;h2 id=&quot;1-1&quot; tabindex=&quot;-1&quot;&gt;1 从一个时间开始，到另一个时间结束&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;19850412/19860101&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-1&quot; tabindex=&quot;-1&quot;&gt;2 从指定时间开始持续一段时间&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;19850412/P6M&lt;/em&gt;&lt;/p&gt;
&lt;h1 id=&quot;循环时间表示法&quot; tabindex=&quot;-1&quot;&gt;循环时间表示法&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;R【循环次数】【/开始时间】/时间间隔【/结束时间】&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;从2004年5月6日北京时间下午1点起时间间隔半年零5天3小时循环，且循环3次&lt;br /&gt;
&lt;strong&gt;R3/20040506T130000+08/P0Y6M5DT3H0M0S&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;以1年2个月为循环间隔，无限次循环，最后循环终止于2025年1月1日&lt;br /&gt;
&lt;strong&gt;R/P1Y2M/20250101&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;div style=&quot;display: block; position: relative; width: 100%; height: 0px; --aspect-ratio:9/16; padding-bottom: calc(var(--aspect-ratio) * 100%);&quot;&gt;&lt;iframe src=&quot;https://zh.wikipedia.org/wiki/ISO_8601&quot; allow=&quot;fullscreen&quot; style=&quot;position: absolute; top: 0px; left: 0px; height: 100%; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/iso-日期表示法/" />
        </entry>
        <entry>
            <title>
                epoll的边缘触发和水平触发
                
            </title>
            <updated>2024-10-12T15:17:29.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/epoll的边缘触发和水平触发/</id>
            <content type="html">
                &lt;h1 id=&quot;epoll&quot; tabindex=&quot;-1&quot;&gt;epoll的边缘触发和水平触发&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;epoll&lt;/code&gt; 是 Linux 下用于处理大量文件描述符的高效 I/O 多路复用机制。在 &lt;code&gt;epoll&lt;/code&gt; 中，有两种触发模式：水平触发（Level-Triggered，简称 LT）和边缘触发（Edge-Triggered，简称 ET）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;水平触发（LT，Level-Triggered）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;当文件描述符就绪时，&lt;code&gt;epoll_wait&lt;/code&gt; 将立即返回。&lt;/li&gt;
&lt;li&gt;如果文件描述符的状态发生变化，&lt;code&gt;epoll_wait&lt;/code&gt; 会再次通知应用程序。&lt;/li&gt;
&lt;li&gt;这种模式下，如果文件描述符有数据可读或可写，&lt;code&gt;epoll_wait&lt;/code&gt; 将不停地返回通知，直到应用程序处理完数据或者阻塞。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边缘触发（ET，Edge-Triggered）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;当文件描述符就绪时，&lt;code&gt;epoll_wait&lt;/code&gt; 只会通知一次，直到应用程序处理完数据并清空了文件描述符的缓冲区。&lt;/li&gt;
&lt;li&gt;如果文件描述符的状态没有变化，&lt;code&gt;epoll_wait&lt;/code&gt; 不会重复通知应用程序。&lt;/li&gt;
&lt;li&gt;这种模式下，应用程序需要注意，在一个事件通知之后，要一直读或写，直到发生 &lt;code&gt;EAGAIN&lt;/code&gt; 或 &lt;code&gt;EWOULDBLOCK&lt;/code&gt; 错误。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为什么epoll这里要叫做边缘触发和水平触发呢？&lt;/p&gt;
&lt;p&gt;这源于通信&lt;strong&gt;数字信号处理领域&lt;/strong&gt;的术语，边缘和水平通常用于描述信号的特性&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;边缘触发（Edge-Triggered）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&amp;quot;边缘&amp;quot; 指的是信号的变化边缘，即信号从一个状态变为另一个状态的瞬间。&lt;/li&gt;
&lt;li&gt;在数字信号处理中，边缘通常用来表示信号的上升沿或下降沿，即信号从低电平到高电平或从高电平到低电平的瞬间。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;水平触发（Level-Triggered）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&amp;quot;水平&amp;quot; 指的是信号的水平状态，即信号所处的电平状态。&lt;/li&gt;
&lt;li&gt;在数字信号处理中，水平触发通常用来描述信号保持在某个电平的状态，而不关心信号的变化瞬间。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/92310.png&quot; alt=&quot;92310.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;1-reference&quot; tabindex=&quot;-1&quot;&gt;1 Reference&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://electronics.stackexchange.com/a/21891&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://electronics.stackexchange.com/a/21891&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/epoll的边缘触发和水平触发/" />
        </entry>
        <entry>
            <title>
                202404142147 如何在shell中遍历数字
                
            </title>
            <updated>2024-04-22T02:49:06.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/202404142147 如何在shell中遍历数字/</id>
            <content type="html">
                &lt;h1 id=&quot;202404142147-shell&quot; tabindex=&quot;-1&quot;&gt;202404142147 如何在shell中遍历数字&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;for i in {0..10}; do
    echo ${i}
done
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;# seq 1 3 10   # 步长3
for i in $(seq 1 10); do
	echo ${i}
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/Linux/shell/shell-%E5%BE%AA%E7%8E%AF/&quot;&gt;shell-循环&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/202404142147 如何在shell中遍历数字/" />
        </entry>
        <entry>
            <title>
                202103251606 - 如何在 linux 上配置科学上网
                
            </title>
            <updated>2024-04-27T12:32:12.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/202103251606 - 如何在 linux 上配置科学上网/</id>
            <content type="html">
                &lt;h1 id=&quot;202103251606-linux&quot; tabindex=&quot;-1&quot;&gt;202103251606 - 如何在 linux 上配置科学上网&lt;/h1&gt;
&lt;p&gt;我的机器是树莓派，底层架构是 arm 的，所以下载 arm 版本的安装包：&lt;br /&gt;
&lt;a href=&quot;https://github.com/Dreamacro/clash/releases/download/v1.4.2/clash-linux-armv8-v1.4.2.gz&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/Dreamacro/clash/releases/download/v1.4.2/clash-linux-armv8-v1.4.2.gz&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;gunzip clash-linux-armv8-v1.4.2.gz
sudo mv clash-linux-armv8-v1.4.2 /usr/bin/clash

# 下载你的配置，这里我是用的是 nsfwcloud.com 的服务
wget -O config.yml &amp;quot;https://rxl-nc.xyz/link/{your.token}?clash=1&amp;amp;log-level=info&amp;quot;

# 后台运行
nohup clash -f config.yml &amp;amp; 

export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;最终效果&quot; tabindex=&quot;-1&quot;&gt;最终效果&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020210325154154.png&quot; alt=&quot;Pasted image 20210325154154.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果不想要 info 日志，可以在 &lt;code&gt;config.yml&lt;/code&gt; 中将 log-level 修改成 &lt;code&gt;log-level: warning&lt;/code&gt;&lt;/p&gt;
&lt;h1 id=&quot;参考&quot; tabindex=&quot;-1&quot;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://nsfwcloud.com/user/tutorial?os=linux&amp;amp;client=clash##&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://nsfwcloud.com/user/tutorial?os=linux&amp;amp;client=clash##&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;output&quot; tabindex=&quot;-1&quot;&gt;output&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/wudanyang/p/15142036.html&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://www.cnblogs.com/wudanyang/p/15142036.html&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/202103251606 - 如何在 linux 上配置科学上网/" />
        </entry>
        <entry>
            <title>
                202011261547 - 使用base64处理二进制字符串
                
            </title>
            <updated>2024-10-12T08:45:43.000Z</updated>
            <id>https://grove-trees.netlify.app/card/Linux/202011261547 - 使用base64处理二进制字符串/</id>
            <content type="html">
                &lt;p&gt;tags: &lt;a class=&quot;tag&quot; onclick=&quot;toggleTagSearch(this)&quot; data-content=&quot;#string&quot;&gt;#string&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一句话简单描述：使用 base64_encode 将二进制字符串映射成 base64 ， 然后在使用的使用 base64_decode 一下&lt;/p&gt;
&lt;h1 id=&quot;202011261547-base64&quot; tabindex=&quot;-1&quot;&gt;202011261547 - 使用base64处理二进制字符串&lt;/h1&gt;
&lt;p&gt;二进制字符串不具有可处理性，输出到文件或者屏幕上面显示如下:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201127110121.png&quot; alt=&quot;Pasted image 20201127110121.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上面图片中的字符串很难被处理，因为二进制字符串在&lt;/p&gt;
&lt;p&gt;base64_encode 之后，是使用64个字符组成的字符串：&lt;br /&gt;
&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020201127110143.png&quot; alt=&quot;Pasted image 20201127110143.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;程序中处理的时候使用 base64_decode 一下，赋值给一个变量即可&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$originData = base64_deocde($base64Data);

# 下面是你自己的逻辑
......
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/Linux/202011261547 - 使用base64处理二进制字符串/" />
        </entry>
        <entry>
            <title>
                202506201431 将刚提交的commit回滚
                
            </title>
            <updated>2025-06-23T03:41:30.000Z</updated>
            <id>https://grove-trees.netlify.app/card/202506201431 将刚提交的commit回滚/</id>
            <content type="html">
                &lt;h1 id=&quot;202506201431-commit&quot; tabindex=&quot;-1&quot;&gt;202506201431 将刚提交的commit回滚&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git reset --soft HEAD
&lt;/code&gt;&lt;/pre&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/202506201431 将刚提交的commit回滚/" />
        </entry>
        <entry>
            <title>
                obsidian-things3-today插件
                
            </title>
            <updated>2025-01-22T17:16:54.000Z</updated>
            <id>https://grove-trees.netlify.app/card/0000 publish/obsidian-things3-today插件/</id>
            <content type="html">
                &lt;h1 id=&quot;obsidian-things3-today&quot; tabindex=&quot;-1&quot;&gt;obsidian-things3-today插件&lt;/h1&gt;
&lt;p&gt;插件： &lt;a href=&quot;https://obsidian.md/plugins?id=things3-today&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;Obsidian Plugin - Things3 Today&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把之前的插件重新搞了搞，把乱七八糟的东西去掉了，然后提交了obsidian插件库&lt;/li&gt;
&lt;li&gt;review 审核通过： &lt;a href=&quot;https://github.com/obsidianmd/obsidian-releases/pull/2997&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://github.com/obsidianmd/obsidian-releases/pull/2997&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;新录了一个gif：见github的readme，图中可以看到和things3的Today列表联动还算是顺畅&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wudanyang6/obsidian-things3-today?tab=readme-ov-file&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;github - wudanyang6/obsidian-things3-today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;跟着操作手册在论坛上面发了分享贴：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.obsidian.md/t/new-plugin-things3-today-manage-todays-tasks-with-things3/77916&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://forum.obsidian.md/t/new-plugin-things3-today-manage-todays-tasks-with-things3/77916&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/0000 publish/obsidian-things3-today插件/" />
        </entry>
        <entry>
            <title>
                Things 工作流
                
            </title>
            <updated>2025-02-05T16:38:26.000Z</updated>
            <id>https://grove-trees.netlify.app/card/0000 publish/Things 工作流/</id>
            <content type="html">
                &lt;h1 id=&quot;things&quot; tabindex=&quot;-1&quot;&gt;Things 工作流&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;有任何事情都记录下来，心中的任何想法都不要放过，使用Things的快速录入功能 &lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020240420225952.png&quot; alt=&quot;Pasted image 20240420225952.png&quot; /&gt;&lt;/li&gt;
&lt;li&gt;定时整理收件箱（需要保证整理完收件箱之后，任务都是可执行的）
&lt;ol&gt;
&lt;li&gt;如果有事情2分钟就能解决，那么直接去做，属于小事情&lt;/li&gt;
&lt;li&gt;如果需要1小时以上，就将任务设置成项目
&lt;ol&gt;
&lt;li&gt;做一次任务分解，分解成小任务，小任务以30分钟以内完成最好&lt;/li&gt;
&lt;li&gt;如果分解项目本身也需要很多时间，那么在项目里面加一个【分解任务】的事项&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;根据时间，选取任务进行处理，打开 &lt;code&gt;Session&lt;/code&gt; 软件进行专注于做事，太喜欢 Session 的页面了，从而订阅了 setapp 使用  &lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020231107224028.png&quot; alt=&quot;Pasted image 20231107224028.png&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为了让Things工作流更顺畅，我做了一个obsidian插件：&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/0000%20publish/obsidian-things3-today%E6%8F%92%E4%BB%B6/&quot;&gt;obsidian-things3-today插件&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%97%B6%E9%97%B4%E7%AE%A1%E7%90%86/202404191548%20GTD%E7%9A%84%E4%B8%BB%E8%A6%81%E6%80%9D%E6%83%B3/&quot;&gt;202404191548 GTD的主要思想&lt;/a&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/0000 publish/Things 工作流/" />
        </entry>
        <entry>
            <title>
                CDN 带宽控制
                
            </title>
            <updated>2025-02-12T13:06:38.000Z</updated>
            <id>https://grove-trees.netlify.app/card/0000 publish/CDN 带宽控制/</id>
            <content type="html">
                &lt;h1 id=&quot;cdn&quot; tabindex=&quot;-1&quot;&gt;CDN 带宽控制&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;refer 限制，禁用非自身域名
&lt;ol&gt;
&lt;li&gt;空refer禁用，有一定风险，尽量在站点刚开放时使用此方案&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;单请求响应限速，百度CDN可以配置&lt;/li&gt;
&lt;li&gt;CDN日志回扫分析
&lt;ol&gt;
&lt;li&gt;删除肉眼可见的违规图片&lt;/li&gt;
&lt;li&gt;对图片进行检测，是否包含视频资源（需要策略算法支持）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;针对访问量、请求数过高的ip进行封禁&lt;/li&gt;
&lt;li&gt;图片与内容关联，在审核内容时，发现图片违禁直接删除内容并删除图片&lt;/li&gt;
&lt;/ol&gt;

            </content>
            <link href="https://grove-trees.netlify.app/card/0000 publish/CDN 带宽控制/" />
        </entry>
        <entry>
            <title>
                Home
                
            </title>
            <updated>2024-09-11T09:07:12.000Z</updated>
            <id>https://grove-trees.netlify.app/</id>
            <content type="html">
                &lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/IMG_2579.jpg&quot; alt=&quot;IMG_2579.jpg|600&quot; width=&quot;600px&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;国泰民安、风调雨顺、世界和平&lt;/li&gt;
&lt;li&gt;平时要全力以赴的练习，才能在关键时刻派上用场&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;最近创建的文章&quot; tabindex=&quot;-1&quot;&gt;最近创建的文章&lt;/h3&gt;
&lt;table class=&quot;block-language-dataview&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;创建时间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/202506201431%20%E5%B0%86%E5%88%9A%E6%8F%90%E4%BA%A4%E7%9A%84commit%E5%9B%9E%E6%BB%9A/&quot;&gt;202506201431 将刚提交的commit回滚&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-20 14:31:04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/mac/202506172251%20mac%20%E5%BC%BA%E5%88%B6%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86/&quot;&gt;202506172251 mac 强制程序使用代理&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-17 22:51:58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/202506171613%20vscode%20%E5%A6%82%E4%BD%95%E7%B2%98%E8%B4%B4%E6%96%87%E4%BB%B6%E4%B8%8D%E8%A6%86%E7%9B%96/&quot;&gt;202506171613 vscode 如何粘贴文件不覆盖&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-17 16:13:46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/go/202506061308%20vscode%20There%20is%20no%20formatter%20for%20&#39;go&#39;%20files%20installed%20%E6%8A%A5%E9%94%99%E5%A4%84%E7%90%86/&quot;&gt;202506061308 vscode There is no formatter for &#39;go&#39; files installed 报错处理&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-06 13:08:31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/python/gunicorn+uvicorn+fastapi%20%E8%BF%9B%E7%A8%8B%E6%A8%A1%E5%9E%8B.excalidraw/&quot;&gt;gunicorn+uvicorn+fastapi 进程模型.excalidraw&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-05-26 22:26:14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/python/python-Asyncer/&quot;&gt;python-Asyncer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-04-21 16:03:31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/python/python%20%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83/&quot;&gt;python 虚拟环境&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-26 14:57:27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/python/python%20fastapi%20%E9%BB%98%E8%AE%A4%E7%BA%BF%E7%A8%8B%E6%95%B0/&quot;&gt;python fastapi 默认线程数&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-17 23:36:42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/mac/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90mac%E7%AB%AF%E5%9B%9E%E9%80%80%E5%88%B02.x%E7%89%88%E6%9C%AC/&quot;&gt;网易云音乐mac端回退到2.x版本&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-13 23:05:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/python/python-%E4%B8%BA%E4%BB%80%E4%B9%88%20%7B%7D%20%E4%B8%8D%E8%83%BD%E4%BD%9C%E4%B8%BA%E9%BB%98%E8%AE%A4%E5%8F%82%E6%95%B0%EF%BC%9F/&quot;&gt;python-为什么 {} 不能作为默认参数？&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-10 14:56:03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%A6%82%E6%9E%9C%E4%B8%80%E7%94%9F%E5%8F%AA%E8%AF%BB6%E6%9C%AC%E4%B9%A6%EF%BC%8C%E6%8E%A8%E8%8D%90%E5%93%AA%E5%87%A0%E6%9C%AC%EF%BC%9F/&quot;&gt;如果一生只读6本书，推荐哪几本？&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-06 15:45:15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/mermaid%20%E5%9B%BE%E8%A1%A8%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90/&quot;&gt;mermaid 图表自动生成&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-01-16 11:03:36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/ai-%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/&quot;&gt;ai-动画制作&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-01-02 00:47:27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/go/golang-cobra/&quot;&gt;golang-cobra&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2024-12-20 14:31:47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/55.%20%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8F/&quot;&gt;55. 跳跃游戏&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2024-11-13 23:46:30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/1143.%20%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97/&quot;&gt;1143. 最长公共子序列&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2024-11-10 19:28:30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/59.%20%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5%20II/&quot;&gt;59. 螺旋矩阵 II&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2024-11-09 18:16:21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/239.%20%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC/&quot;&gt;239. 滑动窗口最大值&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2024-11-09 00:00:13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/72.%20%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB/&quot;&gt;72. 编辑距离&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2024-11-08 01:03:57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE%E9%9A%BE%E5%BA%A6%E6%9B%B4%E6%96%B0%E4%BA%86/&quot;&gt;leetcode题目难度更新了&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2024-11-06 00:26:39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/560.%20%E5%92%8C%E4%B8%BA%20K%20%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84/&quot;&gt;560. 和为 K 的子数组&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2024-10-30 23:25:53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E7%AE%97%E6%B3%95/leetcode%E9%A2%98%E7%9B%AE/54.%20%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5/&quot;&gt;54. 螺旋矩阵&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2024-10-28 20:39:41&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;最近更新的文章&quot; tabindex=&quot;-1&quot;&gt;最近更新的文章&lt;/h3&gt;
&lt;table class=&quot;block-language-dataview&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;更新时间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/202506201431%20%E5%B0%86%E5%88%9A%E6%8F%90%E4%BA%A4%E7%9A%84commit%E5%9B%9E%E6%BB%9A/&quot;&gt;202506201431 将刚提交的commit回滚&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-23 11:41:30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/Linux/linux-%E4%BB%80%E4%B9%88%E6%98%AFanon_inode/&quot;&gt;linux-什么是anon_inode&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-21 23:17:40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/python/python%20fastapi%20%E9%BB%98%E8%AE%A4%E7%BA%BF%E7%A8%8B%E6%95%B0/&quot;&gt;python fastapi 默认线程数&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-19 13:34:56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/202506171613%20vscode%20%E5%A6%82%E4%BD%95%E7%B2%98%E8%B4%B4%E6%96%87%E4%BB%B6%E4%B8%8D%E8%A6%86%E7%9B%96/&quot;&gt;202506171613 vscode 如何粘贴文件不覆盖&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-17 23:07:42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/mac/202506172251%20mac%20%E5%BC%BA%E5%88%B6%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86/&quot;&gt;202506172251 mac 强制程序使用代理&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-17 22:53:59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/go/202506061308%20vscode%20There%20is%20no%20formatter%20for%20&#39;go&#39;%20files%20installed%20%E6%8A%A5%E9%94%99%E5%A4%84%E7%90%86/&quot;&gt;202506061308 vscode There is no formatter for &#39;go&#39; files installed 报错处理&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-06 13:08:59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/ai-%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/&quot;&gt;ai-动画制作&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-06-05 20:57:59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/python/gunicorn+uvicorn+fastapi%20%E8%BF%9B%E7%A8%8B%E6%A8%A1%E5%9E%8B.excalidraw/&quot;&gt;gunicorn+uvicorn+fastapi 进程模型.excalidraw&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-05-27 14:12:43&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/python/python%20%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83/&quot;&gt;python 虚拟环境&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-05-13 22:32:53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/python/python-Asyncer/&quot;&gt;python-Asyncer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-04-25 19:03:19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/Linux/linux-wrk/&quot;&gt;linux-wrk&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-03-13 16:47:19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/k8s/%E5%BF%AB%E9%80%9F%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%8F%AF%E8%AE%BF%E9%97%AE%E7%9A%84%E6%9C%8D%E5%8A%A1/&quot;&gt;快速创建一个可访问的服务&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-24 15:29:43&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/Linux/%E4%BD%BF%E7%94%A8shell%E8%84%9A%E6%9C%AC%E5%BF%AB%E9%80%9F%E5%B9%B6%E8%A1%8C%E5%90%AF%E5%8A%A8%E6%8C%87%E5%AE%9A%E6%95%B0%E9%87%8F%E7%9A%84%E8%BF%9B%E7%A8%8B/&quot;&gt;使用shell脚本快速并行启动指定数量的进程&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-18 22:06:12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/Linux/linux-wait/&quot;&gt;linux-wait&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-18 22:05:49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%80%9D%E8%80%83/202404251145%20%E7%A0%B4%E8%A7%A3%E8%BD%AF%E4%BB%B6%E7%9A%84%E6%88%90%E6%9C%AC%E5%A6%82%E6%9E%9C%E6%AF%94%E8%BE%83%E9%AB%98%E5%B0%B1%E4%B8%8D%E8%A6%81%E5%8E%BB%E8%8A%B1%E6%97%B6%E9%97%B4%E7%A0%B4%E8%A7%A3%E4%BA%86/&quot;&gt;202404251145 破解软件的成本如果比较高就不要去花时间破解了&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-18 21:43:13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/go/go%20%E8%8E%B7%E5%8F%96%E5%87%8C%E6%99%A80%E7%82%B9%E7%9A%84%E6%97%B6%E9%97%B4%E6%88%B3/&quot;&gt;go 获取凌晨0点的时间戳&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-18 20:15:16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E6%80%9D%E8%80%83/202404171707%20%E5%BD%93%E4%BD%A0%E5%AD%A6%E4%B8%8D%E4%B8%8B%E5%8E%BB%E7%9A%84%E6%97%B6%E5%80%99/&quot;&gt;202404171707 当你学不下去的时候&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-14 16:40:58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/mac/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90mac%E7%AB%AF%E5%9B%9E%E9%80%80%E5%88%B02.x%E7%89%88%E6%9C%AC/&quot;&gt;网易云音乐mac端回退到2.x版本&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-13 23:08:44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/kafka/Kafka%E5%85%A5%E9%97%A8/&quot;&gt;Kafka入门&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-13 13:12:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/php/202012081017%20-%20php8.0%20%E6%96%B0%E7%89%B9%E6%80%A7/&quot;&gt;202012081017 - php8.0 新特性&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-13 13:11:20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/go/go-%E6%97%B6%E9%97%B4%E5%A4%84%E7%90%86/&quot;&gt;go-时间处理&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-13 13:03:59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class=&quot;internal-link&quot; target=&quot;&quot; data-note-icon=&quot;2&quot; href=&quot;https://grove-trees.netlify.app/card/%E5%B7%A5%E5%85%B7/vscode%20vim%20%E7%8A%B6%E6%80%81%E4%B8%8B%E6%98%BE%E7%A4%BA%E6%8F%90%E7%A4%BA/&quot;&gt;vscode vim 状态下显示提示&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2025-02-13 12:59:33&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

            </content>
            <link href="https://grove-trees.netlify.app/" />
        </entry>
        <entry>
            <title>
                2024-10-11
                
            </title>
            <updated>2024-11-10T11:43:00.000Z</updated>
            <id>https://grove-trees.netlify.app/journal/2024-10-11/</id>
            <content type="html">
                &lt;h1 id=&quot;2024-10-11&quot; tabindex=&quot;-1&quot;&gt;2024-10-11&lt;/h1&gt;
&lt;p&gt;换了一个新的工作电脑 &lt;code&gt;Apple M3 16G&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;新电脑的刘海把很多图标都挡住了，太难受了，看网上教程，找了个软件 &lt;code&gt;Bartender&lt;/code&gt; 能够解决&lt;/p&gt;
&lt;p&gt;带刘海屏的 Macbook, 状态栏图标多了被刘海挡住看不到了，咋办？ - V2EX: &lt;a href=&quot;https://v2ex.com/t/1019165#&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;https://v2ex.com/t/1019165#&lt;/a&gt;;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://grove-trees.netlify.app/img/user/attachs/Pasted%20image%2020241011213412.png&quot; alt=&quot;Pasted image 20241011213412.png&quot; /&gt;&lt;/p&gt;

            </content>
            <link href="https://grove-trees.netlify.app/journal/2024-10-11/" />
        </entry>
</feed>
