<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>wsmの随记</title>
		<link>https://g0g.top/</link>
		<description>Recent content on wsmの随记</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Fri, 09 Jan 2026 00:00:00 +0800</lastBuildDate>
		
			<atom:link href="https://g0g.top/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>算法笔记</title>
				<link>https://g0g.top/2026/01/%E7%AE%97%E6%B3%95%E7%AC%94%E8%AE%B0/</link>
				<pubDate>Fri, 09 Jan 2026 00:00:00 +0800</pubDate>
				<guid>https://g0g.top/2026/01/%E7%AE%97%E6%B3%95%E7%AC%94%E8%AE%B0/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;此文尚未完工，可能还会有重大改动或者被废弃&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;基础&#34;&gt;基础&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;定义：算法是 良定义的 有输入输出的 计算过程 (procedure)&lt;/li&gt;&#xA;&lt;li&gt;正确性：liveness （有限时间），safety （答案正确）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;分析：伪代码，正确性，复杂度&lt;/li&gt;&#xA;&lt;li&gt;loop invariant, maintenance&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;串行 (sequential) 算法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;技巧：分治，动态规划，贪心&lt;/li&gt;&#xA;&lt;li&gt;分治：“分”即分解为同构的、小规模的问题；“治”即递归解决。治后还需合并小问题结果。例如归并排序&lt;/li&gt;&#xA;&lt;li&gt;图算法：最小生成树，单源最短路&lt;/li&gt;&#xA;&lt;li&gt;NP: 旅行商&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;分布式 (distributed) 算法：多节点 (core, processor, machine, cluster) 互相通信&#xA;&lt;ul&gt;&#xA;&lt;li&gt;examples: C/S, 区块链&lt;/li&gt;&#xA;&lt;li&gt;基础抽象：时序 (timing) 假设，故障 (fault) 检测，广播（可靠，因果），Leader 选举，共识&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;算法复杂度&#34;&gt;算法复杂度&lt;/h2&gt;&#xA;&lt;p&gt;执行时间即指令数：假定所有指令（算术，访存，控制）都会耗等时，串行。&lt;/p&gt;&#xA;&lt;p&gt;朴素计算方式：逐指令计数；考虑最佳/最坏/平均&lt;/p&gt;&#xA;&lt;p&gt;增长量级 Order of growth：Θ (tight) 𝑂 (upper) Ω (lower) ；$f(n)=\Theta(g(n))$ 定义：&#xA;$$&#xA;\exists n_0 \in \mathbb{N}, c_1,c_2&amp;gt;0, \forall n&amp;gt;n_0, 0\le c_1g(n)\le f(n) \le c_2g(n)&#xA;$$&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;我们需要计算一些递归算法的复杂度，其具有 $T(n) =aT\left(\frac{n}{b}\right) + f(n)$ 的形式。有三种算法：代入法，递归树，主定理。&lt;/p&gt;</description>
			</item>
			<item>
				<title>计算机网络</title>
				<link>https://g0g.top/2026/01/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/</link>
				<pubDate>Wed, 07 Jan 2026 17:00:00 +0800</pubDate>
				<guid>https://g0g.top/2026/01/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/</guid>
				<description>&lt;h2 id=&#34;快速自查&#34;&gt;快速自查&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;物理层&#xA;&lt;ul&gt;&#xA;&lt;li&gt;调制：曼彻斯特编码/差分曼彻斯特编码；QAM&lt;/li&gt;&#xA;&lt;li&gt;奈奎斯特准则，信噪比，香农公式&lt;/li&gt;&#xA;&lt;li&gt;媒体：TP (U,S,F)，光纤波段 (0.85, 1.3, 1.55) 带宽 (25THz)，无线电 (2-40GHz)&lt;/li&gt;&#xA;&lt;li&gt;信道复用：FDM, TDM, WDM, CDM&lt;/li&gt;&#xA;&lt;li&gt;SONET / SDH (51.84, 155.52 Mbps)&lt;/li&gt;&#xA;&lt;li&gt;ASDL, HFC, FTTx, ODN (PON)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;数据链路层&#xA;&lt;ul&gt;&#xA;&lt;li&gt;LLC, MAC; MTU, SOH, EOT, ESC; BER, FCS, ARQ&lt;/li&gt;&#xA;&lt;li&gt;CRC, Hamming; ARQ, SW, GBN, SR&lt;/li&gt;&#xA;&lt;li&gt;PPP: LCP, NCP, CHAP, PAP&lt;/li&gt;&#xA;&lt;li&gt;CSMA/CD: 0.1us, 96b IFG, 512b CW, 16, 48b jam&lt;/li&gt;&#xA;&lt;li&gt;MAC: addr (I/G, G/L, broadcast), 18B, 1500B, VLAN (802.1Q, 4B)&lt;/li&gt;&#xA;&lt;li&gt;Switch: CAM, STP; 交换结构&lt;/li&gt;&#xA;&lt;li&gt;802.3u/z/ab; 10ns, 512B; bursting&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;网络层&#xA;&lt;ul&gt;&#xA;&lt;li&gt;IP (20B+4*n, pld*8, trie)  ARP (0806 8+10*2), ICMP (8+n), IGMP (8)&lt;/li&gt;&#xA;&lt;li&gt;IPv6(40B) ICMPv6 (ND, MLD)&lt;/li&gt;&#xA;&lt;li&gt;ip range, private addr, NAT (NAPT)&lt;/li&gt;&#xA;&lt;li&gt;AS, IGP, RIP (hop, udp+4+20*n), OSPF (proto89, 24+); EGP, BGP-4 (iBGP. eBGP, select algo, 19+)&lt;/li&gt;&#xA;&lt;li&gt;multicast: mbone, 01-00-5e-0b1, 路由选择 (DVMRP, PIM)，RPB&lt;/li&gt;&#xA;&lt;li&gt;MPLS: 4B, label, LDP, LSP, LSR, FEC; SR&lt;/li&gt;&#xA;&lt;li&gt;SDN: OpenFlow, 南北&lt;/li&gt;&#xA;&lt;li&gt;libc socket&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;传输层&#xA;&lt;ul&gt;&#xA;&lt;li&gt;UDP: 8B hdr, checksum (2B, 12B phead, pad4B)&lt;/li&gt;&#xA;&lt;li&gt;TCP: TPDU, port (49512); hdr 20+4*n, Options (2B TL+nV, MSS 2, Window Scale 1, TS 8, SACK 8/16)&lt;/li&gt;&#xA;&lt;li&gt;swnd, cwnd, rwnd; ARQ; SACK, D-SACK; RTO (Karn), 快速重传, ZWP （持续计时器）, Nagle, Reno 四阶段; AQM&lt;/li&gt;&#xA;&lt;li&gt;TCP state machine; MSL; keepalive timer&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;应用层&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TCP: FTP (20/21), TELNET (23), SMTP (25/587), POP3 (110/005), IMAP (143/993)&lt;/li&gt;&#xA;&lt;li&gt;UDP: DNS (53), NFS (2049), TFTP (69), DHCP (68/67), SNMP (161/162, SMI, MIB)&lt;/li&gt;&#xA;&lt;li&gt;DNS: 四种 DNS, 递归迭代&lt;/li&gt;&#xA;&lt;li&gt;WWW: URLm HTTP (1.0, 1.1, 2), HTML, Email (SMTP, POP3, IMAP, pld), MIME, Proxy, Payload (v1), CGI, 搜索引擎, Blog, SNS&lt;/li&gt;&#xA;&lt;li&gt;P2P: Time, DHT, Chore ring (KID, NID, finger table)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;无线网络&#xA;&lt;ul&gt;&#xA;&lt;li&gt;802.11: AP, Service set (BSS, ESS, SSID, B/ESSID), Association; AD Hoc (MANET, WSN);  version (bagncx); WPAN&lt;/li&gt;&#xA;&lt;li&gt;CSMA/CA: CW, 预约 (RTS,CTS), NAV, IFS (slot time, SIFS, DIFS); backoff time; MAC (4+3*6+2+6+body+4)&lt;/li&gt;&#xA;&lt;li&gt;WPAN: Bluetooth (IEEE802.15.1, BLE, Piconet), ZigBee (IEEE 802.15.4, FFD, RFD), 802.15.3&lt;/li&gt;&#xA;&lt;li&gt;蜂窝: 1G (FDMA), 2G (T/FDMA, GSM, GPRS), 3G (T/CDMA, UTRAN), 4G (SC/OFDMA+MIMO, LTE, E-UTRAN, EPC)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Internet / 互联网：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;基本特点：连通性，资源共享&lt;/li&gt;&#xA;&lt;li&gt;组成/要素：计算机，信道， 通信协议&lt;/li&gt;&#xA;&lt;li&gt;发展阶段：ARPANET (1969/1983)，三级结构 NSFNET (1985) （主干+地区+企业），多层 ISP （主干，地区，本地 多 tier）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Internet Service Provider (ISP)&lt;/li&gt;&#xA;&lt;li&gt;Internet eXchange Point (IXP) 互联网交换点&lt;/li&gt;&#xA;&lt;li&gt;Content Provider&lt;/li&gt;&#xA;&lt;li&gt;Request For Comments (RFC) (Proposed, Drafted, STD)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;标准化：RFC&lt;/li&gt;&#xA;&lt;li&gt;边缘网 edge/end system&#xA;&lt;ul&gt;&#xA;&lt;li&gt;端通信方式：C/S, P2P&lt;/li&gt;&#xA;&lt;li&gt;接入网 Access Network：从用户到 ISP 边缘路由器之间的网络&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;核心网&#xA;&lt;ul&gt;&#xA;&lt;li&gt;router + packet switch&lt;/li&gt;&#xA;&lt;li&gt;交换技术：电路交换（点对点），分组交换，报文交换&#xA;&lt;ul&gt;&#xA;&lt;li&gt;分组交换优点：高效 灵活 迅速 可靠；逐段占用 独立选择 无需连接 协议可靠&lt;/li&gt;&#xA;&lt;li&gt;缺点：排队延迟 带宽无保证 增加开销&lt;/li&gt;&#xA;&lt;li&gt;报文交换：电报&lt;/li&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;我国发展：铁道部 (1980)，CNPAC (1989)，CHINANET (1994)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最大主干网：CHINANET, UNINET, CMNET, CERNET, CSTNET&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;网络：节点 node + 链路 link&#xA;&lt;ul&gt;&#xA;&lt;li&gt;internet 互连网：网络 + router；internet ≠ Internet&lt;/li&gt;&#xA;&lt;li&gt;计算机通信网：计算机+通道+通信协议&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;计算机网络&#xA;&lt;ul&gt;&#xA;&lt;li&gt;计算机网络主要是由一些通用的、可编程的硬件互连而成的，而这些硬件并非专门用来实现某一特定目的（例如，传送数据或视频信号）。这些可编程的硬件能够用来传送多种不同类型的数据，并能支持广泛的和日益增长的应用。&lt;/li&gt;&#xA;&lt;li&gt;分类：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作用范围：WAN (wide) MAN (metropolitan) LAN (local) PAN (personal)&lt;/li&gt;&#xA;&lt;li&gt;使用者：public/private&lt;/li&gt;&#xA;&lt;li&gt;Access Network 边缘路由器&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;性能参数&#xA;&lt;ul&gt;&#xA;&lt;li&gt;（额定）速率/带宽&lt;/li&gt;&#xA;&lt;li&gt;（实际）吞吐 throughput&lt;/li&gt;&#xA;&lt;li&gt;时延：发送/传输时延 (end)，传播 (link)，处理 (node)，排队 (node)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;提高速率 = 提高发送速率 = 减小发送时延&lt;/li&gt;&#xA;&lt;li&gt;网络实际时延 = 空闲时延 / (1-利用率)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;时延带宽积：链路可容纳的数据量&lt;/li&gt;&#xA;&lt;li&gt;RTT：2传播+remote 处理排队发送&lt;/li&gt;&#xA;&lt;li&gt;有效数据率 = 数据长度 / (发送时间+RTT) = 带宽 * 发送时间/(发送时间+RTT)&lt;/li&gt;&#xA;&lt;li&gt;信道利用率：利用时间比&lt;/li&gt;&#xA;&lt;li&gt;其他：标准化，可靠性，可扩展性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;计算机网络体系结构&#xA;&lt;ul&gt;&#xA;&lt;li&gt;开放系统互连参考模型 Open Systems Interconnection Reference Model (OSI/RM)&lt;/li&gt;&#xA;&lt;li&gt;网络协议：语法 (payload) +语义+同步 （顺序）&lt;/li&gt;&#xA;&lt;li&gt;entity 实体：可收发信息的软硬件&lt;/li&gt;&#xA;&lt;li&gt;分层&#xA;&lt;ul&gt;&#xA;&lt;li&gt;五层/七层 (ISO 7498)：物理，数据链路，网络，传输，应用（会话，表示，应用）&lt;/li&gt;&#xA;&lt;li&gt;TCP/IP：网络接口，IP，TCP/UDP，应用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Protocol Data Unit (PDU): (OSI) 对等层次之间传送的数据单位&lt;/li&gt;&#xA;&lt;li&gt;Service Access Point (SAP): 相邻两层的实体交互点&lt;/li&gt;&#xA;&lt;li&gt;服务数据单元 SDU 层与层之间交换的数据的单位 （与 PDU many2many）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;物理层&#34;&gt;物理层&lt;/h2&gt;&#xA;&lt;p&gt;物理层传输&lt;strong&gt;比特流&lt;/strong&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>系统安全</title>
				<link>https://g0g.top/2025/11/%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8/</link>
				<pubDate>Mon, 24 Nov 2025 21:00:00 +0800</pubDate>
				<guid>https://g0g.top/2025/11/%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8/</guid>
				<description>&lt;h2 id=&#34;系统安全概述&#34;&gt;系统安全概述&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;计算机系统组成&lt;/strong&gt;：硬件，软件（内核，系统软件，应用）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;系统安全&lt;/strong&gt;：在系统&lt;strong&gt;生命周期&lt;/strong&gt;内应用系统安全工程和系统安全管理方法，辨识系统中的&lt;strong&gt;隐患&lt;/strong&gt;，并采取有效的&lt;strong&gt;控制&lt;/strong&gt;措施使其危险性最小，从而使系统在规定的性能、时间和成本范围内达到最佳的&lt;strong&gt;安全&lt;/strong&gt;程度&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;操作系统&lt;/strong&gt;的安全是整个计算机系统安全的&lt;strong&gt;基础&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;系统的重要性&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统无处不在，系统日益广泛&lt;/li&gt;&#xA;&lt;li&gt;2018 年 11 月 30 日，万豪国际集团数据库被黑客入侵&lt;/li&gt;&#xA;&lt;li&gt;2024 年 12 月 17 日，Facebook 涉嫌泄露 2900 万用户个人数据，被爱尔兰数据保护委员会罚款&lt;/li&gt;&#xA;&lt;li&gt;2021 年 Apache Log4j 中发现了一个被称为“Log4Shell”的零日漏洞（CVE-2021-44228）&lt;/li&gt;&#xA;&lt;li&gt;系统安全是数字时代企业生存与发展的&lt;strong&gt;根基&lt;/strong&gt;，是保障核心业务数据与连续性的&lt;strong&gt;生命线&lt;/strong&gt;；一次系统漏洞可能导致毁灭性损失，安全防护是&lt;strong&gt;唯一的底线&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;系统安全问题存在的&lt;strong&gt;原因&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;技术层面：软件漏洞与缺陷 (0day)，系统复杂性，防御机制滞后&lt;/li&gt;&#xA;&lt;li&gt;管理层面：安全策略缺失或执行不力，安全意识不足，第三方与供应链风险&lt;/li&gt;&#xA;&lt;li&gt;人为层面：内部人员威胁，外部攻击者&lt;/li&gt;&#xA;&lt;li&gt;外部环境：法律法规与合规挑战，网络攻击产业化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;系统安全的&lt;strong&gt;错误认识&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;应对安全威胁的主要手段是&lt;strong&gt;密码技术&lt;/strong&gt;，是添置边界防护等&lt;strong&gt;安全设备&lt;/strong&gt; —— 黑客成功实施攻击的途径是发现、挖掘和利用信息系统的&lt;strong&gt;漏洞&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;不值得&lt;/strong&gt;在关注系统安全，降低糟糕的系统开发、集成和部署带来的风险上花费成本&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;概念&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统安全&lt;strong&gt;核心定义&lt;/strong&gt;：系统安全是为保护&lt;strong&gt;系统&lt;/strong&gt;（如信息系统、操作系统、网络系统）免受未经授权的访问、使用、披露、破坏、修改而采取的&lt;strong&gt;措施和流程的集合&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;基本属性&lt;/strong&gt;：CIA&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;机密性&lt;/strong&gt;（Confidentiality）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对谁保：仅被&lt;strong&gt;合法的实体&lt;/strong&gt;（如用户、进程等）访问，而不被泄漏给&lt;strong&gt;未授权实体&lt;/strong&gt;的特性&lt;/li&gt;&#xA;&lt;li&gt;保什么：不但包括&lt;strong&gt;国家秘密&lt;/strong&gt;，而且包括各种社会团体、企业组织的&lt;strong&gt;工作&lt;/strong&gt;秘密及&lt;strong&gt;商业&lt;/strong&gt;秘密，个人的秘密和个人&lt;strong&gt;隐私&lt;/strong&gt;（如浏览习惯、购物习惯等）&lt;/li&gt;&#xA;&lt;li&gt;机密性还包括保护数据的&lt;strong&gt;存在性&lt;/strong&gt;，有时候存在性比数据本身更能暴露信息&lt;/li&gt;&#xA;&lt;li&gt;对计算机的进程、中央处理器、存储、打印设备的使用也必须实施严格的保密措施，以避免产生&lt;strong&gt;电磁泄露&lt;/strong&gt;等安全问题&lt;/li&gt;&#xA;&lt;li&gt;GB/T 16260.1：软件产品保护信息和数据的能力，以使未授权人员或系统不能阅读或修改这些信息和数据，而不拒绝授权人员或系统对它们的访问。&lt;/li&gt;&#xA;&lt;li&gt;GB/T 18492：对系统各项的保护，使其免于受到偶然的或恶意的访问、使用、更改、破坏及泄露。&lt;/li&gt;&#xA;&lt;li&gt;实现机密性的方法一般是通过&lt;strong&gt;物理隔离&lt;/strong&gt;，&lt;strong&gt;信息加密&lt;/strong&gt;，或是&lt;strong&gt;访问控制&lt;/strong&gt;（对信息划分密级并为用户分配访问权限，系统根据用户的身份权限控制对不同密级信息的访问）等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;完整性&lt;/strong&gt;（Integrity）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;信息在&lt;strong&gt;存储、传输或处理&lt;/strong&gt;等过程中不被未授权、未预期或无意地篡改、销毁等&lt;strong&gt;破坏&lt;/strong&gt;的特性&lt;/li&gt;&#xA;&lt;li&gt;系统完整性：系统能够按照&lt;strong&gt;预期的功能&lt;/strong&gt;运行，不受任何有意的或者无意的非法错误所破坏的系统安全属性&lt;/li&gt;&#xA;&lt;li&gt;实现完整性的方法一般分为&lt;strong&gt;预防&lt;/strong&gt;和&lt;strong&gt;检测&lt;/strong&gt;两种机制。预防机制通过阻止任何未经授权的方法来改写数据的企图，如&lt;strong&gt;加密、访问控制&lt;/strong&gt;，以确保数据的完整性；检测机制并不试图阻止完整性的破坏，而是通过分析数据本身或是用户、系统的&lt;strong&gt;行为&lt;/strong&gt;来发现数据的完整性是否遭受破坏，如**数字签名、哈希（Hash）**值计算等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;可用性&lt;/strong&gt;（Availability）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;信息、信息系统资源和系统服务&lt;strong&gt;可被&lt;/strong&gt;合法实体访问并&lt;strong&gt;按要求使用&lt;/strong&gt;的特性&lt;/li&gt;&#xA;&lt;li&gt;ISO13335-1：可用性被定义为保证授权实体在需要时可以正常地访问和使用系统信息的属性&lt;/li&gt;&#xA;&lt;li&gt;为了实现可用性可以采取&lt;strong&gt;备份与灾难恢复、应急响应、系统容侵&lt;/strong&gt;等许多安全措施&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;其他属性&lt;/strong&gt;：可认证性，授权，可审计性，抗抵赖性，可控性，可存活性&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;网络空间安全&lt;/strong&gt;：还关注构成网络空间的基础设施的安全和可信，以及网络对现实社会安全的影响&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;维度&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;系统安全&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;网络空间安全&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;核心焦点&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;单个计算系统的保密性、完整性、可用性&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;整个互联数字领域的保密性、完整性、可用性&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;保护对象&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;独立的操作系统、应用程序、硬件、数据文件&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;网络、网络中的系统、传输和存储中的数据、云环境、物联网生态&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;范围&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;微观、内向（聚焦于系统自身）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;宏观、外向（聚焦于互联互通的整体环境）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;核心威胁&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;本地权限提升、软件漏洞、系统配置错误、恶意软件在本地的执行&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;网络攻击、网络钓鱼、DDoS 攻击、跨站脚本（XSS）、APT 攻击、通过网络入侵&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;主要手段&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;安装防病毒软件、系统加固、打补丁、访问控制、加密本地文件&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;部署防火墙、入侵检测/防御系统(IDS/IPS)、VPN、安全网关、网络监控、态势感知&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;专业角色&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;系统管理员、系统安全工程师&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;网络安全工程师、渗透测试员&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;类比&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;汽车安全：确保一辆车的刹车、引擎、车身结构可靠&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;道路交通安全：确保所有车辆、行人、道路标志、交通规则的整体安全&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;依赖关系&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;是网络空间安全的基础&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;是涵盖系统安全的宏观框架&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;目标&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;保证单个系统的可靠运行和数据安全&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;保障整个数字生态系统的稳定和安全&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;系统安全是基础，网络安全是屏障&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;系统面临的&lt;strong&gt;安全威胁&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;恶意软件攻击、网络攻击与入侵、人为因素与社会工程学、数据安全与内部威胁、系统与软件漏洞、物理安全与供应链威胁&lt;/li&gt;&#xA;&lt;li&gt;恶意软件攻击：勒索软件 (Ransomware)，木马病毒 (Trojan)，蠕虫病毒 (Worm)，间谍软件 (Spyware)&lt;/li&gt;&#xA;&lt;li&gt;网络攻击与入侵：分布式拒绝服务攻击 (DDoS)，中间人攻击 (MitM)，SQL 注入 (SQL Injection)，跨站脚本攻击 (XSS)&lt;/li&gt;&#xA;&lt;li&gt;人为因素：网络钓鱼 (Phishing)，钓鱼 (Pretexting)，内部人员疏忽，权限滥用&lt;/li&gt;&#xA;&lt;li&gt;数据安全与内部威胁：数据泄露，内部恶意人员，云数据配置错误&lt;/li&gt;&#xA;&lt;li&gt;系统与软件漏洞：零日漏洞 (Zero-Day)，未及时打补丁 (Patching)，默认配置与弱口令；信息源：&lt;a href=&#34;https://www.cnvd.org.cn/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;CNVD&lt;/a&gt;，&lt;a href=&#34;https://msrc.microsoft.com/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Microsoft&lt;/a&gt;，暗网（嘉豪兄拜托了）&lt;/li&gt;&#xA;&lt;li&gt;物理安全与供应链威胁：物理安全威胁，供应链攻击，物联网设备威胁&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;系统安全之路&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统安全开发的最佳实践是采用从&lt;strong&gt;系统开发&lt;/strong&gt;之初就不允许漏洞发生的方式，在系统开发的各个环节尽可能消除漏洞，这不仅使得系统及其用户更安全，关键基础设施更具弹性，还将节省软件企业的开发成本。&lt;/li&gt;&#xA;&lt;li&gt;100%安全的系统和软件是&lt;strong&gt;不存在&lt;/strong&gt;的，系统和软件产品存在漏洞是当前信息安全领域而临的最大困境。&lt;/li&gt;&#xA;&lt;li&gt;由于漏洞的产生、利用以及相互作用的机理复杂，因此，如何有效&lt;strong&gt;减少系统漏洞&lt;/strong&gt;数量，提高信息系统整体安全性成为当前亟待解决的挑战性问题。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;系统安全防护&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;将机密性、完整性、可用性、认证性、授权、可审计性作为系统安全的&lt;strong&gt;核心属性&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;系统自身的&lt;strong&gt;实现质量&lt;/strong&gt;，即系统和软件产品包含的漏洞情况也应该是系统安全性的主要内容，因为这些漏洞会直接导致安全性问题，这也是传统的系统安全关注的问题&lt;/li&gt;&#xA;&lt;li&gt;站在不同的&lt;strong&gt;管理者视角&lt;/strong&gt;，抗抵赖性、可信性、可控性、可靠性、软件弹性等也成为系统被关注的其他&lt;strong&gt;安全属性&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;系统安全开发方法&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;抛弃了传统的先构建系统，然后再将安全手段应用于系统的构建模式&lt;/li&gt;&#xA;&lt;li&gt;留了采用风险管理、身份认证、访问控制、数据加密保护、入侵检测等传统安全方法，将安全作为功能需求的必要组成部分，在系统开发的&lt;strong&gt;需求阶段&lt;/strong&gt;就引入安全要素，同时对系统开发全过程的&lt;strong&gt;每一个阶段&lt;/strong&gt;实施&lt;strong&gt;风险管理&lt;/strong&gt;，以期减少每一个开发步骤中可能出现的安全问题，最终提高系统的本质安全性。&lt;/li&gt;&#xA;&lt;li&gt;系统安全&lt;strong&gt;错误原因分析&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;分析系统安全错误发生的原因，将&lt;strong&gt;安全错误的修正&lt;/strong&gt;嵌入到系统开发生命周期的&lt;strong&gt;整个阶段&lt;/strong&gt;。通过对需求分析、设计、实现、测试、发布，以及运维等各阶段相关的系统安全错误的&lt;strong&gt;分析与控制&lt;/strong&gt;，以期大大减少系统的漏洞数量，使系统的安全性得到有效提高。&lt;/li&gt;&#xA;&lt;li&gt;该方法是将安全保障的实施开始于&lt;strong&gt;系统发布之前&lt;/strong&gt;，尤其强调从系统生命周期的早期阶段开始安全考虑，从而减少系统生命周期的后期系统运行过程中安全运维的工作量，提高安全保障效果。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;系统安全工程&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;运用系统工程的思想和方法，&lt;strong&gt;系统地分析&lt;/strong&gt;信息系统存在的安全漏洞、风险、事件、损失、控制方法以及效果之间复杂的对应关系，对信息系统的&lt;strong&gt;安全性进行分析与评价&lt;/strong&gt;，以期建立一个有效的安全防御体系，而不是简单的安全产品堆砌。&lt;/li&gt;&#xA;&lt;li&gt;系统安全工程可以在系统生命周期的&lt;strong&gt;不同阶段&lt;/strong&gt;对安全问题提供&lt;strong&gt;指导&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;信息保障&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统安全的核心目标就是&lt;strong&gt;保障信息安全&lt;/strong&gt;，包括对信息的保护、检测、反应和恢复能力。&lt;/li&gt;&#xA;&lt;li&gt;信息保障与之前的信息保密、网络信息安全等阶段的概念相比，它的&lt;strong&gt;层次更高&lt;/strong&gt;、涉及面更广、解决问题更多、提供的安全保障更全面，它通常是一个&lt;strong&gt;战略级&lt;/strong&gt;的信息防护概念。&lt;/li&gt;&#xA;&lt;li&gt;核心思想是&lt;strong&gt;纵深防护战略&lt;/strong&gt;（Defense-in-Depth），它采用层次化的、多样性的安全措施来保障用户信息及信息系统的安全&lt;/li&gt;&#xA;&lt;li&gt;人、技术和操作是 3 个&lt;strong&gt;核心因素&lt;/strong&gt;，包括了主机、网络、系统边界和支撑性基础设施等多个网络环节之中，如何实现保护（Protection）、检测（Detection）、响应（Reaction）和恢复（Restore）有机结合的动态技术体系，这就是所谓的&lt;strong&gt;PDRR&lt;/strong&gt;（或称 PDR2）模型。&lt;/li&gt;&#xA;&lt;li&gt;信息安全保障&lt;strong&gt;围绕漏洞消除&lt;/strong&gt;展开；要将安全保障措施置于系统发布运行之时&lt;/li&gt;&#xA;&lt;li&gt;降低系统脆弱性的最有效方法就是漏洞分析，因此，&lt;strong&gt;漏洞分析&lt;/strong&gt;是信息安全保障的&lt;strong&gt;基础&lt;/strong&gt;，在信息安全保障中占据核心地位。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;操作系统安全机制&#34;&gt;操作系统安全机制&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;安全威胁的种类&#xA;&lt;ul&gt;&#xA;&lt;li&gt;形成途径：不合理的授权机制，不恰当的代码执行，不恰当的主体控制，不安全的进程间通信，网络协议的安全漏洞，服务的不当配置&lt;/li&gt;&#xA;&lt;li&gt;行为方式：切断，截取，篡改，伪造&lt;/li&gt;&#xA;&lt;li&gt;漏洞分类：获取系统控制权，获取隐私信息，受到拒绝服务攻击&lt;/li&gt;&#xA;&lt;li&gt;表现形式：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;逻辑炸弹：在被感染应用程序的起始处，不能复制自身&lt;/li&gt;&#xA;&lt;li&gt;计算机病毒：能自我复制的一组计算机指令或程序代码&#xA;&lt;ul&gt;&#xA;&lt;li&gt;蠕虫：无须计算机使用者干预即可运行的独立程序&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;特洛伊木马：表面上执行合法功能，实际上却完成用户不曾料到的非法功能，不具备自我复制能力&lt;/li&gt;&#xA;&lt;li&gt;后门：嵌在操作系统里的一段非法代码&lt;/li&gt;&#xA;&lt;li&gt;隐蔽信道：为系统中不受安全策略控制的、违反安全策略的信息泄露路径&#xA;&lt;ul&gt;&#xA;&lt;li&gt;存储隐蔽信道：利用不受安全策略控制的存储单元&lt;/li&gt;&#xA;&lt;li&gt;时间隐蔽信道：利用不受安全策略控制的系统在当前时间段内某方面的状态&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;操作系统的安全需求：CIA+可靠性&lt;/li&gt;&#xA;&lt;li&gt;操作系统的安全机制：访问控制，认证机制，加密机制，最小特权管理，安全审计机制，存储保护、运行保护和 I/O 保护&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;访问控制&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统对用户身份及其所属的预先定义的&lt;strong&gt;策略组限制&lt;/strong&gt;其使用数据资源能力的手段&lt;/li&gt;&#xA;&lt;li&gt;三要素：主体 S（发起者/进程），客体 O（资源），控制策略 A&lt;/li&gt;&#xA;&lt;li&gt;对文件/目录的访问控制&lt;/li&gt;&#xA;&lt;li&gt;自主访问控制 (DAC)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;每个客体有一个&lt;strong&gt;所有者&lt;/strong&gt;，可按照各自意愿将客体访问控制权限&lt;strong&gt;授予&lt;/strong&gt;其他主体&lt;/li&gt;&#xA;&lt;li&gt;强制访问控制 (MAC)：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;将系统中的信息分密级和范畴进行管理，保证每个用户只能访问那些被标明能够由他访问的信息；&lt;/li&gt;&#xA;&lt;li&gt;每个主客体都&lt;strong&gt;自动&lt;/strong&gt;被赋予相应的安全属性；&lt;/li&gt;&#xA;&lt;li&gt;访问时比较进程的安全属性和客体的安全属性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;基于角色的访问控制 (RBAC)：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用户-角色-权限 多对多&lt;/li&gt;&#xA;&lt;li&gt;安全原则：最小权限原则，责任分离原则，数据抽象原则&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;访问控制机制&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;优点&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;缺点&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;自主访问控制（DAC）&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;• 控制是自主的，为用户提供了很大的灵活性&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;• 权限管理比较分散&lt;br&gt;• 安全性差，不能抵御特洛伊木马的攻击&lt;br&gt;• 缺乏高安全等级所需的高安全性&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;强制访问控制（MAC）&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;• 保障了信息的机密性&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;• 忽视了信息的完整性&lt;br&gt;• 对授权管理比较僵硬，缺乏灵活性&lt;br&gt;• 应用领域狭窄，通常只应用于对安全性需求非常高的领域，如军方信息系统&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;基于角色的访问控制（RBAC）&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;• 便于授权管理&lt;br&gt;• 便于角色的划分&lt;br&gt;• 便于赋予最小权限的原则&lt;br&gt;• 便于职责的分离&lt;br&gt;• 便于客体分类&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;• 需要了解组织结构知识&lt;br&gt;• 导致角色爆炸&lt;br&gt;• 没有提供操作顺序的控制机制，这一缺陷使 RBAC 模型很难适应那些对操作顺序有严格要求的系统&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;认证机制&#xA;&lt;ul&gt;&#xA;&lt;li&gt;标识：操作系统能够通过内部识别码或标识符正确识别用户的身份，即用户向系统表明的身份&lt;/li&gt;&#xA;&lt;li&gt;鉴别：对用户所宣称的身份标识的有效性进行校验和测试的过程，用户声明自己身份的几种方法包括&#xA;&lt;ul&gt;&#xA;&lt;li&gt;证实自己所知道的：证实自己所知道的：密码、身份证号、最喜欢的人名字等&lt;/li&gt;&#xA;&lt;li&gt;出示自己所拥有的：智能卡、USBkey 等&lt;/li&gt;&#xA;&lt;li&gt;证明自己是谁：指纹、掌纹、声纹、视网膜、面部特征扫描等&lt;/li&gt;&#xA;&lt;li&gt;表现自己的动作：签名、按键的速度与力量、语速等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;授权：确定给予哪些主体存取哪些客体的权限，并实施这些存取权限&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;加密机制&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数据传输加密技术：链加密，端加密&lt;/li&gt;&#xA;&lt;li&gt;数据存储加密技术：文件级，驱动器级&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;最小特权管理原则&#xA;&lt;ul&gt;&#xA;&lt;li&gt;为使系统能够正常运行，系统中的某些进程需要具有一些可违反系统安全策略的操作能力&lt;/li&gt;&#xA;&lt;li&gt;最小特权原则：必不可少的特权（充分必要性）&lt;/li&gt;&#xA;&lt;li&gt;在系统中定义：系统安全管理员、审计员、操作员、安全操作员、网络管理员&lt;/li&gt;&#xA;&lt;li&gt;任何一个用户都不能获取足够的权利破坏系统的安全策略；不应赋予某人一个以上的职责&lt;/li&gt;&#xA;&lt;li&gt;例：惠普 Presidum/Virtual Vault，红旗安全操作系统 RFSOS，SElinux&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;安全审计机制：对系统中有关安全的活动进行记录、检查及审核&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作用：能详细记录与系统安全有关的行为；能够对违反安全规则的行为或企图提供证据；可以提供信息帮助进行损失评估和系统恢复&lt;/li&gt;&#xA;&lt;li&gt;审计事件：是系统审计用户动作的基本单位，如注册事件、使用系统的事件、利用隐蔽通道的事件&lt;/li&gt;&#xA;&lt;li&gt;实现：日志记录器，分析器，通告器&lt;/li&gt;&#xA;&lt;li&gt;日志：系统日志，应用程序日志，安全日志&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;存储保护、运行保护和 I/O 保护&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;存储器管理和存储保护&lt;/strong&gt;之间的关系：存储保护与存储器管理是紧密相关的，存储保护负责保证系统各个&lt;strong&gt;任务&lt;/strong&gt;之间互不干扰；存储器管理则是为了更有效地&lt;strong&gt;利用&lt;/strong&gt;存储空间&lt;/li&gt;&#xA;&lt;li&gt;基于&lt;strong&gt;内存管理&lt;/strong&gt;的访问控制：由系统软件精确地说明对该进程而言: 系统空间的哪一页是可读的，哪一页是可写的&lt;/li&gt;&#xA;&lt;li&gt;安全操作系统很重要的一点是进行&lt;strong&gt;分层&lt;/strong&gt;设计，而&lt;strong&gt;运行域&lt;/strong&gt;正是这样一种基于保护环的等级式结构&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;I/O 操作&lt;/strong&gt;一般是仅由操作系统完成的一个特权操作；操作系统对 I/O 操作进行封装，提供对应的系统调用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;microsoft-windows-安全&#34;&gt;Microsoft Windows 安全&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Windows NT&#xA;&lt;ul&gt;&#xA;&lt;li&gt;第一个真正意义上的网络操作系统&lt;/li&gt;&#xA;&lt;li&gt;特点：支持多种网络协议，内置 Internet 功能，支持 NTFS 文件系统&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;架构：Windows 系统由内核、系统服务、用户界面等组件构成，提供多任务、多线程处理能力。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用户模式：用户进程，服务进程，系统支持进程，环境子系统服务进程&lt;/li&gt;&#xA;&lt;li&gt;内核模式：执行体（包含操作系统的基础服务），Windows 内核，设备驱动程序；硬件抽象层，窗口和图形系统&lt;/li&gt;&#xA;&lt;li&gt;虚拟机监控程序层&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Windows 系统安全组件 (Also see &lt;a href=&#34;https://learn.microsoft.com/en-us/windows/win32/secauthz/access-control-model&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Access Control Model | Microsoft Learn&lt;/a&gt;)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Windows 系统内置支持用户认证、访问控制、管理、审计、管理等安全功能&lt;/li&gt;&#xA;&lt;li&gt;标识 (SAM)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;安全账户管理器 &lt;strong&gt;SAM&lt;/strong&gt;：负责管理本机定义的用户名和组等信息&lt;/li&gt;&#xA;&lt;li&gt;SAM 数据库：&lt;code&gt;HKEY_LOCAL_MACHINE\SAM&lt;/code&gt; / &lt;code&gt;%systemroot%\system32\config\sam&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;在系统启动后就处于锁定状态，用户无法擅自更改其内容；只由 LSASS 控制&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;鉴别授权/审计 (LSA)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;交互式登录管理器 Winlogon / 登录用户界面 LogonUI&lt;/li&gt;&#xA;&lt;li&gt;凭据提供程序 CP：在 LogonUI 进程中运行的进程内 COM（Component Object Model）对象，用于获取用户的用户名、密码、智能卡 PIN 码、生物验证数据（如指纹、面部识别数据）等&lt;/li&gt;&#xA;&lt;li&gt;身份验证包 AP：检查特定用户名与密码是否匹配，进而对用户进行身份验证&lt;/li&gt;&#xA;&lt;li&gt;本地安全机构子系统服务 &lt;strong&gt;LSASS&lt;/strong&gt;：负责本地系统安全策略，负责用户身份验证。负责将安全审核信息发送给事件&lt;strong&gt;日志&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;LSASS 数据库 &lt;code&gt;HKLM\SECURITY&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;内核安全设备驱动程序 KSecDD；实现了高级本地过程调用接口，其它内核模式安全组件，包括加密文件系统，可以用来在用户模式下与 LSASS 通信&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;访问控制 (SRM)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;安全引用监视器 &lt;strong&gt;SRM&lt;/strong&gt;：定义代表安全上下文的访问令牌数据结构&lt;/li&gt;&#xA;&lt;li&gt;APPLocker：该机制供管理员决定用户和组允许使用哪些可执行文件、DLL 和脚本&lt;/li&gt;&#xA;&lt;li&gt;APPContainer：提供一个限制性的进程执行环境&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Windows 系统安全模型&#xA;&lt;ul&gt;&#xA;&lt;li&gt;访问令牌 Access Token：包含有关已登录用户的信息&#xA;&lt;ul&gt;&#xA;&lt;li&gt;代表此用户执行的每一个进程都将具有此访问令牌的副本&lt;/li&gt;&#xA;&lt;li&gt;包含安全标识符，用于标识用户的帐户以及该用户所属的任何&lt;strong&gt;组帐户&lt;/strong&gt;；包含用户或用户组拥有的&lt;strong&gt;权限列表&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;产生过程：凭据认证，创建当前登录会话，LSA 创建 token；依据 token 创建进程、线程&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;安全描述符 Security Descriptor&#xA;&lt;ul&gt;&#xA;&lt;li&gt;与被访问对象相关联，包含与安全对象关联的安全信息&lt;/li&gt;&#xA;&lt;li&gt;安全对象：是可以具有安全描述符的对象，如文件、管道、进程、注册表等&lt;/li&gt;&#xA;&lt;li&gt;组成：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对象所有者的 SID，属组 SID&lt;/li&gt;&#xA;&lt;li&gt;DACL (Discretionary Access Control List)：描述允许或拒绝特定用户或组的某些访问&lt;strong&gt;权限&lt;/strong&gt;，它包含零个或多个&lt;strong&gt;ACE&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;访问控制项 ACE：SID，访问掩码 (rwx&amp;hellip;)，allow/deny，继承&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;SACL（System Access Control List）：主要是用于&lt;strong&gt;系统审计&lt;/strong&gt;，指定了当特定账户对这个对象执行特定操作时，将其记录到系统日志中&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Windows 系统安全管理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;加强 Windows 用户账户认证：密码策略，账户锁定策略&lt;/li&gt;&#xA;&lt;li&gt;进行 Windows 系统备份&lt;/li&gt;&#xA;&lt;li&gt;使用 Windows BitLocker 进行驱动器加密&lt;/li&gt;&#xA;&lt;li&gt;开启 Windows Defender 防火墙&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;linux-操作系统安全&#34;&gt;Linux 操作系统安全&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Linux 系统概述&#xA;&lt;ul&gt;&#xA;&lt;li&gt;类 Unix 操作系统，GPL 许可证&lt;/li&gt;&#xA;&lt;li&gt;特点：免费，兼容 POSIX 1.0，多用户多任务，良好的界面，丰富的网络功能，可靠的安全，稳定性能，支持多种平台&lt;/li&gt;&#xA;&lt;li&gt;Unix 操作系统：由美国 Bell 实验室开发的一种多任务通用操作系统&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Linux 用户管理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;相关文件：&lt;code&gt;/etc/{passwd,group,shadow}&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;用户类型：超级用户 (uid0) 和普通用户&lt;/li&gt;&#xA;&lt;li&gt;特权：进程控制，设备控制，网络控制，文件系统控制，用户控制&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/etc/passwd&lt;/code&gt;：共 7 个字段&#xA;&lt;ul&gt;&#xA;&lt;li&gt;帐号名称，密码（&lt;code&gt;x&lt;/code&gt; 占位）&lt;/li&gt;&#xA;&lt;li&gt;UID: 0 root, 1-499 sys, 500+ user&lt;/li&gt;&#xA;&lt;li&gt;GID, description, home, shell&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/etc/shadow&lt;/code&gt;: 8+ 字段&#xA;&lt;ul&gt;&#xA;&lt;li&gt;name, passwd, last update, min pwd age, max pwd age, pwd warn period, pwd inactivity period, expire, reserved (&lt;a href=&#34;https://man7.org/linux/man-pages/man5/shadow.5.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;ref&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;password: &lt;code&gt;$id$salt$hashed&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;设置密码复杂度：edit &lt;code&gt;/etc/security/pwquality.conf&lt;/code&gt; or &lt;code&gt;authconfig --passminlen=12 --passminclass=4 --passmaxrepeat=2 --update&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;特权管理：&lt;code&gt;/etc/pam.d/su&lt;/code&gt;，&lt;code&gt;/etc/sudoers&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Linux 系统访问控制&#xA;&lt;ul&gt;&#xA;&lt;li&gt;文件系统挂载：&lt;code&gt;mount [选项] 设备名 挂载点&lt;/code&gt;, &lt;code&gt;umount 设备路径|挂载点&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;procfs 虚拟文件系统 （&lt;code&gt;/proc/{cpuinfo,stat}&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ls&lt;/code&gt; flags：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;类型：d,-,l,b,c,&amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;3x(rwx)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;chown&lt;/code&gt;, &lt;code&gt;chgrp&lt;/code&gt;, &lt;code&gt;chmod&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;open&lt;/code&gt;: DAC 检查 (rwx, cap) - MAC 检查 (selinux, AppArmor)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;移动操作系统安全&#34;&gt;移动操作系统安全&lt;/h2&gt;&#xA;&lt;p&gt;本章三个操作系统：鸿蒙，安卓，Darwin&lt;/p&gt;</description>
			</item>
			<item>
				<title>数据库笔记</title>
				<link>https://g0g.top/2025/11/%E6%95%B0%E6%8D%AE%E5%BA%93/</link>
				<pubDate>Wed, 19 Nov 2025 21:00:00 +0800</pubDate>
				<guid>https://g0g.top/2025/11/%E6%95%B0%E6%8D%AE%E5%BA%93/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;本笔记中 key 翻译为 ”码“，熟悉”键“说法的同志可以自行转译&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;教材：数据库系统概论（第六版） 王珊&lt;/li&gt;&#xA;&lt;li&gt;CMU15445&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;系统概论&#34;&gt;系统概论&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;数据 - 数据库 - 数据库管理系统 - 数据库系统&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;概念：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;实体 Entity&lt;/li&gt;&#xA;&lt;li&gt;属性 Attribute&lt;/li&gt;&#xA;&lt;li&gt;码 Key&lt;/li&gt;&#xA;&lt;li&gt;域 Domain&lt;/li&gt;&#xA;&lt;li&gt;实体类型 Entity Type&lt;/li&gt;&#xA;&lt;li&gt;实体集 Entity Set&lt;/li&gt;&#xA;&lt;li&gt;联系 Relationship&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ER 图&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Entity: 矩形&lt;/li&gt;&#xA;&lt;li&gt;Attribute: 椭圆&lt;/li&gt;&#xA;&lt;li&gt;Join/Relationship: 菱形，标注类型 (1:1, 1:n, m:n)；联系也有属性&lt;/li&gt;&#xA;&lt;li&gt;Edge: 直线（无向！）&lt;/li&gt;&#xA;&lt;li&gt;三关联：仅“两两之间存在联系”且描述用一句话完成&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;数据模型&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;组成&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数据结构：联系的意义；常用于命名数据模型（层次，关系）&lt;/li&gt;&#xA;&lt;li&gt;数据操作：CURD，and more&amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;完整性约束&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;层次模型：树状&#xA;&lt;ul&gt;&#xA;&lt;li&gt;特点：parent 唯一，仅一对多，需要完整路径，约束需要 parent 存在 (on delete cascade)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;网状：层次的扩展&lt;/li&gt;&#xA;&lt;li&gt;关系模型：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Relation, Tuple (Row), Attribute (Column)&lt;/li&gt;&#xA;&lt;li&gt;关系：元组的集合&lt;/li&gt;&#xA;&lt;li&gt;Key, Domain, Component,&lt;/li&gt;&#xA;&lt;li&gt;数据结构&#xA;&lt;ul&gt;&#xA;&lt;li&gt;实体：用关系表示&lt;/li&gt;&#xA;&lt;li&gt;一对一/一对多：隐含在 Attribute&lt;/li&gt;&#xA;&lt;li&gt;多对多：新关系&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;完整性：实体完整，参照完整，属性完整，用户定义的完整性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;数据库系统模式&lt;/p&gt;</description>
			</item>
			<item>
				<title>密码学笔记</title>
				<link>https://g0g.top/2025/11/%E5%AF%86%E7%A0%81/</link>
				<pubDate>Fri, 14 Nov 2025 00:00:00 +0800</pubDate>
				<guid>https://g0g.top/2025/11/%E5%AF%86%E7%A0%81/</guid>
				<description>&lt;h2 id=&#34;misc&#34;&gt;misc&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;密码：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;（密码法）采用特定变换的方法对信息等进行加密保护、安全认证的技术、产品和服务&lt;/li&gt;&#xA;&lt;li&gt;是研究密码技术（Cryptography）和密码分析（Cryptanalysis）的技术科学&lt;/li&gt;&#xA;&lt;li&gt;密码体制是满足条件的五元组 $\mathcal{P,C,K,E,D}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Kerckhoffs原则：密码体制的安全性仅依赖于密钥，其他一切（包括算法本身）都是公开的。&lt;/li&gt;&#xA;&lt;li&gt;香农的保密系统理论&#xA;&lt;ul&gt;&#xA;&lt;li&gt;无条件安全：m 明文，c 密文，有 $I(m;c)=0$, $H(m|c,k)=0$, $H(c|k=k_0)=H(m)$ （第三条仅对于一一映射代换成立）&lt;/li&gt;&#xA;&lt;li&gt;计算安全：各种攻击方法的复杂度均超出了分析者的计算资源可达到的合理边界&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;攻击模型：唯密文攻击，选择明文，已知明文，选择密文&lt;/li&gt;&#xA;&lt;li&gt;法律法规：电子签名法 (2004)，网络安全法 (2016)，密码法 (2019)，数据安全法 (2021)，个人信息保护法 (2021)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;古典密码&#34;&gt;古典密码&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;古典代换&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Caesar cipher: +3&lt;/li&gt;&#xA;&lt;li&gt;Vigenere: 多单字母P&lt;/li&gt;&#xA;&lt;li&gt;密码机&lt;/li&gt;&#xA;&lt;li&gt;中国古代 反切码：诗为密钥，声母-韵母-声调&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;古典置换&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Scytale：棍子&lt;/li&gt;&#xA;&lt;li&gt;平面轨迹&#xA;&lt;ul&gt;&#xA;&lt;li&gt;轨道栅栏 Rail Fence&lt;/li&gt;&#xA;&lt;li&gt;几何图形&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;行变换：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;以密钥（循环）给出的顺序按行读出密文&lt;/li&gt;&#xA;&lt;li&gt;英文密钥：按字母大小顺序&lt;/li&gt;&#xA;&lt;li&gt;密码分析：猜测密钥周期, 再对可能的行列变换进行猜测&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;中国古代：藏头诗&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;序列密码&#34;&gt;序列密码&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;冷战时期受政治影响大，大部分研究保密&lt;/li&gt;&#xA;&lt;li&gt;原理：密钥流 xor 明文&lt;/li&gt;&#xA;&lt;li&gt;结构：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;同步流密码：独立于明文，但不可抗缺码&lt;/li&gt;&#xA;&lt;li&gt;自同步：密钥唯一，$g_n$ 仅依赖于上 n 个 c； $c_{i-k..i-1} \to g_n \to m_i \to c_i$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;LFSR:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$f=\sum^\oplus c_ia_i$ 作为下一个 $a_{n}$，联接多项式为 $1 + \sum_1^n c_{n+1-i}x^i$&lt;/li&gt;&#xA;&lt;li&gt;左 an c1 右 a1 cn；左进右出&lt;/li&gt;&#xA;&lt;li&gt;最长：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;m序列：$n$ 级 LFSR 产生周期为 $2^n-1$ 的序列&lt;/li&gt;&#xA;&lt;li&gt;条件：联接多项式不可约（必要）；$F_2$ 上本原多项式（充要）；$2^n-1$ 素且不可约（充分）&lt;/li&gt;&#xA;&lt;li&gt;随机性：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$0,1$ 分别出现 $2^{n-1}-1, 2^{n-1}$ 次&lt;/li&gt;&#xA;&lt;li&gt;长 $k$ 游程有 $2^{n-2-k}\ (1\le k\le n-2)$ , 长 $n-1$: 0, 长 $n$: 1&lt;/li&gt;&#xA;&lt;li&gt;$C(\tau)=-1$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;对 $n$ 级，$2n$ 明密文对可破解，计算量 $n^3$ （矩阵逆）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Golomb 随机假设：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;周期内 0,1 个数相等&lt;/li&gt;&#xA;&lt;li&gt;长 i 游程（bit 连续相同）占 $2^{-i}$&lt;/li&gt;&#xA;&lt;li&gt;（注意到 $\sum_1^{\infty}k\cdot 2^{-k}=2$ 游程总数应接近周期一半，考虑 0,1 概率相等，应有长 $k$ 的0/1游程个数为 $\frac{T}{2}\cdot 2^{-i}/2 = T\cdot 2^{-i-2}$）&lt;/li&gt;&#xA;&lt;li&gt;$C(\tau)=\sum_i^n (-1)^{a_i+a_{i+\tau}}=常数$ $(\tau \ne 0 \mod n)$ （对于不同 $\tau$ 有 $(a_i,a_{i+\tau})$ 分布相同）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;线性复杂度：能够生成该序列的最短 LFSR 的长度；决定了破译复杂度&lt;/li&gt;&#xA;&lt;li&gt;好密码：周期长，随机性好，线性复杂度大（周期一半）&lt;/li&gt;&#xA;&lt;li&gt;生成器：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;滤波：由 LFSR 单输出非线性滤波&lt;/li&gt;&#xA;&lt;li&gt;组合：多个 LFSR 加非线性组合&lt;/li&gt;&#xA;&lt;li&gt;钟控/停走：LFSR 控钟+LFSR 被控&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;其他生成器：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;勒让德序列：$p$ 为奇素数，$a_i=(\exists x\in \mathbb{N}\ s.t.\ x^2\equiv i \mod p)$&lt;/li&gt;&#xA;&lt;li&gt;椭圆曲线（TODO）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实用流密码：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;钟控+停走 (A5)&lt;/li&gt;&#xA;&lt;li&gt;RC4：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;初始化：(sbox, key) -&amp;gt; sbox 赋值 0-255 + 利用 key 随机打乱 &lt;code&gt;(j+=s[i]+k[i])&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;加密：每 byte 同步打乱 sbox 生成密钥流 &lt;code&gt;j += s[i]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;分组密码&#34;&gt;分组密码&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;设计原理：充分利用简单轮函数和非线性变换进行若干轮迭代&#xA;&lt;ul&gt;&#xA;&lt;li&gt;乘积组合：多种简单运算组合，包括置换、替换，e.g. 异或、线性变换、模乘&lt;/li&gt;&#xA;&lt;li&gt;混淆：密文统计特征与密钥关系复杂化&lt;/li&gt;&#xA;&lt;li&gt;扩散：明文/密钥任何一位都影响密文多位；雪崩/完备特性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Feistel 结构：(↙方向传递)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$L_i, R_i = R_{i-1}, L_{i-1}\oplus f(R_{i-1}, k_i)$&lt;/li&gt;&#xA;&lt;li&gt;$L_{i-1}, R_{i-1} = R_{i}\oplus f(L_i, k_i), L_i$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;DES 64b block, 56b key&#xA;&lt;ul&gt;&#xA;&lt;li&gt;初始置换/逆置换 $P_I$；64-&amp;gt;64；&lt;code&gt;output[i]=input[PI[i]]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;轮函数 （16）：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;扩展 E；32-&amp;gt;48；&lt;code&gt;output[i]=input[E[i]]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;异或 k_i；48-&amp;gt;48&lt;/li&gt;&#xA;&lt;li&gt;S盒；6x8-&amp;gt;4x8；&lt;code&gt;output_k[i]=S_k[input_k[1,6],input_k[2-5]]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;P 盒；32-&amp;gt;32；&lt;code&gt;output[i]=input[P[i]]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;子密钥&#xA;&lt;ul&gt;&#xA;&lt;li&gt;长为 64 但每 7bit 有奇偶校验位 （和为奇）&lt;/li&gt;&#xA;&lt;li&gt;置换 PC-1；64-&amp;gt;56；&lt;code&gt;output[i]=input[PC1[i]]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;每轮前 LS；28x2-&amp;gt;28x2；&lt;code&gt;output_k[i] = rol(input_k[i], LS[k])&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;每轮密钥通过置换 PC-2 产生；56-&amp;gt;48；&lt;code&gt;output[i] = input[PC2[i]]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;弱性质&#xA;&lt;ul&gt;&#xA;&lt;li&gt;互补：$\bar c  = \text{DES}_{\bar k}(\bar m)$&lt;/li&gt;&#xA;&lt;li&gt;弱密钥 DES(DES(m))=m：01, 1F 以及补&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;IDEA 64b block, 128b key&#xA;&lt;ul&gt;&#xA;&lt;li&gt;基本运算：异或 $\oplus$，模 $2^{16}$ 加 $\boxplus$，模 $2^{16}+1$ 乘 $\odot$&lt;/li&gt;&#xA;&lt;li&gt;MA 单元 (32, 16, 16)-&amp;gt;32&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ma&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;a1&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;a2&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;k1&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;k2&lt;/span&gt;): &lt;span style=&#34;color:#177500&#34;&gt;# all uint16, override with mod plus / mul&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;a1&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;k1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#000&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;a2&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;k2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;t&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;t&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;轮函数 （8.5）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;初始运算 &lt;code&gt;output[i]=[mmul,mplus,mplus,mmul][i](input[i], k[i])&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;MA &lt;code&gt;t1, t2 = ma(input[1]^input[3],input[2]^input[4], k5, k6)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;output[1,3] ^= t2, output[2,4] ^= t1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;swap(output[2],output[3])&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;输出变换即轮函数的初始变换&lt;/li&gt;&#xA;&lt;li&gt;密钥生成：一次生成 8 个 (16x8)，不够 rol25 再生成；不与轮同步 8x6+4&lt;/li&gt;&#xA;&lt;li&gt;解密密钥：解密循环 I 的头4个子密钥从加密循环 10－I 的头4个子密钥中导出；解密密钥第1、4个子密钥对应于1、4加密子密钥的乘法逆元；2、3对应2、3的加法逆元 （TODO）&lt;/li&gt;&#xA;&lt;li&gt;注：和 Feistel 一样构造了使用非可逆变换（ma），但有可轮间传递数据的结构（使用异或 ma 结果使 &lt;code&gt;output[1]xor output[3]=input[1] xor input[3]&lt;/code&gt; 抵消了 ma）；密钥生成有些简陋了。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;AES / Rijindael: 128bit block, 128-256bit key (10,12,14 cycles)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;State: 8bit 为字，4 行，4 列, 128bit&lt;/li&gt;&#xA;&lt;li&gt;子密钥生成：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;轮密钥不与轮同步，由密钥扩展随取随用&lt;/li&gt;&#xA;&lt;li&gt;10/12/14 轮&lt;/li&gt;&#xA;&lt;li&gt;&lt;img src=&#34;https://g0g.top/imgs/2025/aes-prf.png&#34; alt=&#34;aes prf&#34;&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;轮函数 列长为 r&#xA;&lt;ul&gt;&#xA;&lt;li&gt;字节替换/S 盒； 4rx8 -&amp;gt; 4rx8&lt;/li&gt;&#xA;&lt;li&gt;行移位；4xrx8 -&amp;gt; 4xrx8；rol i (by byte)&lt;/li&gt;&#xA;&lt;li&gt;列混合；每列视为多项式 $\sum_0^{r-1} a_i x^{r-i-1}$，做 $x^4+1$ 模乘&#xA;&lt;ul&gt;&#xA;&lt;li&gt;可视为系数 ror 的矩阵乘（$GF(2^8)$ 上，模 0x1B；可查表 (02, 03, 0e, 0b, 0d, 09 共 6*256 空间 / embed 算 *2 然后霍纳法则)，可逆；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;轮密钥加&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;工作模式：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ECB：逐块&lt;/li&gt;&#xA;&lt;li&gt;CBC：有 IV，$C_{i+1}=f(M_{i+1}\oplus C_i)$；错误传播本块+后一块对应 bit&lt;/li&gt;&#xA;&lt;li&gt;CFB-n：有 IV，$C_i=M_i\oplus f(IV_{i-1}[:n])$, $IV_i=IV_{i-1}&amp;laquo;n | C_i$；寄存器长度与算法一致；错误传播 L/n 块，错误的那块只改对应 bit&lt;/li&gt;&#xA;&lt;li&gt;OFB-n：同 CFB 但把加密算法输出直接反馈；错误仅影响对应 bit&lt;/li&gt;&#xA;&lt;li&gt;CTR：可并行，$C_i=M_i\oplus f(IV+i)$&lt;/li&gt;&#xA;&lt;li&gt;GCM：CTR + GHASH；先 CTR 完，用 K 派生的 H，预定文本 A，密文 C 计算 GHASH $X_{m+n+1}$ where $X_{i}=(X_{i-1}+ S_i)\cdot H$ （$GF(2^{128})$ 内运算，mod 0x87），$S$ 为 $(A||pad||C||pad||len(A)||len(C))$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;算法分析&#xA;&lt;ul&gt;&#xA;&lt;li&gt;强力攻击（分类：唯密文，已知明文，选择明/密文，自适应选择明/密文）&lt;/li&gt;&#xA;&lt;li&gt;差分攻击：依赖 S 盒的差分熵低（概率分布不平均），寻找概率最高/0路径&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;公钥密码&#34;&gt;公钥密码&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对称缺陷：密钥管理分配麻烦，认证（抗抵赖）&lt;/li&gt;&#xA;&lt;li&gt;分类：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;公钥分发 Public-Key Distribution Schemes&lt;/li&gt;&#xA;&lt;li&gt;公钥加密 Public Key Encryption&lt;/li&gt;&#xA;&lt;li&gt;数字签名 Signature Schemes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;特点：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;加密公开，解密保密&lt;/li&gt;&#xA;&lt;li&gt;公钥+密文 -x&amp;gt; 明文 （=&amp;gt;  公钥 -x&amp;gt;私钥）&lt;/li&gt;&#xA;&lt;li&gt;攻击：强力，选择消息，私钥破解&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;陷门单向函数&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$f$ 容易 $f^{-1}$ 难&lt;/li&gt;&#xA;&lt;li&gt;（最重要！）$F_p$ 上离散对数问题 $y=x^b$&lt;/li&gt;&#xA;&lt;li&gt;（非循环交换群）离散对数问题 $y=x^b$ （认为等价于大素数乘积分解）&lt;/li&gt;&#xA;&lt;li&gt;（非循环交换群）二次剩余问题 $y=x^2$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Diffie-Hellman 密钥交换&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单向性：$F_p^*$ 上离散对数&lt;/li&gt;&#xA;&lt;li&gt;生成元 $g$，生成随机 $x_A, x_B$, 交换 $y_A=g^{x_A}, y_B=g^{x_B}$，则共享密钥为 $y_A^{x_B}=y_B^{x_A}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;El Gamal 公钥密码&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单向性：$F_p^*$ 上离散对数&lt;/li&gt;&#xA;&lt;li&gt;密钥生成：大素数 $p$，$g$ 是 $F_p^*$ 生成元，任意 $x&amp;lt;p-1$ 为私钥，$g, y=g^x\mod p$ 为公钥&lt;/li&gt;&#xA;&lt;li&gt;明文空间 $F_p^*$，密文空间 $F_p^*\times F_p^*$&lt;/li&gt;&#xA;&lt;li&gt;加密：任取 $k$（保密），$c=(g^k, my^k) \mod (p,p)$&lt;/li&gt;&#xA;&lt;li&gt;解密：$m=c_2c_1^{-x}$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;算法：由费马小定理，$c^{-x}=c^{-x \mod p-1}$ / 扩展欧几里得算法&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;签名：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;选 $k\text{ s.t. } GCD(k,p-1)=1$&lt;/li&gt;&#xA;&lt;li&gt;$K=a^k$, $S=k^{-1}(h-xK)\pmod{p-1}$，$(K,S)$ 为 $h$ 签名&lt;/li&gt;&#xA;&lt;li&gt;验签：$y^{K}K^{S}\equiv a^h \pmod{p}$&lt;/li&gt;&#xA;&lt;li&gt;注：$k$ 的选择并非任意，这很重要！因此才有了 DSA 改进&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;DSA 签名算法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;密钥生成：N bit $p$, L bit $q$  使得 $q|p-1$；$g=h^{\frac{p-1}{q}}\pmod{p}$；选择私钥 $x&amp;lt;q$ 计算公钥 $y=g^x\pmod{p}$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;注：ECDSA 没有这么多要求，随便选 g,p,q；主要是 $\mathbb{Z}^*_p$ 的阶是 $p-1$ 为和数，就很难受&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;签名：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;选 $k&amp;lt;q$&lt;/li&gt;&#xA;&lt;li&gt;签名：$K=(g^k\text{ mod }p) \pmod{q}$，$S=k^{-1}(h+xK)\pmod{q}$&lt;/li&gt;&#xA;&lt;li&gt;验签：$K$ 等于 $((y^{K}g^{h})^{S^{-1}}\text{ mod }p) \pmod{q}$ （注：指数上可以 $\text{mod }q$ 优化）&lt;/li&gt;&#xA;&lt;li&gt;注：这里的 K 由于 mod q 了，从 $\langle g\rangle$ 群降维到了 $F_q$，之后不涉及 $\langle g\rangle$ 相关性质。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Rivest-Shamir-Adleman 公钥密码&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单向性：风味离散对数&lt;/li&gt;&#xA;&lt;li&gt;密钥生成：生成大质数x2: $pq=n$，生成随机数 $e\le\phi(n)$ 计算 $d=e^{-1} \mod \phi(n)$；则 $(e,n), (d,p,q)$ 为公钥、私钥&lt;/li&gt;&#xA;&lt;li&gt;加解密：$c=m^e, m=c^d \mod n$&lt;/li&gt;&#xA;&lt;li&gt;签名：$S=h^d, S&amp;rsquo;=S^e$&lt;/li&gt;&#xA;&lt;li&gt;工程上：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;私钥文件会存储所有参数&lt;/li&gt;&#xA;&lt;li&gt;$e=65535$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;中国剩余定理优化解密&#xA;&lt;ul&gt;&#xA;&lt;li&gt;原解密计算复杂度：$\log{d}$ 次乘法，每次乘法 $\log^2 n$ FLOP （忽略加法）；共 $\log d\log^2n$ FLOP&lt;/li&gt;&#xA;&lt;li&gt;由费马小定理 $c^{p-1}=1 (\text{mod}\ p)$，$c^d=c^{d\mod (p-1)} \mod p=m_p$；由此可在 $\log p \times \log^2 p$ FLOP 计算 $m_p$；$m_q$ 同理；共 $2\log^3p$ FLOP&lt;/li&gt;&#xA;&lt;li&gt;此时 $m=m_p\mod p = m_q \mod q$；由中国剩余定理，令 $t_p=(q^{-1}\mod p)$, $t_q=(p^{-1}\mod q)$（都可以提前计算），有 $m=m_pq^{-1}_p q + m_q p^{-1}_q p \mod n$；计算量可忽略&lt;/li&gt;&#xA;&lt;li&gt;可见考虑 $d\sim n\sim p^2$ 的情况下，能快 4 倍左右；代价是要知道完整的 $p,q,p^{-1}_q, q^{-1}_p$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;攻击：共模攻击，弱指数攻击&lt;/li&gt;&#xA;&lt;li&gt;EC 可用性：$pq$ 阶 $\langle G\rangle$ 不够安全且难以找到符合条件参数&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;SM2&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单向性：离散对数&lt;/li&gt;&#xA;&lt;li&gt;密钥生成：大素数 $p$，$g$ 是生成元，任意 $k&amp;lt;p-1$ 为私钥，$q=kg$ 为公钥 （同 ElGamal）&lt;/li&gt;&#xA;&lt;li&gt;加解密：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DH：加密者任意生成 $r$，则 $rq$ 为共享密钥 $S$，且只需传输 $rg$&lt;/li&gt;&#xA;&lt;li&gt;KDF：通过 $S$、消息长度派生出密钥&lt;/li&gt;&#xA;&lt;li&gt;Hash：SM3  $(S_x||M||S_y)$ 得哈希，拼接在最后&lt;/li&gt;&#xA;&lt;li&gt;加密：M 通过 xor 派生密钥加密&lt;/li&gt;&#xA;&lt;li&gt;解密：xor 得 M 后 验签&lt;/li&gt;&#xA;&lt;li&gt;密文数据：$(rg || C || Hash)$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;注：SM2 启示我们，只要有好的密钥交换算法、密钥派生和对称加密就可以实现公钥加密： 可以把预生成 a,A 中 A 公开，这样对方只要随机生成 b B, 用 KDF(A,b) 加密，把 B 绑到密文中，A 可以用 KDF(a,B) 解密。但签名就不行了，因为是单向的。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Rabin&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单向性：二次剩余问题&lt;/li&gt;&#xA;&lt;li&gt;密钥生成：$p\equiv q \equiv 3\mod 4$，$n=pq$ 为公钥，$p,q$ 为私钥&lt;/li&gt;&#xA;&lt;li&gt;加解密：$c = m^2 \mod n$, $m=$ $\pm(c^{\frac{p+1}{4}} \mod p)q q^{-1}_{p}$ $\pm (c^{\frac{q+1}{4}} \mod q) p p^{-1}_{q} \mod n$；&#xA;&lt;ul&gt;&#xA;&lt;li&gt;注：有四种可能明文，需要可识别&lt;/li&gt;&#xA;&lt;li&gt;又是中国剩余定理&lt;/li&gt;&#xA;&lt;li&gt;是 $e=2$, 不满足 $\exists d, de\equiv 1 \mod \phi(n)$ 的 RSA。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;选择密文攻击不安全&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Elliptic Curve (over Finite Fields) (&lt;a href=&#34;https://www.ruanx.net/elliptic-curve/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;ref&lt;/a&gt;)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是一系列 $F_p\times F_p$ 子集上的质阶交换群（因此适用离散对数问题对应算法）&lt;/li&gt;&#xA;&lt;li&gt;通常选用曲线 $y^2=x^3+ax+b, 4a^3+27b^2\ne 0\mod p$；参数包括 $p, a, b, G$；以及导出参数 $n=|\langle G\rangle|, h=\frac{\# E(F_p)}{n}$&lt;/li&gt;&#xA;&lt;li&gt;质数阶循环群二次剩余问题有 $O(\log^2 p)$ 快速算法，可以由 $x$ 推算出 $y$。&lt;/li&gt;&#xA;&lt;li&gt;任意选择参数和基点 $G$，使满足：$\#E(F_p)$ 是一个素数或近乎素数，$|G|$ 是大素数（最好等于 $\# E(F_p)$，最好 $h=1$；由此构成的 $\langle G\rangle$ 作为群集合；当 $h=1$ 时有 $\# E(F_p)=\langle G\rangle \cong Z_{n}$。&lt;/li&gt;&#xA;&lt;li&gt;法则 （全部 $\text{mod}\ p$）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单位元/无穷远点 $\mathcal{O}$&lt;/li&gt;&#xA;&lt;li&gt;逆元 $-P = (x_1, -y_1)$&lt;/li&gt;&#xA;&lt;li&gt;加法 $\lambda = \begin{cases}\frac{y_2 - y_1}{x_2 - x_1} &amp;amp; \text{if } P \neq Q \\ \frac{3x_1^2 + a}{2y_1} &amp;amp; \text{if } P = Q\end{cases}$，$\begin{pmatrix} x_3 \\ y_3 \end{pmatrix} = \begin{pmatrix} \lambda^2 - x_1 - x_2 \\ \lambda(x_1 - x_3) - y_1 \end{pmatrix}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Elliptic Curve Cryptography：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;EC+El Gamal：课上讲了，但工程上没人用&lt;/li&gt;&#xA;&lt;li&gt;签名 ECDSA；密钥交换 ECDH(E)&amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;ECMQV （TODO）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;其他：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$GF(2^n)$ 上的，NTRU&amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;McEliece 公钥密码：线性译码问题（TODO）&lt;/li&gt;&#xA;&lt;li&gt;背包问题 （TODO）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;攻击：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;共模攻击&lt;/li&gt;&#xA;&lt;li&gt;&amp;hellip;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;认证和哈希&#34;&gt;认证和哈希&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;目的：身份确认，防篡改重放延迟（完整性）&lt;/li&gt;&#xA;&lt;li&gt;安全要求&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单向性/抗原像：无法计算 $y$，$H(y)=h$&lt;/li&gt;&#xA;&lt;li&gt;弱抗碰撞性/第二抗原像：无法计算找到 $y$， $H(y) =H(x)$&lt;/li&gt;&#xA;&lt;li&gt;强抗碰撞：无法计算找到任何 $x,y$，$H(x)=H(y)$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;认证方法：加密/MAC/哈希&#xA;&lt;ul&gt;&#xA;&lt;li&gt;MAC 需要 sk 可以认证消息合法；hash 搭配非对称加密可以提供不可否认性（签名）&lt;/li&gt;&#xA;&lt;li&gt;MAC：基于哈希，基于分组密码，加密认证模式&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HMAC：$Hash((K\oplus opad)$ || $Hash(K\oplus ipad)||M)$&lt;/li&gt;&#xA;&lt;li&gt;DES Based: CBC 模式最后输出&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;两种结构&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Merkle–Damgård construction: $CV_{i}=f(M_i, CV_{i-1})$&lt;/li&gt;&#xA;&lt;li&gt;海绵结构：位宽(b)大于比特率(r)，$CV_i=f(CV_{i-1}\oplus M_i)$ 吸收，挤压 $CV_i=f(CV_{i-1})$ 每次 r bit 直到预定长度；安全性等于容量 c/2 (c+r=b)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;MD5：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;512bit 分组，128bit state；4 轮 x 16 步&lt;/li&gt;&#xA;&lt;li&gt;结构：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;pad and length: 填充一个 1 和若干 0 到 -64 mod 512 再填 64bit LE 长度&lt;/li&gt;&#xA;&lt;li&gt;$IV$ 用LE常数&lt;/li&gt;&#xA;&lt;li&gt;$F$ 为 &lt;code&gt;HMD5(M,CV)+CV&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;HMD5 (see rfc1321)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;M(k,i)=M[[k, 1+5k,5+3k, 7k][i]&amp;amp;0xf]&lt;/code&gt; （考虑 M 为 32 bitx16，注意这里 i, k 从 0开始，不同于书）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;T(k,i)=2^32 abs(sin(16i+k+1))&lt;/code&gt; （打表64）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;g_i=[xy|!xz, xz|y!z, x^y^z, y^(x|!z)][i]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;for i in 0..4, for k in 0..16:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;A = (A + gi(B,C,D)+M(k,i)+T(k,i)) &amp;lt;&amp;lt; s(k,i) + B&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;A,B,C,D = D,A,B,C&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;SHA1：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;512bit 分组，160bit state；4 轮 x 20 步&lt;/li&gt;&#xA;&lt;li&gt;结构：同 MD5&lt;/li&gt;&#xA;&lt;li&gt;HSHA：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;M(k,i)=M[[k, 1+5k,5+3k, 7k][i]&amp;amp;0xf]&lt;/code&gt; （考虑 M 为 32 bitx16，注意这里 i, k 从 0开始，不同于书）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;M(j)= j&amp;lt;16 ? M[j] : rol(M(j-16)^M(j-14)^M(j-8)^M(j-3), 1)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;g_i=[xy|!xz, x^y^z, xy|yz|xz, x^y^z][i]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;for i in 0..4, for k in 0..20:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;E = E + g_i(B,C,D)+rol(A,5)+M(20*i+16)+T(i)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;A,B,C,D,E = E, A, rol(B, 30), C, D&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;SHA2 / SM3：都是 MD5 改版（TODO）&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;algorithm  SHA-1  SHA2-256  SHA2-384  SHA2-512 SM3&#xA;digest     160    256       384       512      256&#xA;maxm(2^?)  64     64        128       128      64&#xA;block      512    512       1024      1024     512&#xA;word       32     32        64        64       32&#xA;steps      80     64        80        80       64&#xA;security   80     128       192       256      128&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;SHA3：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;结构：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;填充 &lt;code&gt;10*1&lt;/code&gt; （正则表达式）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;f&lt;/code&gt; 是S盒&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实例 (b=1600)&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;name  S224  S256  S384  S512  SHAKE128  SHAKE256&#xA;d     224   256   384   512   /         /&#xA;r     1152  1052  832   576   1344      1088&#xA;c     448   512   768   1024  256       512&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;li&gt;Keccak-f[1600]&#xA;&lt;ul&gt;&#xA;&lt;li&gt;24轮迭代，每轮 5 步 ι ◦ χ ◦ π ◦ ρ ◦ θ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;后量子密码&#34;&gt;后量子密码&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;量子算法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Shor 算法离散在多项式时间对数问题/大质因数分解问题：现有公钥算法不能用了&lt;/li&gt;&#xA;&lt;li&gt;Grover 算法能把所有 $O(2^n)$ 遍历比较问题加速到 $O(2^{n/2})$：对称加密/哈希算法长度加倍&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;后量子密码&#xA;&lt;ul&gt;&#xA;&lt;li&gt;可以抵御已知量子计算攻击的公钥密码&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;格 (lattice) 密码&#xA;&lt;ul&gt;&#xA;&lt;li&gt;可以密钥交换、签名、加密&lt;/li&gt;&#xA;&lt;li&gt;运算空间：$n$ 维线性空间&lt;/li&gt;&#xA;&lt;li&gt;难题：SVP 最短向量问题，给定基，找出格中的最短非零向量；变体：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ASVP 近似最短向量问题&lt;/li&gt;&#xA;&lt;li&gt;SIVP 最短线性无关向量问题&lt;/li&gt;&#xA;&lt;li&gt;uSVP 唯一最短向量问题&lt;/li&gt;&#xA;&lt;li&gt;CVP 最近向量问题&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实用算法：NTRU （TODO）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;基于编解码的密码（TODO）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GPT 公钥加密：基于线性最大秩距离码&lt;/li&gt;&#xA;&lt;li&gt;McElice 公钥密码：基于 Goppa 纠错码&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;基于二次多变量多项式&#xA;&lt;ul&gt;&#xA;&lt;li&gt;公开 $L_2\circ F \circ L_1$ 用于加密，私钥是可逆的 $L_1,L_2$ 和$F$ （TODO）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;基于哈希和对称性：（TODO）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;可以签名&lt;/li&gt;&#xA;&lt;li&gt;通过哈系树构造；安全性基于抗碰撞性&lt;/li&gt;&#xA;&lt;li&gt;Merkle 哈希树&amp;hellip;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;基于安全多方计算：可以签名（TODO）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;考点&#34;&gt;考点&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;题型：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;填空题：非常简单，送分题！&lt;/li&gt;&#xA;&lt;li&gt;选择题：也非常简单！两分钟做完！&lt;/li&gt;&#xA;&lt;li&gt;问答题/简答题&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;古典密码：代换置换&lt;/li&gt;&#xA;&lt;li&gt;对称密码&#xA;&lt;ul&gt;&#xA;&lt;li&gt;现代分组：雪崩/混淆 (S)，完备/扩散 (P)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;乘积密码：SPN&lt;/li&gt;&#xA;&lt;li&gt;Feistel 结构&lt;/li&gt;&#xA;&lt;li&gt;参数选择，安全效率兼顾——密钥长度，分组长度，迭代轮数，密钥编排，F 复杂度&lt;/li&gt;&#xA;&lt;li&gt;IDEA, DES, 重点：AES 参数 (10-12-14)&lt;/li&gt;&#xA;&lt;li&gt;加密模式 EBC CBC OFB CFB CTR; 错误传播，仅加密/也要解密&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;序列：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;安全性好的密钥流：周期，伪随机性（Golomb：01 等量，游程指数下降，自相关函数恒定），线性复杂度高&lt;/li&gt;&#xA;&lt;li&gt;LFSR 原理，周期 ($2^n-1$)；提高线性复杂度（滤波，钟控/走停）&lt;/li&gt;&#xA;&lt;li&gt;知道有 RC4&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;公钥&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数学困难问题：大整数分解，二次剩余，离散对数，椭圆曲线&lt;/li&gt;&#xA;&lt;li&gt;算法：RSA Rabin ElGamal ECDH；安全性（什么时候不安全）、正确性分析&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RSA: 安全性基于计算 ø(N) 的困难性&#xA;&lt;ul&gt;&#xA;&lt;li&gt;共模攻击：同消息、不同 e、同模计算的密文可 (Euclidean) 解出明文 （用 $re_1+se_2=1\pmod{n}$ 绕开 $d$）&lt;/li&gt;&#xA;&lt;li&gt;低加密指数广播攻击：同消息，同小 e，e 个不同互素 n，可由三密文+CRT+开 e 次方解明文&lt;/li&gt;&#xA;&lt;li&gt;低加密指数暴力攻击：算 $\sqrt[e]{c+kN}$ 直到为整&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Rabin: 安全性基于（非素模）二次剩余问题 / n 因数分解；&#xA;&lt;ul&gt;&#xA;&lt;li&gt;选择密文攻击 1/2 概率直接解私钥&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;El Gamal: 安全性基于离散对数&lt;/li&gt;&#xA;&lt;li&gt;DSA: 共享 k 两条消息直接解私钥&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;ECDH 的主动攻击（mimt）&lt;/li&gt;&#xA;&lt;li&gt;RSA 的中国剩余定理优化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;哈希函数&#xA;&lt;ul&gt;&#xA;&lt;li&gt;认证的需求、目的：身份确认，防篡改重放延迟&lt;/li&gt;&#xA;&lt;li&gt;设计 不同场景 要怎么设计实现；场景设计&lt;/li&gt;&#xA;&lt;li&gt;安全要求：抗 原像，强弱碰撞&lt;/li&gt;&#xA;&lt;li&gt;两大类：MD（要掌握），海绵&lt;/li&gt;&#xA;&lt;li&gt;算法 分组长度、输出长度、迭代轮数&lt;/li&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>信号与系统系统速成</title>
				<link>https://g0g.top/note/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/</link>
				<pubDate>Sat, 14 Jun 2025 22:00:59 +0800</pubDate>
				<guid>https://g0g.top/note/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/</guid>
				<description>&lt;h2 id=&#34;奇怪事项&#34;&gt;奇怪事项&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对周期信号不要强行傅里叶变换，要利用一般周期信号性质&lt;/li&gt;&#xA;&lt;li&gt;积分时注意处理奇点（最好通过性质绕开）；1 的傅里叶变换是 $2\pi\delta(\omega)$&lt;/li&gt;&#xA;&lt;li&gt;对偶 $\frac 1 {2\pi}$&lt;/li&gt;&#xA;&lt;li&gt;区分全三角函数和因果三角函数&lt;/li&gt;&#xA;&lt;li&gt;“稳态”关键词&lt;/li&gt;&#xA;&lt;li&gt;不重要&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$\delta$ 积分注意限&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;信号与系统-基础&#34;&gt;信号与系统 基础&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;信号：传递信息的 函数 有输入 $x(t)$ 输出 $y(t)$&lt;/li&gt;&#xA;&lt;li&gt;系统：实现规定功能而构成的相互关联的集合体&lt;/li&gt;&#xA;&lt;li&gt;求解系统&#xA;&lt;ul&gt;&#xA;&lt;li&gt;时域：卷积 / 微分方程 | 卷积和 / 差分方程&lt;/li&gt;&#xA;&lt;li&gt;变换域：傅里叶/拉普拉斯 | 离散傅里叶/Z变换&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;信号分类：确定性，周期，功率/能量有限，连续/离散时间&lt;/li&gt;&#xA;&lt;li&gt;系统分类：记忆，因果，稳定（求和），时不变（尺度变换，分段），（增量）线性&#xA;&lt;ul&gt;&#xA;&lt;li&gt;时不变：$y(t)=f(x(g(t)))$ 有 $f(x(g(t-t_0)))=f(x(g(t)-t_0))$；充分条件：$g(t-t_0)=g(t)-t_0$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;脉冲/模拟/数字/离散&lt;/li&gt;&#xA;&lt;li&gt;信号&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$Sa(t)=\frac{\sin t}{t}$, $\text{sinc}(t)=\frac{\sin \pi t}{\pi t}$, 积分 $\frac\pi\omega$&lt;/li&gt;&#xA;&lt;li&gt;$u(t)$, $\delta(at)=\frac{1}{|a|}\delta(t)$&lt;/li&gt;&#xA;&lt;li&gt;离散三角：$\omega=\frac{2\pi}{n}$；$n$ 有理则周期&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;处理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;变换：平移，尺度&lt;/li&gt;&#xA;&lt;li&gt;插补&lt;/li&gt;&#xA;&lt;li&gt;分解：直/交流，奇偶，脉冲，正交函数&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;系统描述&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统图：加法器，乘法器，数乘，积分，微分，延时&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;LTI 中 零输入=齐次解，零状态=特解&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;线性时不变系统&#34;&gt;线性时不变系统&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;离散：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;信号：冲激分解&lt;/li&gt;&#xA;&lt;li&gt;系统：冲激响应；卷积和&lt;/li&gt;&#xA;&lt;li&gt;卷积和运算：图解法（反折，重叠） / 解析法 （都可以分类讨论）&lt;/li&gt;&#xA;&lt;li&gt;单位冲激响应 $h[t]$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;卷积&#xA;&lt;ul&gt;&#xA;&lt;li&gt;卷积分段点：两个函数零点的和&lt;/li&gt;&#xA;&lt;li&gt;单边函数积分限&lt;/li&gt;&#xA;&lt;li&gt;宽度是原波形和&lt;/li&gt;&#xA;&lt;li&gt;线性&lt;/li&gt;&#xA;&lt;li&gt;时移/微积分：对任何一个 = 对卷积 （带 $u(t-t_0)$ 可巧算！）&lt;/li&gt;&#xA;&lt;li&gt;尺度 $f_1(at)\star f_2(at) = \frac1{|a|} f(at)$&lt;/li&gt;&#xA;&lt;li&gt;$f \ast \delta = f$, $f \ast \delta&amp;rsquo; = f&amp;rsquo;$；大多数卷积用拉氏变换就好&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;差分方程/微分方程&#xA;&lt;ul&gt;&#xA;&lt;li&gt;零输入/零状态响应：起始条件 $0^-$；初始条件 $0^+$&lt;/li&gt;&#xA;&lt;li&gt;自由/强迫响应&lt;/li&gt;&#xA;&lt;li&gt;$\sum_0^n C_i \frac{\text{d}^{i}r(t)}{\text{d}t^{i}}=\sum_0^m C_i \frac{\text{d}^{i}\delta(t)}{\text{d}t^{i}}$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$n&amp;gt;m$: $h(t)=(\sum_0^n A_ie^{\lambda_i t})u(t)$&lt;/li&gt;&#xA;&lt;li&gt;$n\le m$: $h(t)=(\sum_0^n A_ie^{\lambda_i t})u(t)+\sum_1^{m-n}B_i \delta^{(i)}(t)$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;差分方程&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$j^n+(-j)^n \sim cos(\frac{n\pi}{2})$&lt;/li&gt;&#xA;&lt;li&gt;齐次解：$y_\lambda = (\sum_0^{m-1}C_in^i) \lambda^n$，$\lambda$ 为 $m$ 重根&lt;/li&gt;&#xA;&lt;li&gt;特解：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$n^k \sim n^m\sum_0^k D_in^i$，有 $m$ 重 $1$ 特征根&lt;/li&gt;&#xA;&lt;li&gt;$a^n \sim(\sum_0^m D_in^i)a^n$，$a$ 为 $m$ 重特征根&lt;/li&gt;&#xA;&lt;li&gt;$\sin(\beta n) \sim D_1\sin(\beta n)+D_2\cos(\beta n)$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;傅里叶分析&#34;&gt;傅里叶分析&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;傅里叶 (Fourier) 级数&#xA;&lt;ul&gt;&#xA;&lt;li&gt;正交：无限积分为 $0$&lt;/li&gt;&#xA;&lt;li&gt;正余弦形式 ($n&amp;gt;0$)：$a_n=\frac 2{T}\int_0^T x(t)\cos(n\omega_0 t)\text{d}t, b_n=\frac 2{T}\int_0^T x(t)\sin(n\omega_0 t)\text{d}t$&lt;/li&gt;&#xA;&lt;li&gt;指数形式 ($n\in\mathbb{Z}$)：$\dot a_n = \frac1T \int_0^T x(t)e^{-jn\omega_0t}\text{d}t$&lt;/li&gt;&#xA;&lt;li&gt;转换：$a_n=2Re(\dot a_n), b_n=-2Im(\dot a_n)$ （实信号）&lt;/li&gt;&#xA;&lt;li&gt;含义&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$|\dot a_n|^2$: n 次谐波的功率（负的也要考虑，通常双倍）&lt;/li&gt;&#xA;&lt;li&gt;$\bar P = \frac1T\int |x(t)|^2\text{d}t$: 平均功率&lt;/li&gt;&#xA;&lt;li&gt;$\sqrt{\bar P}$: 信号有效值&lt;/li&gt;&#xA;&lt;li&gt;Parseval&amp;rsquo;s Relation: $\bar P = \sum_{-\infty}^{\infty} |a_k|^2$ （证明：只展开一个傅里叶系数；后同理）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;tips&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$\sum_{-\infty}^{\infty}\delta(t-kT)$: $a_n=\frac1T$&lt;/li&gt;&#xA;&lt;li&gt;$\sum_{-\infty}^{\infty}u(t-kT-\frac\tau2)-u(t-kT+\frac\tau2)$: $a_n=\frac{\tau}{T} Sa(n\omega_1 \frac\tau2)$&lt;/li&gt;&#xA;&lt;li&gt;单段函数：直接积分&lt;/li&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;收敛：平方可积/绝对可积且有限区间有有限间断点（Dirichlet 条件）&lt;/li&gt;&#xA;&lt;li&gt;性质&#xA;&lt;ul&gt;&#xA;&lt;li&gt;线性&lt;/li&gt;&#xA;&lt;li&gt;$x(t-t_0)\sim e^{-jk\omega_0t_0}a_k$&lt;/li&gt;&#xA;&lt;li&gt;$x(-t)\sim a_{-k}=a_k^\ast$&lt;/li&gt;&#xA;&lt;li&gt;$e^{jM\omega_0 t}x(t) \sim a_{k-M}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;From 拉普拉斯变换/傅里叶变换：$a_k=\frac 1T F(jk\omega_0)=\frac 1T F(jk\frac{2\pi}{T})$&lt;/li&gt;&#xA;&lt;li&gt;$\sum n^{-2} = \frac{\pi^2}{6}$, $\sum(2n-1)^{-2} = \frac{\pi^2}{8}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;傅里叶变换&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Intro: 考虑幅频密度 $\frac{F(n\omega_1)}{\Delta f}$，考虑 $T\to\infty, n\omega_1\to\omega$ 得到变换&lt;/li&gt;&#xA;&lt;li&gt;正变换：$F(\omega)=\int_{-\infty}^{\infty}f(t)e^{-j\omega t }\text{d}t$&lt;/li&gt;&#xA;&lt;li&gt;逆变换：$f(t)=\frac{1}{2\pi}\int_{-\infty}^{\infty}F(\omega)e^{j\omega t }\text{d}\omega$&lt;/li&gt;&#xA;&lt;li&gt;例&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$u(t-\frac\tau2)-u(t+\frac\tau2)$：$\tau \operatorname{Sa}(\frac{\omega\tau}{2})$&lt;/li&gt;&#xA;&lt;li&gt;$\operatorname{Sa}(\omega_0 t)$: $\frac{\pi}{\omega} (u(\omega-\omega_0)-u(\omega+\omega_0))$&lt;/li&gt;&#xA;&lt;li&gt;单边指数 $e^{-\alpha t}u(t)$：$\frac1{\alpha+j\omega}$; $e^{\alpha t}u(-t)$: $\frac{1}{\alpha-j\omega}$ （考虑共轭性）&lt;/li&gt;&#xA;&lt;li&gt;双边指数 $e^{-\alpha|t|}$: $\frac{2\alpha}{\alpha^2+\omega^2}$&lt;/li&gt;&#xA;&lt;li&gt;$\delta(t)$: $1$; $\frac{1}{2\pi}$: $\delta(\omega)$&lt;/li&gt;&#xA;&lt;li&gt;$\operatorname{sgn}(t)$: $\frac{2}{j\omega}$&lt;/li&gt;&#xA;&lt;li&gt;$u(t)$: $\pi\delta(\omega)+\frac1{j\omega}$&lt;/li&gt;&#xA;&lt;li&gt;$1-|t|$: $\operatorname{Sa}(\frac\omega2)^2$&lt;/li&gt;&#xA;&lt;li&gt;tip: $\int\operatorname{Sa}(\omega)\text{d}\omega$ 方波&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;周期信号&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$\cos \omega_0 t \sim \pi(\delta(\omega-\omega_0)+\delta(\omega+\omega_0))$&lt;/li&gt;&#xA;&lt;li&gt;$\sin \omega_0 t \sim \frac\pi j(\delta(\omega-\omega_0)-\delta(\omega+\omega_0))$&lt;/li&gt;&#xA;&lt;li&gt;冲激采样信号：$F[f_p(t)] = \sum_\infty \frac{\pi}{T_s}\delta(\omega-n\omega_s)$&lt;/li&gt;&#xA;&lt;li&gt;一般周期信号 $\sum a_k e^{jk\omega_0 t} \sim 2\pi\sum a_k\delta(\omega-k\omega_0)$&lt;/li&gt;&#xA;&lt;li&gt;($\sum_{k=-\infty}^{\infty}e^{-j\omega k T} = \frac{2\pi}{T}\sum_{n=-\infty}^{\infty}\delta(\omega-n\frac{2\pi}{T})$)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;性质：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;线性&lt;/li&gt;&#xA;&lt;li&gt;$x(t-t_0)\sim e^{-j\omega t_0}X(\omega), e^{j\omega_0 t}x(t)\sim X(\omega-\omega_0)$&lt;/li&gt;&#xA;&lt;li&gt;$x^\ast(t)\sim X^\ast(-\omega)$&lt;/li&gt;&#xA;&lt;li&gt;$x&amp;rsquo;(t) \sim j\omega X(\omega), \int x(t)\text{d}t \sim \frac{X(\omega)}{j\omega}+\pi X(0)\delta(\omega), (-jt)x(t)\sim X&amp;rsquo;(\omega)$&lt;/li&gt;&#xA;&lt;li&gt;$x(at)\sim \frac1{|a|}X(\frac{\omega}{a})$&lt;/li&gt;&#xA;&lt;li&gt;对偶 $x(t)\sim X(\omega)$ 则 $X(t)\sim 2\pi x(-\omega)$&lt;/li&gt;&#xA;&lt;li&gt;卷积 $x_1\ast x_2 \sim X_1X_2, x_1x_2 \sim \frac{1}{2\pi} X_1\ast X_2$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Parseval&amp;rsquo;s Theorem $\int_\infty |x(t)|^2\text{d}t = \frac1{2\pi} \int_\infty|X(j\omega)|^2\text{d}\omega$&lt;/li&gt;&#xA;&lt;li&gt;采样&#xA;&lt;ul&gt;&#xA;&lt;li&gt;抽样原理：编码变换-ADC-（信道）-滤波器-DAC-解码变换&lt;/li&gt;&#xA;&lt;li&gt;(Nyquist) 采样定理：$\omega_s \ge 2\omega_m$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;频率域分析&#xA;&lt;ul&gt;&#xA;&lt;li&gt;适用：零状态，稳态&lt;/li&gt;&#xA;&lt;li&gt;常微分方程：$H(\omega)=\frac{Simulate(\omega)}{Response(\omega)}$ （系数）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对三角函数：关注幅频、相频，直接叠加&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;无失真条件：$|H(\omega)| = K, \varphi(\omega)=-\omega t_0$ ($K$: 增益；$t_0$: 群延时)&lt;/li&gt;&#xA;&lt;li&gt;滤波：频率特性&#xA;&lt;ul&gt;&#xA;&lt;li&gt;理想低通阶跃响应：$r(t)=\frac12 + \frac1\pi (t-t_0)\int_0^{\omega_c}\frac{\sin\omega(t-t_0)}{\omega(t-t_0)}\text{d}t\omega = \frac12+\frac1\pi (t-t_0)\operatorname{Si}(\omega_c(t-t_0))$, $t_{\text{rise}}=\frac{2\pi}{\omega_c}=t_c$&lt;/li&gt;&#xA;&lt;li&gt;非理想低通特性：通/阻带有起伏 $\pm\delta_1/\delta_2$，通带边缘 $\omega_p$, 阻带边缘 $\omega_s$&lt;/li&gt;&#xA;&lt;li&gt;工程低通：Butterworth, Chebyshev, Cauer （幅频特性逼近更好，$h(t)$ 更差）&lt;/li&gt;&#xA;&lt;li&gt;物理可实现系统：因果，平方可积&lt;/li&gt;&#xA;&lt;li&gt;佩利－维纳准则：$\int_{\infty}\frac{|\ln|H(j\omega)||}{1+\omega^2}\text{d}\omega &amp;lt; \infty$ （物理可实现必要条件）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;调制解调：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$s_{AM}(t)=(1+km(t))\cos\omega_0 t$&lt;/li&gt;&#xA;&lt;li&gt;$S_{AM}(\omega)=M(\omega)(\frac12 \delta(\omega-\omega_0)+\frac12 \delta(\omega+\omega_0))=\frac12(M(\omega-\omega_0)+M(\omega+\omega_0))$&lt;/li&gt;&#xA;&lt;li&gt;解调：再乘 $\cos\omega_0 t$ ，使 $S(\omega)=\frac14 M(\omega-2\omega_0)+\frac12 M(\omega)+\frac12(\omega+2\omega_0)$ ，再过低通&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;离散傅里叶分析&#34;&gt;离散傅里叶分析&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;离散傅里叶级数 DFS&#xA;&lt;ul&gt;&#xA;&lt;li&gt;有限项级数，频谱周期&lt;/li&gt;&#xA;&lt;li&gt;离散信号可以认为是连续信号的冲激采样&lt;/li&gt;&#xA;&lt;li&gt;$a_k=\frac1{NT_s}\sum_0^{N-1} x(nT_s)e^{-jk\frac{2\pi}{N}n}$&lt;/li&gt;&#xA;&lt;li&gt;$a_k$ 例&#xA;&lt;ul&gt;&#xA;&lt;li&gt;周期方波($N_1/N$): $\frac1N \frac{\sin \frac\pi N k(2N_1+1)}{\sin\frac{\pi}{N}k}$ （注意这里的 $N_1$ 对应连续的 $\frac\tau2$ 而非 $\tau$）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;DTFT&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对比CFS 有 $\frac{2\pi}{N}k \to \omega$&lt;/li&gt;&#xA;&lt;li&gt;$X(e^{j\omega})=\sum_\infty x[n]e^{-j\omega n}$&lt;/li&gt;&#xA;&lt;li&gt;$x[n]=\frac1{2\pi} \int_{2\pi} X(e^{j\omega})e^{j\omega n}\text{d}\omega$&lt;/li&gt;&#xA;&lt;li&gt;收敛条件：$\sum|x[n]|^2&amp;lt;\infty$ or $\sum|x[n]| &amp;lt; \infty$ 且一致收敛&lt;/li&gt;&#xA;&lt;li&gt;例&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$\delta[n] \sim 1$&lt;/li&gt;&#xA;&lt;li&gt;矩形脉冲 $|n|\le N_1$: $\frac{\sin(2N_1+1)\frac\omega2}{\sin\frac\omega2}$&lt;/li&gt;&#xA;&lt;li&gt;频域矩形 $\frac{\sin\omega_s n}{\pi n} \sim u(\omega-\omega_s)-u(\omega+\omega_s)$&lt;/li&gt;&#xA;&lt;li&gt;实指数 $a^nu(n) \sim \frac1{1-ae^{-j\omega}}$&lt;/li&gt;&#xA;&lt;li&gt;非因果实指数 $a^nu(-n) \sim \frac{1}{1-a^{-1}e^{j\omega}}$&lt;/li&gt;&#xA;&lt;li&gt;双边指数 $a^{|n|} \sim \frac{1-a^2}{1+a^2-2a\cos\omega}$&lt;/li&gt;&#xA;&lt;li&gt;常数 $1\sim2\pi\sum_\infty\delta[\omega-2\pi k]$&lt;/li&gt;&#xA;&lt;li&gt;一般周期：$2\pi \sum_N a_k \delta[\omega-\frac{2\pi}{N}k]$ 的周期化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;性质&#xA;&lt;ul&gt;&#xA;&lt;li&gt;周期性，线性，时移频移，时间反转，共轭对称&lt;/li&gt;&#xA;&lt;li&gt;差分 $x[n]-x[n-1] \sim (1-e^{-j\omega})X(e^{j\omega})$&lt;/li&gt;&#xA;&lt;li&gt;求和 $\sum_{-\infty}^{n}x[k] \sim \frac{X(e^{j\omega})}{1-e^{-j\omega}}+\pi X(\omega=0)\delta(\omega)$ 的周期化&lt;/li&gt;&#xA;&lt;li&gt;时域内插 $x_k(n) \sim X(e^{jk\omega})$&lt;/li&gt;&#xA;&lt;li&gt;频域微分 $nx[n] \sim j\frac{\text{d}X(e^{j\omega})}{\text{d}\omega}$&lt;/li&gt;&#xA;&lt;li&gt;Parseval定理 $\sum_\infty|x[n]|^2 = \frac1{2\pi} \int_{2\pi} |X(e^{j\omega})|^2\text{d}\omega$&lt;/li&gt;&#xA;&lt;li&gt;卷积性质 $x(n)\ast h(n) \sim X(\omega)H(\omega)$&lt;/li&gt;&#xA;&lt;li&gt;调制性质 $x(n)h(n) \sim \frac1{2\pi} X(\omega)\ast H(\omega)$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;拉普拉斯变换&#34;&gt;拉普拉斯变换&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;双边拉氏变换 $X(s)=\int_{-\infty}^{\infty} x(t)e^{-st}\text{d}t$&lt;/li&gt;&#xA;&lt;li&gt;反变换 $X(s)=\frac{1}{2\pi j}\int_{\sigma-j\infty}^{\sigma+j\infty}X(s)e^{st}\text{d}s$&lt;/li&gt;&#xA;&lt;li&gt;ROC：平行 $j$ 轴，极点为边界，时限信号 ROC 无限，左右边信号&lt;/li&gt;&#xA;&lt;li&gt;零极点图：零点 &lt;code&gt;○&lt;/code&gt;, 极点 &lt;code&gt;x&lt;/code&gt;；可能抵消；注意分母 $z^{-1}$ 自带一个 $0$ 零点&lt;/li&gt;&#xA;&lt;li&gt;拉氏变换对&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$u(t)\sim\frac1s, \operatorname{Re}(s)&amp;gt;0$ ($\sim \frac1s + \pi\delta(s)$)&lt;/li&gt;&#xA;&lt;li&gt;$\delta(t)\sim1$&lt;/li&gt;&#xA;&lt;li&gt;$1 \sim 2\pi\delta(s)$&lt;/li&gt;&#xA;&lt;li&gt;$e^{-at}u(t) \sim \frac{1}{s+a}$&lt;/li&gt;&#xA;&lt;li&gt;$\sin\omega t\ u(t)\sim\frac{\omega}{s^2+\omega^2}$, $\cos\omega t\ u\sim\frac{s}{s^2+\omega^2}$&lt;/li&gt;&#xA;&lt;li&gt;$\operatorname{Rect}_{\tau}(t) \sim \tau \operatorname{Sah}\frac{s\tau}{2}$ （宽度 $\tau$）；对称三角（宽度 $2\tau$）：$(\tau\operatorname{Sah}\frac{s\tau}{2})^2$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;性质&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$x(t-t_0) \sim X(s)e^{-st_0}$&lt;/li&gt;&#xA;&lt;li&gt;$x(t)e^{s_0t} \sim X(s-s_0)$ （注意 ROC 平移）&lt;/li&gt;&#xA;&lt;li&gt;$x(at) \sim \frac{1}{|a|}X(\frac sa)$ （注意 ROC 尺度变换）&lt;/li&gt;&#xA;&lt;li&gt;$x^\ast(t)\sim X^\ast(s^\ast)$ （若 $x(t)$ 实 则极点共轭也是极点）&lt;/li&gt;&#xA;&lt;li&gt;$x_1(t)\ast x_2(t) \sim X_1(s)X_2(s)$, $x_1(t)x_2(t)\sim \frac1{2\pi j}\int_{c-j\infty}^{c+j\infty}F(\sigma)G(s-\sigma)\text{d}\sigma$&lt;/li&gt;&#xA;&lt;li&gt;$x&amp;rsquo;(t)\sim sX(s)$, $-tx(t)\sim X&amp;rsquo;(s)$, $\int_{-\infty}^{t}x(\tau)\text{d}\tau \sim \frac{X(s)}{s}$, $\frac{x(t)}{t} \sim \int_{s}^{\infty} X(\eta)\text{d}\eta$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单边 $x&amp;rsquo;(t)\sim sX(s)-x(0^-)$ , $x^{(-1)}(t)=\frac{X(s)}{s}+\frac{x^{(-1)}(0^-)}{s}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;$x(\infty)=\lim_{s\to 0}sX(s)$ （条件：因果，原函数无 $\delta(t)$)（推导：幂级数展开）&lt;/li&gt;&#xA;&lt;li&gt;$x(0^+)=\lim_{s\to\infty} sX(s)$ （条件：因果，极点 &amp;lt;0 且至多一个 0）（推导：考虑 $\int_{0^+}^{\infty}e^{-st}\text{d}x(t)$ 换元）&lt;/li&gt;&#xA;&lt;li&gt;周期信号只有单边 $f(s)=\sum_\infty f_1(t-nT) \sim \frac{F_1(s)}{1-e^{-sT}}$&lt;/li&gt;&#xA;&lt;li&gt;没有对偶性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;单边：$[0^-,\infty]$ or $[-\infty, 0^+]$ ROC 为最右极点之右&lt;/li&gt;&#xA;&lt;li&gt;LTI $H(s)$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;因果稳定：$\infty\in ROC$；极点&amp;lt;0&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;全通网络：$|H(j\omega)|=K$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;z-变换&#34;&gt;Z 变换&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$X(z)=\sum_\infty x[n]z^{-n}$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$z=e^{sT}=e^{j\omega}$&lt;/li&gt;&#xA;&lt;li&gt;有限长序列的ROC是整个有限Z平面&lt;/li&gt;&#xA;&lt;li&gt;反变换 $x(n)=\frac1{2\pi j}\oint_{|z|=r} X(z)z^{n-1}\text{d}z$ （逆时针）&lt;/li&gt;&#xA;&lt;li&gt;技巧：$\frac1z X(z)=\sum \frac {C_i}{z-z_i}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;幅频响应：极点峰值，零点凹陷&lt;/li&gt;&#xA;&lt;li&gt;变换对&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$\delta(n) \sim 1$&lt;/li&gt;&#xA;&lt;li&gt;$u(n) \sim \frac z {z-1}, |z|&amp;gt;1$&lt;/li&gt;&#xA;&lt;li&gt;$a^n u(n), -a^n u(-n-1) \sim \frac{z}{z-a}$&lt;/li&gt;&#xA;&lt;li&gt;$na^nu(n)\sim \frac {az} {(z-a)^2}$&lt;/li&gt;&#xA;&lt;li&gt;$z_0^n x(n) \sim X(\frac{z}{z_0})$&lt;/li&gt;&#xA;&lt;li&gt;$x(-n) \sim X(z^{-1})$, $x^\ast(n) \sim X^\ast(z^\ast)$&lt;/li&gt;&#xA;&lt;li&gt;时域内插 $x_k=x(n/k) \sim X(z^k)$&lt;/li&gt;&#xA;&lt;li&gt;$nx(n)\sim -zX&amp;rsquo;(z)$&lt;/li&gt;&#xA;&lt;li&gt;$x(n+n_0)\sim X(z)z^{n_0}$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单边右移 $x(n-n_0) \sim z^{-n_0}(X(z) + \sum_{1}^{n_0}x(-k)z^{k})$&lt;/li&gt;&#xA;&lt;li&gt;单边左移 $x(n+n_0) \sim z^{n_0}(X(z)-\sum_{0}^{n_0-1} x(k)z^{-k})$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;$x(0)=\lim_{z\to\infty} X(z)$, $x(\infty)=\lim_{z\to 1} (z-1)X(z)$ （因果；推导：按 Z 变换定义展开；时移性质）&#xA;&lt;img src=&#34;image.png&#34; alt=&#34;框图&#34;&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>操作系统速成</title>
				<link>https://g0g.top/note/os/</link>
				<pubDate>Fri, 13 Jun 2025 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/note/os/</guid>
				<description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;操作系统：是软件，且是系统软件；基本职能是控制和管理系统资源；提供服务，方便用户使用&#xA;&lt;ul&gt;&#xA;&lt;li&gt;四大特征：并发，共享，虚拟，不确定&lt;/li&gt;&#xA;&lt;li&gt;类型：分时，实时，微机，网络，分布式，嵌入式，智能卡，云OS&lt;/li&gt;&#xA;&lt;li&gt;架构：微内核 micro kernel，宏内核/单体内核 monolithic kernel；SMP(Symmetric MultiProcessing)&lt;/li&gt;&#xA;&lt;li&gt;主要模块：进程管理，内存管理，设备管理，文件管理，用户&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;IO 基础&#xA;&lt;ul&gt;&#xA;&lt;li&gt;脱机输入输出，批处理系统&lt;/li&gt;&#xA;&lt;li&gt;缓冲：解决速度不匹配问题；spooling&lt;/li&gt;&#xA;&lt;li&gt;中断：减少轮询；分为 IO (timer), Hard error, Soft error/exception&lt;/li&gt;&#xA;&lt;li&gt;DMA&lt;/li&gt;&#xA;&lt;li&gt;SPOOLing&#xA;&lt;ul&gt;&#xA;&lt;li&gt;把一台物理设备虚拟成逻辑上的多台设备&lt;/li&gt;&#xA;&lt;li&gt;驱动程序：预输入，井管理，缓输出&lt;/li&gt;&#xA;&lt;li&gt;架构：接口-内存缓冲-井（暂时持久化）-内存缓冲-设备&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;作业：一个完整的任务，包括多个作业步/程序&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;内存管理&#34;&gt;内存管理&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作用：提高主存的利用率，将尽可能多的作业同时加载到主存中&lt;/li&gt;&#xA;&lt;li&gt;层次：寄存器，主存，辅助存储器&lt;/li&gt;&#xA;&lt;li&gt;部分：寄存器，L1，L2，L3/主存，本地二级，远程二级&lt;/li&gt;&#xA;&lt;li&gt;需求：重定位，保护，共享，逻辑组织，物理组织&lt;/li&gt;&#xA;&lt;li&gt;管理技术：单一连续，固定分区，动态分区，分页/分段，虚拟内存&#xA;&lt;ul&gt;&#xA;&lt;li&gt;重定位：分区导致的；静态/动态重定位：动态链接/PIC&lt;/li&gt;&#xA;&lt;li&gt;存储保护：上下限寄存器&lt;/li&gt;&#xA;&lt;li&gt;碎片：分区-内碎片；动态-外碎片&lt;/li&gt;&#xA;&lt;li&gt;可变分区分配算法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;首次适配：空闲分区链表按地址排序；分配快，回收效率高，碎片多，性能下降&lt;/li&gt;&#xA;&lt;li&gt;临近适配：循环首次适应，记忆上次指针位置；分配较快，碎片少&lt;/li&gt;&#xA;&lt;li&gt;最佳适配：空闲分区链表按块从小到大排序；分配慢，回收慢，利用率高，碎片小多&lt;/li&gt;&#xA;&lt;li&gt;最差适配：空闲分区从大到小；分配较快，回收慢，碎片中等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;算法对比&#xA;&lt;ul&gt;&#xA;&lt;li&gt;复杂度：最佳（2+2）&amp;gt; 最差（1+2）&amp;gt;首次（1+1）&amp;gt;循环（1+1）&lt;/li&gt;&#xA;&lt;li&gt;小碎片产生的可能性：最佳 &amp;gt;首次  &amp;gt; 循环 &amp;gt; 最差&lt;/li&gt;&#xA;&lt;li&gt;后继大作业分配成功的可能性：最佳 &amp;gt;首次  &amp;gt; 循环 &amp;gt; 最差&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;内存扩充技术：主辅存交换&#xA;&lt;ul&gt;&#xA;&lt;li&gt;覆盖技术：预先程序分块&lt;/li&gt;&#xA;&lt;li&gt;交换技术：引入分页分段&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;虚拟存储系统&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统抖动：反复换出换入的现象&lt;/li&gt;&#xA;&lt;li&gt;任务：地址映射，缺页处理，物理内存回收分配&lt;/li&gt;&#xA;&lt;li&gt;特点：延迟分配，用户空间不受物理限制&lt;/li&gt;&#xA;&lt;li&gt;基础：异常中断机制；页表项&lt;/li&gt;&#xA;&lt;li&gt;地址翻译：页表 页号+偏移；快表 TLB 页号+flag&lt;/li&gt;&#xA;&lt;li&gt;多级页表；反向页表（逻辑页号+进程ID Hash）&lt;/li&gt;&#xA;&lt;li&gt;空闲页：位图，链表&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;淘汰算法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最优淘汰算法 Optimal：淘汰下次访问最远的&lt;/li&gt;&#xA;&lt;li&gt;FIFO：某些情况抖动大&lt;/li&gt;&#xA;&lt;li&gt;LRU：计数器，定时清理；复杂，会淘汰新页&lt;/li&gt;&#xA;&lt;li&gt;访问 FIFO：低效&lt;/li&gt;&#xA;&lt;li&gt;NUR / 时钟算法：初始/访问1，扫描清零；rw: 先R后W&lt;/li&gt;&#xA;&lt;li&gt;(Unix) 双时钟 前指针更新 flag，后指针淘汰&lt;/li&gt;&#xA;&lt;li&gt;年龄法/老化法：NUR 但是换成计数器&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;读取/清除策略：请求式，预先式；驻留集：可直接访问物理内存（有效虚拟内存）&lt;/li&gt;&#xA;&lt;li&gt;替换策略：页缓冲（RO空闲页表，W修改页表）&lt;/li&gt;&#xA;&lt;li&gt;内存分配算法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Buddy System：二分，用于分配页；Linux lazy merge&lt;/li&gt;&#xA;&lt;li&gt;Slab System：用于分配 Bytes；slub (Linux), slob (embed)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;进程管理&#34;&gt;进程管理&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;进程：系统进行资源分配和调度的一个可并发执行的独立单位&#xA;&lt;ul&gt;&#xA;&lt;li&gt;组成：代码段(RO)，数据上下文（用户层，内核层，寄存器）&lt;/li&gt;&#xA;&lt;li&gt;管理结构：PCB&lt;/li&gt;&#xA;&lt;li&gt;一个进程只能对应于一个程序&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;fork&lt;/code&gt;, &lt;code&gt;exec&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;状态转换&#xA;&lt;ul&gt;&#xA;&lt;li&gt;三状态：Running, Ready, Block&lt;/li&gt;&#xA;&lt;li&gt;五状态：Created(Limited by Process Number), Ready, Running, Sleep(Block/Wait/Uninterruptable sleep), Terminated(Traced/Stopped)&lt;/li&gt;&#xA;&lt;li&gt;挂起 Suspend: 需要评估加载资源&lt;/li&gt;&#xA;&lt;li&gt;*Linux: Ready/Running, Sleeping, Uninterruptable sleep, Stopped, Zombie&lt;/li&gt;&#xA;&lt;li&gt;*Windows: Ready, Standby, Running, Waiting, Transition, Terminated&lt;/li&gt;&#xA;&lt;li&gt;神秘 Job control block: 提交，后备，运行，完成&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;PCB：进程（标识，CPU，调度，记录）、内存、IO、文件&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;struct proc&lt;/code&gt;：核心内容，常驻内存部分&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;struct text&lt;/code&gt;: 代码段相关&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;struct user&lt;/code&gt;: 用户信息，proc 结构，信号处理，事件记录等&lt;/li&gt;&#xA;&lt;li&gt;PCB 链表&lt;/li&gt;&#xA;&lt;li&gt;模式：内核态用户态&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;线程&#xA;&lt;ul&gt;&#xA;&lt;li&gt;进程：资源分配单位；线程：调度执行单位&lt;/li&gt;&#xA;&lt;li&gt;独立资源：执行状态，上下文，TLS，控制块&lt;/li&gt;&#xA;&lt;li&gt;共享资源：地址空间，程序代码，全局变量，设备文件&lt;/li&gt;&#xA;&lt;li&gt;优势：创建，终止，切换，通信快（x&lt;/li&gt;&#xA;&lt;li&gt;用户级多线程：假的，切换更快，更轻&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;调度&#xA;&lt;ul&gt;&#xA;&lt;li&gt;层次：长程/高级，中程/中极，短程/低级：队列，内存，CPU；通常只有一个进程调度&lt;/li&gt;&#xA;&lt;li&gt;准则：面向用户/系统；优先 IO、交互、段、优先级&lt;/li&gt;&#xA;&lt;li&gt;调度方式：不可剥夺，可剥夺&lt;/li&gt;&#xA;&lt;li&gt;时机：中断，异常，Trap&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;调度算法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;FCFS/FIFO：简单，不可抢占&lt;/li&gt;&#xA;&lt;li&gt;SJF/SPN 最短优先：较简单，难预测&lt;/li&gt;&#xA;&lt;li&gt;SRT 最短剩余时间：抢占，难预测，好于 SPN&lt;/li&gt;&#xA;&lt;li&gt;HRRN 最高相应比：R=1+Waited/Runtime，折中&lt;/li&gt;&#xA;&lt;li&gt;Round Robin 时间片轮转：剥夺式；改进：不同规格时间片&lt;/li&gt;&#xA;&lt;li&gt;(Unix, Windows) Feedback：优先调度优先级最高的队列；高优先级时间片短；时间片用完降低优先级&lt;/li&gt;&#xA;&lt;li&gt;(Linux) CFS 完全公平调度：vruntime = 实际运行时间 * NICE_0_LOAD/ 当前进程权重；队列按 vruntime 排&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;多核处理器&#xA;&lt;ul&gt;&#xA;&lt;li&gt;调度：公共就绪队列，私有就绪队列，两级&lt;/li&gt;&#xA;&lt;li&gt;负载均衡：推/拉&lt;/li&gt;&#xA;&lt;li&gt;亲和性（软，硬）；原因：hot cache, tlb&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实时调度：硬实时任务必须按时完成，软实时任务尽量完成&#xA;&lt;ul&gt;&#xA;&lt;li&gt;静态表驱动，静态优先级驱动抢占调度，基于动态规划的调度，动态尽力调度&lt;/li&gt;&#xA;&lt;li&gt;时限调度：最早截止时间，最小松弛（最晚启动）时间&lt;/li&gt;&#xA;&lt;li&gt;RMS 速率单调调度：（周期任务）调度 U=1/T 最大的任务；要求 $\sum \frac{t_i}{T_i}\le n(2^{1/n}1)$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;优先级逆转&#xA;&lt;ul&gt;&#xA;&lt;li&gt;原因：高优先被低优先互斥阻塞&lt;/li&gt;&#xA;&lt;li&gt;解决：优先级继承（改任务优先级）；优先级置顶（设资源优先级）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;多处理器调度&#xA;&lt;ul&gt;&#xA;&lt;li&gt;负载共享：全局队列&lt;/li&gt;&#xA;&lt;li&gt;群调度：全局“群”队列；分配&lt;/li&gt;&#xA;&lt;li&gt;处理器专派：线程绑核&lt;/li&gt;&#xA;&lt;li&gt;动态调度：？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;进程间通信&#34;&gt;进程间通信&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;同步与互斥&#xA;&lt;ul&gt;&#xA;&lt;li&gt;临界资源：一个时刻只能被一个进程访问或使用的资源&lt;/li&gt;&#xA;&lt;li&gt;临界区：是一段代码。进程通过这段代码访问临界资源&#xA;&lt;ul&gt;&#xA;&lt;li&gt;原子性，可嵌套，可中断&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实现方法：硬件支持，用户态算法，操作系统&#xA;&lt;ul&gt;&#xA;&lt;li&gt;中断禁用：仅单处理器，单临界区，危险&lt;/li&gt;&#xA;&lt;li&gt;特殊指令：简单&lt;/li&gt;&#xA;&lt;li&gt;用户态算法：可能死锁饥饿&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Peterson 算法&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;操作系统：信号量（需了解算法）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;P/V, wait/signal&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;同步实例&#xA;&lt;ul&gt;&#xA;&lt;li&gt;半同步：单向等待依赖&lt;/li&gt;&#xA;&lt;li&gt;生产者和消费者问题: &lt;code&gt;semaphore_t buf, ch; mutex&amp;lt;queue_t&amp;gt; queue;&lt;/code&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;producer: P(buf); push queue; V(ch);&lt;/li&gt;&#xA;&lt;li&gt;consumer: P(ch); pop queue; V(buf);&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;RWLock: &lt;code&gt;mutex&amp;lt;int&amp;gt; count; mutex rwlock;&lt;/code&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;reader: &lt;code&gt;if (count++ == 0) P(rwlock); READ; if (--count == 0) V(rwlock);&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;writer: &lt;code&gt;P(rwlock); WRITE; V(rwlock)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;解决 writer 饿死：维护 writer wait flag&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;管程：RAII 锁 &lt;code&gt;Mutex&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;消息&#xA;&lt;ul&gt;&#xA;&lt;li&gt;进程间数据交换：消息，共享内存，管道 FIFO，socket，软中断/信号 signal&lt;/li&gt;&#xA;&lt;li&gt;原语：send, recv&lt;/li&gt;&#xA;&lt;li&gt;signal: PCB 有 signal field 和对应 handler；无优先级，针对进程，不及时，用户态处理&lt;/li&gt;&#xA;&lt;li&gt;FIFO pipe: 命名 &lt;code&gt;mknod/mkfifo&lt;/code&gt;, 匿名 &lt;code&gt;pipe&lt;/code&gt;；类似字符文件，单向；匿名管道用于同一进程族；环形缓冲区 ring buffer *PIPE_SIZE=64k, PIPE_BUF=4k；&lt;/li&gt;&#xA;&lt;li&gt;消息：&lt;code&gt;msgget&lt;/code&gt;, &lt;code&gt;msgsnd&lt;/code&gt;, &lt;code&gt;msgrcv&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;共享内存：&lt;code&gt;shmget&lt;/code&gt;, &lt;code&gt;shmat&lt;/code&gt;, &lt;code&gt;shmdt&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;死锁&#xA;&lt;ul&gt;&#xA;&lt;li&gt;原因：资源竞争；硬件资源分配不当；软件编写不当&lt;/li&gt;&#xA;&lt;li&gt;条件：充分（循环等待）；必要（互斥，保持并等待，不可剥夺）&lt;/li&gt;&#xA;&lt;li&gt;资源分配图 Resource allocation graph RAG&lt;/li&gt;&#xA;&lt;li&gt;应对方法：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;预防：消除条件之一&#xA;&lt;ul&gt;&#xA;&lt;li&gt;保持且等待：静态分配策路，失败全回滚&lt;/li&gt;&#xA;&lt;li&gt;不可剥夺：剥夺&lt;/li&gt;&#xA;&lt;li&gt;循环等待：资源排序，只能申请相较已获得编号更大的资源&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;避免：允许条件，算法避免死锁&#xA;&lt;ul&gt;&#xA;&lt;li&gt;介入时间：进程启动时，资源分配时&lt;/li&gt;&#xA;&lt;li&gt;拒绝进程启动：进程需要资源总和≤可用资源&lt;/li&gt;&#xA;&lt;li&gt;银行家算法：申请者告知未来最大需求；分配者计算死锁&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数据：max, alloc, need, available; request&lt;/li&gt;&#xA;&lt;li&gt;(a) request &amp;lt; need （否则 error）&lt;/li&gt;&#xA;&lt;li&gt;(b) request &amp;lt; available （否则 block）&lt;/li&gt;&#xA;&lt;li&gt;(c) 试修改： need -= request; alloc += request（check alloc &amp;lt; max）&lt;/li&gt;&#xA;&lt;li&gt;(d) Coffman 算法：假定 need 全同时变成 request，找到可行进程链；$O(n^2)$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;适用条件：进程间无同步，事先声明需求和可用资源&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;死锁检测（从死锁恢复）：Coffman 算法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;死锁消除：撤销死锁进程，剥夺资源&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;附：Peterson 算法&lt;/p&gt;</description>
			</item>
			<item>
				<title>马原概念速成</title>
				<link>https://g0g.top/note/%E9%A9%AC%E5%8E%9F%E6%A6%82%E5%BF%B5/</link>
				<pubDate>Wed, 11 Jun 2025 15:10:59 +0800</pubDate>
				<guid>https://g0g.top/note/%E9%A9%AC%E5%8E%9F%E6%A6%82%E5%BF%B5/</guid>
				<description>&lt;h2 id=&#34;导论&#34;&gt;导论&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;本质和使命：实现无产阶级和人类的解放&lt;/li&gt;&#xA;&lt;li&gt;基本立场、基本观点、基本方法的有机统一&lt;/li&gt;&#xA;&lt;li&gt;创立与发展&#xA;&lt;ul&gt;&#xA;&lt;li&gt;社会根源：生产力发展，社会两级分化，资本主义的经济危机&lt;/li&gt;&#xA;&lt;li&gt;阶级基础&#xA;&lt;ul&gt;&#xA;&lt;li&gt;三大工人运动：法国里昂工人起义 英国宪章运动 德国西里西亚纺织工人起义；阶级诞生，实践经验；无理论，无党&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;著作&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1846 德意志意识形态 历史唯物主义&lt;/li&gt;&#xA;&lt;li&gt;1848 共产党宣言 马克思主义的诞生&lt;/li&gt;&#xA;&lt;li&gt;1867 资本论 剩余价值学说&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;主要内容（可用于解释价值）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;理论的基础：马哲学&lt;/li&gt;&#xA;&lt;li&gt;理论的论证：马政治经济学&lt;/li&gt;&#xA;&lt;li&gt;理论的归宿：科学社会主义&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;理论根源：德国古典哲学（黑，费）、英国古典政治经济学（亚当斯密，大卫李嘉图）和英国法国的空想社会主义（圣西门，傅里叶，欧文）&lt;/li&gt;&#xA;&lt;li&gt;历程：马，列，毛，中特（邓，江（三个代表），胡（科学发展观）），习&#xA;&lt;ul&gt;&#xA;&lt;li&gt;同 中国具体实际 中华优秀传统文化 相结合&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;特征：科学性 人民性 实践性 发展性；体现本质使命；科学性与革命性的统一&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;世界的物质性及发展规律&#34;&gt;世界的物质性及发展规律&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;哲学既是世界观又是方法论&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&amp;ldquo;哲学家们只是用不同的方式解释世界，而问题在于改变世界。&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;哲学的基本问题：思维和存在的关系 / 本体论，可知论&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;唯物主义&#xA;&lt;ul&gt;&#xA;&lt;li&gt;发展：古代朴素（古希腊/中国），形而上学（自然科学，霍布斯，梅特利），辨证历史&lt;/li&gt;&#xA;&lt;li&gt;物质的唯一特性/原则：客观实在性&lt;/li&gt;&#xA;&lt;li&gt;运动&#xA;&lt;ul&gt;&#xA;&lt;li&gt;运动是物质的存在方式、根本属性&lt;/li&gt;&#xA;&lt;li&gt;物质是一切运动变化和发展过程的实在基础和承担者&lt;/li&gt;&#xA;&lt;li&gt;运动是绝对的、静止是相对的&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;意识：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是自然、社会历史（劳动/实践）的产物， 是物质世界的主观映象，客观内容和主观形式的统一&lt;/li&gt;&#xA;&lt;li&gt;反作用意识/有能动作用（x4）；主观能动性与客观规律性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;世界的物质统一性；一切从实际出发&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;唯物辩证法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;vs 形而上学：矛盾 运动 和 发展 的动力和源泉&lt;/li&gt;&#xA;&lt;li&gt;两大特征：联系和发展：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是唯物辩证法的总观点和总特征&lt;/li&gt;&#xA;&lt;li&gt;联系：客观，普遍（内，间，世界），多样(4)，条件(3)；联系导致运动&lt;/li&gt;&#xA;&lt;li&gt;发展：实质是新事物的产生和旧事物的灭亡；新事物必然战胜旧事物；发展是一个过程&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;唯物辩证法三大规律&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对立统一规律/矛盾&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是普遍联系的根本内容，是永恒发展的内在动力，是唯物辩证法的实质和核心&lt;/li&gt;&#xA;&lt;li&gt;属性：对立（斗争性）和统一（同一性）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;相互联结、相辅相成，斗争性是无条件的绝对的&lt;/li&gt;&#xA;&lt;li&gt;同一性是有条件的相对的&lt;/li&gt;&#xA;&lt;li&gt;在事物发展中的作用（3+2）&lt;/li&gt;&#xA;&lt;li&gt;矛盾的共性/普遍性和个性/特殊性、绝对和相对的道理，是关于事物矛盾问题的精髓&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;普遍性（时，物），特殊性（不同物，不同时，不同方面）&lt;/li&gt;&#xA;&lt;li&gt;两点论：对立且统一，主要且次要&lt;/li&gt;&#xA;&lt;li&gt;重点论：把握主要（矛盾、方面）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;质量互变：质、量、度；量变和质变：相辅相成（准备，结果，渗透）&lt;/li&gt;&#xA;&lt;li&gt;否定之否定&#xA;&lt;ul&gt;&#xA;&lt;li&gt;肯定（存在）和否定（灭亡）&lt;/li&gt;&#xA;&lt;li&gt;否定是事物内部矛盾运动的结果；是事物发展的环节，是新旧事物联系的环节，实质是扬弃（扬长弃短）&lt;/li&gt;&#xA;&lt;li&gt;前进性与曲折性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;唯物辩证法五大范畴：原因和结果、必然性和偶然性、可能性和现实性、现象和本质、内容和形式&lt;/li&gt;&#xA;&lt;li&gt;马克思主义方法论&#xA;&lt;ul&gt;&#xA;&lt;li&gt;唯物辩证法：是批判的和革命的，是客观辩证法与主观辩证法的统一，是伟大的认识工具（矛盾分析法）&lt;/li&gt;&#xA;&lt;li&gt;方法论：辩证思维方法&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;认识世界和改造世界&#34;&gt;认识世界和改造世界&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;实践观&#xA;&lt;ul&gt;&#xA;&lt;li&gt;发展：康黑费，马恩，列，中&lt;/li&gt;&#xA;&lt;li&gt;本质：人类能动地改造世界的社会性的物质活动&lt;/li&gt;&#xA;&lt;li&gt;结构：主体，客体，手段&lt;/li&gt;&#xA;&lt;li&gt;基本特征：直接现实，自觉能动，社会历史&lt;/li&gt;&#xA;&lt;li&gt;与认知：来源，发展动力，实践是认识的目的，是检验真理性唯一标准&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;认识论&#xA;&lt;ul&gt;&#xA;&lt;li&gt;本质：主体在实践基础上对客体的能动反映&#xA;&lt;ul&gt;&#xA;&lt;li&gt;路线：唯物（反映论）、唯心（先验论）&lt;/li&gt;&#xA;&lt;li&gt;反映论：能动革命的，x直观被动的；特点：摹写性，创造性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;规律/过程&#xA;&lt;ul&gt;&#xA;&lt;li&gt;实践-理性/感性认知-实践&lt;/li&gt;&#xA;&lt;li&gt;感性认知：直接性，具体性&lt;/li&gt;&#xA;&lt;li&gt;理性认识&#xA;&lt;ul&gt;&#xA;&lt;li&gt;形式：概念，判断，推理&lt;/li&gt;&#xA;&lt;li&gt;特点：间接性，抽象性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;感性/理性辩证统一：依赖，发展深化，互相渗透&#xA;&lt;ul&gt;&#xA;&lt;li&gt;错误：唯理论和经验论&lt;/li&gt;&#xA;&lt;li&gt;感性→理性：实践，辩证思维&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;从认识到实践&#xA;&lt;ul&gt;&#xA;&lt;li&gt;必要性重要性：认识世界的目的是改造世界，认识的真理性只有在实践中才能得到检验和发展&lt;/li&gt;&#xA;&lt;li&gt;条件：从实际出发，经过路线、方针、政策等中介，为群众所掌握，有正确的实践方法（？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;认识过程反复性和无限性（人有限而物无限）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;真理观 价值观&#xA;&lt;ul&gt;&#xA;&lt;li&gt;真理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;本质：对客观事物的本质及其规律的正确反映&lt;/li&gt;&#xA;&lt;li&gt;客观性：思想内容、检验标准都客观；决定了一元性&lt;/li&gt;&#xA;&lt;li&gt;绝对性：内容，认识能力；相对性：世界部分，特定事物&lt;/li&gt;&#xA;&lt;li&gt;绝对相对的辩证统一：相互渗透包含，真理辨证转化&lt;/li&gt;&#xA;&lt;li&gt;真理与谬误：主观是否与客观相符合；对立，联系，斗争，可转化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实践是检验真理的唯一标准&#xA;&lt;ul&gt;&#xA;&lt;li&gt;原因：真理的本质和实践的直接现实性&lt;/li&gt;&#xA;&lt;li&gt;补充：逻辑证明&lt;/li&gt;&#xA;&lt;li&gt;有 确定性/绝对性 | 不确定性/相对性/条件性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;价值&#xA;&lt;ul&gt;&#xA;&lt;li&gt;特定属性的客体对于主体需要的&lt;strong&gt;意义&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;基本特性：主体性，客观性，多维性，社会历史性&lt;/li&gt;&#xA;&lt;li&gt;价值评价：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是关于价值现象的认识活动，是主体对客体是否具有满足主体需要的属性做出肯定或否定的评判&lt;/li&gt;&#xA;&lt;li&gt;特点：以 价值关系 为 认识对象，与主体有直接联系，正确与否依赖于相关的知识性认识&lt;/li&gt;&#xA;&lt;li&gt;并不是一种主观随意 性的认识活动，而是具有客观性的认识活动&lt;/li&gt;&#xA;&lt;li&gt;功能：激励，规范制约，导向&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;价值观&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是人们 价值本质的认识 评价标准 评价方法 的观点体系&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;价值和真理在实践中的辩证统一：实践以之为前提；时间和认知中他们相互制约、相互引导、相互促进&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;认识世界和改造世界&#xA;&lt;ul&gt;&#xA;&lt;li&gt;辩证统一：改造是目的，认识是前提&lt;/li&gt;&#xA;&lt;li&gt;认识世界和改造世界的过程是从必然走向自由的过程（用来反对 宿命论和唯意志论）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;认识是能动的展示，是自由的可能性；改造是能动的确证，是自由的现实性&lt;/li&gt;&#xA;&lt;li&gt;自由发展：自然经济（依赖人），商品经济（依赖物），共产主义（自由全面）&lt;/li&gt;&#xA;&lt;li&gt;三重维度：人与自然，人与社会，人与自身&lt;/li&gt;&#xA;&lt;li&gt;自由条件：认识+实践&lt;/li&gt;&#xA;&lt;li&gt;认识必然、争取自由是一个历史过程&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;一切从实际出发，实事求是：是马要求，是中共路线核心&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;人类社会及其发展规律&#34;&gt;人类社会及其发展规律&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;社会基本矛盾及其运动规律&#xA;&lt;ul&gt;&#xA;&lt;li&gt;社会存在与社会意识&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是社会历史观的基本问题（唯心：社会意识主导）&lt;/li&gt;&#xA;&lt;li&gt;社会存在：是社会生活的物质方面，包括生产方式（决定性），地理环境，人口&#xA;&lt;ul&gt;&#xA;&lt;li&gt;生产方式 是生产力和生产关系的统一体 是社会历史发展的决定力量&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;社会意识：是社会生活的精神方面，是社会存在的反映；具有不同形态/形式/复杂结构&#xA;&lt;ul&gt;&#xA;&lt;li&gt;个体意识，群体意识；社会心理，社会意识形式；上层建筑意识形式（意识形态）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;辩证统一：存在决定意识，相对独立（3），反作用&lt;/li&gt;&#xA;&lt;li&gt;文化为社会：思想保证，精神动力，凝聚力，智力支持&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;生产力与生产关系&#xA;&lt;ul&gt;&#xA;&lt;li&gt;生产力：客观现实性，社会历史性&#xA;&lt;ul&gt;&#xA;&lt;li&gt;劳动者&lt;/li&gt;&#xA;&lt;li&gt;劳动资料：包括生产工具；划分经济时代，衡量生产力水平&lt;/li&gt;&#xA;&lt;li&gt;劳动对象：自然物，原料；侧面反映生产力&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;生产关系&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是社会关系中最基本的关系&lt;/li&gt;&#xA;&lt;li&gt;构成：生产资料所有制，人际关系/地位，产品分配关系&lt;/li&gt;&#xA;&lt;li&gt;分类：公有制，私有制&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;矛盾运动规律&#xA;&lt;ul&gt;&#xA;&lt;li&gt;生产力决定生产关系（性质，变革）&lt;/li&gt;&#xA;&lt;li&gt;生产关系对生产力具有能动的反作用&lt;/li&gt;&#xA;&lt;li&gt;生产关系一定要适合生产力状况的规律&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;规律价值：道德转生产力，可以为政党&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;经济基础与上层建筑&#xA;&lt;ul&gt;&#xA;&lt;li&gt;经济基础：是生产关系的总和&lt;/li&gt;&#xA;&lt;li&gt;上层建筑：经济基础之上的意识形态以及相应的制度、组织和设施&#xA;&lt;ul&gt;&#xA;&lt;li&gt;构成：思想（文化），政治；互相提供保证/精神指导&lt;/li&gt;&#xA;&lt;li&gt;政治居主导地位，国家政权是核心；国家按地域管理，依靠暴力手段维持&lt;/li&gt;&#xA;&lt;li&gt;国体：阶级地位安排；政体：统治/政权构成形式&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;矛盾运动规律&#xA;&lt;ul&gt;&#xA;&lt;li&gt;经济基础决定上层建筑（性质，变革，物质基础）&lt;/li&gt;&#xA;&lt;li&gt;上层建筑对经济基础具有反作用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;社会形态更替的一般规律及特殊形式&#xA;&lt;ul&gt;&#xA;&lt;li&gt;社会形态&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是关于社会运动的具体形式、发展阶段和不同质态的范畴&lt;/li&gt;&#xA;&lt;li&gt;包括经济形态，政治形态，意识形态&lt;/li&gt;&#xA;&lt;li&gt;构成：经济基础和上层建筑&lt;/li&gt;&#xA;&lt;li&gt;五种社会形态&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;社会形态更替的必然性：生产力与生产关系矛盾运动的规律性&lt;/li&gt;&#xA;&lt;li&gt;人们的历史选择性：人民群众的选择性&lt;/li&gt;&#xA;&lt;li&gt;社会形态更替的前进性与曲折性，渐进性与跨越性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;社会历史发展的动力&#xA;&lt;ul&gt;&#xA;&lt;li&gt;社会基本矛盾：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;生产力和生产关系、经济基础和上层建筑的矛盾&lt;/li&gt;&#xA;&lt;li&gt;是动力，是冲突根源，会转化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;阶级斗争和社会革命&#xA;&lt;ul&gt;&#xA;&lt;li&gt;阶级斗争是人类社会发展到一定阶段才出现的设社会现象；是动力；阶级分析法是认知方法&lt;/li&gt;&#xA;&lt;li&gt;社会革命：是社会形态的变更，是社会基本矛盾运动基础上的社会生活的全面变革（包括对人，对自然，思想变革）&lt;/li&gt;&#xA;&lt;li&gt;改革：在不改变社会基本制度，变革生产关系和上层建筑的某些方面环节，从而促进生产力发展和社会进步&lt;/li&gt;&#xA;&lt;li&gt;改革意义：生产方式，生活方式，思维&lt;/li&gt;&#xA;&lt;li&gt;科技：推动发展，受自然、人、社会制度影响&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;人民群众在历史发展中的作用&#xA;&lt;ul&gt;&#xA;&lt;li&gt;人民群众是历史的创造者&#xA;&lt;ul&gt;&#xA;&lt;li&gt;唯物史观：群众史观；立足人，社会，历史&lt;/li&gt;&#xA;&lt;li&gt;史观产生根源：认知，社会历史，阶级&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;人民群众：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;质（推动历史者），量（大多数）&lt;/li&gt;&#xA;&lt;li&gt;是一个历史范畴&lt;/li&gt;&#xA;&lt;li&gt;最稳定的主体部分始终是从事物质资料生产的劳动群众&lt;/li&gt;&#xA;&lt;li&gt;创造物质、精神，变革社会&lt;/li&gt;&#xA;&lt;li&gt;受经济，政治，精神文化制约&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;个人：必然性+偶然性；受制约&lt;/li&gt;&#xA;&lt;li&gt;分析法：历史，阶级&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;资本主义的本质及其规律&#34;&gt;资本主义的本质及其规律&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;劳动价值论&#xA;&lt;ul&gt;&#xA;&lt;li&gt;商品经济&#xA;&lt;ul&gt;&#xA;&lt;li&gt;形成：分工，资料产品分属&lt;/li&gt;&#xA;&lt;li&gt;阶段：个体，雇佣&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;商品因素&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用价值和价值&lt;/li&gt;&#xA;&lt;li&gt;价值是交换价值的基础，交换价值是价值的表现形式&lt;/li&gt;&#xA;&lt;li&gt;价值和使用价值 对立统一&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;劳动：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;二重性：具体劳动（形成使用价值，自然属性）和抽象劳动（形成价值，社会属性）&lt;/li&gt;&#xA;&lt;li&gt;具体劳动和抽象劳动也是矛盾统一&lt;/li&gt;&#xA;&lt;li&gt;复杂劳动是多倍的简单劳动&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;社会必要劳动时间：正常生产条件下，平均熟练程度、劳动强度下，“具体劳动”时间；决定商品价值量&lt;/li&gt;&#xA;&lt;li&gt;货币&#xA;&lt;ul&gt;&#xA;&lt;li&gt;职能：价值尺度，流通手段，贮藏手段，支付手段，世界货币&lt;/li&gt;&#xA;&lt;li&gt;简化商品交换；没解决商品经济基本矛盾&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;价值规律：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;商品的价值量由生产商品的社会必要劳动时间决定，商品交换以价值量为基础，按照等价交换的原则进行，形成价值规律：商品的价格围绕商品的价值自发波动（商品经济）&lt;/li&gt;&#xA;&lt;li&gt;作用：自发调节生产，刺激生产力，调整收入分配&lt;/li&gt;&#xA;&lt;li&gt;后果：劳动浪费，垄断，生产者分化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;商品经济的基本矛盾：私人劳动和社会劳动的矛盾&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;剩余价值理论&#xA;&lt;ul&gt;&#xA;&lt;li&gt;资本原始积累&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是生产者与生产资料相分离，货币资本迅速集中于少数人手中的历史过程&lt;/li&gt;&#xA;&lt;li&gt;途径：暴力掠夺生产资料、产品/财富&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;资本主义经济制度是以资本家占有生产资料和以雇佣劳动为基础的经济制度&lt;/li&gt;&#xA;&lt;li&gt;劳动力成为商品&#xA;&lt;ul&gt;&#xA;&lt;li&gt;劳动力：人的体力和脑力的总和&lt;/li&gt;&#xA;&lt;li&gt;是资本主义雇佣劳动制度的形成前提&lt;/li&gt;&#xA;&lt;li&gt;条件：劳动者是自由人，劳动者一无所有&lt;/li&gt;&#xA;&lt;li&gt;劳动力商品的价值：生存，生活，训练；使用价值是价值的源泉&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;资本&#xA;&lt;ul&gt;&#xA;&lt;li&gt;价值形式/价值构成：不变资本（生产资料），可变资本（购买劳动力）&lt;/li&gt;&#xA;&lt;li&gt;物质构成/技术构成：生产资料，劳动力&lt;/li&gt;&#xA;&lt;li&gt;有机构成：由 技术构成 构成 决定并反映 技术构成 变化的 价值构成&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;生产剩余价值&#xA;&lt;ul&gt;&#xA;&lt;li&gt;剩余价值：剩余劳动时间内创造的、被无偿占有的价值&lt;/li&gt;&#xA;&lt;li&gt;是资本主义生产方式的绝对规律，是资本主义生产的直接目的和决定性动机&lt;/li&gt;&#xA;&lt;li&gt;资本主义生产过程两重性：物质资料，剩余价值（价值增值）；资本主义生产过程是劳动过程和价值增殖过程的统一&lt;/li&gt;&#xA;&lt;li&gt;生产基本方法：绝对剩余价值（必要劳动时间不变，延长时间、提高强度），相对（缩短必要劳动时间）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;资本积累&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是剩余价值的资本化&lt;/li&gt;&#xA;&lt;li&gt;简单再生产：剩余价值不再用于生产；物质资料再生产和资本主义生产关系再生产的统一&lt;/li&gt;&#xA;&lt;li&gt;扩大再生产：剩余价值部分资本化&lt;/li&gt;&#xA;&lt;li&gt;是财富占有分化、社会失业的原因&lt;/li&gt;&#xA;&lt;li&gt;历史趋势：生产社会性，资本集中&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;循环周转与再生产&#xA;&lt;ul&gt;&#xA;&lt;li&gt;产业资本的循环，资本的周转，社会资本的再生产和流通&lt;/li&gt;&#xA;&lt;li&gt;社会资本：相互联系、相互依存的个别资本的总和&lt;/li&gt;&#xA;&lt;li&gt;社会再生产顺利进行：社会总产品（价值，实物）能实现，社会生产（生产资料，消费资料）成比例&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;工资与剩余价值的分配：只要资本雇佣劳动的基本经济关系不变，资本主义工资的本质就不会发生根本变化&lt;/li&gt;&#xA;&lt;li&gt;意义：由于唯物史观和剩余价值的发现，社会主义由空想变为科学&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;资本主义基本矛盾&#xA;&lt;ul&gt;&#xA;&lt;li&gt;基本矛盾：资本主义私人占有的生产关系与社会化生产力之间的矛盾&#xA;&lt;ul&gt;&#xA;&lt;li&gt;表现：个别企业生产的有组织性和整个社会生产无政府状态之间的矛盾；资本主义生产无限扩大的趋势与劳动人民有支付能力的需求相对狭小之间的矛盾&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;经济危机实质：生产相对过剩&lt;/li&gt;&#xA;&lt;li&gt;再生产的周期性：危机，萧条，复苏，高涨；资本主义基本矛盾运动的阶段性决定&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;资本主义的发展及其趋势&#34;&gt;资本主义的发展及其趋势&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;垄断资本主义的形成与发展&#xA;&lt;ul&gt;&#xA;&lt;li&gt;资本主义两个阶段：自由竞争，垄断&lt;/li&gt;&#xA;&lt;li&gt;垄断&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是少数资本主义大企业，为了利润，对一个或几个部门商品的生产、销售和价格，进行操纵和控制&lt;/li&gt;&#xA;&lt;li&gt;形成：生产集中和资本集中&#xA;&lt;ul&gt;&#xA;&lt;li&gt;生产集中：生产资料、劳动力和商品的生产集中于大企业&lt;/li&gt;&#xA;&lt;li&gt;资本集中：吞并、合并&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;是资本家追求剩余价值的结果&lt;/li&gt;&#xA;&lt;li&gt;垄断利润：垄断地位获得的高额利润；源自剩余价值&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;垄断竞争&#xA;&lt;ul&gt;&#xA;&lt;li&gt;没有消除产生竞争的经济条件，必须通过竞争来维持&lt;/li&gt;&#xA;&lt;li&gt;规模大、时间长、手段残酷、程度激烈、而且具有更大的破坏性&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;金融垄断资本&#xA;&lt;ul&gt;&#xA;&lt;li&gt;由工业垄断资本和银行垄断资本融合形成的一种垄断资本&lt;/li&gt;&#xA;&lt;li&gt;金融寡头：指操纵国民经济命脉，并在实际上控制国家政权的少数垄断资本家或垄断资本家集团&lt;/li&gt;&#xA;&lt;li&gt;形成条件：金融自由化，金融创新&lt;/li&gt;&#xA;&lt;li&gt;控制方式：经济领域 参与制；国家 个人联合&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;国家垄断资本主义：国家政权和私人垄断资本融合&#xA;&lt;ul&gt;&#xA;&lt;li&gt;原因：支配大规模生产力/资料，应对经济危机，缓和社会矛盾&lt;/li&gt;&#xA;&lt;li&gt;形式：国营企业，合资企业，参与私人垄断资本，宏观调节，微观规制&lt;/li&gt;&#xA;&lt;li&gt;积极作用：发展生产力，突破私人局限性，再分配，引导现代化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;向世界范围扩展&#xA;&lt;ul&gt;&#xA;&lt;li&gt;动因：输出过剩资本，取得别国垄断，抢夺市场，获得生产资料&lt;/li&gt;&#xA;&lt;li&gt;形式：借贷资本，生产资本，商品资本&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;经济全球化&#xA;&lt;ul&gt;&#xA;&lt;li&gt;表现：生产、贸易、金融 全球化&lt;/li&gt;&#xA;&lt;li&gt;动因：生产力的发展，适宜的组织形式（跨国公司），各国经济体制的变革&lt;/li&gt;&#xA;&lt;li&gt;积极影响：科技，就业，贸易&lt;/li&gt;&#xA;&lt;li&gt;消极：收益不平等，环境恶化，经济风险&lt;/li&gt;&#xA;&lt;li&gt;应对：是必然趋势，以构建人类命运共同体的理念引领经济全球化&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;正确认识当代资本主义的新变化&#xA;&lt;ul&gt;&#xA;&lt;li&gt;所有制：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;国家资本形成并发挥重要作用&#xA;&lt;ul&gt;&#xA;&lt;li&gt;国家出资，推行政府政策，为私人垄断资本的发展&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;法人资本崛起并成为居主导&#xA;&lt;ul&gt;&#xA;&lt;li&gt;是法人股东化的产物&lt;/li&gt;&#xA;&lt;li&gt;两种形式：企业法人资本所有制，机构法人资本所有制&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;垄断资本变强&lt;/li&gt;&#xA;&lt;li&gt;缓和劳资关系：职工参与决策，终身雇佣，职工持股&lt;/li&gt;&#xA;&lt;li&gt;阶层结构：高级职业经理成为实际控制者；知识型和服务型劳动者增加&lt;/li&gt;&#xA;&lt;li&gt;经济调节机制和经济危机形态：二战后：国家开始对经济进行全面干预；1970s后：强化市场、弱化政府干预，福利制度改革减少政府财政负担，放松对经济和金融的管制，释放经济活力&lt;/li&gt;&#xA;&lt;li&gt;政治制度：多元化，加强法制，改良主义政党&lt;/li&gt;&#xA;&lt;li&gt;变化原因：生产力发展，斗争，社会主义制度影响，改良主义政党上台&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;资本主义的历史地位和发展趋势&#xA;&lt;ul&gt;&#xA;&lt;li&gt;相较封建进步：用科学技术，剩余价值+竞争+上层建筑推动生产力&lt;/li&gt;&#xA;&lt;li&gt;为社会主义所代替的历史必然性&#xA;&lt;ul&gt;&#xA;&lt;li&gt;必然：内在矛盾&lt;/li&gt;&#xA;&lt;li&gt;长期&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;社会主义的发展及其规律&#34;&gt;社会主义的发展及其规律&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;社会主义&#xA;&lt;ul&gt;&#xA;&lt;li&gt;思想：工人阶级的意识&lt;/li&gt;&#xA;&lt;li&gt;运动：工人阶级改造资本主义的实践&lt;/li&gt;&#xA;&lt;li&gt;制度：取代资本主义的新的社会制度&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;16-19 空想社会主义&#xA;&lt;ul&gt;&#xA;&lt;li&gt;早期（家庭手工业）：财产公有，共同劳动，人人平等&lt;/li&gt;&#xA;&lt;li&gt;空想平均（工厂手工业）：论述了从私有制过渡到公有制的必然性，并以法律条文的形式阐述了&#xA;理想社会的纲领和原则&lt;/li&gt;&#xA;&lt;li&gt;批判空想（机器大工业）：圣西门，傅里叶，欧文&lt;/li&gt;&#xA;&lt;li&gt;意义：新见解，无产阶级论，不具备科学和实践&lt;/li&gt;&#xA;&lt;li&gt;缺陷：出路，资本主义雇佣制本质，资本主义发展规律，找到社会力量&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;科学社会主义&#xA;&lt;ul&gt;&#xA;&lt;li&gt;标志：剩余价值和唯物史观；坚持科学的立场、观点和方法&lt;/li&gt;&#xA;&lt;li&gt;发展：第一国际与巴黎公社，第二国际与马恩晚年，十月革命&lt;/li&gt;&#xA;&lt;li&gt;预测：无产阶级革命至少将在几个主要的资本主义国家同时发生，社会主义可能在经济文化落后的俄国首先取得胜利&lt;/li&gt;&#xA;&lt;li&gt;意义：变成现实，建立国家，鼓舞革命，掀起解放斗争，推广马列主义和无产阶级政党&lt;/li&gt;&#xA;&lt;li&gt;教训：放弃了社会主义道路，放弃了无产阶级专政，放弃了共产党的领导地位，放弃了马克思列宁主义，结果使得已经相当严重的经济、政治、社会、民族矛盾进一步计划最终导致制度剧变、国家解体&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;科学社会主义的基本原则&#xA;&lt;ul&gt;&#xA;&lt;li&gt;资本主义必然灭亡，社会主义必然胜利；无产阶级是最先进最革命的阶级；无产阶级革命是无产阶级进行斗争的最高形式，以建立无产阶级专政的国家为目的；要在生产资料公有制基础上组织生产；要对社会生产进行有计划的指导和调节，实行按劳分配的原则；要合乎自然规律地改造和利用自然；坚持科学的理论指导；政党是无产阶级的先锋队，坚持无产阶级政党的领导；发展生产力；共产主义是人类最美好的社会&lt;/li&gt;&#xA;&lt;li&gt;正确把握：坚持一般原则；与本国实际相结合；不断总结新鲜经验&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;一些规律&#xA;&lt;ul&gt;&#xA;&lt;li&gt;经济文化相对落后的国家走向社会主义建设社会主义的长期性：生产力，经济，上层建筑，国际环境，马理论&lt;/li&gt;&#xA;&lt;li&gt;社会主义发展道路的多样性：生产力，历史文化，时代实践&lt;/li&gt;&#xA;&lt;li&gt;探索适合本国国情的社会主义发展道路：坚持马科学态度，以当时当地的历史条件出发，充分吸收人类一切文明成果&lt;/li&gt;&#xA;&lt;li&gt;社会主义在实践探索中开拓前进：遵循人类社会发展，遵循社会主义建设，遵循共产党执政&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;共产主义&#xA;&lt;ul&gt;&#xA;&lt;li&gt;预见未来社会的方法论&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在揭示人类社会发展一般规律的基础上指明社会发展的方向&lt;/li&gt;&#xA;&lt;li&gt;在剖析资本主义社会旧世界中阐发未来新世界的特点&lt;/li&gt;&#xA;&lt;li&gt;在社会主义社会发展中不断深化对未来共产主义社会的认识&lt;/li&gt;&#xA;&lt;li&gt;立足于揭示未来社会的一般特征，而不作详尽的细节描绘&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;共产主义社会的基本特征&#xA;&lt;ul&gt;&#xA;&lt;li&gt;物质财富极大丰富，消费资料按需分配&lt;/li&gt;&#xA;&lt;li&gt;社会关系高度和谐，人们精神境界极大提高&#xA;&lt;ul&gt;&#xA;&lt;li&gt;阶级，国家，战争消亡&lt;/li&gt;&#xA;&lt;li&gt;三大差别（工业和农业、城市和农村、脑力劳动和体力劳动）消失&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;每个人自由而全面的发展，人类从必然王国向自由王国的飞跃&#xA;&lt;ul&gt;&#xA;&lt;li&gt;旧式分工的消除为人的自由而全面的发展创造条件&lt;/li&gt;&#xA;&lt;li&gt;自由时间的延长为人的自由而全面的发展提供了广阔的前景&lt;/li&gt;&#xA;&lt;li&gt;劳动不再是单纯的谋生手段，而成为“生活的第一需要”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实现共产主义是历史发展的必然要求：是能够实现的社会理想，是人类最伟大的事业&lt;/li&gt;&#xA;&lt;li&gt;实现共产主义是一个长期的历史过程&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>马原速成</title>
				<link>https://g0g.top/note/%E9%A9%AC%E5%8E%9F/</link>
				<pubDate>Tue, 10 Jun 2025 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/note/%E9%A9%AC%E5%8E%9F/</guid>
				<description>&lt;h1 id=&#34;一导论&#34;&gt;一、导论&lt;/h1&gt;&#xA;&lt;h2 id=&#34;什么是马克思主义&#34;&gt;什么是马克思主义&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;马克思主义是由马克思、恩格斯创立并为后继者所不断发展的科学理论体系，是关于自然、社会和人类思维发展一般规律的学说，是关于社会主义必然代替资本主义、最终实现共产主义的学说，是关于无产阶级解放、全人类解放和每个人自由而全面发展的学说，是无产阶级政党和社会主义国家的指导思想，是指引人民创造美好生活的行动指南。&lt;/li&gt;&#xA;&lt;li&gt;三个组成部分：马克思主义哲学、马克思主义政治经济学和科学社会主义&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;什么是马克思主义基本原理&#34;&gt;什么是马克思主义基本原理&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;含义：对马克思主义立场观点方法的集中概括，是马克思主义在其形成、发展和运用过程中经过实践反复检验而确立起来的具有普遍真理性的理论。&lt;/li&gt;&#xA;&lt;li&gt;特点：具有普遍的、根本的和长远的指导意义。&lt;/li&gt;&#xA;&lt;li&gt;马克思主义的&lt;strong&gt;基本立场&lt;/strong&gt;，是马克思主义观察、分析和解决问题的根本立足点和出发点。&lt;/li&gt;&#xA;&lt;li&gt;马克思主义的&lt;strong&gt;基本观点&lt;/strong&gt;，是关于自然、社会和人类思维发展一般规律的科学认识，是对资本主义社会和社会主义社会发展规律的科学认识，是对人类思想成果和社会实践经验的科学总结。&lt;/li&gt;&#xA;&lt;li&gt;马克思主义的&lt;strong&gt;基本方法&lt;/strong&gt;，是建立在辩证唯物主义和历史唯物主义世界观和方法论基础上，指导我们正确认识世界和改造世界的思想方法和工作方法。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;马克思主义的创立与发展&#34;&gt;马克思主义的创立与发展&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;德国古典哲学、英国古典政治经济学、英法空想社会主义为马克思主义的创立提供了直接的&lt;strong&gt;理论来源&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;细胞学说、能量守恒定律、生物进化论，为马克思主义的创立提供了&lt;strong&gt;自然科学前提&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;1848年2月，《共产党宣言》发表&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;马克思主义的基本特征&#34;&gt;马克思主义的基本特征&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;科学性，人民性，实践性，发展性&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;基本特征&lt;/strong&gt;一句话概括：科学性与革命性的统一&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;二世界的物质性及其发展规律&#34;&gt;二、世界的物质性及其发展规律&lt;/h1&gt;&#xA;&lt;h2 id=&#34;世界多样性与物质统一性&#34;&gt;世界多样性与物质统一性&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;物质范畴是一切唯物哲学的理论基石。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;恩：“物、物质无非是各种物的总和，而这个概念就是从这一总和中抽象出来的”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;物质范畴的&lt;strong&gt;理论意义&lt;/strong&gt;：坚持了唯物主义一元论；坚持了能动的反映论和可知论，批判了不可知论；体现了唯物论和辩证法的统一，克服了形而上学唯物主义的缺陷；体现了唯物主义自然观与历史观的统一&lt;/li&gt;&#xA;&lt;li&gt;物质的根本&lt;strong&gt;属性&lt;/strong&gt;是运动。&lt;/li&gt;&#xA;&lt;li&gt;物质世界的二重化：一方面，世界分化为自然界与人类社会（劳动，人的印记，人的实践活动）；另一方面，世界分化为客观世界和主观世界。&lt;/li&gt;&#xA;&lt;li&gt;意识的起源：自然界长期发展；社会历史发展。&lt;/li&gt;&#xA;&lt;li&gt;物质决定意识，意识对物质具有能动的反作用。&lt;/li&gt;&#xA;&lt;li&gt;主观能动性和客观规律性的辩证统一：一方面，尊重客观规律是正确发挥主观能动性的前提；另一方面，只有充分发挥主观能动性，才能正确认识和利用客观规律。&lt;/li&gt;&#xA;&lt;li&gt;世界的统一性在于它的物质性，世界（自然界，社会，意识）统一于物质。物质的统一性是多样性的统一。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;事物的普遍联系和变化发展&#34;&gt;事物的普遍联系和变化发展&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;唯物辩证法认为，世界上的万事万物都处于普遍联系之中，普遍联系引起事物的变化发展。&lt;/li&gt;&#xA;&lt;li&gt;事物的普遍联系的性质：客观性，普遍性，多样性，条件性&lt;/li&gt;&#xA;&lt;li&gt;对立统一规律是唯物辩证法的实质和核心。&lt;/li&gt;&#xA;&lt;li&gt;矛盾的同一性是指矛盾着的对立面相互依存、相互贯通的性质和趋势；矛盾的斗争性是矛盾着的对立面相互排斥、相互分离的性质和趋势。矛盾的同一性和斗争性相互联结、相辅相成，在事物发展中具有重要作用。&lt;/li&gt;&#xA;&lt;li&gt;矛盾的普遍性是指矛盾存在于一切事物中，存在于一切事物发展过程的始终；矛盾的特殊性是指各个具体事物的矛盾、每一个矛盾的各个方面在发展的不同阶段上各有其特点。事物是由多种矛盾构成的。&lt;/li&gt;&#xA;&lt;li&gt;量变是质变的必要准备；质变是量变的必然结果。&lt;/li&gt;&#xA;&lt;li&gt;任何事物内部都包含肯定的方面与否定的方面，由于矛盾双方的相互作用，当否定的方面上升至支配地位时，事物就会由肯定走向对自身的否定，再由否定进一步走向更高阶段的肯定，即否定之否定。否定之否定规律揭示了事物发展的前进性与曲折性的统一。&lt;/li&gt;&#xA;&lt;li&gt;任何事物都是内容与形式的统一；本质与现象是揭示事物内在联系和外在表现的一对范畴；原因与结果是揭示事物引起和被引起关系的一对范畴；必然与偶然是揭示事物产生、发展和衰亡过程中的不同趋势的一对范畴。现实与可能是反映事物的过去、现在和将来关系的一对范畴&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;三实践与认识及其发展规律&#34;&gt;三、实践与认识及其发展规律&lt;/h1&gt;&#xA;&lt;h2 id=&#34;实践与认识&#34;&gt;实践与认识&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;实践是人类能动地改造世界的社会性的物质活动&lt;/li&gt;&#xA;&lt;li&gt;科学实践观的&lt;strong&gt;意义&lt;/strong&gt;：克服了旧唯物主义的根本缺陷；揭示了实践对认识的决定作用；在人类思想史上第一次揭示了社会生活的实践本质；为人们能动地认识世界和改造世界提供了基本的思想方法和工作方法。&lt;/li&gt;&#xA;&lt;li&gt;实践的&lt;strong&gt;本质&lt;/strong&gt;：客观实在性；自觉能动性；社会历史性&lt;/li&gt;&#xA;&lt;li&gt;实践的&lt;strong&gt;基本结构&lt;/strong&gt;：主体，客体，中介。实践的基本结构是历史的变化发展的。&lt;/li&gt;&#xA;&lt;li&gt;实践形式的&lt;strong&gt;基本类型&lt;/strong&gt;：物质生产实践，社会政治实践，科学文化实践&lt;/li&gt;&#xA;&lt;li&gt;实践对认识的决定作用：实践是认识的来源；实践是认识发展的动力；实践是认识的目的；实践是检验认识真理性的唯一标准。&lt;/li&gt;&#xA;&lt;li&gt;认识的&lt;strong&gt;本质&lt;/strong&gt;是主体在实践基础上对客体的能动反映。&lt;/li&gt;&#xA;&lt;li&gt;辩证唯物主义认识论有两个突出的特点：一是把实践的观点引入认识论；二是把辩证法应用于反映论考察认识的发展过程。&lt;/li&gt;&#xA;&lt;li&gt;人们认识一定事物的过程，是一个从实践到认识，再从认识到实践的过程。&lt;/li&gt;&#xA;&lt;li&gt;感性认识和理性认识是人对客观世界的两种不同水平的反映形式。两者辩证统一。&lt;/li&gt;&#xA;&lt;li&gt;从认识到实践的飞跃的重要性：认识世界的目的是改造世界；认识的真理性只有在实践中才能得到检验和发展&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;真理与价值&#34;&gt;真理与价值&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;马克思主义真理观：真理与客观事物之间的符合关系是建立在人类能动地改造客观世界的实践基础上的，是通过人的能动的反映活动而实现的，并且必然随着人类实践的发展而拓展和深化。&lt;/li&gt;&#xA;&lt;li&gt;客观性是真理的本质属性。真理的客观性决定了真理的一元性。&lt;/li&gt;&#xA;&lt;li&gt;真理的绝对性是指真理主客观统一的确定性和发展的无限性。它有两个方面的含义：一是指任何真理都标志着主观与客观相符合；二是人类认识按其本性来说，能够正确认识无限发展着的物质世界，认识每前进一步，都是对无限发展着的物质世界的接近。&lt;/li&gt;&#xA;&lt;li&gt;真理的相对性：人们在一定条件下对客观事物及其本质和发展规律的正确认识总是有限度的、不完善的。&lt;/li&gt;&#xA;&lt;li&gt;真理的绝对性和相对性辩证统一。&lt;/li&gt;&#xA;&lt;li&gt;真理与谬误相互对立；真理与谬误的对立是相对的，它们在一定条件下可以互相转化。&lt;/li&gt;&#xA;&lt;li&gt;实践是检验真理的唯一标准的&lt;strong&gt;原因&lt;/strong&gt;：真理是人们对客观事物及其发展规律的正确&#xA;反映，它的本性在于主观和客观相符合；实践具有直接现实性。实践的直接现实性是它的客观实在性的具体表现&lt;/li&gt;&#xA;&lt;li&gt;价值是反映主体和客体之间意义关系的哲学范畴，是客体对个人、群体乃至整个社会的生活和活动所具有的意义&lt;/li&gt;&#xA;&lt;li&gt;价值的基本特性：主体性，客观性，多维性，社会历史性&lt;/li&gt;&#xA;&lt;li&gt;价值评价是主体对客体的价值以及价值大小所作的评判或判断。&lt;/li&gt;&#xA;&lt;li&gt;价值评价的特点：评价以主客体之间的价值关系为认识对象；评价结果与评价主体直接相关；评价结果的正确与否依赖于对客体状况和主体需要的认识；价值评价有科学与非科学之别。&lt;/li&gt;&#xA;&lt;li&gt;价值观是人们关于价值本质的认识以及对人和事物的评价标准、评价原则和评价方法的观点的体系。&lt;/li&gt;&#xA;&lt;li&gt;人们的实践活动总是受着真理尺度和价值尺度的制约。真理尺度与价值尺度是紧密联系、不可分割的辩证统一关系。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;认识世界和改造世界&#34;&gt;认识世界和改造世界&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;认识世界和改造世界是相互依赖、相互制约的辩证统一关系。&lt;/li&gt;&#xA;&lt;li&gt;改造客观世界和改造主观世界是辩证统一的。&lt;/li&gt;&#xA;&lt;li&gt;自由是表示人的活动状态的范畴，是指人在活动中通过认识和利用必然所表现出的一种自觉自主的状态。&lt;/li&gt;&#xA;&lt;li&gt;认识必然和争取自由，是人类认识世界和改造世界的根本目标，是一个历史性的过程。&lt;/li&gt;&#xA;&lt;li&gt;一切从实际出发,就是要把客观存在的事物作为观察和处理问题的根本出发点。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;四人类社会及其发展规律&#34;&gt;四、人类社会及其发展规律&lt;/h1&gt;&#xA;&lt;h2 id=&#34;人类社会的存在与发展&#34;&gt;人类社会的存在与发展&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;社会存在是指社会物质生活条件，是社会生活的物质方面，主要包括自然地理环境、人口因素和物质生产方式。&lt;/li&gt;&#xA;&lt;li&gt;社会意识是社会存在的反映，是社会生活的精神方面。根据不同的主体，社会意识可分为个体意识和群体意识。根据不同的层次，社会意识可分为社会心理和社会意识形式。社会意识形式有意识形态和非意识形态之分。&lt;/li&gt;&#xA;&lt;li&gt;社会存在是社会意识内容的客观来源，社会意识是社会物质生活过程及其条件的主观反映。&lt;/li&gt;&#xA;&lt;li&gt;社会意识的能动作用是通过指导人们的实践活动实现的。&lt;/li&gt;&#xA;&lt;li&gt;生产力是人类在生产实践中形成的改造和影响自然以使其适合社会需&#xA;要的物质力量。&lt;/li&gt;&#xA;&lt;li&gt;生产力的基本要素：劳动资料，劳动对象，劳动者&lt;/li&gt;&#xA;&lt;li&gt;生产关系是社会关系中最基本的关系&lt;/li&gt;&#xA;&lt;li&gt;生产资料公有制和私有制。生产力和生产关系的矛盾运动中内在的联系就是生产关系一定要符合生产力状况的规律。&lt;/li&gt;&#xA;&lt;li&gt;经济基础是指由社会一定发展阶段的生产力所决定的生产关系的总和。&lt;/li&gt;&#xA;&lt;li&gt;上层建筑是建立在一定经济基础之上的意识形态以及与之相适应的制度、组织和设施。&lt;/li&gt;&#xA;&lt;li&gt;国体是指社会各阶级在国家中的地位，表明国家政权掌握在哪个阶级手里；政体是指统治阶级实现其阶级统治的具体组织形式。&lt;/li&gt;&#xA;&lt;li&gt;交往是唯物史观的重要范畴，指在一定历史条件下的现实的个人、群体、阶级、民族、国家之间在物质和精神上相互往来、相互作用、彼此联系的活动。交往与生产力发展相伴随。&lt;/li&gt;&#xA;&lt;li&gt;物质交往和精神交往。&lt;/li&gt;&#xA;&lt;li&gt;交往的作用：促进生产力的发展；促进社会关系的进步；促进文化的发展与传播；促进人的全面发展。&lt;/li&gt;&#xA;&lt;li&gt;社会进步的两个方面：社会形态从低级到高级，同一社会形态内部的发展。&lt;/li&gt;&#xA;&lt;li&gt;社会进步促进人的发展，推动人类解放。&lt;/li&gt;&#xA;&lt;li&gt;社会形态包括社会的经济形态、政治形态和意识形态，是三者具体的、历史的统一。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;列宁：“世界历史发展的一般规律，不仅丝毫不排斥个别发展阶段在发展的形式或顺序上表现出特殊性，反而是以此为前提的。”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;社会形态更替的必然性指社会形态依次更替的过程和规律是客观的，基本趋势是确定不移的。其历史选择性归根结底是人民群众的选择性。&lt;/li&gt;&#xA;&lt;li&gt;文明是人类创造的所有物质成果、精神成果和制度成果的总和，是标志社会进步程度的范畴，反映了人类社会实践活动的积极成果。文明发展的程度体现了民族，国家，社会发展的水平。&lt;/li&gt;&#xA;&lt;li&gt;人类文明具有多样性。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;社会历史发展的动力&#34;&gt;社会历史发展的动力&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;社会发展动力是一个系统，其中基础性和根本性的动力是社会基本矛盾。&lt;/li&gt;&#xA;&lt;li&gt;社会基本矛盾是指贯穿社会发展过程始终，规定社会发展过程的基本性质和基本趋势，并对社会历史发展起根本推动作用的矛盾。生产力和生产关系、经济基础和上层建筑的矛盾是社会基本矛盾。&lt;/li&gt;&#xA;&lt;li&gt;社会基本结构主要包括经济结构、政治结构和观念结构。&lt;/li&gt;&#xA;&lt;li&gt;首先，生产力是社会基本矛盾运动中最基本的动力因素，是人类社会发展和进步的最终决定力量；生产力是社会进步的根本内容，是衡量社会进步的根本尺度。&lt;/li&gt;&#xA;&lt;li&gt;社会基本矛盾特别是生产力和生产关系的矛盾，决定着社会中其他矛盾的存在和发展。&lt;/li&gt;&#xA;&lt;li&gt;社会基本矛盾是其他一切社会矛盾的根源，规定和制约着社会主要矛盾的存在和发展，社会主要矛盾是社会基本矛盾的具体体现。&lt;/li&gt;&#xA;&lt;li&gt;阶级斗争是社会基本矛盾在阶级社会中的表现。&lt;/li&gt;&#xA;&lt;li&gt;阶级和阶级斗争观点是唯物史观的基本观点。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;恩格斯：“用‘历史唯物主义’这个名词来表达一种关于历史过程的观点……这种观点认为，一切重要历史事件的终极原因和伟大动力是社会的经济发展，是生产方式和交换方式的改变，是由此产生的社会之划分为不同的阶级，是这些阶级彼此之间的斗争。”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;阶级斗争是阶级利益根本冲突的对抗阶级之间的对立和斗争；阶级斗争对阶级社会发展的推动作用突出地表现在社会形态的更替中。&lt;/li&gt;&#xA;&lt;li&gt;革命根源于社会基本矛盾的尖锐化。&lt;/li&gt;&#xA;&lt;li&gt;科技革命是推动经济和社会发展的强大杠杆&#xA;&lt;ul&gt;&#xA;&lt;li&gt;马克思：“伟大的历史杠杆”，“最明显的字面意义而言的革命力量”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;科技革命的影响：首先，对生产方式产生了深刻影响；其次，对生活方式产生了巨大影响；最后，促进了思维方式的变革。&lt;/li&gt;&#xA;&lt;li&gt;文化对社会发展的影响：第一，文化为社会发展提供思想指引；第二，文化为社会发展提供精神动力；第三，文化为社会发展提供凝聚力量。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;人民群众在历史发展中的作用&#34;&gt;人民群众在历史发展中的作用&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;人民群众是历史的创造者（唯物史观中的群众史观）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;马克思：“人的本质不是单个人所固有的抽象物，在其现实性上，它是一切社会关系的总和”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;人的本质属性是社会属性。&lt;/li&gt;&#xA;&lt;li&gt;人民群众在创造历史过程中的决定作用：人民群众是社会物质财富的创造者；人民群众是社会精神财富的创造者；人民群众是社会变革的决定力量。&lt;/li&gt;&#xA;&lt;li&gt;人民群众创造历史的活动受到一定社会历史条件的制约：经济条件，政治条件，精神文化条件&lt;/li&gt;&#xA;&lt;li&gt;马克思主义群众观点：坚信人民群众自己解放自己的观点，全心全意为人民服务的观点，一切向人民群众负责的观点，虚心向人民群众学习的观点。&lt;/li&gt;&#xA;&lt;li&gt;群众，阶级，政党，领袖环环相扣，构成一个有机整体&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;资本主义的本质及规律&#34;&gt;资本主义的本质及规律&lt;/h1&gt;&#xA;&lt;h2 id=&#34;商品经济和价值规律&#34;&gt;商品经济和价值规律&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;商品经济是以交换为目的而进行生产的经济形式，是一定社会历史条件的产物。商品经济得以产生的社会&lt;strong&gt;历史条件&lt;/strong&gt;有两个：一是存在社会分工，二是生产资料和劳动产品属于不同的所有者。&lt;/li&gt;&#xA;&lt;li&gt;商品是用来交换、能满足人的某种需要的劳动产品，具有使用价值和价值两个因素或两种属性，是使用价值和价值的矛盾统一体。使用价值和价值对立统一。&lt;/li&gt;&#xA;&lt;li&gt;价值是交换价值的基础，交换价值是价值的表现形式。&lt;/li&gt;&#xA;&lt;li&gt;商品是劳动产品，生产商品的劳动具有二重性，即具体劳动和抽象劳动。&lt;/li&gt;&#xA;&lt;li&gt;劳动生产率指的是劳动者生产使用价值的效率。&lt;/li&gt;&#xA;&lt;li&gt;货币：商品内在的使用价值和价值的矛盾转化为为商品和货币的外在矛盾。&lt;/li&gt;&#xA;&lt;li&gt;价值规律：商品的平均价格和价值是相一致的。&lt;/li&gt;&#xA;&lt;li&gt;价值规律的作用：第一，自发地调节生产资料和劳动力在社会各生产部门之间的分配比例；第二，自发地刺激社会生产力的发展；第三，自发地调节社会收入的分配。&lt;/li&gt;&#xA;&lt;li&gt;价值规律的消极后果：导致社会资源浪费；阻碍技术进步；导致收入两极分化。&lt;/li&gt;&#xA;&lt;li&gt;私人劳动和社会劳动的矛盾是商&#xA;品经济的基本矛盾。社会性质：由社会分工决定；私人性质：由生产资料私有制决定。这个矛盾是商品经济其他一切矛盾的基础。具体劳动能否还原为抽象劳动，在根本上取决于私人劳动和社会劳动能否实现统一。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;马克思：“商品拜物教”：人与人之间一定的社会关系被物与物的关系所掩盖&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;马克思劳动价值论的理论和实践意义：第一，马克思劳动价值论扬弃了英国古典政治经济学的观点，为剩余&#xA;价值论的创立奠定了基础（马克思：“理解政治经济学的枢纽”）；第二，马克思劳动价值论揭示了私有制条件下商品经济的基本矛盾，为从物与物的关系背后揭示人与人的关系提供了理论依据。第三，马克思劳动价值论揭示了商品经济的一般规律，对理解社会主义市场经济具有指导意义。&lt;/li&gt;&#xA;&lt;li&gt;马克思主义政治经济学是经济学上的一场深刻革命，它站在无产阶级立场，运用辩证唯物主义和历史唯物主义的科学方法，批判继承了英国古典政治经济学的合理成分，创立了科学的劳动价值论和剩余价值论，深刻揭示了资本主义生产和剥削的秘密，揭露了无产阶级与资产阶级之间阶级对立和斗争的经济根源，论证了资本主义必然灭亡和社会主义必然胜利的客观规律，指明了无产阶级的历史使命是推翻资本主义制度和建立社会主义制度，最终实现共产主义。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;资本主义经济制度&#34;&gt;资本主义经济制度&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;劳动力成为商品的两个基本条件：其一，劳动者在法律上是自由人，能够把自己的劳动力当作自己的商品来支配；其二，劳动者没有任何生产资料，没有生活资料来源，因而不得不依靠出卖劳动力为生。实质上是剥削工人的雇佣劳动关系。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;马克思：“劳动力的价值，是由生产、发展、维持和延续劳动力所必需的生活必需品的价值决定的。”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;资本主义生产过程具有二重性：一方面是生产物质资料的劳动过程；另一方面是生产剩余价值的过程，即价值增殖过程。&lt;/li&gt;&#xA;&lt;li&gt;绝对剩余价值是指在必要劳动时间不变的条件下，由于延长工作日的长度或提高劳动强度而生产的剩余价值。&lt;/li&gt;&#xA;&lt;li&gt;相对剩余价值是指在工作日长度不变的条件下，通过缩短必要劳动时间而相对延长剩余劳动时间所生产的剩余价值。&lt;/li&gt;&#xA;&lt;li&gt;把剩余价值转化为资本，或者说，剩余价值的资本化，就是资本积累。资本积累是资本主义扩大再生产的源泉。&lt;/li&gt;&#xA;&lt;li&gt;资本循环是资本从一种形式出发，经过一系列形式的变化，又回到原来出发点的运动。资本的周转。&lt;/li&gt;&#xA;&lt;li&gt;剩余价值理论深刻揭露了资本主义生产关系的剥削本质，阐明了资产阶级与无产阶级之间阶级斗争的经济根源，指出了无产阶级革命的历史必然性。&lt;/li&gt;&#xA;&lt;li&gt;资本主义基本矛盾：生产社会化和生产资料资本主义私人占有之间的矛盾。&lt;/li&gt;&#xA;&lt;li&gt;资本主义发展到一定阶段，就会发生以（相对）生产过剩为基本特征的经济危机。&lt;/li&gt;&#xA;&lt;li&gt;资本主义经济危机具有周期性，这是由资本主义基本矛盾运动的阶段性决定的。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;（后续部分不是简答题和辨析题的要点，故不作整理）&lt;/p&gt;</description>
			</item>
			<item>
				<title>抽象代数速成</title>
				<link>https://g0g.top/2025/05/%E6%8A%BD%E8%B1%A1%E4%BB%A3%E6%95%B0/</link>
				<pubDate>Wed, 28 May 2025 18:00:00 +0800</pubDate>
				<guid>https://g0g.top/2025/05/%E6%8A%BD%E8%B1%A1%E4%BB%A3%E6%95%B0/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;此文尚未完工，可能还会有重大改动或者被废弃&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;群&#34;&gt;群&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;关系：有序对集合&#xA;&lt;ul&gt;&#xA;&lt;li&gt;等价：反身，对称，传递&lt;/li&gt;&#xA;&lt;li&gt;等价类 $[a]$，等价关系商集，分类/划分&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;群&#xA;&lt;ul&gt;&#xA;&lt;li&gt;代数运算&lt;/li&gt;&#xA;&lt;li&gt;群：代数运算，结合律，单位元，逆元&lt;/li&gt;&#xA;&lt;li&gt;交换群，有限群&lt;/li&gt;&#xA;&lt;li&gt;性质：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单位元唯一，逆元唯一，消去律成立&lt;/li&gt;&#xA;&lt;li&gt;方幂的指数法则&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;充要条件1：结合，左单位，左逆&lt;/li&gt;&#xA;&lt;li&gt;充要条件2：结合，$ax=b, ya=b$ 有解&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;子群 $H&amp;lt;G$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;平凡：$G, \lbrace e\rbrace$&lt;/li&gt;&#xA;&lt;li&gt;性质：$H,G$ 单位元相同，逆元相同&lt;/li&gt;&#xA;&lt;li&gt;充要条件1：$ab\in H, a^{-1}\in H$&lt;/li&gt;&#xA;&lt;li&gt;充要条件2：$ab^{-1}\in H$&lt;/li&gt;&#xA;&lt;li&gt;充要条件3：有限，$ab\in H$&lt;/li&gt;&#xA;&lt;li&gt;子群的交是子群，子群并是子群&amp;lt;=&amp;gt;包含，子群乘积是子群&amp;lt;=任一正规&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;同构 $\cong$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;同态：$\forall a,b\in G, \phi(ab)=\phi(a)\phi(b)$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单位元、逆元对应&lt;/li&gt;&#xA;&lt;li&gt;$\operatorname{ord}(\phi(a)) \mid \operatorname{ord}(a)$&lt;/li&gt;&#xA;&lt;li&gt;子群、正规子群保持&lt;/li&gt;&#xA;&lt;li&gt;$\ker \phi = \phi^{-1}(e&amp;rsquo;) = \lbrace x\in G \mid \phi(x) = e&amp;rsquo;\rbrace  \triangleleft G$&lt;/li&gt;&#xA;&lt;li&gt;循环群 $\langle g\rangle$ 的同态由 $\phi(g)$ 确定&lt;/li&gt;&#xA;&lt;li&gt;自然同态 $G \to G/H: a \to \bar{a}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;同构：一一映射的同态&#xA;&lt;ul&gt;&#xA;&lt;li&gt;恒等同构 $\iota$&lt;/li&gt;&#xA;&lt;li&gt;$\phi(e)=e&amp;rsquo;$, $\phi(a^{-1})=a&amp;rsquo;^{-1}$, $\phi^{-1}$ 是同构映射&lt;/li&gt;&#xA;&lt;li&gt;同构是等价关系&lt;/li&gt;&#xA;&lt;li&gt;判定：构造 $\phi$，同态+单满&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;群同态基本定理：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;若 $\phi: G\to G&amp;rsquo;$ 满，则 $G/\ker \phi \cong G&amp;rsquo;$ - 满同态的集合结构（并非同构）：$\ker \phi \times G&#39;$&lt;/li&gt;&#xA;&lt;li&gt;$HK/K \cong H/(H\cap K)$ （$H$ 不需要正规）- $HK$ 的结构：$K \times (H/(H\cap K))$&lt;/li&gt;&#xA;&lt;li&gt;$(G/N)/(K/N)\cong G/K$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;阶&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$\operatorname{ord}(a) = \min\lbrace r\rbrace \quad\text{s.t.}\quad a^r=e$&lt;/li&gt;&#xA;&lt;li&gt;$\operatorname{ord}(a)\mid|G|$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;循环群&#xA;&lt;ul&gt;&#xA;&lt;li&gt;存在 $a$ 使 $G=\langle a\rangle$&lt;/li&gt;&#xA;&lt;li&gt;$a^r$ 是生成元 $\Leftrightarrow$ $r, |G|$ 互素；$G$ 恰有 $\phi(n)$ 个生成元&lt;/li&gt;&#xA;&lt;li&gt;$\langle a^r\rangle = \langle a^{gcd(r,n)}\rangle$&lt;/li&gt;&#xA;&lt;li&gt;结构：无限 $\cong(\mathbb{Z},+)$, 有限 $\cong(\mathbb{Z_n},+)$；子群是循环群（推论：$\langle a\rangle$ 的子群为 $\lbrace\langle a^d\rangle | d|\operatorname{ord}(a)\rbrace$ ）&lt;/li&gt;&#xA;&lt;li&gt;循环群 $\langle g\rangle$ 的同态由 $\phi(g)$ 确定&lt;/li&gt;&#xA;&lt;li&gt;素数阶群是循环群（拉格朗日定理）（2.2.23 $pq$ 阶群是循环群）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;置换群&#xA;&lt;ul&gt;&#xA;&lt;li&gt;每一个有限群同构于一个置换群&lt;/li&gt;&#xA;&lt;li&gt;$n$次置换群 $S_n$ 的阶是 $n!$。&lt;/li&gt;&#xA;&lt;li&gt;$\tau\sigma\tau^{-1} = \left(\begin{array}{} \tau(1) &amp;amp; \tau(2) &amp;amp;\cdots &amp;amp;\tau(n) \newline  \tau(\sigma(1)) &amp;amp; \tau(\sigma(2)) &amp;amp;\cdots &amp;amp;\tau(\sigma(n)) \end{array}\right)$&lt;/li&gt;&#xA;&lt;li&gt;轮换 $(i_1i_2\cdots i_n)$&lt;/li&gt;&#xA;&lt;li&gt;$(a,b)=(1,a)(1,b)(1,a)$&lt;/li&gt;&#xA;&lt;li&gt;不相交的轮换是可以交换的，每一个置换可（唯一）表为一些不相交轮换的乘积&lt;/li&gt;&#xA;&lt;li&gt;每个置换都可表为对换的乘积&lt;/li&gt;&#xA;&lt;li&gt;奇偶置换，将一个置换表示为对换的乘积，所用对换个数奇偶性唯一&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;子群&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$gA=gB\Leftrightarrow A=B \Leftrightarrow Ag=Bg$&lt;/li&gt;&#xA;&lt;li&gt;$H\cdot H = H$&lt;/li&gt;&#xA;&lt;li&gt;$A,B$ 是子群，$AB$ 是子群 $\Leftrightarrow AB=BA$&lt;/li&gt;&#xA;&lt;li&gt;陪集 $aH$ （$H$ 是子群，非正规时，陪集结构比较丑陋）；陪集集 $G/H=\lbrace gH|g\in G\rbrace$&lt;/li&gt;&#xA;&lt;li&gt;$aH=H$ $\Leftrightarrow$ $aH$ 为群 $\Leftrightarrow$ $a\in H$&lt;/li&gt;&#xA;&lt;li&gt;$aH=bH \Leftrightarrow a\in H$&lt;/li&gt;&#xA;&lt;li&gt;拉格朗日定理：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$H$ 在 $G$ 中的指数 /  $H$ 陪集个数  $[G : H] = |G/H| = |H \backslash G| = \frac{|G|}{|H|}$&lt;/li&gt;&#xA;&lt;li&gt;一个元素的阶都是 $|G|$ 的因子&lt;/li&gt;&#xA;&lt;li&gt;$[G : K] = [G : H][H : K]$&lt;/li&gt;&#xA;&lt;li&gt;$|A||B| = |AB||A\cap B|$ （证明：构造 $A/A\cap B \to A/B: x(A\cap B)\mapsto xB$）&lt;/li&gt;&#xA;&lt;li&gt;费马定理：$a^{p-1}\equiv1\mod p$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;正规子群&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$H\triangleleft G$ : $\forall a\in G, aH = Ha$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;平凡：$G,\lbrace e\rbrace$；只有平凡正规子群的是单群&lt;/li&gt;&#xA;&lt;li&gt;交换群的子群是正规子群&lt;/li&gt;&#xA;&lt;li&gt;正规子群的子群是正规子群&lt;/li&gt;&#xA;&lt;li&gt;正规子群的交、积是正规子群&lt;/li&gt;&#xA;&lt;li&gt;$[G:H]=2 \Rightarrow H\triangleleft G$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;判定：$\forall a\in G, aha^{-1}\in H$&lt;/li&gt;&#xA;&lt;li&gt;商群：陪集 $aH$ 集合，$|G/H|=[G:H]=\frac{|G|}{|H|}$ （可以考虑成 $\cong \lbrace a\rbrace$）&lt;/li&gt;&#xA;&lt;li&gt;tip：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对置换群，利用 $\tau\sigma\tau^{-1}$&lt;/li&gt;&#xA;&lt;li&gt;$\forall \sigma\in G, H\triangleleft G$, 有 $\sigma^{[G:H]}\in H$&lt;/li&gt;&#xA;&lt;li&gt;交换群&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;直积&#xA;&lt;ul&gt;&#xA;&lt;li&gt;外直积： $G_1 \times G_2$ or $G_1 \oplus G_2$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$|G_1\times G_2| = |G_1||G_2|$&lt;/li&gt;&#xA;&lt;li&gt;$\operatorname{ord}(a,b)=lcm(\operatorname{ord}(a),\operatorname{ord}(b))$&lt;/li&gt;&#xA;&lt;li&gt;$\langle m \rangle \times \langle n \rangle$ 循环 $\Leftrightarrow$ $gcd(\operatorname{ord}(m), \operatorname{ord}(n)) = 1$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;内直积：$HK$ if $H\cap K = \lbrace e\rbrace , H,K\triangleleft G$&lt;/li&gt;&#xA;&lt;li&gt;内直积充要条件：$G$ 中每个元素唯一表示为 $hk$，且 $h,k$ 可交换 （证明：考虑 $hkh^{-1}k^{-1}\in H\cap K = \lbrace{e}\rbrace$）&lt;/li&gt;&#xA;&lt;li&gt;内直积（若存在）同构于外直积&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;环 $(R,+,\cdot)$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$(R,+)$ 交换群，乘法结合律、分配律成立&lt;/li&gt;&#xA;&lt;li&gt;单位：乘可逆元（注意和单位元区别）&lt;/li&gt;&#xA;&lt;li&gt;子环 $S&amp;lt;R$：加法封闭，乘法封闭&lt;/li&gt;&#xA;&lt;li&gt;无零因子：乘消去律成立&lt;/li&gt;&#xA;&lt;li&gt;整环：无零因子，有单位元，交换&lt;/li&gt;&#xA;&lt;li&gt;域：加交换群，去除0后为乘交换群（除0可逆的整环）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例：$\mathbb{C,R,Q},F[x],\mathbb{Q}[\sqrt{d}],Z_p$&lt;/li&gt;&#xA;&lt;li&gt;可定义除法 $a\div b=a\cdot b^{-1}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;理想 $I\triangleleft R$：加法封闭，乘法吸收，$IR\subseteq I$, $RI\subseteq I$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;充要条件：$a-b, ar, ra \in I$&lt;/li&gt;&#xA;&lt;li&gt;平凡：$\lbrace 0\rbrace , R$&lt;/li&gt;&#xA;&lt;li&gt;理想的交、和是理想&lt;/li&gt;&#xA;&lt;li&gt;主理想 $\langle a \rangle$ 为最小的含 $a$ 理想/带 $a$ 理想的交&#xA;&lt;ul&gt;&#xA;&lt;li&gt;交换环：$\langle a \rangle = \lbrace xa+ma, x\in R, m\in Z\rbrace$&lt;/li&gt;&#xA;&lt;li&gt;$R$ 有单位元：$\langle a \rangle =\lbrace xa,x\in R\rbrace$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;素理想：$a,b\in R, ab\in P \Rightarrow a\in P \text{ or } b\in P$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$R$ 有单位元、交换，则 $P$ 素 $\Leftrightarrow$ $R/P$ 是整环&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;极大理想 $M$：不存在理想 $N$, $M\subset N \subset R$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$R$ 有单位元、交换，则 $P$ 极大 $\Leftrightarrow$ $R/P$ 是域&lt;/li&gt;&#xA;&lt;li&gt;$R$ 有单位元、交换，则 $P$ 极大 $\Rightarrow$ $P$ 素&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;商环 $R/I$：由+交换，$I$ 显然正规&lt;/li&gt;&#xA;&lt;li&gt;环同态：加乘同态&#xA;&lt;ul&gt;&#xA;&lt;li&gt;整数乘、整数幂次同态，乘单位&lt;/li&gt;&#xA;&lt;li&gt;满同态：$\phi(e)=e&amp;rsquo;$；$R&amp;rsquo;$ 无零因子，$\phi(e)=e&amp;rsquo; \text{ or } 0$；若 $\phi(e_1)=e_1&#39;$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;中国剩余定理：若 $R$ 单位且交换，$I,J$ 是理想，$I+J=R$，则&#xA;&lt;ol&gt;&#xA;&lt;li&gt;$I\cap J = IJ$&lt;/li&gt;&#xA;&lt;li&gt;$R/IJ \cong R/I \times R/J$&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;特征 $\operatorname{Char}\ R = \min\lbrace n | \forall a\in R, na=0, n\in \mathbb{N}^*\rbrace$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$R$ 有单位元，$\operatorname{Char}(R)=\operatorname{ord}(e)$&lt;/li&gt;&#xA;&lt;li&gt;Char 整环 是素数&lt;/li&gt;&#xA;&lt;li&gt;$F$ 是域，则有子域 $F&amp;rsquo;\cong Z_{\operatorname{Char}\ F}$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;奇怪的群&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$G$ （群/环）的中心 $C(G)$：$\lbrace g | gx=xg. \forall x \in G\rbrace$ 是子群/子环&lt;/li&gt;&#xA;&lt;li&gt;$G$ 的内自同构群 $\operatorname{Inn}(G)=\lbrace f(x)=gxg^{-1} | g\in G\rbrace$ 是自同构群 $\operatorname{Aut}(G)$ 的正规子群，$\operatorname{Aut}(G) / \operatorname{Inn}(G) = \operatorname{Out}(G)$ 为外自同构群&lt;/li&gt;&#xA;&lt;li&gt;$GL_n$: $n$ 阶可逆矩阵乘法群；$SL_n$: $n$ 阶行列式 1 矩阵乘法群&lt;/li&gt;&#xA;&lt;li&gt;生成子群 $\langle S\rangle = \cap _{S\subseteq H&amp;lt;G} H, S\subseteq G$&#xA;&lt;ul&gt;&#xA;&lt;li&gt;若 $S=\lbrace s_1,&amp;hellip;s_n\rbrace$，记 $\langle S\rangle = \langle s_1&amp;hellip;s_n\rangle$&lt;/li&gt;&#xA;&lt;li&gt;$S=\lbrace s_1^{l_1}&amp;hellip;s_k^{l_k} | s_1&amp;hellip;s_k\in S, l_i\in \mathbb{Z}\rbrace$ (tip: $s_i, s_j$ 可重复（不交换）)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;变换群：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;令 $S_X$ 为 $X$ 中所有可逆变换组成的集合，$S_X$ 关于变换合成构成群，称为对称群&lt;/li&gt;&#xA;&lt;li&gt;$S_X$ 的子群为变换群&lt;/li&gt;&#xA;&lt;li&gt;凯莱定理：每个群都同构于一个变换群 $G_\mathcal{l} = \lbrace \phi_a(x)=ax|a\in G\rbrace$&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;$p$ 素，$Z^\star_p$ 是 $p-1$ 阶循环群&lt;/li&gt;&#xA;&lt;li&gt;$n$次置换群 $S_n$ 的阶是 $n!$。&lt;/li&gt;&#xA;&lt;li&gt;$A_n$ 偶置换构成 $S_n$ 的一个子群称为 $n$ 次交错群&lt;/li&gt;&#xA;&lt;li&gt;整数环的理想：找到最小元，构成主理想&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;方法论&#xA;&lt;ul&gt;&#xA;&lt;li&gt;集合相等：包含且被包含（某方向可用 $|G|$ 相等替代） / 单射+满射&lt;/li&gt;&#xA;&lt;li&gt;没思路：数学归纳法&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>lug 源码速览</title>
				<link>https://g0g.top/2025/02/lug/</link>
				<pubDate>Mon, 24 Feb 2025 09:37:00 +0800</pubDate>
				<guid>https://g0g.top/2025/02/lug/</guid>
				<description>&lt;p&gt;lug 是 sjtug mirror 最为核心一个组件。其主要功能是定时跑脚本；功能很简单，代码量不少，结构很是清晰。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── Dockerfile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── LICENSE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── README.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── cli/lug&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── license.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── main.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── go.mod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── go.sum&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── pkg&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   └── config.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── exporter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   └── exporter.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── helper&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   ├── disk_usage.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   └── max_length_slice.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── manager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   ├── json_rest.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   └── manager.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── worker&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── executor.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── executor_invoke_worker.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── external_worker.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── shell_script_executor.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── utilities.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── utility_rlimit.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        └── worker.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;p&gt;先从入口开始吧。入口位于 cli/lug，&lt;code&gt;licence.go&lt;/code&gt; 由 &lt;code&gt;scripts/gen_license.sh&lt;/code&gt; （从被 git ignore 的 &lt;code&gt;vendor/&lt;/code&gt;）生成，看起来像是圣遗物&amp;hellip;主要的还是 &lt;code&gt;main.go&lt;/code&gt;。&lt;/p&gt;</description>
			</item>
			<item>
				<title>离散数学笔记</title>
				<link>https://g0g.top/2025/01/%E7%A6%BB%E6%95%A3%E6%95%B0%E5%AD%A6/</link>
				<pubDate>Wed, 15 Jan 2025 14:00:00 +0800</pubDate>
				<guid>https://g0g.top/2025/01/%E7%A6%BB%E6%95%A3%E6%95%B0%E5%AD%A6/</guid>
				<description>&lt;ul&gt;&#xA;&lt;li&gt;&amp;ldquo;x&amp;gt;y&amp;rdquo; 并非命题&lt;/li&gt;&#xA;&lt;li&gt;简单命题/原子命题：不含联结词的命题&lt;/li&gt;&#xA;&lt;li&gt;P→Q 中，P 为前件/前项/条件，Q 为后件/后项/结论&lt;/li&gt;&#xA;&lt;li&gt;代入规则：从简单到复杂&lt;/li&gt;&#xA;&lt;li&gt;⊽ 异或 ↑与非 ↓或非&lt;/li&gt;&#xA;&lt;li&gt;除非：¬P→Q&lt;/li&gt;&#xA;&lt;li&gt;悖论并非命题&lt;/li&gt;&#xA;&lt;li&gt;推理形式：由前提和结论经蕴涵词联结而成的；正确的：重言的&lt;/li&gt;&#xA;&lt;li&gt;等值：AB共同的命题变项任一解释，且不同的命题变项任意解释，真值相同&lt;/li&gt;&#xA;&lt;li&gt;等值定理：A=B ⇔ A↔B&lt;/li&gt;&#xA;&lt;li&gt;置换规则：等值可任意替换&lt;/li&gt;&#xA;&lt;li&gt;等值公式：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;分配律：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;P∨(Q∧R) = (P∨Q)∧(P∨R)&lt;/li&gt;&#xA;&lt;li&gt;P∧(Q∨R) = (P∧Q)∨(P∧R)&lt;/li&gt;&#xA;&lt;li&gt;P→(Q→R) = (P→Q)→(P→R)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;吸收律&#xA;&lt;ul&gt;&#xA;&lt;li&gt;P∨(P∧Q) = P&lt;/li&gt;&#xA;&lt;li&gt;P∧(P∨Q) = P&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;前提合并 P→(Q→R) = (P∧Q)→R = Q→(P→R)&lt;/li&gt;&#xA;&lt;li&gt;(P→R)∧(Q→R) = (P∨Q)→R&lt;/li&gt;&#xA;&lt;li&gt;归谬论 (P→Q)∧(P→¬Q) = ¬P&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;n 元联结词个数：2^2^n&lt;/li&gt;&#xA;&lt;li&gt;基底：完备，联结词不能相互表示；元素不超过3个&lt;/li&gt;&#xA;&lt;li&gt;¬A = A*⁻；A〜A⁻，¬A〜A* （证明尽量避免星号）&lt;/li&gt;&#xA;&lt;li&gt;推理演算：前提引入，结论引用，代入规则，置换规则，分离规则，条件证明规则/附加前提&lt;/li&gt;&#xA;&lt;li&gt;归结证明：子句集，归结&lt;/li&gt;&#xA;&lt;li&gt;形式化&#xA;&lt;ul&gt;&#xA;&lt;li&gt;有的 A 是 B：(∃x)(A(x)∧B(x))&lt;/li&gt;&#xA;&lt;li&gt;A 都是 B 的：(∀x)(A(x)→B(x))&lt;/li&gt;&#xA;&lt;li&gt;仅当 A 才 B: B→A&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;集合论&#34;&gt;集合论&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;外延表示法：0,1,2 或 0,1,2,&amp;hellip; 或 0,1,2,&amp;hellip;,7,8,9&lt;/p&gt;</description>
			</item>
			<item>
				<title>Flattened Device Tree Blob</title>
				<link>https://g0g.top/2025/01/fdt/</link>
				<pubDate>Tue, 14 Jan 2025 14:00:00 +0800</pubDate>
				<guid>https://g0g.top/2025/01/fdt/</guid>
				<description>&lt;p&gt;Device Tree 是一个硬件系统的描述，是对于 ACPI 的一个静态、轻量级的平替。它在定制主板/PCB的 ARM 和 RISC-V 系统上广泛使用；但在一些传统技术积累深厚的平台和兼容 UEFI 的系统上 ACPI 仍是更常见的选择。&lt;/p&gt;&#xA;&lt;p&gt;当 Kernel 被 boot 时，它首先得通过 ACPI 或 Device Tree 获得设备信息，&lt;strong&gt;尤其是&lt;/strong&gt;内存和 CPU 信息；有了这些信息内核才能初始化内存子系统、内核堆、任务队列等最最基础的内核模块。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://devicetree-specification.readthedocs.io/en/stable/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Device Tree&lt;/a&gt; 和 &lt;a href=&#34;https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/index.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;ACPI&lt;/a&gt; 都有网页版的规范文件，光看篇幅就能看出 Device Tree 相当简单，而 ACPI 功能丰富。&lt;/p&gt;&#xA;&lt;p&gt;Flattened Device Tree Blob (FDT/DTB) 则是 bootloader 传递给 kernel 的 Device Tree 二进制编码，这是本文的主角，由 spec 的第五章描述；但要能解析 FDT 还是得看完整个 spec。&lt;/p&gt;&#xA;&lt;h2 id=&#34;基本结构&#34;&gt;基本结构&lt;/h2&gt;&#xA;&lt;p&gt;它通过类似 JSON 的树状结构描述设备树。不同于 JSON 的超多类型，Device Tree 只由两种元素构成：Node 和 Property。Node 是一个带名字的子元素列表，而 Property 是一个键值对，其中值由一串 &lt;code&gt;u32&lt;/code&gt; 构成（实质上类似 void*，由驱动自行解析内容）。可以描述如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>原子操作与内存顺序</title>
				<link>https://g0g.top/2025/01/%E5%8E%9F%E5%AD%90%E6%93%8D%E4%BD%9C%E4%B8%8E%E5%86%85%E5%AD%98%E9%A1%BA%E5%BA%8F/</link>
				<pubDate>Tue, 14 Jan 2025 14:00:00 +0800</pubDate>
				<guid>https://g0g.top/2025/01/%E5%8E%9F%E5%AD%90%E6%93%8D%E4%BD%9C%E4%B8%8E%E5%86%85%E5%AD%98%E9%A1%BA%E5%BA%8F/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;注：本文作于刚学完计算机组成时，对真实 CPU 设计理解较少，有不少事实错误与过度简化，但结论应当是没有问题的。仅供参考，欢迎交流。&lt;/p&gt;&#xA;&lt;p&gt;额外资料：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://users.cs.utah.edu/~aburtsev/cs5460/lectures/lecture13-memory-ordering/lecture13-memory-barriers.pdf&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;https://users.cs.utah.edu/~aburtsev/cs5460/lectures/lecture13-memory-ordering/lecture13-memory-barriers.pdf&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;https://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;当我第一次遇到“原子操作”&lt;/p&gt;&#xA;&lt;p&gt;曾经我刚接触原子操作时，产生了造自旋锁的梦；然而 Linus 的言论给我泼了一盆冷水：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In fact, I&amp;rsquo;d go even further: don&amp;rsquo;t ever make up your own locking routines. You will get the wrong,&#xA;whether they are spinlocks or not. You&amp;rsquo;ll get memory ordering wrong, or you&amp;rsquo;ll get fairness wrong,&#xA;or you&amp;rsquo;ll get issues like the above &amp;ldquo;busy-looping while somebody else has been scheduled out&amp;rdquo;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;当我兴致勃勃地搜索内存顺序——发现 C++ 规定多达六种顺序，网上的解释也五花八门。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.cppreference.com/w/cpp/atomic/memory_order&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;CPP Reference&lt;/a&gt; (解读: &lt;a href=&#34;https://liam.page/2021/06/06/memory-order-cpp-01/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;1&lt;/a&gt; &lt;a href=&#34;https://liam.page/2021/12/11/memory-order-cpp-02/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;2&lt;/a&gt; &lt;a href=&#34;https://liam.page/2021/12/14/memory-order-cpp-03/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;3&lt;/a&gt;) 定义了大量术语，包括 &lt;code&gt;sequenced-before&lt;/code&gt; &lt;code&gt;carries dependency&lt;/code&gt; &lt;code&gt;(simply/strongly) happen before&lt;/code&gt; &lt;code&gt;modification order&lt;/code&gt; &lt;code&gt;release sequence&lt;/code&gt; &lt;code&gt;dependency-ordered before&lt;/code&gt; &lt;code&gt;inter-thread happens-before&lt;/code&gt; &lt;code&gt;visible side-effects&lt;/code&gt;，建立了一个极其复杂、一看就是给编译器开发者而非普通开发者和 CPU 开发者写的依赖图模型。&lt;/p&gt;</description>
			</item>
			<item>
				<title>[Rust 每日一库] base64</title>
				<link>https://g0g.top/2024/11/base64/</link>
				<pubDate>Tue, 26 Nov 2024 19:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/11/base64/</guid>
				<description>&lt;p&gt;又功能一相当基础的小而美库&lt;/p&gt;&#xA;&lt;h2 id=&#34;核心功能&#34;&gt;核心功能&lt;/h2&gt;&#xA;&lt;p&gt;base64 库把核心功能在 &lt;code&gt;engine::Engine&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;trait&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Engine&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;internal_encode&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;mut&lt;/span&gt; [&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;internal_decoded_len_estimate&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;input_len&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Self&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;DecodeEstimate&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;internal_decode&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;mut&lt;/span&gt; [&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;decode_estimate&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;Self&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;DecodeEstimate&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ) -&amp;gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Result&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;DecodeMetadata&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;DecodeSliceError&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后它实现了一个 &lt;code&gt;GeneralPurpose&lt;/code&gt; 实现了这个 Trait&lt;/p&gt;&#xA;&lt;p&gt;值得注意的是它的实现用到了循环展开&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_be_bytes&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#1c01ce&#34;&gt;8&lt;/span&gt;].&lt;span style=&#34;color:#000&#34;&gt;try_into&lt;/span&gt;().&lt;span style=&#34;color:#000&#34;&gt;unwrap&lt;/span&gt;())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;internal_encode&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;mut&lt;/span&gt; [&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0x3F&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#177500&#34;&gt;// we read 8 bytes at a time (u64) but only actually consume 6 of those bytes. Thus, we need&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#177500&#34;&gt;// 2 trailing bytes to be available to read..&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;last_fast_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;len&lt;/span&gt;().&lt;span style=&#34;color:#000&#34;&gt;saturating_sub&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;last_fast_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;last_fast_index&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// Major performance wins from letting the optimizer do the bounds check once, mostly&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// on the output side&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;))];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;8&lt;/span&gt;)];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// Hand-unrolling for 32 vs 16 or 8 bytes produces yields performance about equivalent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// to unsafe pointer code on a Xeon E5-1650v3. 64 byte unrolling was slightly better for&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// large inputs but significantly worse for 50-byte input, unsurprisingly. I suspect&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// that it&amp;#39;s a not uncommon use case to encode smallish chunks of data (e.g. a 64-byte&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// SHA-512 digest), so it would be nice if that fit in the unrolled loop at least once.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// Plus, single-digit percentage performance differences might well be quite different&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// on different hardware.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;58&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;52&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;46&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;40&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;34&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;5&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;7&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;8&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;58&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;9&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;52&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;10&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;46&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;11&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;40&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;12&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;34&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;13&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;14&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;15&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;58&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;17&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;52&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;18&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;46&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;19&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;40&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;20&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;34&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;21&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;23&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;24&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;58&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;25&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;52&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;26&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;46&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;27&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;40&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;34&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;29&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;30&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;31&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;8&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#177500&#34;&gt;// Encode what&amp;#39;s left after the fast loop.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0x3F&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;len&lt;/span&gt;() &lt;span style=&#34;color:#000&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;len&lt;/span&gt;() &lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#177500&#34;&gt;// start at the first index not handled by fast loop, which may be 0.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;)];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;)];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[(&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            [((&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            [((&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[(&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#a90d91&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O3 优化下，x86_64 的汇编代码就是朴素的一堆 &lt;code&gt;mov&lt;/code&gt;, &lt;code&gt;and&lt;/code&gt; 和 &lt;code&gt;shr&lt;/code&gt;；arm 汇编倒是做了乱序处理；然而实测在 x86_64 (ryzen 6800h)&#xA;上展开与否并不会显著影响性能（提升平均 5% 左右且不稳定）。个人不是很喜欢这个做法&lt;/p&gt;</description>
			</item>
			<item>
				<title>SJTUG mirror-intel 源码浏览笔记</title>
				<link>https://g0g.top/2024/10/sjtug-mirror-intel/</link>
				<pubDate>Sun, 27 Oct 2024 15:30:00 +0800</pubDate>
				<guid>https://g0g.top/2024/10/sjtug-mirror-intel/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;此文尚未完工，可能还会有重大改动或者被废弃&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这个项目不知道为啥带个 “intel”。就当 intel 赞助了吧。&lt;/p&gt;&#xA;&lt;p&gt;mirror-intel 的工作流程大概是请求命中对应代理/缓存策略，若有缓存就返回缓存，没有就提交一个下载任务，然后反向代理。&lt;/p&gt;&#xA;&lt;p&gt;话不多说，开始看代码！&lt;/p&gt;&#xA;&lt;h2 id=&#34;repos&#34;&gt;Repos&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;crate::repos&lt;/code&gt; 里硬编码了所有 endpoint 的路由和处理方式。如果要加 endpoint 就要改这里。&lt;/p&gt;&#xA;&lt;h2 id=&#34;日志&#34;&gt;日志&lt;/h2&gt;&#xA;&lt;p&gt;开篇日志。本项目基于 tokio-rs/tracing 做日志；它通过 &lt;code&gt;crate::setup_log&lt;/code&gt; 函数绑定 stdout 并从环境读取日志格式配置。&lt;/p&gt;&#xA;&lt;h2 id=&#34;配置文件&#34;&gt;配置文件&lt;/h2&gt;&#xA;&lt;p&gt;本项目基于 &lt;a href=&#34;https://docs.rs/figment/latest/figment/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;figment&lt;/a&gt; 做配置文件。&lt;/p&gt;&#xA;&lt;p&gt;它从 &lt;code&gt;Rocket.toml&lt;/code&gt; 和 &lt;code&gt;mirror-intel.toml&lt;/code&gt; 两个文件中读取配置，项目也提供了模板配置文件。&lt;/p&gt;&#xA;&lt;p&gt;配置文件结构定义如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;/// Global application config.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Config&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Upstream endpoints for redirecting, reverse-proxying and caching.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;endpoints&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;Endpoints&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Github release related configs.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;github_release&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;GithubReleaseConfig&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// S3 storage to store cached files.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;s3&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;S3Config&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Path of temporary buffer directory.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;buffer_path&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;PathBuf&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// and other config items&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;/// Endpoints of origin servers.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Endpoints&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rust_static&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;homebrew_bottles&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;pypi_packages&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;fedora_iot&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;fedora_ostree&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;flathub&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;crates_io&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;dart_pub&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;guix&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;pytorch_wheels&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;linuxbrew_bottles&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sjtug_internal&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;flutter_infra&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;flutter_infra_release&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;github_release&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nix_channels_store&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;pypi_simple&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;opam_cache&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gradle_distribution&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Upstream override rules.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;overrides&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;Vec&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;EndpointOverride&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Paths starts with any of these prefixes will be unconditionally redirected to S3 storage.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;s3_only&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;Vec&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;/// Configuration for S3 storage.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;S3Config&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Name of the S3 storage.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// S3 endpoint of the storage service.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;endpoint&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Website endpoint of the S3 service.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;website_endpoint&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Bucket name.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bucket&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;/// Configuration for Github Release endpoint.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;GithubReleaseConfig&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Repositories allowed to be cached.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;///&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Accessing a repository that is not in this list will result in an unconditional redirect.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;allow&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;Vec&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;/// An upstream endpoint override rule.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;EndpointOverride&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Name of the rule.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;///&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Currently this field is only used for a descriptive purpose.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Pattern to match against the origin.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;///&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Note that only plain strings are supported, i.e. no regex, and substring matching is allowed.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;pattern&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Replacement for the matched pattern.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;replace&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;单配置文件解决一切！唯一不足就是 endpoint 列表硬编码在源码里，有的源需要特别处理，只好牺牲扩展性了。（不过 &lt;code&gt;simple_intel&lt;/code&gt; 感觉可以做成动态的列表）&lt;/p&gt;</description>
			</item>
			<item>
				<title>[Rust 每日一库] bitflags</title>
				<link>https://g0g.top/2024/10/bitfield/</link>
				<pubDate>Wed, 23 Oct 2024 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/10/bitfield/</guid>
				<description>&lt;p&gt;bitflags 在宏三大法器中抢夺出了前四名中的一席之地。它本身的功能相当简单。直接看代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;bitflags&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;bitflags!&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Flags&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u32&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;A&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000001&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;B&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000010&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;C&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000100&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或是&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Flags&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;u32&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;bitflags!&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;impl&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Flags&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u32&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;A&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000001&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;B&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000010&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;C&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000100&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后就可以把 &lt;code&gt;Flags&lt;/code&gt; 类似 &lt;code&gt;u128&lt;/code&gt; 一样计算使用，不同的是它基于 &lt;a href=&#34;https://docs.rs/bitflags/2.6.0/bitflags/trait.Flags.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;&lt;code&gt;Flags&lt;/code&gt;&lt;/a&gt;&#xA;trait 实现了一些好方法，如同官方 &lt;code&gt;slice&lt;/code&gt; 一样，让我们能够轻松使用。&lt;/p&gt;&#xA;&lt;p&gt;这是一种值得学习的范式：用 declarative macro 实现最小化扩展，然后用一个 trait 实现更多方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;宏&#34;&gt;宏&lt;/h2&gt;&#xA;&lt;p&gt;让我们深入看看 bitflags 的实际实现：教科书式的 declarative macro。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;$(#[$outer:meta]&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;$vis&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;vis&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#633820&#34;&gt;$BitFlags&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;ident&lt;/span&gt;: &lt;span style=&#34;color:#633820&#34;&gt;$T&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;ty&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#633820&#34;&gt;$(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#633820&#34;&gt;$(#[$inner:ident $($args:tt)*]&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#633820&#34;&gt;$Flag&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;tt&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#633820&#34;&gt;$value&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;expr&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;$($t&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;tt&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;首先它处理了内外的 metadata；以支持诸如嵌套 macro、文档注释、编译标记等额外信息。&lt;/p&gt;&#xA;&lt;p&gt;然后是逐步的函数式 declarative macro 实现。&lt;/p&gt;&#xA;&lt;p&gt;它在最后处理了额外的 Token Tree，以支持多类型定义。&lt;/p&gt;&#xA;&lt;p&gt;总之简单好用就完了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>[Rust 每日一库] hashbrown</title>
				<link>https://g0g.top/2024/10/hashbrown/</link>
				<pubDate>Wed, 23 Oct 2024 19:52:59 +0800</pubDate>
				<guid>https://g0g.top/2024/10/hashbrown/</guid>
				<description>&lt;p&gt;hashbrown 库是 Rust 转写的 Google SwissTable，算法细节可以看 &lt;a href=&#34;https://www.youtube.com/watch?v=ncHmEUmJZf4&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;CppCon talk&lt;/a&gt;。&#xA;它也是 1.36 之后版本的 Rust 标准库 HashTable 实现。&lt;/p&gt;&#xA;&lt;h2 id=&#34;layout&#34;&gt;Layout&lt;/h2&gt;&#xA;&lt;p&gt;大体架构上，它实现了一个 &lt;code&gt;RawTable&amp;lt;T&amp;gt;&lt;/code&gt;。不同于 CppCon 中提到的一个 ctrl 一个 bucket 两个向量，它的实现只用了一个 &lt;code&gt;ctrl&lt;/code&gt; 指针。&lt;/p&gt;&#xA;&lt;p&gt;源码中有以下说明：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       `self.table.ctrl.cast()` returns pointer that&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       points here (to the end of `T0`)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         ∨&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[Pad], T_n, ..., T1, T0, |CT0, CT1, ..., CT_n|, CTa_0, CTa_1, ..., CTa_m&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          \________  ________/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                   \/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      `n = buckets - 1`, i.e. `RawTable::buckets() - 1`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;where: T0...T_n  - our stored data;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       CT0...CT_n - control bytes or metadata for `data`.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       CTa_0...CTa_m - additional control bytes, where `m = Group::WIDTH - 1` (so that the search&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       with loading `Group` bytes from the heap works properly, even if the result&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       of `h1(hash) &amp;amp; self.bucket_mask` is equal to `self.bucket_mask`). See also&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       `RawTableInner::set_ctrl` function.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;P.S. `h1(hash) &amp;amp; self.bucket_mask` is the same as `hash as usize % self.buckets()` because the number&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;of buckets is a power of two, and `self.bucket_mask = self.buckets() - 1`.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本质上是 Grouped Vector，让人眼前一亮！这种做法感觉对缓存非常友好。&lt;/p&gt;</description>
			</item>
			<item>
				<title>[Rust 每日一库] 引言</title>
				<link>https://g0g.top/2024/10/%E7%9B%AE%E5%BD%95/</link>
				<pubDate>Tue, 22 Oct 2024 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/10/%E7%9B%AE%E5%BD%95/</guid>
				<description>&lt;p&gt;Rust 提供了 crates.io 作为官方在线库服务；不过即使是拥有 Rust 语言本身的高要求，crates.io 里已然有着和&#xA;npm registry 一样的毛病：不少库看似花哨，实际性能低下、包装过多、依赖繁重。&lt;/p&gt;&#xA;&lt;p&gt;本系列计划或浅或深地按照 crates.io 上热门排名的顺序，选择一些库进行试用和学习；不爽的点可能会批判；但不会深入探究用法和功能，对应需求建议参考对应库的&#xA;&lt;code&gt;examples/&lt;/code&gt; 文件夹。&lt;/p&gt;</description>
			</item>
			<item>
				<title>[中国翻訳] Rust 内联汇编 - Rust By Example</title>
				<link>https://g0g.top/2024/10/rust-%E5%86%85%E8%81%94%E6%B1%87%E7%BC%96/</link>
				<pubDate>Thu, 17 Oct 2024 21:44:59 +0800</pubDate>
				<guid>https://g0g.top/2024/10/rust-%E5%86%85%E8%81%94%E6%B1%87%E7%BC%96/</guid>
				<description>&lt;p&gt;原文： &lt;a href=&#34;https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Inline assembly - Rust By Example&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Rust 通过 &lt;code&gt;asm!&lt;/code&gt; 宏提供对内联汇编的支持。它能用来将手写汇编嵌入到编译器生成的汇编输出中。一般来说不必如此，除非有性能或时序需求无法通过其他方式实现。访问低级硬件原语（例如在内核代码里）也可能需要此功能。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;注：示例只给出了 x86/x86-64 汇编，但是其他架构也是支持的&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;内联汇编目前支持以下架构：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;x86 和 x86-64&lt;/li&gt;&#xA;&lt;li&gt;ARM&lt;/li&gt;&#xA;&lt;li&gt;AArch64&lt;/li&gt;&#xA;&lt;li&gt;RISC-V&lt;/li&gt;&#xA;&lt;li&gt;LoongArch&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;基础用法&#34;&gt;基础用法&lt;/h2&gt;&#xA;&lt;p&gt;我们从理论上最简单的例子开始：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;arch&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;asm&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;unsafe&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;asm!&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;nop&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会向编译器生成汇编中插入一个 NOP (无操作) 指令。注意，所有 &lt;code&gt;asm!&lt;/code&gt; 调用都需要在以一个 &lt;code&gt;unsafe&lt;/code&gt; 块内，毕竟它可能插入任意指令，然后破坏很多不变量。插入指令在 &lt;code&gt;asm!&lt;/code&gt;宏的第一个参数以字符串字面量的形式列出。&lt;/p&gt;&#xA;&lt;h2 id=&#34;输入和输出&#34;&gt;输入和输出&lt;/h2&gt;&#xA;&lt;p&gt;不过插入一个什么都不做的指令太无聊了。我们来实际动动数据：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;arch&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;asm&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;unsafe&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;asm!&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;mov {}, 5&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;out&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;reg&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;assert_eq!&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;, &lt;span style=&#34;color:#1c01ce&#34;&gt;5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会将值 &lt;code&gt;5&lt;/code&gt; 写入 &lt;code&gt;u64&lt;/code&gt; 变量 &lt;code&gt;x&lt;/code&gt;。可以看到，我们用来指定指令的字面量是一个模板。它约束于 Rust &lt;a href=&#34;https://doc.rust-lang.org/std/fmt/#syntax&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;格式字符串&lt;/a&gt;相同的规则；但是插入模板的参数看起来与所熟悉的略有不同。首先，我们需要明确变量是内联汇编的输入还是输出。在此例中，它是一个输出。我们通过写 &lt;code&gt;out&lt;/code&gt; 来声明。我们还需要明确汇编需要什么类型的寄存器来放置变量。在此例中，我们通过指定 &lt;code&gt;reg&lt;/code&gt; 将其放入任意通用寄存器中。编译器将选择合适的寄存器插入模板，并在内联汇编完成执行后以它为变量。&lt;/p&gt;&#xA;&lt;p&gt;让我们看看另一个还用到了一个输入的例子：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;arch&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;asm&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;unsafe&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;asm!&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;mov {0}, {1}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;add {0}, {number}&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;out&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;reg&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;in&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;reg&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;number&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;5&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;assert_eq!&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;, &lt;span style=&#34;color:#1c01ce&#34;&gt;8&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会将 &lt;code&gt;5&lt;/code&gt; 加到输入变量 &lt;code&gt;i&lt;/code&gt; 上，并将结果写入变量 &lt;code&gt;o&lt;/code&gt;。汇编的实现方式是首先将值从 &lt;code&gt;i&lt;/code&gt; 复制到输出，然后加上 &lt;code&gt;5&lt;/code&gt;。&lt;/p&gt;</description>
			</item>
			<item>
				<title>SJTU Xflops 一轮考核小记</title>
				<link>https://g0g.top/2024/10/xflops-%E8%80%83%E6%A0%B8%E5%B0%8F%E8%AE%B0/</link>
				<pubDate>Tue, 15 Oct 2024 15:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/10/xflops-%E8%80%83%E6%A0%B8%E5%B0%8F%E8%AE%B0/</guid>
				<description>&lt;p&gt;SJTU Xflops 招新啦！&lt;/p&gt;&#xA;&lt;p&gt;初见 &lt;a href=&#34;https://github.com/HPC-SJTU/Xflops2024_1st_exam/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;试题&lt;/a&gt;，就被充实的考试内容、详尽友好的&#xA;&lt;code&gt;readme.md&lt;/code&gt; 和几乎已完成的代码/测试/构建框架震撼了；Xflops 真是为了本次招新花了很大心思。向命题组致敬🫡！&lt;/p&gt;&#xA;&lt;p&gt;总共五题，涉及了 OpenMP/MPI 基础、简单算法编写、性能调优等知识。话不多说，直接开始做题！&lt;/p&gt;&#xA;&lt;h2 id=&#34;bithack&#34;&gt;Bithack&lt;/h2&gt;&#xA;&lt;p&gt;由于本人是按照字母顺序做题的，这是我最开始上手的一道题，是刚开始以为最简单的一道题（看题目资源限制看的），&#xA;却是最晚写完的，也是本人体感难度最高的一道题；这可能是因为我不太擅长搓算法，尤其是需要精细处理、仔细思考的那些（还是刷题少了）。&lt;/p&gt;&#xA;&lt;p&gt;由于题目要求不能开堆空间，最开始我想弄一个足够大的 buffer 然后 rotate 时写到 buffer 里然后一块块慢慢搬（如图）；然后发现一越界循环就寄了。&#xA;&lt;img src=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzoAAADDCAMAAAB9GpTKAAAAEXRFWHRTb2Z0d2FyZQBTbmlwYXN0ZV0Xzt0AAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAGzUExURcz/zP39/fz8/Pr6+vj4+AAAAP7+/v////n5+fv7+/Dw8Ofn57+/v2hoaD09PeHh4UFaM/f39yoqKlR6Rk2ATdfX12eaWYG0edLS0r3wu0NSO87QzFdXV2dnZ5iYmBEREWWWV1Z+SKjZmsDZsrjruLfrsLHZo/3+/NXmzMb5w+nq6OXv367ho7jZqjc3N6rcnbvZre306cj7yHd3d3ireGmcaWR1W2+haDg4OLPmse7u7tvb27u7u+Dh4O3t7Z6enr6+vikpKTAwMG59ZuLk4M3NzTU1NQQEBCwsLC4uLqGhod/f39DQ0NHR0WVlZcrLybS0tEFQOczOykJCQpubm4+PjzIyMtXV1YyMjO/v74qKiio6IrCwsE9PT8XFxfT09D8/P15eXpWVlVRUVNra2tbW1vb29uTk5Obm5hQYE62trWFhYThHMLe4tjo6OqmpqYCzdcPEwuvr6yQkJEtsPdjY2BwcHDNBLGibXmt2ZXeUaSY1HlyPVBokFE+CTURERDI3L1N4RQsMCnquckdlOardp15uVrLOpKLUlavPnXuibURgNq3gpW2gZdLczHWnc9jf1EXVHy8AAAnaSURBVHja7dzpWxvXFcdxSXOP5o6NgSF26ro4QOJubpuuadMgKMgBbMAsDgaHxS21W2q8Y5PES5ylaZbuf3Jf2OCBe8ZcWR2BNN/zTueZZ/jp3Pt5LhI8UwjDso1Ct4pqNwwPKb3IFtVuWekGajfsUHplG6hd4hL3AMQtMC3iEhc6xCUudFhc4kKHxSUudFhc4hIXOsQlLnSIS1zosLjEbQ46pVJkbMmtyAQlrd5ReoGJlK5N6aq3HdCaKcGIS9wDELdgjIljo5TeNRvel9Z02wmTzX2JS9yM4haiKDA2ckvvRtGg0rMm8O4atRtNqBGMdzDiErfBcfmsQ1zi8jUBcYkLHRaXuNBhcYkLHRaXuMSFDnGJCx3iEhc6LC5xocPiEhc6TIu4xIUOcYkLHeISFzosLnGhw+ISFzpMi7jEhQ5xiQsd4hIXOiwucaHD4hIXOkV74Tta3VV6F6YveHen71buHnerovTOj4yo3UmlOzlSadP6l9Vr9TucV7ojl4e0W9xU3+90TbMZeNethXcPO7XWsXZY6/5F6XZsam8iOd3Lbc9qqFJpcyute3t9SOnPJF9sz7G2zaC006Y76b0ZJo9rM9s8XMN0B1+ezunOrGpJmr6WMhtO88/mWmaz+biRb+PNPekMDm6c3hh0a6O/s/fVTKqvFej0ZTOb3lag80U2s3n1fkPpzCsmTidfvejU6f3btzOof/V9eTiD2hS5m8V952VF6b7xzT/rm8KpJ0+U6Z76+qu1+uIeUeM2dLr//epr7zG89eQ/3te+/s2/fSN01L0ZFj1OnRfR+W0hg/pN36/DDOqQyLEs7vu2dCvdH3zvu/VN4RdHj55yuz98/Y3v1xf3l2rchk735z/7qfcY3jr6K+9rf/yTH/lGMHVvhtegAx3oQAc60IEOdKADHehABzrQgQ50oAMd6EAHOtCBDnSgAx3oQAc60IEOdKADHehABzrQgQ50oAMd6EAHOtCBDnSgAx3oQAc60Dn4dKIoMDZyK4AOdPJMZ9Q1YUyQeFUwxsSxUQo60Mk1HZfETiiFUikytuRWBB3o5JqOa8Ka5Cs+60AHOnxNAB3oQAc60IEOdKADHehABzrQgQ50oAMd6EAHOtCBDnSgAx3oQAc60IEOdKADHehABzrQgQ50oAMd6EAHOtCBDnSgAx3oQAc60IEOdKCTHzpBYGMTuGWhA5080xl1TZg4+Yon4kAHOiqdPZ+IUyyWbFB0qwQd6OT6FzbXhLXJV3zWgQ50+JoAOtCBDnSgAx3oQAc60IEOdKADHehABzrQgQ50oAMd6EAHOtCBDnSgAx3oQAc60IEOdKADHehABzrQgQ50oAMd6EAHOtCBDnSgAx3oQCc/dKy1sbFu8VgP6OSazqhrIo6Tr3giDnSgo9LZ84k45XLRBmW3eCIOdPL9C5trwtrkKz7rQAc6fE0AHehABzrQgQ50oAMd6EAHOtCBDnSgAx3oQAc60IEOdKADHehABzrQgQ50oAMd6EAHOtCBDnSgAx3oQAc60IEOdKADHehABzrQgQ50oAOd4unO3r9+K4P6qG/2SAZ1XaQ7i/tek3tK98zf79Q3hTuPHyvTvXPnYZ1xq2rchk73wUP/2fQ+/sh/ZA8f+EaYqnsztHvQ6e/v37za79bVC52fvZJJ3V+Spq+l+/pbq3c2n3U2/2yu/SObffPKFx838m2cc01sbiZfpZ86h06oNevdPHHj0ZJy6Y0Pl7rcuqf0uoaHa+j29Gj3GK73th/0fKC0P1SncONz79nMPnr05Rm3Hpw5cnJ3TU1NnTypdE9q3U+0N5Gc7rWel6qxsT0v2ZrYp/obXppVN8MN7z02e+LTGtZyVZnOdXWOKdNdfPlf2NRuGB5SepEtat0/7n3obVeH0ivbQO1mFFcNVlPcFbnpGzflw0ND4zZ0uuvah7Cm3gzZ0hnNFZ0RkXnfuL8X+VOu6FRFFqADHT3uiojMQEeNuywiV6ADHTXueRHl2IFOGIZhWBVRjh3oQCcMw/CKiHLspNNZyBGdGRHt2IEOdMIwXHj6nWYVOsWUQ8c9aKEDne1Dxzl2oLN96LjHDnRSfvxreaKzsPWntCp00g4d59iBDnTCsHv7z9DL0NlVN7dncwU60NlV/c//g6MKnbRDZ/exA51UOvO5odOd+O+nZY+4fxY5nhc6NxOzWYEOdHbUseQ/Dlahs6PeTg7nPHSgk3bo7Dx2oFPZMZsV6EAnUZs7/199fu+4cX7o3No5nOPQgc7zWhURke5RuV7dfezkns7TQ6drSrpWx3YfO9BJ+fFzzp/WW5TOVRGR1WO2XS6Gy2dF5Oyecc2u3/pbl84tEbl3O5iTajgxJSIyCR3oJA6d1f6wbNvlYhiGy/PJYyfvdNpEzq6XtzbDxPWx5LEDnZzT6R9bnQjDbTphODM6DJ2tr9eq6zs2w9rU2GSL0CmXizYou1WyUVmr95VeZEtKN5iTqtu1Vr1th9ZUr80sri2WXy7uTP+za9vl4lZrc6+4IpP7FLeh0x1YdjbDwHprbIaCMSaOjVJ612x4XxrPyTnv2074R8gqbi231eO2yyXv+4pM73fchk639TZDwVobG+uWUbvWbnhfa+bknNuNY/W2E1pTvzaruLF/hJS47XLJO67I9H7Hbeh0W28zZPtZ51xe/iT6NNgfnn3W8Ym745umlv67TqtuBuhABzrQaS46I9CBTsqP/x10oNO6mwE60IHOAaRzFjrQgQ50oAMd6GSzF9+TS9DJzWaAzj7RGYMOdKADHegwLeiwGQ4AnXHpgk46nWnoQAc60IEOdKADHehA5+BMdxw60HkRnUXo5GYzZEtnGDrQgQ50oAMd6GSzFz+BTp7oFIslGxTd0rvF4vtKL7AlrTsuw27XWvW2A1pTvTazuGq3prjvyaJ33DG5vN9xGzrdcelqsc2Q5RNxxuXzdt96sz2bupXNbfW4PbJYwxNxqvsdt6HTHZauVnsiThDY2ARu6d0g2FB6JrZad1xyV4uec7Rx/mbTpW0cdY9NaM0adun/Ye+mdJOvsvysszbU5lalonXbbiu9oUqlzm5b24x3hFq6qXE7vH8bHzoIcRs63Wm+JmjVD7LEJS50iEtc6LC4xIUOi0tc6LC4xIUO0yIucaFDXOJCh8UlLnRYXOJCh8UlLnGhQ1ziQoe4xIUOi0tc6LC4xIUO0yIucaFDXOJCh7jEhQ6LS9xmolMqRcaW3IpMUNLqHaUXmEjp2pSuetsBrZkSjLjEPQBxC/v7VJEmewgKcYn7/Ik4URQYG7mld6NoUOlZE3h3jdqNJtQIxjsYcYnb4Lh81iEucfmagLjEhQ6LS1zosLjEhQ6LS1ziQoe4xIUOcYkLHRaXuM0R93/urNtPnZ5UbAAAAABJRU5ErkJggg==&#34; alt=&#34;废稿&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;遂放弃额外 buffer 的算法。Chatgpt 告诉我有个 in-place rotate 算法：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;reverse_vec&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;vec&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;left&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;right&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;reverse_vec&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;vec&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;left&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;rotate&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;reverse_vec&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;vec&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;rotate&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;right&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看起来十分可靠。感谢 Chatgpt！&lt;/p&gt;&#xA;&lt;p&gt;一分钟搓了一个基线 &lt;code&gt;reverse&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;reverse_the_bit_vector_slow&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;bit_vector_t&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bit_vector&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;size_t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bit_from&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;size_t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bit_to&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;bit_from&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bit_to&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;temp&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bit_vector_get&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;bit_vector&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;bit_from&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;bit_vector_set&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;bit_vector&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;bit_from&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;bit_vector_get&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;bit_vector&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;bit_to&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;bit_vector_set&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;bit_vector&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;bit_to&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;temp&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;bit_from&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;bit_to&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;--&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;看起来依旧开销满满，但成绩还不错，毕竟是真 O(n) 算法：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;check result: PASSED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;performance of -s: 27&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;performance of -m: 31&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;performance of -l: 36&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;------score--------&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-s : 65.00 /100&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-m : 68.18 /100&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-l : 72.00 /100&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;total score: 69.45 /100&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;距离满分还有大约 $1.618^7\approx30$ 倍的性能差距。那就优化常数吧！搓一个更快的 &lt;code&gt;reverse&lt;/code&gt; 函数。&lt;/p&gt;</description>
			</item>
			<item>
				<title>slurm 和 mpi 软核速成</title>
				<link>https://g0g.top/2024/09/slurm-%E9%80%9F%E6%88%90/</link>
				<pubDate>Sat, 28 Sep 2024 00:00:00 +0800</pubDate>
				<guid>https://g0g.top/2024/09/slurm-%E9%80%9F%E6%88%90/</guid>
				<description>&lt;p&gt;slurm 可以说是最亲民的跨系统任务调度器了，很多超算也在开心地使用它。因为它是 &amp;ldquo;Simple Linux Utility&#xA;for Resource Management&amp;rdquo;——Linux！谁不爱呢。&lt;/p&gt;&#xA;&lt;p&gt;它提供了三大功能：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;给用户分配互斥/非互斥的算力片段&lt;/li&gt;&#xA;&lt;li&gt;在分配的算力上启动、执行、监控任务的框架&lt;/li&gt;&#xA;&lt;li&gt;在资源不足时的任务队列管理&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;总结起来就是让你能在一堆计算节点上轻松地提交一个多进程任务。功能少，学起来也轻松。&lt;/p&gt;&#xA;&lt;p&gt;一个 slurm 系统中，有一个中央管理节点（sjtu hpc 叫他登录节点），还有一堆计算节点。每个计算节点都属于一个&#xA;partition （sjtu hpc 管他叫队列。一个 partition 会包括一堆节点），我们执行任务的时候可以（应当）指定 partition。&lt;/p&gt;&#xA;&lt;p&gt;大多数的操作可以借鉴 &lt;a href=&#34;https://docs.hpc.sjtu.edu.cn/job/slurm.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Slurm 作业调度系统 | 上海交大超算平台用户手册&lt;/a&gt; 和&#xA;&lt;a href=&#34;https://hpc.pku.edu.cn/_book/guide/slurm/slurm.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;提交作业 | 未名&lt;/a&gt;。&#xA;本文将关注于 batch file 的编写；写完后 &lt;code&gt;sbatch BATCHFILE &amp;amp;&amp;amp; watch -n0.5 squeue -l&lt;/code&gt; 一把梭就行。&lt;/p&gt;&#xA;&lt;h2 id=&#34;hello-world&#34;&gt;Hello, world&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;main.slurm&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;#SBATCH --job-name=hello-world # squeue/sacct 显示的任务名&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;#SBATCH --partition=arm128c256g # 选择 partition&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;#SBATCH --ntasks=4 # srun 并行数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;#SBATCH --nodes=1 # 使用节点数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;#SBATCH --ntasks-per-node=1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;#SBATCH --cpus-per-task=1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;#SBATCH --output=stdout&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;echo&lt;/span&gt; hello, world&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中，&lt;code&gt;#SBATCH&lt;/code&gt; 开头的是传给 sbatch 的参数，这样就可以避免手动输入。&lt;/p&gt;</description>
			</item>
			<item>
				<title>OpenMP 硬核速成</title>
				<link>https://g0g.top/2024/09/openmp-%E7%A1%AC%E6%A0%B8%E9%80%9F%E6%88%90/</link>
				<pubDate>Wed, 25 Sep 2024 00:00:00 +0800</pubDate>
				<guid>https://g0g.top/2024/09/openmp-%E7%A1%AC%E6%A0%B8%E9%80%9F%E6%88%90/</guid>
				<description>&lt;p&gt;OpenMP 是啥？官方&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;如是说：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The OpenMP® API is a scalable model that gives parallel programmers a simple and&#xA;flexible interface for developing portable parallel applications in C/C++ and Fortran.&lt;/p&gt;&#xA;&lt;p&gt;OpenMP is suitable for a wide range of algorithms running on multicore nodes and&#xA;chips, NUMA systems, GPUs, and other such devices attached to a CPU.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;它的功能相当简单，就是单进程/共享内存并行计算；具体包括&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;并行化形如 &lt;code&gt;for(int i=START; i&amp;lt;END; i++)&lt;/code&gt; 的循环/静态任务列表 (&lt;code&gt;#pragma omp for/sections&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;并行化动态任务 (&lt;code&gt;#pragma omp task&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;它的在 C 里的工作方式&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;类似于 Rust attribute-like macro：通过 &lt;code&gt;#pragma omp XXX&lt;/code&gt; 来把对应代码块通过&#xA;openmp 魔改，生成可并行代码。不同于 Rust 允许自定义 &lt;code&gt;proc-macro&lt;/code&gt; 来 hook ast 解析过程，openmp&#xA;需要编译器的原生支持；好在绝大多数的编译器都支持 openmp&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;</description>
			</item>
			<item>
				<title>用 Rust 扩展 Python | 数学建模加速尝试</title>
				<link>https://g0g.top/2024/09/rust-%E7%9A%84%E6%95%B0%E5%AD%A6%E5%BB%BA%E6%A8%A1%E5%B0%9D%E8%AF%95/</link>
				<pubDate>Sun, 08 Sep 2024 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/09/rust-%E7%9A%84%E6%95%B0%E5%AD%A6%E5%BB%BA%E6%A8%A1%E5%B0%9D%E8%AF%95/</guid>
				<description>&lt;p&gt;Python 在数学建模的数值求解上可以说是砍瓜切菜，但是有一个小问题：部分场合有点慢，尤其是涉及列表、ndarray 来回倒腾，循环，隐函数求解，&#xA;配合一个优化器之类的东西反复调用这个函数，运行起来奇慢无比。我们需要加速他，不然算不完啊！&lt;/p&gt;&#xA;&lt;p&gt;Rust 在科学计算上并没有 Python 里大而全的 scipy, sympy, matplotlib 等库，生态不够发达。如果我们能够将二者优势结合起来，&#xA;取 Python 的生态和 Rust 的速度，岂不美哉。&lt;/p&gt;&#xA;&lt;p&gt;在开始之前需要强调，实际效果还是看重写部分的关键程度。只要不是 100% Rust，就应当评估原 Python 部分所占最终时间的比例。只有当时间比例超过&#xA;50% 时，改写才是有意义的。&lt;/p&gt;&#xA;&lt;p&gt;本文经过测试，发现以下策略卓有成效：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;(?) 对于大 ndarray 的 numpy 直接向量化操作（重写性能差不多，没必要）&lt;/li&gt;&#xA;&lt;li&gt;(x200+) 长列表的复杂的数学计算和映射 (&lt;code&gt;[f(i) for i in arr]&lt;/code&gt;) 用 Rust 重写&lt;/li&gt;&#xA;&lt;li&gt;(x5-10) 热数学计算函数用 Rust 重写&lt;/li&gt;&#xA;&lt;li&gt;(x8)    用 Rust 重写”优化函数“&lt;/li&gt;&#xA;&lt;li&gt;(x4-10) 多个重任务的多线程分治&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;以下策略会适得其反：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;(x0.3) 用 Python 的 multiprocessing.pool.Pool&lt;/li&gt;&#xA;&lt;li&gt;(x0.9) 在 Rust 中频繁调用 Python 函数&lt;/li&gt;&#xA;&lt;li&gt;(?) 少量轻任务的的多线程分治&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;测试全部在个人设备上进行 (Python 3.12.5, Windows10, AMD Ryzen 9 7950X)&lt;/p&gt;</description>
			</item>
			<item>
				<title>Artalk 部署 (PostgreSQL)</title>
				<link>https://g0g.top/2024/08/artalk-%E9%83%A8%E7%BD%B2/</link>
				<pubDate>Thu, 29 Aug 2024 12:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/08/artalk-%E9%83%A8%E7%BD%B2/</guid>
				<description>&lt;p&gt;最近把本博客的评论系统从 Waline 迁移到了 &lt;a href=&#34;https://artalk.js.org/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Artalk&lt;/a&gt;。主要原因就是 Waline 是纯 js 实现，&#xA;NodeJS 运行时有点太重了；最近正在把服务整合到新小鸡上，遂迁移。&lt;/p&gt;&#xA;&lt;p&gt;Artalk 够轻够简单，完全单文件化，连静态资源都被嵌入了可执行文件；不过总比臃肿的 nodejs 要好。&#xA;Artalk 另一个优势是可配置项更多，文档更详细，看着就更像个正经项目（然而是高三大佬写的&lt;/p&gt;&#xA;&lt;h2 id=&#34;安装依赖&#34;&gt;安装依赖&lt;/h2&gt;&#xA;&lt;p&gt;我们使用 PostgreSQL。首先安装依赖，下载可执行文件&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;LATEST&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;v2.8.7&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install postgresql&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://github.com/ArtalkJS/Artalk/releases/download/&lt;span style=&#34;color:#c41a16&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LATEST&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;}&lt;/span&gt;/artalk_&lt;span style=&#34;color:#c41a16&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LATEST&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;}&lt;/span&gt;_linux_amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar xf artalk_&lt;span style=&#34;color:#c41a16&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LATEST&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;}&lt;/span&gt;_linux_amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv artalk_&lt;span style=&#34;color:#c41a16&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LATEST&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;}&lt;/span&gt;_linux_amd64/artalk /usr/local/bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -r artalk_&lt;span style=&#34;color:#c41a16&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LATEST&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;}&lt;/span&gt;_linux_amd64.tar.gz artalk_&lt;span style=&#34;color:#c41a16&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LATEST&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;}&lt;/span&gt;_linux_amd64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;配置数据库&#34;&gt;配置数据库&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;-- sudo -u postgres psql&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;USER&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;artalk&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;WITH&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;PASSWORD&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;&amp;lt;CUSTOM PASSWORD&amp;gt;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;DATABASE&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;artalk_db&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;OWNER&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;artalk&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;GRANT&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;ALL&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;PRIVILEGES&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;ON&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;DATABASE&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;artalk_db&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;TO&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;artalk&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;配置文件&#34;&gt;配置文件&lt;/h2&gt;&#xA;&lt;p&gt;尽管示例有很多配置项，实际上都可以网页上 ui 配置。配置文件只需要写最基本的暴露端口和数据库配置就行。（不过文件权限是个问题）&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;/etc/artalk.yml&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;host&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;port&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;23333&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;app_key&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;&amp;lt;CUSTOM KEY&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;locale&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;zh-CN&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;timezone&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;Asia/Shanghai&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;log&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;enabled&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;filename&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;/var/log/artalk/access.log&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;db&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;pgsql&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;artalk_db&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;host&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;localhost&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;port&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;5432&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;user&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;artalk&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;password&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;&amp;lt;CUSTOM PASSWORD&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;守护进程&#34;&gt;守护进程&lt;/h2&gt;&#xA;&lt;p&gt;我们用 systemd。我个人比较喜欢 DynamicUser&lt;/p&gt;</description>
			</item>
			<item>
				<title>Rustdesk 自建服务器</title>
				<link>https://g0g.top/2024/07/rustdesk-%E8%87%AA%E5%BB%BA%E6%9C%8D%E5%8A%A1%E5%99%A8/</link>
				<pubDate>Mon, 01 Jul 2024 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/07/rustdesk-%E8%87%AA%E5%BB%BA%E6%9C%8D%E5%8A%A1%E5%99%A8/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://rustdesk.com/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Rustdesk&lt;/a&gt; 是一个功能完备的远程桌面套件。其作为一款开源软件，其&#xA;Github Star 数高达 67.8k，得到了开源社区的广泛认可。&lt;/p&gt;&#xA;&lt;p&gt;其基本架构如图所示：&#xA;&lt;img src=&#34;1737323-20240511112331780-1084989840-1.png&#34; alt=&#34;Rustdesk 架构&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;本文旨在记录 Server 的安装方式和基本使用。&lt;/p&gt;&#xA;&lt;p&gt;Rustdesk 的软件分发基于 &lt;a href=&#34;https://github.com/rustdesk/rustdesk-server/releases/latest&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Github Releases&lt;/a&gt;。&#xA;如果是国内服务器，建议先用魔法下到本地再传到服务器上。&lt;/p&gt;&#xA;&lt;p&gt;把下载的 &lt;code&gt;hbbs&lt;/code&gt; 和 &lt;code&gt;hbbr&lt;/code&gt; 放到 &lt;code&gt;/usr/local/bin/&lt;/code&gt; 下之后，运行：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo mkdir /var/log/rustdesk/ &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo chmod &lt;span style=&#34;color:#1c01ce&#34;&gt;777&lt;/span&gt; /var/log/rustdesk/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tee /lib/systemd/system/rustdesk@.service &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;lt;&amp;lt;EOF &amp;gt;/dev/null&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;[Unit]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;Description=Rustdesk Server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;Documentation=https://rustdesk.com/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;[Service]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;Type=simple&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;DynamicUser=yes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;LimitNOFILE=1000000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;ExecStart=/usr/local/bin/%i&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;WorkingDirectory=/var/lib/rustdesk/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;StateDirectory=rustdesk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;LogsDirectory=rustdesk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;Restart=always&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;StandardOutput=append:/var/log/rustdesk/%i.log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;StandardError=append:/var/log/rustdesk/%i.err&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;RestartSec=10&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;[Install]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;WantedBy=multi-user.target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;EOF&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl daemon-reload&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;# start daemon&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start rustdesk@hbbs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start rustdesk@hbbr&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;# key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;echo&lt;/span&gt; -e &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;\033[1;33mKey: &lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;$(&lt;/span&gt;sudo cat /var/lib/rustdesk/id_ed25519.pub&lt;span style=&#34;color:#a90d91&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;\033[0m&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;记录下这里的 key。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Rust 宏编程</title>
				<link>https://g0g.top/2024/06/rust-%E5%AE%8F%E7%BC%96%E7%A8%8B/</link>
				<pubDate>Sun, 30 Jun 2024 01:23:59 +0800</pubDate>
				<guid>https://g0g.top/2024/06/rust-%E5%AE%8F%E7%BC%96%E7%A8%8B/</guid>
				<description>&lt;p&gt;所谓宏 (Macro)，指能生成代码的代码。它可以对已有代码进行匹配、替换和生成。&lt;/p&gt;&#xA;&lt;p&gt;对于我们程序员而言，宏的作用就是减少工作量：利用宏生成一些非常繁琐的、但是避不开的代码，例如&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;常量的批量定义和文档说明&lt;/li&gt;&#xA;&lt;li&gt;一段不长不短的套件初始化&lt;/li&gt;&#xA;&lt;li&gt;要使用变量名本身和源码信息&lt;/li&gt;&#xA;&lt;li&gt;&amp;hellip;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;一个广为人知的宏语言是 m4。它的发明让 C 获得了宏编程之力。但相比 Rust 成熟完整的宏编程，m4 显得过于&#xA;简陋了。&lt;/p&gt;&#xA;&lt;p&gt;在进入正题前，需要区分两个版本的宏：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;declarative macros&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这是最原始形态的宏，也是许多教程中会写到的、让人眼前一黑的版本 (macro_rules)。它基于模式/伪正则匹配语法工作。&#xA;好消息是：它将在未来被逐步废弃。 &lt;del&gt;我们不需要会写，只要能看懂就行。&lt;/del&gt; 好吧还是非常好用的，尤其是在一些需要批量生成类似代码的地方。&lt;/p&gt;&#xA;&lt;p&gt;教程：&lt;a href=&#34;https://course.rs/advance/macro.html#%E5%A3%B0%E6%98%8E%E5%BC%8F%E5%AE%8F-macro_rules&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;声明式宏 macro_rules! | course.rs&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;procedural macros&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这是功能完备、实现优雅的现代版本：用 Rust 写 Rust 宏！这也太帅了！&lt;/p&gt;&#xA;&lt;p&gt;Rust 将宏分为了三类&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;内联宏，形如 &lt;code&gt;custom!(...)&lt;/code&gt;，对应 &lt;code&gt;#[proc_macro]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;派生宏，形如 &lt;code&gt;#[derive(CustomDerive)]&lt;/code&gt;，对应 &lt;code&gt;#[proc_macro_derive]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;属性宏，形如 &lt;code&gt;#[CustomAttribute]&lt;/code&gt;，对应 &lt;code&gt;#[proc_macro_attribute]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;示例-json-解析&#34;&gt;示例-Json 解析&lt;/h2&gt;&#xA;&lt;p&gt;我们定义 Json 如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;ConstValue&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;String&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;#39;static&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;str&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Number&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;f64&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Object&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;#39;static&lt;/span&gt; [(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;#39;static&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;str&lt;/span&gt;, &lt;span style=&#34;color:#5b269a&#34;&gt;Self&lt;/span&gt;)]),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Array&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;#39;static&lt;/span&gt; [&lt;span style=&#34;color:#5b269a&#34;&gt;Self&lt;/span&gt;]),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Boolean&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;bool&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Null&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解析宏如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;proc_macro&lt;/span&gt;::{&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Ident&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Punct&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Span&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;TokenStream&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#[proc_macro]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;json&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;parse_object&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_object&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;check_colun&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenTree&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;panic_err&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;panic!&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;expect &amp;#39;:&amp;#39;, got &lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;{p}&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Punct&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;as_char&lt;/span&gt;()&lt;span style=&#34;color:#000&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;:&amp;#39;&lt;/span&gt; {&lt;span style=&#34;color:#000&#34;&gt;panic_err&lt;/span&gt;()}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#a90d91&#34;&gt;else&lt;/span&gt; {&lt;span style=&#34;color:#000&#34;&gt;panic_err&lt;/span&gt;()}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;into_iter&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TokenStream&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;loop&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Some&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;key&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;else&lt;/span&gt; {&lt;span style=&#34;color:#a90d91&#34;&gt;break&lt;/span&gt;;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Literal&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;key&lt;/span&gt; {} &lt;span style=&#34;color:#a90d91&#34;&gt;else&lt;/span&gt; {&lt;span style=&#34;color:#000&#34;&gt;panic!&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;expect key literal, got `&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;{key}&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;`&amp;#34;&lt;/span&gt;)};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;check_colun&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;().&lt;span style=&#34;color:#000&#34;&gt;expect&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;expect &amp;#39;:&amp;#39;, got EOF&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;().&lt;span style=&#34;color:#000&#34;&gt;expect&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;expect value, got EOF&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_value&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;grp&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TokenStream&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_iter&lt;/span&gt;([&lt;span style=&#34;color:#000&#34;&gt;key&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;punc&lt;/span&gt;(&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt;)]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;grp&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;extend&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;extend&lt;/span&gt;([&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;proc_macro&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Delimiter&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Parenthesis&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;grp&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            )),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;punc&lt;/span&gt;(&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Some&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Punct&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;)) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;as_char&lt;/span&gt;() &lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt; { &lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;(); }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;gen_constvalue&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Object&amp;#34;&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;TokenStream&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_iter&lt;/span&gt;([&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;punc&lt;/span&gt;(&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;proc_macro&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Delimiter&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Bracket&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_array&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TokenStream&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;into_iter&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;loop&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Some&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;else&lt;/span&gt; {&lt;span style=&#34;color:#a90d91&#34;&gt;break&lt;/span&gt;;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_value&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;extend&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;v&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;extend&lt;/span&gt;([&lt;span style=&#34;color:#000&#34;&gt;punc&lt;/span&gt;(&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt;)]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Some&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Punct&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;)) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;as_char&lt;/span&gt;() &lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt; { &lt;span style=&#34;color:#000&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;(); }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;gen_constvalue&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Array&amp;#34;&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;TokenStream&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_iter&lt;/span&gt;([&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;punc&lt;/span&gt;(&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;proc_macro&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Delimiter&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Bracket&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_value&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenTree&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;grp&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#177500&#34;&gt;// array, object&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;grp&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;delimiter&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;proc_macro&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Delimiter&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Brace&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_object&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;grp&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;stream&lt;/span&gt;()),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;proc_macro&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Delimiter&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Bracket&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_array&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;grp&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;stream&lt;/span&gt;()),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;panic!&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;unsupported value &lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;grp&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;stream&lt;/span&gt;()),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Literal&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;v&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#177500&#34;&gt;// string, number&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;v&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;to_string&lt;/span&gt;().&lt;span style=&#34;color:#000&#34;&gt;parse&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;f64&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;tt&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;into&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000&#34;&gt;tt&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;extend&lt;/span&gt;([&lt;span style=&#34;color:#000&#34;&gt;ident&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;as&amp;#34;&lt;/span&gt;), &lt;span style=&#34;color:#000&#34;&gt;ident&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;f64&amp;#34;&lt;/span&gt;)]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000&#34;&gt;gen_constvalue&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Number&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;tt&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gen_constvalue&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;String&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;into&lt;/span&gt;())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Ident&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#177500&#34;&gt;// null, true, false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;to_string&lt;/span&gt;().&lt;span style=&#34;color:#000&#34;&gt;as_str&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;null&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gen_id&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Null&amp;#34;&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gen_constvalue&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Boolean&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;into&lt;/span&gt;()),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;panic!&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;identifier &lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;{input}&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt; not supported&amp;#34;&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;panic!&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;unexpected symbol &lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;{input}&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;punc&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;ch&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;char&lt;/span&gt;)-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;TokenTree&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Punct&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;Punct&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;ch&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;proc_macro&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Spacing&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Alone&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ident&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenTree&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Ident&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;Ident&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Span&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;call_site&lt;/span&gt;()))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gen_id&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;TokenStream&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_iter&lt;/span&gt;([&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;ident&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;ConstValue&amp;#34;&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Punct&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;Punct&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;(&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;:&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;proc_macro&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Spacing&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Joint&lt;/span&gt;)),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;punc&lt;/span&gt;(&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;:&amp;#39;&lt;/span&gt;), &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;ident&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gen_constvalue&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;#39;static&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;str&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;inner&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;TokenStream&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gen_id&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;id&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;extend&lt;/span&gt;([&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;TokenTree&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;Group&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;proc_macro&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Delimiter&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Parenthesis&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;inner&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不过这个例子大概还是声明宏方便些。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Rust vs Go | Web Framework 小横评</title>
				<link>https://g0g.top/2024/06/web-frameworks/</link>
				<pubDate>Fri, 28 Jun 2024 21:00:00 +0800</pubDate>
				<guid>https://g0g.top/2024/06/web-frameworks/</guid>
				<description>&lt;p&gt;本次参赛选手是&amp;hellip;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;来自 Golang 的 &lt;a href=&#34;https://github.com/gin-gonic/gin&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Gin&lt;/a&gt;！&lt;/li&gt;&#xA;&lt;li&gt;来自 Rust 的 &lt;a href=&#34;https://github.com/tokio-rs/axum&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Axum&lt;/a&gt;！&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;本次将通过基本的路由和中间件，着重评测二位的性能和上手体验。测试设计很草率，并不代表普遍情况！&lt;/p&gt;&#xA;&lt;h2 id=&#34;选择理由&#34;&gt;选择理由&lt;/h2&gt;&#xA;&lt;p&gt;有读者老爷可能会问了，明明 xxx 性能更强/更成熟/更优雅，为什么不选它？&lt;/p&gt;&#xA;&lt;p&gt;Golang 方面， Gin 毋庸置疑是最为成熟稳定、生态最丰富的 Web Server Framework.&#xA;其 &lt;code&gt;func(*gin.Context)&lt;/code&gt; 吃遍天的良好设计极其优雅高效。其他的 Framework 相比它&#xA;并没有决定性的性能优势，反倒是接口千奇百怪，难以理解。&lt;/p&gt;&#xA;&lt;p&gt;Rust 方面，本来我是要选 Actix 的，然而它在本机上的性能表现比 Axum 差 20% 以上，而且&#xA;它的接口个人不太喜欢，尤其是其奇怪的 Response 构造和 path macro。Axum 的接口是最&#xA;对我胃口的，且性能在第一梯队。&lt;/p&gt;&#xA;&lt;p&gt;当然，有测试表明，Actix 最大的优势是系统性能友好——它相比 Axum 能省 30% 以上的 CPU、&#xA;50% 以上的内存，而性能差距不到 10%。（虽然和我自己测出来的不一样）&lt;/p&gt;&#xA;&lt;h2 id=&#34;golang-代码&#34;&gt;Golang 代码&lt;/h2&gt;&#xA;&lt;p&gt;直接依赖： &lt;code&gt;github.com/gin-gonic/gin&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;代码：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;main.go&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;github.com/gin-gonic/gin&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gin&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;New&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;r&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Use&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;Counter&lt;/span&gt;())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;r&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;GET&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;/count&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Count&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;r&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;NoRoute&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;NotFound&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;r&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Run&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;localhost:8081&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;NotFound&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gin&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Context&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;JSON&lt;/span&gt;(&lt;span style=&#34;color:#1c01ce&#34;&gt;200&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;gin&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;H&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;code&amp;#34;&lt;/span&gt;:  &lt;span style=&#34;color:#1c01ce&#34;&gt;404&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;not found&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Count&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gin&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Context&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;msg&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Get&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;example&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;JSON&lt;/span&gt;(&lt;span style=&#34;color:#1c01ce&#34;&gt;200&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;gin&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;H&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;code&amp;#34;&lt;/span&gt;:  &lt;span style=&#34;color:#1c01ce&#34;&gt;200&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#000&#34;&gt;msg&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Counter&lt;/span&gt;() &lt;span style=&#34;color:#000&#34;&gt;gin&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;HandlerFunc&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;n&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;func&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gin&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Context&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Set&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;example&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;n&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;n&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Next&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;超级优雅的 Go 风格代码！仅需 35 行！&lt;/p&gt;</description>
			</item>
			<item>
				<title>Nom 小试</title>
				<link>https://g0g.top/2024/06/nom-rs/</link>
				<pubDate>Wed, 19 Jun 2024 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/06/nom-rs/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://github.com/rust-bakery/nom&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Nom&lt;/a&gt; 是一个二进制解析框架。它提供了许多特性：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;零拷贝切片&lt;/li&gt;&#xA;&lt;li&gt;流粘包处理&lt;/li&gt;&#xA;&lt;li&gt;解析器 (Parser) 级联&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/rust-bakery/nom/blob/main/doc/choosing_a_combinator.md&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;常用二进制处理工具&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Nom 需要配合 &lt;code&gt;impl Fn(Input) -&amp;gt; IResult&amp;lt;Remain, Output, Error&amp;gt;&lt;/code&gt; 的解析器工作。&lt;/p&gt;&#xA;&lt;p&gt;大致来说，它的工作方式是，你告诉 nom 解析字节的某种匹配模式。&#xA;它会尝试从输入中解析尽可能多的内容，将其余的输入返回给你。&lt;/p&gt;&#xA;&lt;p&gt;相比 &lt;a href=&#34;https://serde.rs/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;serde&lt;/a&gt; ，它更注重于高速的二进制解析，而并不提供 encode/serialize 的功能。&#xA;它本身只提供了一个约定和一些工具集帮助我们解析。&lt;/p&gt;&#xA;&lt;h2 id=&#34;小试&#34;&gt;小试&lt;/h2&gt;&#xA;&lt;p&gt;最近本人在尝试写一个系统检测器。了解到在 Linux 下提供了 &lt;code&gt;/proc/stat&lt;/code&gt; 文件，此文件能给出内核运行信息。我们尝试解析一下它吧！&lt;/p&gt;&#xA;&lt;p&gt;首先是一个数字解析器。btw nom 已经精简到任何解析相关的东西都要我们手动实现。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;map_res&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;digit1&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;unsafe&lt;/span&gt;{&lt;span style=&#34;color:#000&#34;&gt;core&lt;/span&gt;::&lt;span style=&#34;color:#a90d91&#34;&gt;str&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_utf8_unchecked&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;)}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .&lt;span style=&#34;color:#000&#34;&gt;parse&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;())(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后是一个分割器。在一些分割空格的场合十分有用&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;n&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;)-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;impl&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Fn&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;])-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;move&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_till&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;n&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;)) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_while&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;n&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;)) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;)),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;随后就开始照着 &lt;a href=&#34;https://man7.org/linux/man-pages/man5/proc_stat.5.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;官方文档&lt;/a&gt; 实现了。完整代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;// ref: https://man7.org/linux/man-pages/man5/proc_stat.5.html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#[derive(Debug)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;ProcStat&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;total&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;CPUStat&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;per_cpu&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;Vec&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;CPUStat&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// counts of interrupts serviced since boot time. only total is parsed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;intr&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// The number of context switches that the system underwent.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ctxt&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// boot time, in seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;btime&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Number of forks since boot.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;processes&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#[derive(Debug)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;CPUStat&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Time spent in user mode.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;user&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Time spent in user mode with low priority (nice).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nice&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Time spent in system mode.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;system&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Time spent in the idle task.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;idle&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Time waiting for I/O to complete. (may lower than actual value)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;iowait&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Time servicing interrupts.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;irq&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Time servicing softirqs.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;softirq&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Stolen time, which is the time spent in other operating systems when&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// running in a virtualized environment&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;steal&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Time spent running a virtual CPU for guest operating systems under the&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// control of the Linux kernel.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;guest&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;/// Time spent running a niced guest.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;guest_nice&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nom&lt;/span&gt;::{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;bytes&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;complete&lt;/span&gt;::{&lt;span style=&#34;color:#000&#34;&gt;tag&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;take_till&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;take_while&lt;/span&gt;}, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;character&lt;/span&gt;::{&lt;span style=&#34;color:#000&#34;&gt;complete&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;digit1&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;is_space&lt;/span&gt;}, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;combinator&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;map_res&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;IResult&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;map_res&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;digit1&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;unsafe&lt;/span&gt;{&lt;span style=&#34;color:#000&#34;&gt;core&lt;/span&gt;::&lt;span style=&#34;color:#a90d91&#34;&gt;str&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_utf8_unchecked&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;)}.&lt;span style=&#34;color:#000&#34;&gt;parse&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;())(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;n&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;)-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;impl&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Fn&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;])-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;move&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_till&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;n&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;)) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_while&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;n&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;)) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;)),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_line&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;// input a whole line&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;cpu_stat&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;])-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;CPUStat&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;macro_rules&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;!&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gen_fields&lt;/span&gt; { (&lt;span style=&#34;color:#633820&#34;&gt;$($field&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;ident&lt;/span&gt;),&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;inner&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;])-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;CPUStat&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// check cpu&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;tag&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#2300ce&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#633820&#34;&gt;$(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#633820&#34;&gt;$field&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parse_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_while&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;is_space&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            )&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;CPUStat&lt;/span&gt; {&lt;span style=&#34;color:#633820&#34;&gt;$($field&lt;/span&gt;,)&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;}))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;gen_fields!&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;user&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;nice&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;system&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;idle&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;iowait&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;irq&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;softirq&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;steal&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;guest&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;guest_nice&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;inner&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;proc_field&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#836c28&#34;&gt;&amp;#39;a&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#836c28&#34;&gt;&amp;#39;a&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;impl&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Fn&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;])-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;+&lt;/span&gt;&lt;span style=&#34;color:#836c28&#34;&gt;&amp;#39;a&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;move&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_debug_name&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;tag&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_while&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;is_space&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_debug_input2&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;unsafe&lt;/span&gt;{&lt;span style=&#34;color:#000&#34;&gt;core&lt;/span&gt;::&lt;span style=&#34;color:#a90d91&#34;&gt;str&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_utf8_unchecked&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;parse_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;proc_stat&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;ProcStat&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#177500&#34;&gt;// will skip remain value in line&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;try_field&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;O&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;F&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;Fn&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;])-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;O&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;f&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;F&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;O&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;line&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_line&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;loop&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;f&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;line&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;val&lt;/span&gt;)) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; {&lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;val&lt;/span&gt;));}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;len&lt;/span&gt;()&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt; {&lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;);}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;line&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_line&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;try_field_many&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;O&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;F&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;Fn&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;])-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;O&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;f&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;F&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#a90d91&#34;&gt;Vec&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;O&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Vec&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;loop&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;f&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;val&lt;/span&gt;)) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;take_line&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000&#34;&gt;v&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;push&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;val&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a90d91&#34;&gt;Err&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; {&lt;span style=&#34;color:#a90d91&#34;&gt;break&lt;/span&gt;;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;v&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;macro_rules&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;!&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gen_field&lt;/span&gt; {(&lt;span style=&#34;color:#633820&#34;&gt;$($field&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;ident&lt;/span&gt;),&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; { &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;inner&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;IResult&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;ProcStat&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;total&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;try_field&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;cpu_stat&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;per_cpu&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;try_field_many&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;cpu_stat&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#633820&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#633820&#34;&gt;$field&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;try_field&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;proc_field&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;stringify!&lt;/span&gt;(&lt;span style=&#34;color:#633820&#34;&gt;$field&lt;/span&gt;)))&lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;;)&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;ProcStat&lt;/span&gt;{&lt;span style=&#34;color:#000&#34;&gt;total&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;per_cpu&lt;/span&gt;, &lt;span style=&#34;color:#633820&#34;&gt;$($field&lt;/span&gt;),&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;}))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;gen_field!&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;intr&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;ctxt&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;btime&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;processes&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;inner&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;fs&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;read&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;/proc/stat&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#000&#34;&gt;unwrap&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;r&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;proc_stat&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;).&lt;span style=&#34;color:#000&#34;&gt;unwrap&lt;/span&gt;().&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;{r:#?}&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>Rust 与 C 第二弹</title>
				<link>https://g0g.top/2024/06/rust-and-c-2/</link>
				<pubDate>Sat, 08 Jun 2024 19:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/06/rust-and-c-2/</guid>
				<description>&lt;p&gt;在前篇中我们已经了解了 Rust 如何调用 C 的代码和给定接口的库。现在让我们更任性一点：&#xA;我们现在需要定义一个动态链接库接口，协作者只要发布他的实现接口的动态链接库二进制文件，我们就可以&#xA;对代码不做任何修改，直接动态调用它。&lt;/p&gt;&#xA;&lt;p&gt;由于 &lt;code&gt;dlopen&lt;/code&gt; 与 &lt;code&gt;LoadLibrary&lt;/code&gt; 的存在，这肯定是可以实现的。他们只能解析返回&#xA;静态变量和函数。因此我们实现的一切都需要使用函数和静态变量去传递。&lt;/p&gt;&#xA;&lt;h2 id=&#34;rust-调用&#34;&gt;Rust 调用&lt;/h2&gt;&#xA;&lt;p&gt;我们使用 &lt;code&gt;libloading = &amp;quot;0.8&amp;quot;&lt;/code&gt; 简化调用过程。&lt;/p&gt;&#xA;&lt;p&gt;我们期望实现这样一个插件接口&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#[repr(C)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;MyPlugin&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;#39;static&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;i8&lt;/span&gt;, &lt;span style=&#34;color:#177500&#34;&gt;// CStr&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;i32&lt;/span&gt;)-&amp;gt;&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;#39;static&lt;/span&gt; (),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;destroy&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;unsafe&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;()),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;add&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;(), &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;:&lt;span style=&#34;color:#a90d91&#34;&gt;i32&lt;/span&gt;)-&amp;gt;&lt;span style=&#34;color:#a90d91&#34;&gt;i32&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;sub&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;(), &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;:&lt;span style=&#34;color:#a90d91&#34;&gt;i32&lt;/span&gt;)-&amp;gt;&lt;span style=&#34;color:#a90d91&#34;&gt;i32&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从而能够这样被调用&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;env&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;current_dir&lt;/span&gt;().&lt;span style=&#34;color:#000&#34;&gt;expect&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;unable to access library directory&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#[cfg(unix)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;libmylib.so&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#[cfg(windows)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;mylib.dll&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;unsafe&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lib&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;libloading&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;Library&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;join&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;)).&lt;span style=&#34;color:#000&#34;&gt;unwrap&lt;/span&gt;(); &lt;span style=&#34;color:#177500&#34;&gt;// load from absolute path&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;plgn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lib&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;get&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;MyPlugin&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;impls&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#000&#34;&gt;unwrap&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;load plugin &lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;{:?}&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;core&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;ffi&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;CStr&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_ptr&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;plgn&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;name&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;plgn&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;)(&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;assert_eq!&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;plgn&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;add&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;,&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;), &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;assert_eq!&lt;/span&gt;((&lt;span style=&#34;color:#000&#34;&gt;plgn&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;sub&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;,&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;), &lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#000&#34;&gt;plgn&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;destroy&lt;/span&gt;)(&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;c-library&#34;&gt;C library&lt;/h2&gt;&#xA;&lt;p&gt;一个最简单的插件库如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#633820&#34;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#633820&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; {&lt;span style=&#34;color:#a90d91&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;;} &lt;span style=&#34;color:#a90d91&#34;&gt;calc_t&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;calc_t&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;calc_t&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;calc_t&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;calc_t&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;destroy&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;calc_t&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;){&lt;span style=&#34;color:#000&#34;&gt;free&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;p&lt;/span&gt;);}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;calc_t&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;, &lt;span style=&#34;color:#a90d91&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;y&lt;/span&gt;){&lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;y&lt;/span&gt;;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sub&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;calc_t&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;, &lt;span style=&#34;color:#a90d91&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;y&lt;/span&gt;){&lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;y&lt;/span&gt;;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;plugin_t&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;5&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#ifdef _MSC_VER&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;__declspec&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;dllexport&lt;/span&gt;) &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;#endif&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;plugin_t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;impls&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;{ &lt;span style=&#34;color:#177500&#34;&gt;// &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;c impl&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;new&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;destroy&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;add&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;sub&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过 &lt;code&gt;gcc -shared -fPIC -o libmylib.so lib.c&lt;/code&gt; 编译出动态链接库，就能用啦！&lt;/p&gt;</description>
			</item>
			<item>
				<title>数据结构速成</title>
				<link>https://g0g.top/2024/06/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E9%80%9F%E6%88%90/</link>
				<pubDate>Fri, 07 Jun 2024 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/06/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E9%80%9F%E6%88%90/</guid>
				<description>&lt;h2 id=&#34;前置知识&#34;&gt;前置知识&lt;/h2&gt;&#xA;&lt;h3 id=&#34;数据结构&#34;&gt;数据结构&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数据之间的逻辑关系&#xA;&lt;ul&gt;&#xA;&lt;li&gt;集合结构&lt;/li&gt;&#xA;&lt;li&gt;线性结构&lt;/li&gt;&#xA;&lt;li&gt;树形结构&lt;/li&gt;&#xA;&lt;li&gt;图形结构&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;存储：元素+关系&#xA;&lt;ul&gt;&#xA;&lt;li&gt;内容分类：数据，关系，附加（非必要但出于优化的、单数据结构内唯一的内容，&#xA;例如长度、根节点&amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;数据储存方式：顺序，链接&lt;/li&gt;&#xA;&lt;li&gt;关系算法：哈希，索引，树&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;接口&#xA;&lt;ul&gt;&#xA;&lt;li&gt;构造，销毁&lt;/li&gt;&#xA;&lt;li&gt;增查删改&lt;/li&gt;&#xA;&lt;li&gt;访问，遍历&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;数据结构主要讨论关系的存储&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;算法复杂度&#34;&gt;算法复杂度&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;渐进表示法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$O$ : 渐进上界&lt;/li&gt;&#xA;&lt;li&gt;$\Omega$ : 渐进下界&lt;/li&gt;&#xA;&lt;li&gt;$\theta$ : 渐进确界&lt;/li&gt;&#xA;&lt;li&gt;$o$ : 渐近非紧上界&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;线性结构&#34;&gt;线性结构&lt;/h2&gt;&#xA;&lt;h3 id=&#34;线性表&#34;&gt;线性表&lt;/h3&gt;&#xA;&lt;p&gt;定义：除了首尾元素，每个元素都有其前驱与后继。每个元素对应唯一非负整数 index.&lt;/p&gt;&#xA;&lt;h4 id=&#34;顺序表&#34;&gt;顺序表&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Vec&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;data&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;size_t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;len&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;cap&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;倍增空间：&lt;code&gt;realloc&lt;/code&gt;，至多浪费 $50%$ 空间，换取均摊 $O(0)$ 的内存分配（内存分配很耗时）和 $O(1)$ 的复制。&lt;/li&gt;&#xA;&lt;li&gt;增/删：后继节点全部需要移动， $O(n)$&lt;/li&gt;&#xA;&lt;li&gt;查：index 访问 $O(1)$，值访问 $O(n)$&lt;/li&gt;&#xA;&lt;li&gt;遍历：迭代 &lt;code&gt;index: 0..len&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;优势：局部性好，index 访问快。&lt;/li&gt;&#xA;&lt;li&gt;劣势：插入、删除、值访问很慢，均摊浪费 $33%$ 空间。&lt;/li&gt;&#xA;&lt;li&gt;适用情景：静态，可 index 访问。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;链表&#34;&gt;链表&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;; &lt;span style=&#34;color:#177500&#34;&gt;// 若空则 this 为尾节点&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;prev&lt;/span&gt;; &lt;span style=&#34;color:#177500&#34;&gt;// （双链表专用）指向前面的节点，若为空则是头节点&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;LinkedList&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;head&lt;/span&gt;; &lt;span style=&#34;color:#177500&#34;&gt;// 可空或伪节点&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Node&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;tail&lt;/span&gt;; &lt;span style=&#34;color:#177500&#34;&gt;// （双链表专用）可空或伪节点&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;size_t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;len&lt;/span&gt;; &lt;span style=&#34;color:#177500&#34;&gt;// 可选，长度&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;增删：a-&amp;gt;b-&amp;gt;c 变成 a-&amp;gt;c 并 delete b， $O(1)$&lt;/li&gt;&#xA;&lt;li&gt;遍历：循环 &lt;code&gt;p&amp;lt;-(p.next)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;查：index 与值都是遍历的 $O(n)$&lt;/li&gt;&#xA;&lt;li&gt;优势：对已知节点增删快&lt;/li&gt;&#xA;&lt;li&gt;劣势：访问很慢，浪费 1 或 2 个指针的空间&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;栈&#34;&gt;栈&lt;/h3&gt;&#xA;&lt;p&gt;栈：LIFO 后进先出&lt;/p&gt;</description>
			</item>
			<item>
				<title>Rust 与 C</title>
				<link>https://g0g.top/2024/06/rust-and-c/</link>
				<pubDate>Tue, 04 Jun 2024 18:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/06/rust-and-c/</guid>
				<description>&lt;p&gt;Rust 很棒，但是 C/C++ 有时候更香，尤其是有已有库、或者是写超级 unsafe 的代码时。&lt;/p&gt;&#xA;&lt;p&gt;p.s. Why only C deserves? 大概有两条原因&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;C-FFI 已经成了所有语言兼容的接口标准&lt;/li&gt;&#xA;&lt;li&gt;C compiler 在任何平台上都有&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;怎么在 Rust 里调用其他语言呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;理解-cargo&#34;&gt;理解 Cargo&lt;/h2&gt;&#xA;&lt;p&gt;我们首先得理解 Cargo 做了什么。&lt;/p&gt;&#xA;&lt;p&gt;大家都知道，多文件的编译过程就是：分别编译成 object 或 library，然后 link 起来。这其中，最关键的难题&#xA;是找到文件。我们在编译 C/C++ 时最头痛的就是 &lt;code&gt;not found&lt;/code&gt; 和 &lt;code&gt;undefined symbol&lt;/code&gt; 满天飞。&lt;/p&gt;&#xA;&lt;p&gt;Cargo 是怎么组织编译产物的呢？&lt;/p&gt;&#xA;&lt;p&gt;对于单个 Crate Dep，它会先（如果存在）在 &lt;code&gt;target/${MODE}/build/${CRATE}-hash&lt;/code&gt; 下运行 build script，&#xA;然后在 &lt;code&gt;target/${MODE}/build/${CRATE}-anotherhash&lt;/code&gt; 下编译，并将产物文件参与其被依赖的编译之中。&lt;/p&gt;&#xA;&lt;p&gt;对于依赖图，就是不断取；然后把最后一项任务的产物放在 &lt;code&gt;target/${MODE}/build/&lt;/code&gt; 下。&lt;/p&gt;&#xA;&lt;p&gt;我们的 foreign library 只需要能构建出产物放在产物文件夹中，被 Cargo 找到就行。&lt;/p&gt;&#xA;&lt;h2 id=&#34;链接库&#34;&gt;链接库&lt;/h2&gt;&#xA;&lt;p&gt;最朴素的做法是和传统 C 一样，编译出库，然后链接它。&lt;/p&gt;&#xA;&lt;p&gt;在 Rust 里提供了 &lt;code&gt;rustc-link-xx&lt;/code&gt; 的 api。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Rust 指针，引用，生命周期和其他</title>
				<link>https://g0g.top/2024/03/rust-pointer/</link>
				<pubDate>Mon, 11 Mar 2024 21:00:00 +0801</pubDate>
				<guid>https://g0g.top/2024/03/rust-pointer/</guid>
				<description>&lt;p&gt;2024/10 更新：本文为初学 Rust 阶段所作，仅作为个人学习记录，不应作为参考。&lt;/p&gt;&#xA;&lt;h2 id=&#34;rust-指针&#34;&gt;Rust 指针&lt;/h2&gt;&#xA;&lt;p&gt;Rust 有其裸指针 &lt;code&gt;*mut T&lt;/code&gt; 和 &lt;code&gt;*const T&lt;/code&gt;，分别意味着指向的数据是可变/不可变的（实用中唯一的区别就是 Variance，实际通过&#xA;unsafe dereference 可以自由修改数据）。&lt;/p&gt;&#xA;&lt;p&gt;它有以下限制&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;解引用裸指针是 unsafe 的&lt;/li&gt;&#xA;&lt;li&gt;对象的所有权管理要手动实现&lt;/li&gt;&#xA;&lt;li&gt;默认 &lt;code&gt;!Send + !Sync&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;转换规则&#34;&gt;转换规则&lt;/h2&gt;&#xA;&lt;p&gt;指针和引用之间的转换规则如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;   &amp;amp;T        &amp;amp;mut T&#xD;&#xA;   ^            ^  &#xD;&#xA;   |            |  &#xD;&#xA;   v            v  &#xD;&#xA;*const T &amp;lt;-&amp;gt; *mut T&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;引用或指针转换到指针用 &lt;code&gt;as&lt;/code&gt; 关键词，而指针转换为引用需要 &lt;code&gt;&amp;amp;(*ptr)&lt;/code&gt; 或 &lt;code&gt;&amp;amp;mut(*ptr)&lt;/code&gt;。&#xA;由于解引用是 unsafe 的，此操作需要包装在 unsafe 内。&lt;/p&gt;&#xA;&lt;p&gt;我们似乎可以构造这么个超模的函数&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;upgrade&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;: &lt;span style=&#34;color:#000&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;Sized&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;v&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;T&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;&amp;#39;static&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;unsafe&lt;/span&gt;{&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;v&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;)}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当当！把不可变引用变成可变性引用了！这就是 unsafe 的威力啊哈哈！&lt;/p&gt;&#xA;&lt;p&gt;Rust 手动写了一项静态检查，要求 &lt;code&gt;&amp;amp;T&lt;/code&gt; 不能转换为 &lt;code&gt;&amp;amp;mut T&lt;/code&gt;。因此上面的代码并不能通过编译，&#xA;尽管理论上他不违背 Rust 语法，我们也可以通过一些奇妙操作绕过这项检查。（见附 #2）&lt;/p&gt;</description>
			</item>
			<item>
				<title>Rust 随感</title>
				<link>https://g0g.top/2024/03/rust/</link>
				<pubDate>Sun, 10 Mar 2024 21:00:00 +0800</pubDate>
				<guid>https://g0g.top/2024/03/rust/</guid>
				<description>&lt;p&gt;Rust 的核心哲学在于在不放弃任何底层兼容性（汇编&amp;amp;系统调用）的同时，用一些&#xA;富有指导性的的最佳实践包装代替脑子内与纯粹的指针、变量和内存打交道，从而&#xA;兼顾了安全、最佳实践、代码可读性。&lt;/p&gt;&#xA;&lt;p&gt;Rust 内有一个富有指导性的语义：每一层包装都意味着正确处理必要的开销（无论是&#xA;运行时意义上还是逻辑语义的意义上），因此通过代码能够轻松预测代码的性能和逻辑。&lt;/p&gt;&#xA;&lt;h2 id=&#34;数据驱动流程&#34;&gt;数据驱动流程&lt;/h2&gt;&#xA;&lt;p&gt;Rust 一大亮点是通过 enum 和模式匹配，让我们可以超级优雅地包装、处理任何数据。&#xA;过去的大量 if-else 通过流程分支出不同操作，因而流程控制变量与内容变量通常需要&#xA;分离。Rust 的模式匹配可以将数据和我们的注意力汇聚到 enum 内。&lt;/p&gt;&#xA;&lt;p&gt;此外，模式匹配加上 Rust 的最后一行作为值的语法，使得对于单个变量的赋值语义集中化了，&#xA;而不像过去在每一个分支中都可能会发生改动，因而在读代码或是重构的时候十分困难。&#xA;这很 ergonomic。&lt;/p&gt;&#xA;&lt;p&gt;例如对于这样一个（检查前序迭代器为满二叉树的）递归：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;BranchStatus&lt;/span&gt;{&lt;span style=&#34;color:#000&#34;&gt;Empty&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Full&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;NotFull&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;// self: (Iterator&amp;lt;Item = bool&amp;gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;is_full&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;)-&amp;gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;BranchStatus&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#1c01ce&#34;&gt;0.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;(){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;None&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Some&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;false&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Empty&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;Some&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;true&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#177500&#34;&gt;// non-empty&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;match&lt;/span&gt; (&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;is_full&lt;/span&gt;(), &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;is_full&lt;/span&gt;()){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#000&#34;&gt;Empty&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Empty&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;Full&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Full&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Full&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;_&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;NotFull&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用 C 写起来是这样的&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;// bool empty(); bool next();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;BranchStatus&lt;/span&gt;{&lt;span style=&#34;color:#000&#34;&gt;Empty&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;Full&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;NotFull&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;BranchStatus&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;isfull&lt;/span&gt;(){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;empty&lt;/span&gt;()) &lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Empty&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;next&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;false&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Empty&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;isfull&lt;/span&gt;(), &lt;span style=&#34;color:#000&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;isfull&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Empty&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Empty&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Full&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Full&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Full&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;NotFull&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;数据主导和流程主导的差别可窥一二。&lt;/p&gt;&#xA;&lt;h3 id=&#34;异常处理&#34;&gt;异常处理&lt;/h3&gt;&#xA;&lt;p&gt;这里很明显能看到 ES6 的影子。Rust 通过约定了 &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt;作为函数返回值，&#xA;以及 &lt;code&gt;?&lt;/code&gt; 语法糖，使得 Rust 的异常处理异常简单。另一方面，enumed union 的底层实现既优雅，&#xA;性能又高。&lt;/p&gt;</description>
			</item>
			<item>
				<title>SOCKS5 的一些小细节</title>
				<link>https://g0g.top/2024/01/socks5/</link>
				<pubDate>Sun, 28 Jan 2024 09:48:22 +0800</pubDate>
				<guid>https://g0g.top/2024/01/socks5/</guid>
				<description>&lt;p&gt;关于 SOCKS5 的协议细节在 &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc1928&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;RFC 1928&lt;/a&gt;&#xA;中有详细的记录，本文旨在记录一些值得注意的细节。&lt;/p&gt;&#xA;&lt;h2 id=&#34;握手方法&#34;&gt;握手方法&lt;/h2&gt;&#xA;&lt;p&gt;RFC 中要求合法的 SOCKS5 实现&lt;strong&gt;必须&lt;/strong&gt;实现 &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc1961&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;GSSAPI&lt;/a&gt;。&#xA;这是很好的，因为可以通过 SSH 等方式来加密我们的连接。然而，常见客户端（curl, browser）都不支持啊！&#xA;所以现有实现中实现了 GSSAPI 的很少。&lt;/p&gt;&#xA;&lt;h2 id=&#34;connect-请求&#34;&gt;CONNECT 请求&lt;/h2&gt;&#xA;&lt;p&gt;CONNECT 请求就是在 CONNECT 成功后直接开始透传，即此时这个连接好似就是客户端&#xA;直连到远程服务器上一样。&lt;/p&gt;&#xA;&lt;p&gt;注意 &lt;code&gt;BND.ADDR&lt;/code&gt; 和 &lt;code&gt;BND.PORT&lt;/code&gt;。rfc 里是这么说的：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;BND.PORT contains the port number that the&#xA;server assigned to connect to the target host, while BND.ADDR&#xA;contains the associated IP address.  The supplied BND.ADDR is often&#xA;different from the IP address that the client uses to reach the SOCKS&#xA;server, since such servers are often multi-homed.&lt;/p&gt;</description>
			</item>
			<item>
				<title>新生杯（一）初配置</title>
				<link>https://g0g.top/2024/01/%E5%88%9D%E9%85%8D%E7%BD%AE/</link>
				<pubDate>Mon, 15 Jan 2024 22:31:37 +0800</pubDate>
				<guid>https://g0g.top/2024/01/%E5%88%9D%E9%85%8D%E7%BD%AE/</guid>
				<description>&lt;p&gt;官方教程中建议使用 Vmware Workstation Player 作为虚拟机在 Ubuntu 上运行 Qt。然而对于使用 Windows 10/11 的我们，隔一层虚拟机来操作过于没事找事了；不如尝试 Windows 本地开发。&lt;/p&gt;&#xA;&lt;h2 id=&#34;arduino-环境安装&#34;&gt;Arduino 环境安装&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;访问 &lt;a href=&#34;https://www.arduino.cc/en/software&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Arduino 官网&lt;/a&gt;，下载最新 Windows 版 IDE；富哥可以捐点钱，像我这样的穷鬼就 &lt;code&gt;JUST DOWNLOAD&lt;/code&gt; 吧；然后如果不想被邮件骚扰，就继续 &lt;code&gt;JUST DOWNLOAD&lt;/code&gt;：下载成功！然后运行安装一把梭。&#xA;&lt;img src=&#34;image.png&#34; alt=&#34;Arduino download&#34;&gt;&#xA;&lt;img src=&#34;image-1.png&#34; alt=&#34;Arduino download 2&#34;&gt;&#xA;&lt;img src=&#34;image-3.png&#34; alt=&#34;Arduino download 3&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;安装完初次运行会初始化亿会会，我是关掉重新开就立刻加载出来了。然后 Arduino IDE 似乎会装一堆驱动和插件，我就允许了&amp;hellip;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;,&lt;/code&gt; 进入设置，先把语言改成中文（简体），然后 Additional board manager URLs 中填一个 &lt;code&gt;https://espressif.github.io/arduino-esp32/package_esp32_index.json&lt;/code&gt;（看起来像是 ardiono ide - esp32 binding）。确认过后 IDE 就会自动加载啦。&#xA;&lt;img src=&#34;image-2.png&#34; alt=&#34;IDE Preference&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;由于众所周知的原因，Github 的访问性令人堪忧。所以我们需要设置代理：&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;,&lt;/code&gt; 进入设置，选择网络，填上你的代理地址（通常来说 Clash 是 7890 端口，其他的是 1080 端口）。 &lt;del&gt;（不会吧不会吧不会真的有计算机人不会用梯子吧（手动滑稽）&lt;/del&gt;&#xA;&lt;img src=&#34;image-15.png&#34; alt=&#34;Proxy setting&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;装一个 &lt;a href=&#34;https://github.com/espressif/arduino-esp32&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;esp32 插件&lt;/a&gt;，再装三个库： &lt;a href=&#34;https://github.com/madhephaestus/ESP32Servo&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;ESP32Servo&lt;/a&gt;，&lt;a href=&#34;https://github.com/robopeak/rplidar_arduino&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;rplidar_arduino&lt;/a&gt;, 和新生杯 Simulator。这一步下载量巨大，建议网络配置好再下。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Arduino 的库可以安装到 &lt;code&gt;%userprofile%\Documents\Arduino\libraries&lt;/code&gt; (&lt;code&gt;~/Arduino/libraries&lt;/code&gt;) 下。所以官方教程中要求我们把 &lt;code&gt;RPLidarDriver&lt;/code&gt; 和 &lt;code&gt;Simulator&lt;/code&gt; 放到该目录内。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Cloudflare DNS API 初窥</title>
				<link>https://g0g.top/2024/01/cloudflare-dns-api-%E5%88%9D%E7%AA%A5/</link>
				<pubDate>Fri, 12 Jan 2024 12:22:52 +0800</pubDate>
				<guid>https://g0g.top/2024/01/cloudflare-dns-api-%E5%88%9D%E7%AA%A5/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.cloudflare.com&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Cloudflare&lt;/a&gt; 作为世界上最大的互联网慈善组织，为开发者提供了极其完整的 API 支持。本文关注于 Cloudflare 的 DNS API 部分。&lt;/p&gt;&#xA;&lt;h2 id=&#34;申请-api-令牌token&#34;&gt;申请 API 令牌(Token)&lt;/h2&gt;&#xA;&lt;p&gt;这是 API 使用过程中唯一图形化的部分了。我们要在 &lt;a href=&#34;https://dash.cloudflare.com/profile/api-tokens&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;用户 API 令牌&lt;/a&gt; 创建一个令牌。对于我们要操作的 DNS，可以选择编辑区域 DNS 模板，然后填入我们要操作的二级域名（和 IP 地址白名单）。为了最小权限原理，建议填写白名单。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;genkey.png&#34; alt=&#34;生成界面&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;然后就生成了我们的 API Token！注意保存以及保存的安全性，因为离开页面后再也见不到它啦。如果弄丢了只能重新生成部署了。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;key.png&#34; alt=&#34;Token 界面&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;建议在对应服务器上明文储存，反正有 ssh 帮你拦着风险。&lt;/p&gt;&#xA;&lt;p&gt;然后就可以尝试验证一下 Token。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;https://api.cloudflare.com/client/v4/user/tokens/verify&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     -H &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Authorization: Bearer &amp;lt;API_TOKEN&amp;gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正常情况下应当返回&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;active&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;errors&amp;#34;&lt;/span&gt;: [],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;messages&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;code&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;10000&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;This API Token is valid and active&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;null&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dns-record-api&#34;&gt;DNS Record API&lt;/h2&gt;&#xA;&lt;p&gt;Cloudflare 的 API 采用 RESTful 风格，默认基于 JSON (Content-Type: application/json) 传递数据。&lt;/p&gt;</description>
			</item>
			<item>
				<title>phantun 简单用法</title>
				<link>https://g0g.top/2024/01/phantun/</link>
				<pubDate>Fri, 12 Jan 2024 11:10:32 +0800</pubDate>
				<guid>https://g0g.top/2024/01/phantun/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.v2ex.com/t/802949&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;作者介绍&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;Phantun 可以把 UDP 流量伪装成 TCP。伪装意味着并不遵从 TCP 的任何流量控制等，只是单纯地把 IP 头中的 UDP 和 TCP 转换了一下。因此，Phantun 并不能经过任何常规的 TCP 代理，因为他们基本上都通过内核 TCP 处理，因此会处理 TCP 的流控。而 Phantun 在常规模式下并不会有常规的 TCP 流控相关包，因此会直接断流（收不到 ACK 包）。在这方面 UDP2Raw 倒是模拟了更多的 TCP 特性，因此可以通过 TCP 代理，但是成为了纯纯的 udp over tcp，性能低下。&lt;br&gt;&#xA;最典型的应用是当 ISP 有 UDP 歧视的时候，可以以此减少丢包率；但是不能透过任何代理和防火墙。&lt;/p&gt;&#xA;&lt;h2 id=&#34;打开方式&#34;&gt;打开方式&lt;/h2&gt;&#xA;&lt;p&gt;Phantun 不像 udp2raw 能够自动配置，我们需要按照 &lt;a href=&#34;https://github.com/dndx/phantun&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;官网&lt;/a&gt; 的说明，一步步手动配置。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;# 变量&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;server_port&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#1c01ce&#34;&gt;4567&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;server_address&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;# 第一步：开启内核转发&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;echo&lt;/span&gt; net.ipv4.ip_forward&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt; &amp;gt;&amp;gt; /etc/sysctl.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;echo&lt;/span&gt; net.ipv6.conf.all.forwarding&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt; &amp;gt; /etc/sysctl.conf &lt;span style=&#34;color:#177500&#34;&gt;# v6&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sysctl -p&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;# 第二步：NAT&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;## Client：需要把 Phantun 地址 NAT 为 eth0 地址&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;## Server：需要把来自特定端口的流量全部转发到 TUN 设备，默认为 192.168.201.0/24 和 fcc9::/64 两个地址。&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iptables -t nat -A PREROUTING -p tcp -i eth0 --dport &lt;span style=&#34;color:#000&#34;&gt;$server_port&lt;/span&gt; -j DNAT --to-destination 192.168.201.2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip6tables -t nat -A PREROUTING -p tcp -i eth0 --dport &lt;span style=&#34;color:#000&#34;&gt;$server_port&lt;/span&gt; -j DNAT --to-destination fcc9::2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;# 第三步：赋予网络权限&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setcap &lt;span style=&#34;color:#000&#34;&gt;cap_net_admin&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;+pe phantun_server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setcap &lt;span style=&#34;color:#000&#34;&gt;cap_net_admin&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;+pe phantun_client&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;# 第四步：启动&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;phantun_server --local &lt;span style=&#34;color:#000&#34;&gt;$server_port&lt;/span&gt; --remote &amp;lt;原本的udp服务器:端口&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;phantun_client --local &amp;lt;本地udp监听地址&amp;gt; --remote &lt;span style=&#34;color:#000&#34;&gt;$server_address&lt;/span&gt;:&lt;span style=&#34;color:#000&#34;&gt;$server_port&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>交大水源水印原理初窥</title>
				<link>https://g0g.top/2024/01/%E4%BA%A4%E5%A4%A7%E6%B0%B4%E5%8D%B0%E5%8E%9F%E7%90%86%E5%88%9D%E7%AA%A5/</link>
				<pubDate>Tue, 09 Jan 2024 16:11:00 +0000</pubDate>
				<guid>https://g0g.top/2024/01/%E4%BA%A4%E5%A4%A7%E6%B0%B4%E5%8D%B0%E5%8E%9F%E7%90%86%E5%88%9D%E7%AA%A5/</guid>
				<description>&lt;p&gt;本来以为水源只是做了一个简单的 LSB 隐写，顺手撸了一个去除脚本。没想到前两天使用脚本时，水源居然自动刷新了！而且任何 Event Listener Breakpoint 都无法检测到这个回调函数，任由其刷新。今天考完军理，我倒要看看水源用了什么黑魔法。&lt;/p&gt;&#xA;&lt;p&gt;声明：本人只是出于理论研究的目的对源代码进行研究并提出可能的应对方案，请任何人都不要把水源截图外传，更不要利用本文提到的方式逃避管理。在校内群，请使用链接分享帖子。至于为什么，请自行水源上搜索 &lt;a href=&#34;https://shuiyuan.sjtu.edu.cn/search?q=%E6%88%AA%E5%9B%BE%E5%A4%96%E4%BC%A0&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;截图外传&lt;/a&gt;（ps &lt;a href=&#34;https://shuiyuan.sjtu.edu.cn/t/topic/153895/94&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;一个我很喜欢的解释&lt;/a&gt;）。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://shuiyuan.sjtu.edu.cn/t/topic/156250&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;水源社区管理规范&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第十一条&lt;/strong&gt; 以下行为被界定为“恶意对抗行为”：&lt;/p&gt;&#xA;&lt;p&gt;（一）使用技术手段逃避管理；&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;第十二条&lt;/strong&gt; 以下行为被界定为“对社区的恶意行为”：&lt;/p&gt;&#xA;&lt;p&gt;（二）未经授权许可，将他人发布的内容以图片、视频等形式发布到社区以外，并造成不良影响；&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;找到源代码&#34;&gt;找到源代码&lt;/h2&gt;&#xA;&lt;p&gt;通过简单摸索我们会发现，水印被放在一个 &lt;code&gt;.ember-view&lt;/code&gt; 内部，通过一个 &lt;code&gt;z-index=9999&lt;/code&gt; 且 &lt;code&gt;opacity=0.005&lt;/code&gt; 的全屏的 base64 化的 PNG 写入了可能唯一标识了个人账号的三位 base64（大概能表示 $64^3=262,144$  人，也就是只有二十年的交大人吧/doge）。&lt;/p&gt;&#xA;&lt;p&gt;由于断点没有任何作用，我只好把一个网页的全部代码下载下来：&lt;/p&gt;&#xA; &#xD;&#xA;&#xD;&#xA;&lt;details&gt;&#xD;&#xA;    &lt;summary&gt;全部文件&lt;/summary&gt;&#xD;&#xA;    &lt;p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ls&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 05d79569ae40510aab461b2563db6b47d00e8cd4.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 0aa74b582acb6a91dd3e411b2a7bfbc04e260211.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 108af40fa662a89aaf7a21f877353d51e03f20ab.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 11312c7a2877d0b500b0e6a8c206a7dddd248d68.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 13256e7c9a732d6f122bd0ade6ce1667f1056fc8.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 19b4640f9b7fefd688672e06cba5d97f064376b1.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2953c571d30c38ce62223ab7cb71bfa62ff7f6b3.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2e3da41114c0548f77ba38b143d059f6e71b6070.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3cd5da1afde47c3b2559a9d32fb22dae709bc452.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 5a71c44fba2bc8a8ba3db3aaed76bbf2edc6ef2b.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 609808483b2f30b853cf8365c6210db98a45e7bf.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 755071_2.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 819585_2.jpg&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 9c11c73a9c8a1d753cb2c89ddf7215f2fcbb7d79.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; a1df1e94bf4b5b5825e5947ad9acccb47fdaaa08.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; abe5e87ff37d7d06fc18f6e696f906528dfc9da8.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ba83de1a244eff6ea32b9cfdb456fc943d55fba2.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; browser-detect-13a181da51a93c36e477dd3626795ba449290653fdff8a.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; browser-update-a7811824a1beeecce86fb3546ab789b1788261ece30a33.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; c0eff5115343eeb12e312488f9572bf683b25619.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; c36051143379f82fc44d6b2b723f499d097138a6.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; cdb089134551f0d890ff37adaac1b7fa96a5ba1f.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; chat-3c2c0a87bea84663ed8fd3479fd008569160424dff2e5904463c1aea.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; chat_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; chat_desktop_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; checklist-f67957fc54745e2d28d433f45b8fdddd34d8930865fd51c82a0.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; checklist_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; chunk.5ef2f01c75e63a9864e3.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; chunk.ef28e73e3d8ce45a79d7.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; color_definitions_scheme_1_3_2ceb21439b63ac43c0d23727e715500.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; color_definitions_scheme_2_3_e0c576c10b96945224a8cfc1c5995b7.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; continous-days-visited-0a1f3a5a289feed212e3b738f8280656ac5cee.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; d9439395e9e8be8688cc93b588dd8ecf1115a1f8.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; db287b65037a3ce2491b9ad5245c877b323ff6a8.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; db38b836d86e35614ac30164555cd84c3bc3c6dd.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_37_1522da10433779d746cafc79ea7feff6ebe9d770.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_3_3d24bc909a4159746945cecfa8cee8de96493824.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_56_353dbf58327f2e62005109874adbb04510666e04.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_58_c6d6de17779690824e99a36648e4df96ab67615f.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_59_1c846f489c78ccaf6afbd8bb7b7973150ec09bd1.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_64_96b396354093d5bcb7d0dab382193683be0e77e8.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_65_1cb59dc2d246bcf71678aefca67c06c27cfb7599.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_68_8400573319944af0aa635a2f7f7e5d42c3b7fd6c.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_74_677da7fcf51b0143ed98730f3aba364459b74f70.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_79_a1825946d3fe7d97d214f84d21f15cc07b0884c3.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_81_79a7a6e8301d472501b52ee8864518bd570def04.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_83_85aa855d093c947c912fee33b90d3f77d331f292.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_89_2d9dce6b7b598acbb798bcb9a4cbc8a4769c2d40.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; desktop_theme_91_259e9839336f626e95899ea3689c6383cce9f638.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-automation-797d429c98a553f481d0c33e150e5afe8261a1f4.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-automation_b2c67b8084a86f0477766fc1e3b4cc189a786e9.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-bbcode-3079b7785a470c5508894ce7e21ef4f760f675fb88ea.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-bbcode_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-cakeday-c97b9d03e7a391b25a24f008ca0ffebfd402e9bb3b6.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-cakeday_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-data-explorer-1248d71f16c4796d46d30ee2597df96b716ad.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-data-explorer_b2c67b8084a86f0477766fc1e3b4cc189a78.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-details-26aae552e6a41eaae05c07286af29e9d2f47fecac68.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-details_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-docs-d98420e41668b811fce6ebd0cf558a1b271a6e9f13a027.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-docs_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-graphviz-f5d1a9b315dbf288505004c1393ac993f5f053ea34.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-graphviz_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-lazy-videos-96992b2d9c70100602c892be1e0cdf0f3e0be9f.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-lazy-videos_b2c67b8084a86f0477766fc1e3b4cc189a786e.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-local-dates-453b2b53c09cec847757bb2efbaf4ab6162ecd6.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-local-dates_b2c67b8084a86f0477766fc1e3b4cc189a786e.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-math-0b9adce705e8554ecc8d6c4ddbf8713c5bb5a589e07a91.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-math_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-narrative-bot-643f10339e287d380f81413fde738a8ad3a6e.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-narrative-bot_b2c67b8084a86f0477766fc1e3b4cc189a78.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-no-bump-561edd77c2c9cfc1281128910880083ac1c91780c09.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-onebox-weibo_b2c67b8084a86f0477766fc1e3b4cc189a786.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-presence-eabb23f556643767cf848218ef5a093b1c99496fc6.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-presence_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-solved-08c562b8c2c8394867700f33ad2c8286d8a32019553f.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-solved_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-templates-f4b7f891267b8392caee8f14278e39ed7e726b8d0.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-templates_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-user-notes-afd4dd7029f812c33e086df9b15444d614dae7a3.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; discourse-user-notes_b2c67b8084a86f0477766fc1e3b4cc189a786e9.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; docker_manager_admin-fe9cdca37bd3366d6a0ebb4d5b644d58bdb51647.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; docker_manager_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ec422ab66afb234aef01dbfd5b072c1d82cfa5c4.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; enhanced-ignore-827409206e61dc07ed1362d726142ad57abb3468df0d3.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ffc47fcf9607be2ef80b9ec1c4313c3abb1235f2.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; footnote-e4283bf95e4bdcc5062c1bde5e8962932a35f35298b193181cda.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; footnote_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; footnote_extra-7f7bb8e0891106317fe6883ba187d239709a385df2c386.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;logo dark_&amp;#39;$&amp;#39;\346\233\262\347\272\277\345\214\226&amp;#39;&amp;#39;.svg&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;logo_&amp;#39;$&amp;#39;\346\233\262\347\272\277\345\214\226&amp;#39;&amp;#39;.svg&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; optimized-move-posts-notice-0b54397438579007a4dddc41adc0ae280.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; overrides&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; people_hugging.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; poll-ff562b4ba36654269cfbdd883265f8f6c938a4f003aa2d8547d5d092.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; poll_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; poll_desktop_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; retort-e9ced6a1c13cdd0ec63d76b9374daafa59cd75762651e24fe095e3.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; retort_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; retort_desktop_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; sob.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; spoiler-alert-7994af0f89dbc4d8cfcda8388fbf06cef011ee2cb622a4d.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; spoiler-alert_b2c67b8084a86f0477766fc1e3b4cc189a786e96.css&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; start-discourse-7c0f5f4daf3c942b7b6ecfe8e62e2e5a0f6555924859c.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; svg-3-f4d1b64487be6085362dcf71d6570447745763ce.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; vendor.9e07dd0436aff8751322647cc975361e-0b8308ceb741824f018eb.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; zh_CN-84e3bf8fa7a50b4444752859a8317a818aa929dc3bc74c45a87c70c.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>历史</title>
				<link>https://g0g.top/archives/</link>
				<pubDate>Fri, 05 Jan 2024 23:05:52 +0800</pubDate>
				<guid>https://g0g.top/archives/</guid>
				<description></description>
			</item>
			<item>
				<title>友链</title>
				<link>https://g0g.top/links/</link>
				<pubDate>Fri, 05 Jan 2024 23:05:52 +0800</pubDate>
				<guid>https://g0g.top/links/</guid>
				<description></description>
			</item>
			<item>
				<title>关于</title>
				<link>https://g0g.top/about/</link>
				<pubDate>Fri, 05 Jan 2024 17:38:46 +0800</pubDate>
				<guid>https://g0g.top/about/</guid>
				<description>&lt;p&gt;待施工&amp;hellip;&lt;/p&gt;</description>
			</item>
			<item>
				<title>萌备案</title>
				<link>https://g0g.top/2024/01/%E8%90%8C%E5%A4%87%E6%A1%88/</link>
				<pubDate>Wed, 03 Jan 2024 20:41:29 +0000</pubDate>
				<guid>https://g0g.top/2024/01/%E8%90%8C%E5%A4%87%E6%A1%88/</guid>
				<description>&lt;p&gt;申请的事按照 &lt;a href=&#34;https://icp.gov.moe/join.php&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;官网要求&lt;/a&gt; 一步步做就好啦。这里记录一下添加图标的经过。&lt;/p&gt;&#xA;&lt;h2 id=&#34;基础版&#34;&gt;基础版&lt;/h2&gt;&#xA;&lt;p&gt;要从官网下载 &lt;a href=&#34;https://icp.gov.moe/moe-icon.zip&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;样式库&lt;/a&gt; 才能引用萌备的图标。下载下来解压到 &lt;code&gt;/moebeian&lt;/code&gt; 就行。&lt;/p&gt;&#xA;&lt;p&gt;然后在你的网页 footer 上写上&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#000&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#836c28&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#836c28&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;text/css&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#836c28&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;/moebeian/style.css&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#000&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#836c28&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;icon-MOE&amp;#34;&lt;/span&gt;&amp;gt; &amp;lt;/&lt;span style=&#34;color:#000&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;next-主题适配&#34;&gt;NexT 主题适配&lt;/h2&gt;&#xA;&lt;p&gt;对于我正在使用的 Hexo-NexT 主题，需要编辑 &lt;code&gt;next&lt;/code&gt; 文件夹中的源文件：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#000&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#836c28&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#836c28&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;text/css&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#836c28&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;/moebeian/style.css&amp;#34;&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#000&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#836c28&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;icon-MOE&amp;#34;&lt;/span&gt;&amp;gt; &amp;lt;/&lt;span style=&#34;color:#000&#34;&gt;span&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;&amp;lt;!--以下是原有的备案--&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{- next_url(theme.footer.beian.url, theme.footer.beian.icp + &amp;#39; &amp;#39;) }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后在 NexT 配置文件中编辑&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;beian&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;enable&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;icp&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;萌ICP备xxxx号&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;url&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;https://icp.gov.moe/?keyword=xxxx&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然，萌备样式库放在了 &lt;code&gt;/source/moebeian&lt;/code&gt; 下。&lt;/p&gt;</description>
			</item>
			<item>
				<title>ProtoBuf</title>
				<link>https://g0g.top/2023/12/protobuf-%E5%9F%BA%E7%A1%80/</link>
				<pubDate>Thu, 28 Dec 2023 19:57:18 +0000</pubDate>
				<guid>https://g0g.top/2023/12/protobuf-%E5%9F%BA%E7%A1%80/</guid>
				<description>&lt;p&gt;初次听闻 &lt;a href=&#34;https://protobuf.dev/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;ProtoBuf&lt;/a&gt;，以为他是只是一种“二进制编码的 JSON 平替”。但事实与之相去甚远&lt;/p&gt;&#xA;&lt;h2 id=&#34;基本理解&#34;&gt;基本理解&lt;/h2&gt;&#xA;&lt;p&gt;在此节中我会将 JSON 与 ProtoBuf 进行横向对比。&lt;/p&gt;&#xA;&lt;p&gt;ProtoBuf 在设计上以“机器快速解析”为终极目标，并尽力减少不必要的数据（但不包括压缩）。为此它舍弃了 JSON 的以下优秀特性：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;自解释性：单个 JSON 字符串就可以解析出一个完整的以键值对为基础的对象；然而，ProtoBuf 将格式定义与数据&lt;strong&gt;分离&lt;/strong&gt;，protobuf 数据必须依赖某个目标语言中预定义的类似 &lt;code&gt;struct&lt;/code&gt; 的东西、配合 protobuf 的数据编码解码算法才能够解析。&lt;/li&gt;&#xA;&lt;li&gt;可读性：很明显，作为一种二进制编码，它是不可读的。&lt;/li&gt;&#xA;&lt;li&gt;简单性/易手搓：JSON 如此流行不可不归功于其语法的简洁明了，这也意味着对于一个新语言而言支持非常简单。而 ProtoBuf 定义了一个新的数据结构，有点点复杂，不太好实现。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;当然肯定有不少的优秀特性：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;高速解析：由于格式定义和数据的分离，格式定义被预编译进了代码内部，且以二进制编码数据，从而减少了解析时键名解析、类型判断、数值解析等开销，实现了 3-100 倍的解析性能提升。&lt;/li&gt;&#xA;&lt;li&gt;节省空间&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;：ProtoBuf 通过应用编号(Field Numbers)代替了键名，节省了寻键的开销和键的内存占用；ProtoBuf 用 Varint 和 ZigZag 减少了整数这种数据类型的内存占用。最重要的是，ProtoBuf 中所有部分都是可选的，实际传输中可以只传输要传输的那一部分，从而减少传输数据量；而不必像固定 struct 一样不论数据需不需要都会占固定内存。&lt;/li&gt;&#xA;&lt;li&gt;可变长度&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;：ProtoBuf LEB128 表示变长数据的长度，实现了非标记（例如 JSON的 &lt;code&gt;{}&lt;/code&gt;）变长度。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;个人感觉，ProtoBuf 是 Golang 开发者们为了 Golang 这样的静态语言而设计出的高效、扩展性强的结构化可选数据表示方式。如果把静态考虑在内，ProtoBuf 的确是最好的结构化&lt;strong&gt;可选&lt;/strong&gt;数据表示方式。&lt;/p&gt;&#xA;&lt;h2 id=&#34;打开方式&#34;&gt;打开方式&lt;/h2&gt;&#xA;&lt;p&gt;使用 ProtoBuf 需要三步：&lt;/p&gt;&#xA;&lt;ol start=&#34;0&#34;&gt;&#xA;&lt;li&gt;安装工具链，详见 &lt;a href=&#34;https://protobuf.dev/reference/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;官网&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;在 &lt;code&gt;.proto&lt;/code&gt; 文件中编写你的 protobuf 格式&lt;/li&gt;&#xA;&lt;li&gt;用 &lt;code&gt;protoc&lt;/code&gt; 把 &lt;code&gt;.proto&lt;/code&gt; 文件编译成目标语言的代码&lt;/li&gt;&#xA;&lt;li&gt;在目标语言中引用编译出来的代码，引用 Google ProtoBuf 官方库，解析编码你的 ProtoBuf 数据&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;protobuf-语法&#34;&gt;ProtoBuf 语法&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/h3&gt;&#xA;&lt;p&gt;最基础的 protobuf 文件定义示例如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>git 入门 - 本地篇</title>
				<link>https://g0g.top/2023/12/git-%E5%85%A5%E9%97%A8-%E6%9C%AC%E5%9C%B0%E7%AF%87/</link>
				<pubDate>Fri, 22 Dec 2023 14:58:40 +0000</pubDate>
				<guid>https://g0g.top/2023/12/git-%E5%85%A5%E9%97%A8-%E6%9C%AC%E5%9C%B0%E7%AF%87/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://git-scm.com/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;git&lt;/a&gt; 是最著名的版本管理软件，其最大作用就是离线保存项目的&lt;strong&gt;完整编辑经过&lt;/strong&gt;/历史，并提供了同步，从而能够实现&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;尽可能离线的多人协作和代码同步&lt;/li&gt;&#xA;&lt;li&gt;回滚&lt;/li&gt;&#xA;&lt;li&gt;标注稳定/纪念性版本（增加成就感？）&lt;/li&gt;&#xA;&lt;li&gt;分支和合并&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;本文旨在记录学习到的 git 本地基础知识以复习。初学者建议学习 &lt;a href=&#34;https://git-scm.com/book/zh/v2&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Pro Git book&lt;/a&gt;，并借用 &lt;a href=&#34;https://learngitbranching.js.org/?demo=&amp;amp;locale=zh_CN&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Learn git branching&lt;/a&gt; 网站形成形象的理解。&lt;/p&gt;&#xA;&lt;p&gt;约定：“某个”/“特定的”特指在前面的命令中提到的那个。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;过去，我对 git 的使用只是单纯的 clone 然后只读地作为库使用它；或者是在单人开发中 add, commit  push 一把梭。这时 git 仅仅作为一种比 rsync 更加麻烦的同步工具而被使用，然而其 commit 树带来的众多优秀的本地特性才是 git 的精髓。&lt;/p&gt;&#xA;&lt;p&gt;若要真正熟练运用 git 这个强大工具，不但要对 commit, branch 等概念有基本的理解，更要理解 git 的数据结构和基本原理。&lt;/p&gt;&#xA;&lt;h2 id=&#34;入门&#34;&gt;入门&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init &lt;span style=&#34;color:#177500&#34;&gt;# 初始化一个仓库&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;# 一通编辑&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add . &lt;span style=&#34;color:#177500&#34;&gt;# 添加当前目录所有文件到 git 暂存区&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &amp;lt;commit message&amp;gt; &lt;span style=&#34;color:#177500&#34;&gt;# commit&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;基本概念&#34;&gt;基本概念&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;.git&lt;/code&gt; 目录记录了这个项目编辑改动的全部历史。&lt;/p&gt;&#xA;&lt;p&gt;commit 指一次提交记录，branch 是一串提交记录。他们保存了一个项目编辑的全部历史经过。&lt;/p&gt;&#xA;&lt;p&gt;（逻辑上）一个项目中有一个主分支（通常称为 master/main），其他分支都是从主分支中某个 commit 中分叉出来的，即产生了与主分支不同的 commit。&lt;/p&gt;</description>
			</item>
			<item>
				<title>微信小程序光速入门</title>
				<link>https://g0g.top/2023/12/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%85%89%E9%80%9F%E5%85%A5%E9%97%A8/</link>
				<pubDate>Sun, 17 Dec 2023 19:28:52 +0000</pubDate>
				<guid>https://g0g.top/2023/12/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%85%89%E9%80%9F%E5%85%A5%E9%97%A8/</guid>
				<description>&lt;h2 id=&#34;最小程序组成&#34;&gt;最小程序组成&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在 &lt;a href=&#34;https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;官网&lt;/a&gt; 下载开发者工具安装好。&lt;/p&gt;&#xA;&lt;p&gt;新建一个目录。一个最小程序组成如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;//app.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;App&lt;/span&gt;({});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;pages&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;pages/home&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-pages/home.js&#34; data-lang=&#34;pages/home.js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;//pages/home.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;Page&lt;/span&gt;({});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;&amp;lt;!--pages/home.wxml--&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;view&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;text&amp;gt;&lt;/span&gt;hello world&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;/text&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;/view&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;调用逻辑：首先运行 &lt;code&gt;app.js&lt;/code&gt;。&lt;code&gt;App()&lt;/code&gt; 检查了 &lt;code&gt;app.json&lt;/code&gt;。在此例中，将其中 &lt;code&gt;pages/home.js&lt;/code&gt; 加以处理，其 &lt;code&gt;Page()&lt;/code&gt; 编译 &lt;code&gt;pages/home.wxml&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;项目配置-appjson&#34;&gt;项目配置 &lt;code&gt;app.json&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;app.json&lt;/code&gt; 文件配置了小程序的全局参数，包括 &lt;code&gt;pages&lt;/code&gt; 列表和 &lt;code&gt;window&lt;/code&gt; 字典，和 &lt;a href=&#34;https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;其他&lt;/a&gt;。&lt;code&gt;pages&lt;/code&gt; 存储了所有待编译的页面，&lt;code&gt;window&lt;/code&gt; 包括了这堆页面的全局设定；常用 &lt;code&gt;navigationBarBackgroundColor&lt;/code&gt; 与 &lt;code&gt;navigationBarTitleText&lt;/code&gt; 两个参数。一个示例如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;pages&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;pages/home&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;window&amp;#34;&lt;/span&gt;:{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarBackgroundColor&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;#fff&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarTitleText&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;标题&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarTextStyle&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;black&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;既然有“全局设定”，也就有局部设定。对于一个页面 &lt;code&gt;${NAME}.js&lt;/code&gt;，其 &lt;code&gt;window&lt;/code&gt; 设定存储在该目录下 &lt;code&gt;${NAME}.json&lt;/code&gt; 中，会覆盖全局的 &lt;code&gt;window&lt;/code&gt; 设定。例如&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarBackgroundColor&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;#000&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;&amp;#34;navigationBarTitleText&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;Title&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;程序启动&#34;&gt;程序启动&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;code&gt;App()&lt;/code&gt; 必须在 &lt;code&gt;app.js&lt;/code&gt; 中调用，必须调用且只能调用一次。不然会出现无法预期的后果。&lt;/p&gt;</description>
			</item>
			<item>
				<title>用 VuePress 写一个文档</title>
				<link>https://g0g.top/2023/06/%E7%94%A8-vuepress-%E5%86%99%E4%B8%80%E4%B8%AA%E6%96%87%E6%A1%A3/</link>
				<pubDate>Fri, 30 Jun 2023 17:25:54 +0000</pubDate>
				<guid>https://g0g.top/2023/06/%E7%94%A8-vuepress-%E5%86%99%E4%B8%80%E4%B8%AA%E6%96%87%E6%A1%A3/</guid>
				<description>&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;&#xA;&lt;p&gt;首先参考 &lt;a href=&#34;https://v2.vuepress.vuejs.org/zh/guide/getting-started.html#%E6%89%8B%E5%8A%A8%E5%AE%89%E8%A3%85&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;手动安装&lt;/a&gt; 安装本体&lt;/p&gt;&#xA;&lt;p&gt;然后 &lt;code&gt;npm i -D vuepress-plugin-md-enhance&lt;/code&gt; 安装 &lt;code&gt;md-enhance&lt;/code&gt;，下面会参考 &lt;a href=&#34;https://plugin-md-enhance.vuejs.press/zh/guide/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;Markdown 增强&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;配置&#34;&gt;配置&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#000&#34;&gt;defineUserConfig&lt;/span&gt; } &lt;span style=&#34;color:#000&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;vuepress&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#000&#34;&gt;defaultTheme&lt;/span&gt; } &lt;span style=&#34;color:#000&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;vuepress&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#000&#34;&gt;mdEnhancePlugin&lt;/span&gt; } &lt;span style=&#34;color:#000&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;vuepress-plugin-md-enhance&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;defineUserConfig&lt;/span&gt;({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;lang&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;zh-CN&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;标题&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;head&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; [[&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;link&amp;#39;&lt;/span&gt;, { &lt;span style=&#34;color:#000&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;icon&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;/favicon.svg&amp;#39;&lt;/span&gt; }]], &lt;span style=&#34;color:#177500&#34;&gt;// tab 图标&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;theme&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;defaultTheme&lt;/span&gt;({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000&#34;&gt;logo&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;/favicon.svg&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#177500&#34;&gt;// 主图标&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000&#34;&gt;sidebar&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#39;文件名（可不带.md）&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;plugins&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;mdEnhancePlugin&lt;/span&gt;({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000&#34;&gt;footnote&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#177500&#34;&gt;// 支持脚注&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#177500&#34;&gt;// container: true, // 支持容器，后来发现默认样式也不错&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000&#34;&gt;align&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-stylus&#34; data-lang=&#34;stylus&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;用以修改颜色&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;:&lt;span style=&#34;color:#000&#34;&gt;root&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;--&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;brand&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;#B390D9&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;--&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;brand&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;light&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;#C4A8E1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;html&lt;/span&gt;.&lt;span style=&#34;color:#3f6e75&#34;&gt;dark&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;--&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;brand&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;#A594F9&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;--&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;brand&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;light&lt;/span&gt;: &lt;span style=&#34;color:#1c01ce&#34;&gt;#CDC1FF&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-vue&#34; data-lang=&#34;vue&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;用以修改默认&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;404&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;--&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#177500&#34;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;可以添加任何合法的&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Vue&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;元素&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;--&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;pwa&#34;&gt;PWA&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://v2.vuepress.vuejs.org/zh/reference/plugin/pwa.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;TODO&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>使用 Hexo &#43; NexT 搭建博客</title>
				<link>https://g0g.top/2023/06/%E4%BD%BF%E7%94%A8-hexo-next-%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2/</link>
				<pubDate>Mon, 26 Jun 2023 21:01:48 +0000</pubDate>
				<guid>https://g0g.top/2023/06/%E4%BD%BF%E7%94%A8-hexo-next-%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2/</guid>
				<description>&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;&#xA;&lt;p&gt;参考 &lt;a href=&#34;https://hexo.io/zh-cn/docs/&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;文档 | Hexo&lt;/a&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install -g hexo-cli&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hexo init my-blog &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;cd&lt;/span&gt; my-blog&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;配置-hexo&#34;&gt;配置 Hexo&lt;/h2&gt;&#xA;&lt;p&gt;我们需要区分两个 &lt;code&gt;_config.yml&lt;/code&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;After the installation of Hexo and NexT, you may found that there are two configuration files using by Hexo and both called &lt;code&gt;_config.yml&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The first one is under {% label info@site root directory %}, which contains Hexo&amp;rsquo;s config.&lt;/li&gt;&#xA;&lt;li&gt;The second one is under {% label primary@theme root directory %} (e.g. &lt;code&gt;themes/next/_config.yml&lt;/code&gt; or &lt;code&gt;node_modules/hexo-theme-next/_config.yml&lt;/code&gt;), which is provided by NexT and contains theme&amp;rsquo;s config.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s call the first one – {% label info@Hexo config file %}, and the second one – {% label primary@NexT config file %}.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title></title>
				<link>https://g0g.top/note/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E9%A2%84%E4%B9%A0/0x02-%E7%BA%BF%E6%80%A7%E8%A1%A8/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://g0g.top/note/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E9%A2%84%E4%B9%A0/0x02-%E7%BA%BF%E6%80%A7%E8%A1%A8/</guid>
				<description></description>
			</item>
			<item>
				<title></title>
				<link>https://g0g.top/note/%E7%94%B5%E8%B7%AF%E7%90%86%E8%AE%BA/1/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://g0g.top/note/%E7%94%B5%E8%B7%AF%E7%90%86%E8%AE%BA/1/</guid>
				<description>&lt;h2 id=&#34;电感电容电阻&#34;&gt;电感，电容，电阻&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;T型去耦&lt;br&gt;&#xA;&lt;img src=&#34;b77fd69b55be25791ce82497d17d9b3a_r.jpg&#34; alt=&#34;耦合电感等效&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;电阻、电感串算术、并调和、变压/流乘；电导、电容串调和、并算数、变压/流除&lt;/li&gt;&#xA;&lt;li&gt;磁链守恒：对于一个纯电感回路，由 KVL $\Sigma L_k\frac{\text{d}i_k}{\text{d}t}=0$&#xA;有 $\Sigma L_ki_k$ 守恒&lt;/li&gt;&#xA;&lt;li&gt;电荷守恒：连到同一节点的电容， $\Sigma Q_k=\Sigma U_kC_k = Const$&lt;/li&gt;&#xA;&lt;li&gt;时间常数 $\tau_C=RC, \tau_L=L/R$&lt;/li&gt;&#xA;&lt;li&gt;RLC:&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;串联 $R$&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;并联 $G$&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;过阻尼&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$&amp;gt;2\sqrt{L/C}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$&amp;gt;2\sqrt{C/L}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;临界阻尼&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$=2\sqrt{L/C}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$=2\sqrt{C/L}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;欠阻尼&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$&amp;lt;2\sqrt{L/C}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$&amp;lt;2\sqrt{C/L}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;无阻尼&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$0$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;$0$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;冲激响应 $h(T)=\frac{\text{d}S(t)}{\text{d}t}$&lt;/li&gt;&#xA;&lt;li&gt;受控电源等效：与i有关项，需串联到对应路，然后等效电阻；u 项需并联到对应路，&#xA;然后等效电导；常数项直接等效为电源。注意方向：电流方向应为电压降向。&lt;/li&gt;&#xA;&lt;li&gt;电容：从正流向负为正参考方向&lt;/li&gt;&#xA;&lt;li&gt;RC 桥式振荡&#xA;&lt;img src=&#34;image.png&#34; alt=&#34;RC 桥式振荡&#34;&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;拉普拉斯变换&#34;&gt;拉普拉斯变换&lt;/h2&gt;&#xA;&lt;p&gt;$F(s)=\int_{0^-}^\infty f(t)e^{-st}\text{d}t$&lt;br&gt;&#xA;$f(s)=\frac1{2\pi j}\int_{\sigma-j\infty}^{\sigma+j\infty} F(t)e^{st}\text{d}t, t\ge0$&lt;/p&gt;&#xA;&lt;p&gt;常见变换表：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: center&#34;&gt;原函数&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: center&#34;&gt;像函数&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\delta(t)$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$1$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\varepsilon(t), 1$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$1/s$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$t^n$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$n!/s^{n+1}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\cos(\omega t)$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\frac{s}{s^2+\omega^2}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\sin(\omega t)$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$\frac{\omega}{s^2+\omega^2}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$e^{-at}$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: center&#34;&gt;$1/(s+a)$&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;性质：&lt;/p&gt;</description>
			</item>
			<item>
				<title></title>
				<link>https://g0g.top/todo/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://g0g.top/todo/</guid>
				<description>&lt;ul&gt;&#xA;&lt;li&gt;resource file redict&lt;/li&gt;&#xA;&lt;li&gt;latex &lt;code&gt;\&lt;/code&gt; ignore&lt;/li&gt;&#xA;&lt;li&gt;table of content generation&lt;/li&gt;&#xA;&lt;li&gt;template render&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
	</channel>
</rss>
