<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Garlic Space</title><link>https://garlicspace.com/</link><description>Recent content on Garlic Space</description><generator>Hugo -- 0.152.2</generator><language>zh-cn</language><lastBuildDate>Fri, 13 Mar 2026 11:30:00 +0800</lastBuildDate><atom:link href="https://garlicspace.com/feed.xml" rel="self" type="application/rss+xml"/><item><title>AI Daily Newsletter｜2026-03-13｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-13-ai-daily/</link><pubDate>Fri, 13 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-13-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;20&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;1) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;2) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-the-new-rules-of-ai-a-global-legal-overview"&gt;3) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-november-2025-tech-litigation-roundup"&gt;4) November 2025 Tech Litigation Roundup&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Tech Policy Press&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-10 16:00 (UTC+8)&lt;/code&gt;
Tech Policy Press 披露：November 2025 Tech Litigation Roundup。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-global-ai-governance-law-and-policy-us"&gt;5) Global AI Governance Law and Policy: US&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;IAPP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-03 15:00 (UTC+8)&lt;/code&gt;
IAPP 披露：Global AI Governance Law and Policy: US。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-6-regulatory-convergence-grows-across-sectors-and-borders"&gt;6) 6. Regulatory convergence grows across sectors and borders&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Freshfields&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-23 06:25 (UTC+8)&lt;/code&gt;
Freshfields 披露：6. Regulatory convergence grows across sectors and borders。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://freshfields.com"&gt;https://freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freshfields.com"&gt;https://www.freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-proximal-cloud-and-instant-systems-partner-to-accelerate-enterprise-ai-deployment-and-supercharge-startups"&gt;8) Proximal Cloud And Instant Systems Partner To Accelerate Enterprise AI Deployment And Supercharge Startups.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;TRIPURA STAR NEWS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-03-11 18:58 (UTC+8)&lt;/code&gt;
TRIPURA STAR NEWS 披露：Proximal Cloud And Instant Systems Partner To Accelerate Enterprise AI Deployment And Supercharge Startups.。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tripurastarnews.com"&gt;https://tripurastarnews.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tripurastarnews.com"&gt;https://www.tripurastarnews.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-softbank-shares-slide-as-nvidia-stake-sale-highlights-ai-funding-needs"&gt;9) SoftBank shares slide as Nvidia stake sale highlights AI funding needs&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Reuters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-11-12 16:00 (UTC+8)&lt;/code&gt;
Reuters 披露：SoftBank shares slide as Nvidia stake sale highlights AI funding needs。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reuters.com"&gt;https://reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reuters.com"&gt;https://www.reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-2026-banking-and-capital-markets-outlook"&gt;10) 2026 banking and capital markets outlook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Deloitte&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-30 15:00 (UTC+8)&lt;/code&gt;
Deloitte 披露：2026 banking and capital markets outlook。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deloitte.com"&gt;https://deloitte.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.deloitte.com"&gt;https://www.deloitte.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-how-much-data-center-revenue-do-ai-companies-bring-in"&gt;11) How Much Data Center Revenue Do AI Companies Bring In?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Motley Fool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-03-06 03:26 (UTC+8)&lt;/code&gt;
The Motley Fool 披露：How Much Data Center Revenue Do AI Companies Bring In?。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fool.com"&gt;https://fool.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fool.com"&gt;https://www.fool.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.12（2026-03-13））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-12｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-12-ai-daily/</link><pubDate>Thu, 12 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-12-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;20&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;1) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;2) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-the-new-rules-of-ai-a-global-legal-overview"&gt;3) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-august-2025-us-tech-policy-roundup"&gt;4) August 2025 US Tech Policy Roundup&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Tech Policy Press&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-02 15:00 (UTC+8)&lt;/code&gt;
Tech Policy Press 披露：August 2025 US Tech Policy Roundup。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-global-ai-governance-law-and-policy-us"&gt;5) Global AI Governance Law and Policy: US&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;IAPP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-03 15:00 (UTC+8)&lt;/code&gt;
IAPP 披露：Global AI Governance Law and Policy: US。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-california-leads-regulatory-frontier-with-new-privacy-and-artificial-intelligence-laws-for-2026"&gt;6) California Leads Regulatory Frontier with New Privacy and Artificial Intelligence Laws for 2026&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Buchanan Ingersoll &amp;amp; Rooney PC&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-11-12 16:00 (UTC+8)&lt;/code&gt;
Buchanan Ingersoll &amp;amp; Rooney PC 披露：California Leads Regulatory Frontier with New Privacy and Artificial Intelligence Laws for 2026。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bipc.com"&gt;https://bipc.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bipc.com"&gt;https://www.bipc.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-infosys-and-anthropic-forge-strategic-partnership-to-accelerate-enterprise-ai-adoption-across-regulated-industries"&gt;7) Infosys and Anthropic Forge Strategic Partnership to Accelerate Enterprise AI Adoption Across Regulated Industries&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Tekedia&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-18 21:50 (UTC+8)&lt;/code&gt;
Tekedia 披露：Infosys and Anthropic Forge Strategic Partnership to Accelerate Enterprise AI Adoption Across Regulated Industries。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tekedia.com"&gt;https://tekedia.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tekedia.com"&gt;https://www.tekedia.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;8) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-salesforce-lifts-guidance-as-informatica-acquisition-ai-momentum-strengthen-growth-outlook"&gt;9) Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;ERP Today&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-04 16:00 (UTC+8)&lt;/code&gt;
ERP Today 披露：Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-2026-banking-and-capital-markets-outlook"&gt;10) 2026 banking and capital markets outlook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Deloitte&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-30 15:00 (UTC+8)&lt;/code&gt;
Deloitte 披露：2026 banking and capital markets outlook。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deloitte.com"&gt;https://deloitte.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.deloitte.com"&gt;https://www.deloitte.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-how-much-data-center-revenue-do-ai-companies-bring-in"&gt;11) How Much Data Center Revenue Do AI Companies Bring In?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Motley Fool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-03-06 03:26 (UTC+8)&lt;/code&gt;
The Motley Fool 披露：How Much Data Center Revenue Do AI Companies Bring In?。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fool.com"&gt;https://fool.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fool.com"&gt;https://www.fool.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.8（2026-03-09））
来源：&lt;/p&gt;</description></item><item><title>运维 Agent / Runbook / AIOps 官方方案详细学习笔记</title><link>https://garlicspace.com/posts/ops-agent-solution-study/</link><pubDate>Wed, 11 Mar 2026 15:30:00 +0800</pubDate><guid>https://garlicspace.com/posts/ops-agent-solution-study/</guid><description>系统梳理 StackStorm、Rundeck、OpenTelemetry Collector、PagerDuty SRE Agent、LangGraph HITL 与 OpenAI Agents SDK 的官方能力边界、设计理念与可直接上手的命令示例。</description></item><item><title>AI Daily Newsletter｜2026-03-11｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-11-ai-daily/</link><pubDate>Wed, 11 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-11-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;12&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-5175m-settlement-in-clearview-ai-biometric-privacy-litigation-illustrates-creative-resolution-for-startups-facing-parallel-litigation-and-enforcement-action"&gt;1) $51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;regulatoryoversight.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-04-30 15:00 (UTC+8)&lt;/code&gt;
regulatoryoversight.com 披露：$51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regulatoryoversight.com"&gt;https://regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.regulatoryoversight.com"&gt;https://www.regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;2) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;3) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-the-new-rules-of-ai-a-global-legal-overview"&gt;4) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-ai-antitrust-landscape-2025-federal-policy-algorithm-cases-and-regulatory-scrutiny"&gt;5) AI Antitrust Landscape 2025: Federal Policy, Algorithm Cases, and Regulatory Scrutiny&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The National Law Review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-05 15:00 (UTC+8)&lt;/code&gt;
The National Law Review 披露：AI Antitrust Landscape 2025: Federal Policy, Algorithm Cases, and Regulatory Scrutiny。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://natlawreview.com"&gt;https://natlawreview.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://natlawreview.com"&gt;https://natlawreview.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-global-ai-governance-law-and-policy-us"&gt;6) Global AI Governance Law and Policy: US&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;IAPP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-03 15:00 (UTC+8)&lt;/code&gt;
IAPP 披露：Global AI Governance Law and Policy: US。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-infosys-and-anthropic-forge-strategic-partnership-to-accelerate-enterprise-ai-adoption-across-regulated-industries"&gt;7) Infosys and Anthropic Forge Strategic Partnership to Accelerate Enterprise AI Adoption Across Regulated Industries&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Tekedia&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-18 21:50 (UTC+8)&lt;/code&gt;
Tekedia 披露：Infosys and Anthropic Forge Strategic Partnership to Accelerate Enterprise AI Adoption Across Regulated Industries。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tekedia.com"&gt;https://tekedia.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tekedia.com"&gt;https://www.tekedia.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;8) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-turning-data-center-revenues-into-affordable-homes"&gt;9) Turning Data Center Revenues into Affordable Homes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Urban Institute&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-27 15:00 (UTC+8)&lt;/code&gt;
Urban Institute 披露：Turning Data Center Revenues into Affordable Homes。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urban.org"&gt;https://urban.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.urban.org"&gt;https://www.urban.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-nextracker-moves-into-ai-and-robotics-posts-us864-million-in-revenue"&gt;10) Nextracker moves into AI and robotics, posts US$864 million in revenue&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;PV Tech&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-07-30 15:00 (UTC+8)&lt;/code&gt;
PV Tech 披露：Nextracker moves into AI and robotics, posts US$864 million in revenue。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pv-tech.org"&gt;https://pv-tech.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pv-tech.org"&gt;https://www.pv-tech.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-how-much-data-center-revenue-do-ai-companies-bring-in"&gt;11) How Much Data Center Revenue Do AI Companies Bring In?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Motley Fool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-03-06 03:26 (UTC+8)&lt;/code&gt;
The Motley Fool 披露：How Much Data Center Revenue Do AI Companies Bring In?。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fool.com"&gt;https://fool.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fool.com"&gt;https://www.fool.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.8（2026-03-09））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-10｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-10-ai-daily/</link><pubDate>Tue, 10 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-10-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;14&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-5175m-settlement-in-clearview-ai-biometric-privacy-litigation-illustrates-creative-resolution-for-startups-facing-parallel-litigation-and-enforcement-action"&gt;1) $51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;regulatoryoversight.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-04-30 15:00 (UTC+8)&lt;/code&gt;
regulatoryoversight.com 披露：$51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regulatoryoversight.com"&gt;https://regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.regulatoryoversight.com"&gt;https://www.regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;2) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;3) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-the-new-rules-of-ai-a-global-legal-overview"&gt;4) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-global-ai-governance-law-and-policy-us"&gt;5) Global AI Governance Law and Policy: US&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;IAPP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-03 15:00 (UTC+8)&lt;/code&gt;
IAPP 披露：Global AI Governance Law and Policy: US。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-6-regulatory-convergence-grows-across-sectors-and-borders"&gt;6) 6. Regulatory convergence grows across sectors and borders&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Freshfields&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-23 06:25 (UTC+8)&lt;/code&gt;
Freshfields 披露：6. Regulatory convergence grows across sectors and borders。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://freshfields.com"&gt;https://freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freshfields.com"&gt;https://www.freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;8) OpenAI partners with Capgemini to scale enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 16:00 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-turning-data-center-revenues-into-affordable-homes"&gt;9) Turning Data Center Revenues into Affordable Homes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Urban Institute&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-27 15:00 (UTC+8)&lt;/code&gt;
Urban Institute 披露：Turning Data Center Revenues into Affordable Homes。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urban.org"&gt;https://urban.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.urban.org"&gt;https://www.urban.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-2026-banking-and-capital-markets-outlook"&gt;10) 2026 banking and capital markets outlook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Deloitte&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-30 15:00 (UTC+8)&lt;/code&gt;
Deloitte 披露：2026 banking and capital markets outlook。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deloitte.com"&gt;https://deloitte.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.deloitte.com"&gt;https://www.deloitte.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-how-much-data-center-revenue-do-ai-companies-bring-in"&gt;11) How Much Data Center Revenue Do AI Companies Bring In?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Motley Fool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-03-06 03:26 (UTC+8)&lt;/code&gt;
The Motley Fool 披露：How Much Data Center Revenue Do AI Companies Bring In?。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fool.com"&gt;https://fool.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fool.com"&gt;https://www.fool.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.8（2026-03-09））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-09｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-09-ai-daily/</link><pubDate>Mon, 09 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-09-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;16&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-5175m-settlement-in-clearview-ai-biometric-privacy-litigation-illustrates-creative-resolution-for-startups-facing-parallel-litigation-and-enforcement-action"&gt;1) $51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;regulatoryoversight.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-04-30 15:00 (UTC+8)&lt;/code&gt;
regulatoryoversight.com 披露：$51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regulatoryoversight.com"&gt;https://regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.regulatoryoversight.com"&gt;https://www.regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;2) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;3) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-the-new-rules-of-ai-a-global-legal-overview"&gt;4) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-global-ai-governance-law-and-policy-us"&gt;5) Global AI Governance Law and Policy: US&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;IAPP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-03 15:00 (UTC+8)&lt;/code&gt;
IAPP 披露：Global AI Governance Law and Policy: US。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-from-data-to-decisions-navigating-privacy-and-litigation-risks-in-the-ai-era"&gt;6) From Data to Decisions: Navigating Privacy and Litigation Risks in the AI Era&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Lexology&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-07-22 15:00 (UTC+8)&lt;/code&gt;
Lexology 披露：From Data to Decisions: Navigating Privacy and Litigation Risks in the AI Era。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lexology.com"&gt;https://lexology.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lexology.com"&gt;https://www.lexology.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;8) OpenAI partners with Capgemini to scale enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 16:00 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-waystar-finalizes-125b-acquisition-of-iodine-software-to-boost-ai-enabled-revenue-cycle-management"&gt;9) Waystar finalizes $1.25B acquisition of Iodine Software to boost AI-enabled revenue cycle management&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Fierce Healthcare&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-07-23 15:00 (UTC+8)&lt;/code&gt;
Fierce Healthcare 披露：Waystar finalizes $1.25B acquisition of Iodine Software to boost AI-enabled revenue cycle management。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fiercehealthcare.com"&gt;https://fiercehealthcare.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fiercehealthcare.com"&gt;https://www.fiercehealthcare.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-turning-data-center-revenues-into-affordable-homes"&gt;10) Turning Data Center Revenues into Affordable Homes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Urban Institute&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-27 15:00 (UTC+8)&lt;/code&gt;
Urban Institute 披露：Turning Data Center Revenues into Affordable Homes。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urban.org"&gt;https://urban.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.urban.org"&gt;https://www.urban.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-how-much-data-center-revenue-do-ai-companies-bring-in"&gt;11) How Much Data Center Revenue Do AI Companies Bring In?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Motley Fool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-03-06 03:26 (UTC+8)&lt;/code&gt;
The Motley Fool 披露：How Much Data Center Revenue Do AI Companies Bring In?。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fool.com"&gt;https://fool.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fool.com"&gt;https://www.fool.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.7（2026-03-08））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-08｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-08-ai-daily/</link><pubDate>Sun, 08 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-08-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;20&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-5175m-settlement-in-clearview-ai-biometric-privacy-litigation-illustrates-creative-resolution-for-startups-facing-parallel-litigation-and-enforcement-action"&gt;1) $51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;regulatoryoversight.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-04-30 15:00 (UTC+8)&lt;/code&gt;
regulatoryoversight.com 披露：$51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regulatoryoversight.com"&gt;https://regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.regulatoryoversight.com"&gt;https://www.regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;2) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;3) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-the-new-rules-of-ai-a-global-legal-overview"&gt;4) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-ai-antitrust-landscape-2025-federal-policy-algorithm-cases-and-regulatory-scrutiny"&gt;5) AI Antitrust Landscape 2025: Federal Policy, Algorithm Cases, and Regulatory Scrutiny&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The National Law Review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-05 15:00 (UTC+8)&lt;/code&gt;
The National Law Review 披露：AI Antitrust Landscape 2025: Federal Policy, Algorithm Cases, and Regulatory Scrutiny。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://natlawreview.com"&gt;https://natlawreview.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://natlawreview.com"&gt;https://natlawreview.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-global-ai-governance-law-and-policy-us"&gt;6) Global AI Governance Law and Policy: US&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;IAPP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-03 15:00 (UTC+8)&lt;/code&gt;
IAPP 披露：Global AI Governance Law and Policy: US。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-cisco-ai-strategy-dominance-by-architecting-enterprise-ai"&gt;8) Cisco AI Strategy: Dominance by Architecting Enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Klover.ai&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-07-15 15:00 (UTC+8)&lt;/code&gt;
Klover.ai 披露：Cisco AI Strategy: Dominance by Architecting Enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://klover.ai"&gt;https://klover.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.klover.ai"&gt;https://www.klover.ai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-salesforce-lifts-guidance-as-informatica-acquisition-ai-momentum-strengthen-growth-outlook"&gt;9) Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;ERP Today&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-04 16:00 (UTC+8)&lt;/code&gt;
ERP Today 披露：Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-ask-sage-acquisition-and-earnings-reset-could-be-a-game-changer-for-bigbearai-holdings-bbai"&gt;10) Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;simplywall.st&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-27 16:33 (UTC+8)&lt;/code&gt;
simplywall.st 披露：Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-how-much-data-center-revenue-do-ai-companies-bring-in"&gt;11) How Much Data Center Revenue Do AI Companies Bring In?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Motley Fool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-03-06 03:26 (UTC+8)&lt;/code&gt;
The Motley Fool 披露：How Much Data Center Revenue Do AI Companies Bring In?。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fool.com"&gt;https://fool.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fool.com"&gt;https://www.fool.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.2（2026-03-03））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-07｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-07-ai-daily/</link><pubDate>Sat, 07 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-07-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;20&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-5175m-settlement-in-clearview-ai-biometric-privacy-litigation-illustrates-creative-resolution-for-startups-facing-parallel-litigation-and-enforcement-action"&gt;1) $51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;regulatoryoversight.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-04-30 15:00 (UTC+8)&lt;/code&gt;
regulatoryoversight.com 披露：$51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regulatoryoversight.com"&gt;https://regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.regulatoryoversight.com"&gt;https://www.regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;2) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-the-new-rules-of-ai-a-global-legal-overview"&gt;3) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-ai-antitrust-landscape-2025-federal-policy-algorithm-cases-and-regulatory-scrutiny"&gt;4) AI Antitrust Landscape 2025: Federal Policy, Algorithm Cases, and Regulatory Scrutiny&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The National Law Review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-05 15:00 (UTC+8)&lt;/code&gt;
The National Law Review 披露：AI Antitrust Landscape 2025: Federal Policy, Algorithm Cases, and Regulatory Scrutiny。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://natlawreview.com"&gt;https://natlawreview.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://natlawreview.com"&gt;https://natlawreview.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-global-ai-governance-law-and-policy-us"&gt;5) Global AI Governance Law and Policy: US&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;IAPP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-03 15:00 (UTC+8)&lt;/code&gt;
IAPP 披露：Global AI Governance Law and Policy: US。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-ai-watch-global-regulatory-tracker---united-states"&gt;6) AI Watch: Global regulatory tracker - United States&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-24 15:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case 披露：AI Watch: Global regulatory tracker - United States。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;8) OpenAI partners with Capgemini to scale enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 16:00 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-salesforce-lifts-guidance-as-informatica-acquisition-ai-momentum-strengthen-growth-outlook"&gt;9) Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;ERP Today&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-04 16:00 (UTC+8)&lt;/code&gt;
ERP Today 披露：Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-ask-sage-acquisition-and-earnings-reset-could-be-a-game-changer-for-bigbearai-holdings-bbai"&gt;10) Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;simplywall.st&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-27 16:33 (UTC+8)&lt;/code&gt;
simplywall.st 披露：Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-oracle-assures-investors-on-ai-cloud-margins-as-it-struggles-to-profit-from-older-nvidia-chips"&gt;11) Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Information&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-16 15:00 (UTC+8)&lt;/code&gt;
The Information 披露：Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theinformation.com"&gt;https://theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theinformation.com"&gt;https://www.theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.2（2026-03-03））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-06｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-06-ai-daily/</link><pubDate>Fri, 06 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-06-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;19&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-5175m-settlement-in-clearview-ai-biometric-privacy-litigation-illustrates-creative-resolution-for-startups-facing-parallel-litigation-and-enforcement-action"&gt;1) $51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;regulatoryoversight.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-04-30 15:00 (UTC+8)&lt;/code&gt;
regulatoryoversight.com 披露：$51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regulatoryoversight.com"&gt;https://regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.regulatoryoversight.com"&gt;https://www.regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;2) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-ftc-backs-doj-proposal-in-google-search-antitrust-case"&gt;3) FTC backs DOJ proposal in Google search antitrust case&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Reuters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-05-29 15:00 (UTC+8)&lt;/code&gt;
Reuters 披露：FTC backs DOJ proposal in Google search antitrust case。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reuters.com"&gt;https://reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reuters.com"&gt;https://www.reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-the-new-rules-of-ai-a-global-legal-overview"&gt;4) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-global-ai-governance-law-and-policy-us"&gt;5) Global AI Governance Law and Policy: US&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;IAPP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-03 15:00 (UTC+8)&lt;/code&gt;
IAPP 披露：Global AI Governance Law and Policy: US。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iapp.org"&gt;https://iapp.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-ai-watch-global-regulatory-tracker---united-states"&gt;6) AI Watch: Global regulatory tracker - United States&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-24 15:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case 披露：AI Watch: Global regulatory tracker - United States。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;8) OpenAI partners with Capgemini to scale enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 16:00 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-salesforce-lifts-guidance-as-informatica-acquisition-ai-momentum-strengthen-growth-outlook"&gt;9) Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;ERP Today&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-04 16:00 (UTC+8)&lt;/code&gt;
ERP Today 披露：Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-ask-sage-acquisition-and-earnings-reset-could-be-a-game-changer-for-bigbearai-holdings-bbai"&gt;10) Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;simplywall.st&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-27 16:33 (UTC+8)&lt;/code&gt;
simplywall.st 披露：Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-oracle-assures-investors-on-ai-cloud-margins-as-it-struggles-to-profit-from-older-nvidia-chips"&gt;11) Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Information&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-16 15:00 (UTC+8)&lt;/code&gt;
The Information 披露：Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theinformation.com"&gt;https://theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theinformation.com"&gt;https://www.theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.2（2026-03-03））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-05｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-05-ai-daily/</link><pubDate>Thu, 05 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-05-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;18&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-5175m-settlement-in-clearview-ai-biometric-privacy-litigation-illustrates-creative-resolution-for-startups-facing-parallel-litigation-and-enforcement-action"&gt;1) $51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;regulatoryoversight.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-04-30 15:00 (UTC+8)&lt;/code&gt;
regulatoryoversight.com 披露：$51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regulatoryoversight.com"&gt;https://regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.regulatoryoversight.com"&gt;https://www.regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;2) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-ftc-backs-doj-proposal-in-google-search-antitrust-case"&gt;3) FTC backs DOJ proposal in Google search antitrust case&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Reuters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-05-29 15:00 (UTC+8)&lt;/code&gt;
Reuters 披露：FTC backs DOJ proposal in Google search antitrust case。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reuters.com"&gt;https://reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reuters.com"&gt;https://www.reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;4) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-the-new-rules-of-ai-a-global-legal-overview"&gt;5) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-ai-and-antitrust-a-technical-primer"&gt;6) AI and Antitrust: A Technical Primer&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;American Bar Association&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-12 16:00 (UTC+8)&lt;/code&gt;
American Bar Association 披露：AI and Antitrust: A Technical Primer。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbar.org"&gt;https://americanbar.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.americanbar.org"&gt;https://www.americanbar.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;8) OpenAI partners with Capgemini to scale enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 22:46 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-ask-sage-acquisition-and-earnings-reset-could-be-a-game-changer-for-bigbearai-holdings-bbai"&gt;9) Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;simplywall.st&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-27 16:33 (UTC+8)&lt;/code&gt;
simplywall.st 披露：Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-turning-data-center-revenues-into-affordable-homes"&gt;10) Turning Data Center Revenues into Affordable Homes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Urban Institute&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-27 15:00 (UTC+8)&lt;/code&gt;
Urban Institute 披露：Turning Data Center Revenues into Affordable Homes。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urban.org"&gt;https://urban.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.urban.org"&gt;https://www.urban.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-oracle-assures-investors-on-ai-cloud-margins-as-it-struggles-to-profit-from-older-nvidia-chips"&gt;11) Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Information&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-16 15:00 (UTC+8)&lt;/code&gt;
The Information 披露：Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theinformation.com"&gt;https://theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theinformation.com"&gt;https://www.theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.2（2026-03-03））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-04｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-04-ai-daily/</link><pubDate>Wed, 04 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-04-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;16&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-5175m-settlement-in-clearview-ai-biometric-privacy-litigation-illustrates-creative-resolution-for-startups-facing-parallel-litigation-and-enforcement-action"&gt;1) $51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;regulatoryoversight.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-04-30 15:00 (UTC+8)&lt;/code&gt;
regulatoryoversight.com 披露：$51.75M Settlement in Clearview AI Biometric Privacy Litigation Illustrates Creative Resolution for Startups Facing Parallel Litigation and Enforcement Action。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://regulatoryoversight.com"&gt;https://regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.regulatoryoversight.com"&gt;https://www.regulatoryoversight.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;2) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-ai--antitrust-series-episode-3-ai-applications"&gt;3) AI &amp;amp; Antitrust Series, Episode 3: AI Applications&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;American Bar Association&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-03-03 09:31 (UTC+8)&lt;/code&gt;
American Bar Association 披露：AI &amp;amp; Antitrust Series, Episode 3: AI Applications。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbar.org"&gt;https://americanbar.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.americanbar.org"&gt;https://www.americanbar.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;4) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-google-ruling-shows-how-tech-can-outpace-antitrust-enforcement"&gt;5) Google ruling shows how tech can outpace antitrust enforcement&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Reuters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-09-04 15:00 (UTC+8)&lt;/code&gt;
Reuters 披露：Google ruling shows how tech can outpace antitrust enforcement。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reuters.com"&gt;https://reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reuters.com"&gt;https://www.reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-the-new-rules-of-ai-a-global-legal-overview"&gt;6) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;8) OpenAI partners with Capgemini to scale enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 22:46 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-nvidia-earnings-record-441b-revenue-powers-ai-growth-while-new-china-rules-trigger-45b-charge"&gt;9) NVIDIA Earnings: Record $44.1B Revenue Powers AI Growth While New China Rules Trigger $4.5B Charge&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Stock Titan&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-05-28 15:00 (UTC+8)&lt;/code&gt;
Stock Titan 披露：NVIDIA Earnings: Record $44.1B Revenue Powers AI Growth While New China Rules Trigger $4.5B Charge。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stocktitan.net"&gt;https://stocktitan.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stocktitan.net"&gt;https://www.stocktitan.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-healwell-revenue-more-than-doubled-in-q1-2025-thanks-to-acquisition-spree-and-ai"&gt;10) Healwell revenue more than doubled in Q1 2025 thanks to acquisition spree and AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;BetaKit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-05-13 15:00 (UTC+8)&lt;/code&gt;
BetaKit 披露：Healwell revenue more than doubled in Q1 2025 thanks to acquisition spree and AI。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://betakit.com"&gt;https://betakit.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://betakit.com"&gt;https://betakit.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-oracle-assures-investors-on-ai-cloud-margins-as-it-struggles-to-profit-from-older-nvidia-chips"&gt;11) Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Information&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-16 15:00 (UTC+8)&lt;/code&gt;
The Information 披露：Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theinformation.com"&gt;https://theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theinformation.com"&gt;https://www.theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.2（2026-03-03））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-03｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-03-ai-daily/</link><pubDate>Tue, 03 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-03-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;18&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;1) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-ftc-backs-doj-proposal-in-google-search-antitrust-case"&gt;2) FTC backs DOJ proposal in Google search antitrust case&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Reuters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-05-29 15:00 (UTC+8)&lt;/code&gt;
Reuters 披露：FTC backs DOJ proposal in Google search antitrust case。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reuters.com"&gt;https://reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reuters.com"&gt;https://www.reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;3) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-the-new-rules-of-ai-a-global-legal-overview"&gt;4) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-6-regulatory-convergence-grows-across-sectors-and-borders"&gt;5) 6. Regulatory convergence grows across sectors and borders&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Freshfields&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-23 06:25 (UTC+8)&lt;/code&gt;
Freshfields 披露：6. Regulatory convergence grows across sectors and borders。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://freshfields.com"&gt;https://freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freshfields.com"&gt;https://www.freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-year-in-review-2025-artificial-intelligence-privacy-litigation-trends"&gt;6) Year in Review: 2025 Artificial Intelligence-Privacy Litigation Trends&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;JD Supra&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-03 16:00 (UTC+8)&lt;/code&gt;
JD Supra 披露：Year in Review: 2025 Artificial Intelligence-Privacy Litigation Trends。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jdsupra.com"&gt;https://jdsupra.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jdsupra.com"&gt;https://www.jdsupra.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;7) OpenAI partners with Capgemini to scale enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 22:46 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-servicenow-ntt-data-expand-partnership-to-drive-ai-led-enterprise-transformation"&gt;8) ServiceNow, NTT DATA Expand Partnership to Drive AI-Led Enterprise Transformation&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Fast Mode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-11-11 11:03 (UTC+8)&lt;/code&gt;
The Fast Mode 披露：ServiceNow, NTT DATA Expand Partnership to Drive AI-Led Enterprise Transformation。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thefastmode.com"&gt;https://thefastmode.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thefastmode.com"&gt;https://www.thefastmode.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-ask-sage-acquisition-and-earnings-reset-could-be-a-game-changer-for-bigbearai-holdings-bbai"&gt;9) Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;simplywall.st&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-27 16:33 (UTC+8)&lt;/code&gt;
simplywall.st 披露：Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-turning-data-center-revenues-into-affordable-homes"&gt;10) Turning Data Center Revenues into Affordable Homes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Urban Institute&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-27 15:00 (UTC+8)&lt;/code&gt;
Urban Institute 披露：Turning Data Center Revenues into Affordable Homes。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urban.org"&gt;https://urban.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.urban.org"&gt;https://www.urban.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-oracle-assures-investors-on-ai-cloud-margins-as-it-struggles-to-profit-from-older-nvidia-chips"&gt;11) Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Information&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-16 15:00 (UTC+8)&lt;/code&gt;
The Information 披露：Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theinformation.com"&gt;https://theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theinformation.com"&gt;https://www.theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.2（2026-03-03））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-02｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-02-ai-daily/</link><pubDate>Mon, 02 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-02-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;17&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;1) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-ftc-backs-doj-proposal-in-google-search-antitrust-case"&gt;2) FTC backs DOJ proposal in Google search antitrust case&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Reuters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-05-29 15:00 (UTC+8)&lt;/code&gt;
Reuters 披露：FTC backs DOJ proposal in Google search antitrust case。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reuters.com"&gt;https://reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reuters.com"&gt;https://www.reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;3) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-the-new-rules-of-ai-a-global-legal-overview"&gt;4) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-state-attorneys-general-step-up-as-federal-enforcement-gap-grows"&gt;5) State Attorneys General Step Up as Federal Enforcement Gap Grows&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Bloomberg Law News&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-06-20 15:00 (UTC+8)&lt;/code&gt;
Bloomberg Law News 披露：State Attorneys General Step Up as Federal Enforcement Gap Grows。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.bloomberglaw.com"&gt;https://news.bloomberglaw.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.bloomberglaw.com"&gt;https://news.bloomberglaw.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-october-2025-us-tech-policy-roundup"&gt;6) October 2025 US Tech Policy Roundup&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Tech Policy Press&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-31 15:00 (UTC+8)&lt;/code&gt;
Tech Policy Press 披露：October 2025 US Tech Policy Roundup。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;7) OpenAI partners with Capgemini to scale enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 22:46 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-movate-and-lyzrai-announce-strategic-partnership-to-accelerate-enterprise-ai-transformation"&gt;8) Movate and Lyzr.ai Announce Strategic Partnership to Accelerate Enterprise AI Transformation&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;PR Newswire&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-11-04 16:00 (UTC+8)&lt;/code&gt;
PR Newswire 披露：Movate and Lyzr.ai Announce Strategic Partnership to Accelerate Enterprise AI Transformation。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prnewswire.com"&gt;https://prnewswire.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.prnewswire.com"&gt;https://www.prnewswire.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-salesforce-lifts-guidance-as-informatica-acquisition-ai-momentum-strengthen-growth-outlook"&gt;9) Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;ERP Today&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-04 16:00 (UTC+8)&lt;/code&gt;
ERP Today 披露：Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-ask-sage-acquisition-and-earnings-reset-could-be-a-game-changer-for-bigbearai-holdings-bbai"&gt;10) Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;simplywall.st&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-27 16:33 (UTC+8)&lt;/code&gt;
simplywall.st 披露：Ask Sage Acquisition and Earnings Reset Could Be A Game Changer For BigBear.ai Holdings (BBAI)。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplywall.st"&gt;https://simplywall.st&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-oracle-assures-investors-on-ai-cloud-margins-as-it-struggles-to-profit-from-older-nvidia-chips"&gt;11) Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Information&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-16 15:00 (UTC+8)&lt;/code&gt;
The Information 披露：Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theinformation.com"&gt;https://theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theinformation.com"&gt;https://www.theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.3.1（2026-03-02））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-03-01｜工程与产业版</title><link>https://garlicspace.com/ai/2026-03-01-ai-daily/</link><pubDate>Sun, 01 Mar 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-03-01-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;20&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;1) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 16:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-ftc-backs-doj-proposal-in-google-search-antitrust-case"&gt;2) FTC backs DOJ proposal in Google search antitrust case&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Reuters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-05-29 15:00 (UTC+8)&lt;/code&gt;
Reuters 披露：FTC backs DOJ proposal in Google search antitrust case。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reuters.com"&gt;https://reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reuters.com"&gt;https://www.reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;3) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-15 16:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-the-new-rules-of-ai-a-global-legal-overview"&gt;4) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 16:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-august--september-2025-tech-litigation-roundup"&gt;5) August &amp;amp; September 2025 Tech Litigation Roundup&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Tech Policy Press&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-10 15:00 (UTC+8)&lt;/code&gt;
Tech Policy Press 披露：August &amp;amp; September 2025 Tech Litigation Roundup。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-6-regulatory-convergence-grows-across-sectors-and-borders"&gt;6) 6. Regulatory convergence grows across sectors and borders&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Freshfields&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-23 06:25 (UTC+8)&lt;/code&gt;
Freshfields 披露：6. Regulatory convergence grows across sectors and borders。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://freshfields.com"&gt;https://freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freshfields.com"&gt;https://www.freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 16:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-servicenow-ntt-data-expand-partnership-to-drive-ai-led-enterprise-transformation"&gt;8) ServiceNow, NTT DATA Expand Partnership to Drive AI-Led Enterprise Transformation&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Fast Mode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-11-11 11:03 (UTC+8)&lt;/code&gt;
The Fast Mode 披露：ServiceNow, NTT DATA Expand Partnership to Drive AI-Led Enterprise Transformation。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thefastmode.com"&gt;https://thefastmode.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thefastmode.com"&gt;https://www.thefastmode.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-intel-inks-multiyear-ai-inference-deal-with-sambanova-after-acquisition-talks-end"&gt;9) Intel Inks ‘Multiyear’ AI Inference Deal With SambaNova After Acquisition Talks End&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;crn.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 20:09 (UTC+8)&lt;/code&gt;
crn.com 披露：Intel Inks ‘Multiyear’ AI Inference Deal With SambaNova After Acquisition Talks End。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crn.com"&gt;https://crn.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.crn.com"&gt;https://www.crn.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-salesforce-lifts-guidance-as-informatica-acquisition-ai-momentum-strengthen-growth-outlook"&gt;10) Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;ERP Today&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-04 16:00 (UTC+8)&lt;/code&gt;
ERP Today 披露：Salesforce Lifts Guidance as Informatica Acquisition, AI Momentum Strengthen Growth Outlook。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erp.today"&gt;https://erp.today&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-oracle-assures-investors-on-ai-cloud-margins-as-it-struggles-to-profit-from-older-nvidia-chips"&gt;11) Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Information&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-16 15:00 (UTC+8)&lt;/code&gt;
The Information 披露：Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theinformation.com"&gt;https://theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theinformation.com"&gt;https://www.theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 15:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.2.26（2026-02-27））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-02-28｜工程与产业版</title><link>https://garlicspace.com/ai/2026-02-28-ai-daily/</link><pubDate>Sat, 28 Feb 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-02-28-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;12&lt;/strong&gt; 条（候选池 40 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;20&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻按分类"&gt;今日要闻（按分类）&lt;/h2&gt;
&lt;h3 id="监管政策司法"&gt;监管/政策/司法&lt;/h3&gt;
&lt;h4 id="1-eu-ai-act-enforcement-begins-reshaping-startup-compliance-landscape"&gt;1) EU AI Act enforcement begins, reshaping startup compliance landscape&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Digital Watch Observatory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-25 11:43 (UTC+8)&lt;/code&gt;
Digital Watch Observatory 披露：EU AI Act enforcement begins, reshaping startup compliance landscape。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dig.watch"&gt;https://dig.watch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dig.watch"&gt;https://dig.watch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;2) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 08:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-ftc-backs-doj-proposal-in-google-search-antitrust-case"&gt;3) FTC backs DOJ proposal in Google search antitrust case&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Reuters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-05-29 07:00 (UTC+8)&lt;/code&gt;
Reuters 披露：FTC backs DOJ proposal in Google search antitrust case。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reuters.com"&gt;https://reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reuters.com"&gt;https://www.reuters.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-the-new-rules-of-ai-a-global-legal-overview"&gt;4) The New Rules of AI: A Global Legal Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 08:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-august--september-2025-tech-litigation-roundup"&gt;5) August &amp;amp; September 2025 Tech Litigation Roundup&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Tech Policy Press&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-10 07:00 (UTC+8)&lt;/code&gt;
Tech Policy Press 披露：August &amp;amp; September 2025 Tech Litigation Roundup。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-6-regulatory-convergence-grows-across-sectors-and-borders"&gt;6) 6. Regulatory convergence grows across sectors and borders&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Freshfields&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-22 22:25 (UTC+8)&lt;/code&gt;
Freshfields 披露：6. Regulatory convergence grows across sectors and borders。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://freshfields.com"&gt;https://freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freshfields.com"&gt;https://www.freshfields.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="大厂战略企业落地"&gt;大厂战略&amp;amp;企业落地&lt;/h3&gt;
&lt;h4 id="7-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;7) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 08:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;8) OpenAI partners with Capgemini to scale enterprise AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 14:46 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="投融资并购财报"&gt;投融资/并购/财报&lt;/h3&gt;
&lt;h4 id="9-turning-data-center-revenues-into-affordable-homes"&gt;9) Turning Data Center Revenues into Affordable Homes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Urban Institute&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-27 07:00 (UTC+8)&lt;/code&gt;
Urban Institute 披露：Turning Data Center Revenues into Affordable Homes。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urban.org"&gt;https://urban.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.urban.org"&gt;https://www.urban.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="10-nextracker-moves-into-ai-and-robotics-posts-us864-million-in-revenue"&gt;10) Nextracker moves into AI and robotics, posts US$864 million in revenue&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;PV Tech&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-07-30 07:00 (UTC+8)&lt;/code&gt;
PV Tech 披露：Nextracker moves into AI and robotics, posts US$864 million in revenue。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pv-tech.org"&gt;https://pv-tech.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pv-tech.org"&gt;https://www.pv-tech.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="芯片算力云成本"&gt;芯片/算力/云成本&lt;/h3&gt;
&lt;h4 id="11-oracle-assures-investors-on-ai-cloud-margins-as-it-struggles-to-profit-from-older-nvidia-chips"&gt;11) Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;The Information&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-16 07:00 (UTC+8)&lt;/code&gt;
The Information 披露：Oracle Assures Investors on AI Cloud Margins as It Struggles to Profit From Older Nvidia Chips。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theinformation.com"&gt;https://theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theinformation.com"&gt;https://www.theinformation.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开源生态工具标准"&gt;开源生态/工具/标准&lt;/h3&gt;
&lt;h4 id="12-what-most-people-get-wrong-about-open-source-ai"&gt;12) What most people get wrong about open source AI&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 07:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.2.26（2026-02-27））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-02-27｜工程与产业版</title><link>https://garlicspace.com/ai/2026-02-27-ai-daily/</link><pubDate>Fri, 27 Feb 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-02-27-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;8&lt;/strong&gt; 条（候选池 24 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻"&gt;今日要闻&lt;/h2&gt;
&lt;h3 id="1-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;1) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;监管/政策/司法&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-13 08:00 (UTC+8)&lt;/code&gt;
Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skadden.com"&gt;https://skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-the-new-rules-of-ai-a-global-legal-overview"&gt;2) The New Rules of AI: A Global Legal Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;监管/政策/司法&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;Morgan Lewis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-12-22 08:00 (UTC+8)&lt;/code&gt;
Morgan Lewis 披露：The New Rules of AI: A Global Legal Overview。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://morganlewis.com"&gt;https://morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.morganlewis.com"&gt;https://www.morganlewis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-can-red-hat-and-nvidia-remove-the-friction-slowing-ai-deployments"&gt;3) Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;大厂战略&amp;amp;企业落地&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;The Futurum Group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-14 08:00 (UTC+8)&lt;/code&gt;
The Futurum Group 披露：Can Red Hat and NVIDIA Remove the Friction Slowing AI Deployments?。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futurumgroup.com"&gt;https://futurumgroup.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-openai-partners-with-capgemini-to-scale-enterprise-ai"&gt;4) OpenAI partners with Capgemini to scale enterprise AI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;大厂战略&amp;amp;企业落地&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;The American Bazaar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-24 14:46 (UTC+8)&lt;/code&gt;
The American Bazaar 披露：OpenAI partners with Capgemini to scale enterprise AI。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americanbazaaronline.com"&gt;https://americanbazaaronline.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-turning-data-center-revenues-into-affordable-homes"&gt;5) Turning Data Center Revenues into Affordable Homes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;投融资/并购/财报&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;Urban Institute&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-27 07:00 (UTC+8)&lt;/code&gt;
Urban Institute 披露：Turning Data Center Revenues into Affordable Homes。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urban.org"&gt;https://urban.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.urban.org"&gt;https://www.urban.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-nvidia-announces-financial-results-for-fourth-quarter-and-fiscal-2026"&gt;6) NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2026&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;投融资/并购/财报&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;NVIDIA Newsroom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-25 23:52 (UTC+8)&lt;/code&gt;
NVIDIA Newsroom 披露：NVIDIA Announces Financial Results for Fourth Quarter and Fiscal 2026。
财报或资本动作会给出可量化商业信号，直接影响预算流向与项目生存周期。
重点看收入质量、客户留存和并购后整合速度，避免只看融资金额。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nvidianews.nvidia.com"&gt;http://nvidianews.nvidia.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nvidianews.nvidia.com"&gt;http://nvidianews.nvidia.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7-nvidia-kicks-off-the-next-generation-of-ai-with-rubin--six-new-chips-one-incredible-ai-supercomputer"&gt;7) NVIDIA Kicks Off the Next Generation of AI With Rubin — Six New Chips, One Incredible AI Supercomputer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;芯片/算力/云成本&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;NVIDIA Newsroom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-01-05 08:00 (UTC+8)&lt;/code&gt;
NVIDIA Newsroom 披露：NVIDIA Kicks Off the Next Generation of AI With Rubin — Six New Chips, One Incredible AI Supercomputer。
算力与云成本变化会直接反映到推理毛利、交付 SLA 和扩容节奏。
建议同步跟踪供给稳定性、单 token 成本和机房能效指标。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvidianews.nvidia.com"&gt;https://nvidianews.nvidia.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvidianews.nvidia.com"&gt;https://nvidianews.nvidia.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="8-what-most-people-get-wrong-about-open-source-ai"&gt;8) What most people get wrong about open source AI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;开源生态/工具/标准&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;Okoone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-08-06 07:00 (UTC+8)&lt;/code&gt;
Okoone 披露：What most people get wrong about open source AI。
开源生态变化会影响开发效率，也会改变许可证与供应链安全边界。
落地前应补齐 SBOM、版本锁定和安全更新流程。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://okoone.com"&gt;https://okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okoone.com"&gt;https://www.okoone.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.2.26（2026-02-27））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-02-26｜工程与产业版</title><link>https://garlicspace.com/ai/2026-02-26-ai-daily/</link><pubDate>Thu, 26 Feb 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-02-26-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="数据概览"&gt;数据概览&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今日入选：&lt;strong&gt;6&lt;/strong&gt; 条（候选池 6 条）&lt;/li&gt;
&lt;li&gt;GitHub 跟踪：&lt;strong&gt;5&lt;/strong&gt; 条&lt;/li&gt;
&lt;li&gt;X 热点信号：&lt;strong&gt;3&lt;/strong&gt; 条（实验数据源）&lt;/li&gt;
&lt;li&gt;口径说明：优先监管、企业落地、资本与算力；主动过滤低价值‘跑分/演示’新闻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今日要闻"&gt;今日要闻&lt;/h2&gt;
&lt;h3 id="1-germanys-latest-ai-enforcement-plan-answers-data-watchdogs-wish-for-bigger-role"&gt;1) Germany’s latest AI enforcement plan answers data watchdogs&amp;rsquo; wish for bigger role&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;监管/政策/司法&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;MLex&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2026-02-20 15:05 (UTC+8)&lt;/code&gt;
MLex 披露：Germany’s latest AI enforcement plan answers data watchdogs&amp;rsquo; wish for bigger role。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mlex.com"&gt;https://mlex.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mlex.com"&gt;https://www.mlex.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-from-data-to-decisions-navigating-privacy-and-litigation-risks-in-the-ai-era"&gt;2) From Data to Decisions: Navigating Privacy and Litigation Risks in the AI Era&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;监管/政策/司法&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;Lexology&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-07-22 07:00 (UTC+8)&lt;/code&gt;
Lexology 披露：From Data to Decisions: Navigating Privacy and Litigation Risks in the AI Era。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lexology.com"&gt;https://lexology.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lexology.com"&gt;https://www.lexology.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-ibm-and-groq-partner-to-accelerate-enterprise-ai-deployment-with-speed-and-scale"&gt;3) IBM and Groq Partner to Accelerate Enterprise AI Deployment with Speed and Scale&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;大厂战略&amp;amp;企业落地&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;IBM Newsroom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-10-20 07:00 (UTC+8)&lt;/code&gt;
IBM Newsroom 披露：IBM and Groq Partner to Accelerate Enterprise AI Deployment with Speed and Scale。
这类公司动作通常会改变企业采购路径、平台依赖关系和生态谈判空间。
建议优先评估集成成本、迁移难度与合同约束，而不是只看功能清单。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://newsroom.ibm.com"&gt;https://newsroom.ibm.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://newsroom.ibm.com"&gt;https://newsroom.ibm.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-whats-driving-the-eus-ai-act-shake-up"&gt;4) What’s Driving the EU’s AI Act Shake-Up?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;监管/政策/司法&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;Tech Policy Press&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-11-13 08:00 (UTC+8)&lt;/code&gt;
Tech Policy Press 披露：What’s Driving the EU’s AI Act Shake-Up?。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techpolicy.press"&gt;https://techpolicy.press&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-ai-watch-global-regulatory-tracker---european-union"&gt;5) AI Watch: Global regulatory tracker - European Union&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;监管/政策/司法&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;White &amp;amp; Case LLP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-07-21 07:00 (UTC+8)&lt;/code&gt;
White &amp;amp; Case LLP 披露：AI Watch: Global regulatory tracker - European Union。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whitecase.com"&gt;https://whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitecase.com"&gt;https://www.whitecase.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-trump-administration-issues-ai-action-plan-and-series-of-ai-executive-orders"&gt;6) Trump Administration Issues AI Action Plan and Series of AI Executive Orders&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;分类：&lt;code&gt;监管/政策/司法&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;来源：&lt;code&gt;Inside Privacy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布时间：&lt;code&gt;2025-07-25 07:00 (UTC+8)&lt;/code&gt;
Inside Privacy 披露：Trump Administration Issues AI Action Plan and Series of AI Executive Orders。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/li&gt;
&lt;li&gt;&lt;a href="https://insideprivacy.com"&gt;https://insideprivacy.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insideprivacy.com"&gt;https://www.insideprivacy.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="github-ai-项目跟踪"&gt;GitHub AI 项目跟踪&lt;/h2&gt;
&lt;h3 id="repo-openclawopenclaw"&gt;repo: openclaw/openclaw&lt;/h3&gt;
&lt;p&gt;变化：release（发布 v2026.2.25（2026-02-26））
来源：&lt;/p&gt;</description></item><item><title>AI Daily Newsletter｜2026-02-25｜工程与产业版</title><link>https://garlicspace.com/ai/2026-02-25-ai-daily/</link><pubDate>Wed, 25 Feb 2026 11:30:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-02-25-ai-daily/</guid><description>&lt;p&gt;今天有两个高优先级信号：第一，AI 监管已从原则讨论进入执行与审计阶段，产品上线将更多受法域条款与证据链约束；第二，算力竞争重心从“拿到芯片”转向“能否以可控成本稳定交付”，数据中心能效与平台工程化能力成为新分水岭。&lt;/p&gt;
&lt;h2 id="今日要闻"&gt;今日要闻&lt;/h2&gt;
&lt;h3 id="1-corporate-compliance-remains-critical-as-state-enforcement-initiatives-gain-momentum-following-governors-races"&gt;1) Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races&lt;/h3&gt;
&lt;p&gt;Skadden, Arps, Slate, Meagher &amp;amp; Flom LLP 披露：Corporate Compliance Remains Critical as State Enforcement Initiatives Gain Momentum Following Governors’ Races。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.google.com/rss/articles/CBMiwwFBVV95cUxPSkE0WUp3Q2tKaVRXNlZ1bVBzNzh6aXVMTjFVd1YtVlpJZkNOXzFTbkpyVkgzOUlNM1Iwa2RCdnYxSWJRS3J1YkRTTDFMWHJqQ25GeWRtdExfbWtzbENsazdzR0o0VkhnTEswUEhnbERnZjlUbUVoMlE0Q3J6MW9FRWdBMHptaWxiYmNDUlMyWml6RGxLaWgxSEVGNWtQei1kUVhLNkVsTUpmbWE4MnB6eW1XakhoQzBxZGNxX2h4dHRxV3c"&gt;https://news.google.com/rss/articles/CBMiwwFBVV95cUxPSkE0WUp3Q2tKaVRXNlZ1bVBzNzh6aXVMTjFVd1YtVlpJZkNOXzFTbkpyVkgzOUlNM1Iwa2RCdnYxSWJRS3J1YkRTTDFMWHJqQ25GeWRtdExfbWtzbENsazdzR0o0VkhnTEswUEhnbERnZjlUbUVoMlE0Q3J6MW9FRWdBMHptaWxiYmNDUlMyWml6RGxLaWgxSEVGNWtQei1kUVhLNkVsTUpmbWE4MnB6eW1XakhoQzBxZGNxX2h4dHRxV3c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.skadden.com"&gt;https://www.skadden.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-eyes-on-ai-looking-ahead-to-potential-ai-antitrust-enforcement-in-the-trump-administration"&gt;2) Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration&lt;/h3&gt;
&lt;p&gt;White &amp;amp; Case LLP 披露：Eyes on AI: Looking ahead to potential AI antitrust enforcement in the Trump administration。
该事件涉及明确法域或监管动作，会直接影响跨区域上线、数据治理和审计责任。
工程侧需要把合规证据链前置到研发与发布流程，而不是上线后补文档。
来源：&lt;/p&gt;</description></item><item><title>AI Newsletter｜2026-02-25｜主新闻空窗日：用工程信号替代噪音</title><link>https://garlicspace.com/ai/2026-02-25-ai-newsletter/</link><pubDate>Wed, 25 Feb 2026 00:52:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-02-25-ai-newsletter/</guid><description>&lt;p&gt;今天的数据特征很少见：主新闻池为 0，但 GitHub 跟踪持续更新。与其为了“凑满版面”引入低价值信息，不如把注意力放回可执行的工程信号：版本更新、PR 方向、兼容与回归风险。弱新闻日并不等于无事发生，恰恰适合做体系化复盘与明日验证准备。&lt;/p&gt;
&lt;h2 id="今日三件大事-top-3"&gt;今日三件大事 Top 3&lt;/h2&gt;
&lt;h3 id="1-llamacpp-发布-b8140本地推理底座继续高频迭代"&gt;1) llama.cpp 发布 b8140，本地推理底座继续高频迭代&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;发生了什么（含具体要素）&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;ggml-org/llama.cpp&lt;/code&gt; 在 2026-02-25 发布 &lt;code&gt;b8140&lt;/code&gt;。这类高频 release 往往覆盖推理性能、模型兼容与工程稳定性改进。&lt;br&gt;
&lt;strong&gt;为什么重要&lt;/strong&gt;&lt;br&gt;
llama.cpp 是大量本地部署方案的关键底座，版本变化会直接影响下游应用的吞吐、延迟与可维护性。&lt;br&gt;
&lt;strong&gt;编辑点评&lt;/strong&gt;&lt;br&gt;
没有宏观大新闻时，底层工具链更新就是最真实的产业脉搏。&lt;br&gt;
&lt;strong&gt;关注清单&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;升级前后做同模型同参数基准对比&lt;/li&gt;
&lt;li&gt;检查默认参数变化导致的“伪性能提升”&lt;/li&gt;
&lt;li&gt;准备可回滚版本与复现记录
&lt;strong&gt;来源&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ggml-org/llama.cpp/releases/tag/b8140"&gt;https://github.com/ggml-org/llama.cpp/releases/tag/b8140&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-llamacpp-pr-19827-推进-kimi-linear-block-实现"&gt;2) llama.cpp PR #19827 推进 Kimi Linear block 实现&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;发生了什么（含具体要素）&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;PR #19827&lt;/code&gt; 指向 Kimi Linear block implementation，显示社区在推进新结构/算子支持。&lt;br&gt;
&lt;strong&gt;为什么重要&lt;/strong&gt;&lt;br&gt;
架构支持能力决定可用模型边界，也影响本地推理方案的选型弹性。&lt;br&gt;
&lt;strong&gt;编辑点评&lt;/strong&gt;&lt;br&gt;
PR 阶段是趋势早期信号，读 PR 往往比等 release note 更有价值。&lt;br&gt;
&lt;strong&gt;关注清单&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;持续跟踪评审意见与合并状态&lt;/li&gt;
&lt;li&gt;评估对现有模型组合的收益与成本&lt;/li&gt;
&lt;li&gt;提前准备兼容测试脚本
&lt;strong&gt;来源&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ggml-org/llama.cpp/pull/19827"&gt;https://github.com/ggml-org/llama.cpp/pull/19827&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-vllm-pr-30908-指向-stable-abi-路线服务端稳定性优先级上升"&gt;3) vLLM PR #30908 指向 stable ABI 路线，服务端稳定性优先级上升&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;发生了什么（含具体要素）&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;vllm-project/vllm&lt;/code&gt; 的 &lt;code&gt;PR #30908&lt;/code&gt; 提到 activation kernels 向 libtorch stable ABI 迁移。&lt;br&gt;
&lt;strong&gt;为什么重要&lt;/strong&gt;&lt;br&gt;
这类迁移通常服务于长期兼容与可维护，直接关系企业级推理服务的升级风险与运维成本。&lt;br&gt;
&lt;strong&gt;编辑点评&lt;/strong&gt;&lt;br&gt;
推理平台竞争已从“跑得快”转向“长期稳”。&lt;br&gt;
&lt;strong&gt;关注清单&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>AI Newsletter｜2026-02-24｜主新闻空窗日：用工程信号替代噪音</title><link>https://garlicspace.com/ai/2026-02-24-ai-newsletter/</link><pubDate>Tue, 24 Feb 2026 23:29:00 +0800</pubDate><guid>https://garlicspace.com/ai/2026-02-24-ai-newsletter/</guid><description>&lt;p&gt;今天的数据特征很少见：主新闻池为 0，但 GitHub 跟踪持续更新。与其为了“凑满版面”引入低价值信息，不如把注意力放回可执行的工程信号：版本更新、PR 方向、兼容与回归风险。弱新闻日并不等于无事发生，恰恰适合做体系化复盘与明日验证准备。&lt;/p&gt;
&lt;h2 id="今日三件大事-top-3"&gt;今日三件大事 Top 3&lt;/h2&gt;
&lt;h3 id="1-llamacpp-发布-b8140本地推理底座继续高频迭代"&gt;1) llama.cpp 发布 b8140，本地推理底座继续高频迭代&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;发生了什么（含具体要素）&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;ggml-org/llama.cpp&lt;/code&gt; 在 2026-02-24 发布 &lt;code&gt;b8140&lt;/code&gt;。这类高频 release 往往覆盖推理性能、模型兼容与工程稳定性改进。&lt;br&gt;
&lt;strong&gt;为什么重要&lt;/strong&gt;&lt;br&gt;
llama.cpp 是大量本地部署方案的关键底座，版本变化会直接影响下游应用的吞吐、延迟与可维护性。&lt;br&gt;
&lt;strong&gt;编辑点评&lt;/strong&gt;&lt;br&gt;
没有宏观大新闻时，底层工具链更新就是最真实的产业脉搏。&lt;br&gt;
&lt;strong&gt;关注清单&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;升级前后做同模型同参数基准对比&lt;/li&gt;
&lt;li&gt;检查默认参数变化导致的“伪性能提升”&lt;/li&gt;
&lt;li&gt;准备可回滚版本与复现记录
&lt;strong&gt;来源&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ggml-org/llama.cpp/releases/tag/b8140"&gt;https://github.com/ggml-org/llama.cpp/releases/tag/b8140&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-llamacpp-pr-19827-推进-kimi-linear-block-实现"&gt;2) llama.cpp PR #19827 推进 Kimi Linear block 实现&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;发生了什么（含具体要素）&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;PR #19827&lt;/code&gt; 指向 Kimi Linear block implementation，显示社区在推进新结构/算子支持。&lt;br&gt;
&lt;strong&gt;为什么重要&lt;/strong&gt;&lt;br&gt;
架构支持能力决定可用模型边界，也影响本地推理方案的选型弹性。&lt;br&gt;
&lt;strong&gt;编辑点评&lt;/strong&gt;&lt;br&gt;
PR 阶段是趋势早期信号，读 PR 往往比等 release note 更有价值。&lt;br&gt;
&lt;strong&gt;关注清单&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;持续跟踪评审意见与合并状态&lt;/li&gt;
&lt;li&gt;评估对现有模型组合的收益与成本&lt;/li&gt;
&lt;li&gt;提前准备兼容测试脚本
&lt;strong&gt;来源&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ggml-org/llama.cpp/pull/19827"&gt;https://github.com/ggml-org/llama.cpp/pull/19827&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-vllm-pr-30908-指向-stable-abi-路线服务端稳定性优先级上升"&gt;3) vLLM PR #30908 指向 stable ABI 路线，服务端稳定性优先级上升&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;发生了什么（含具体要素）&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;vllm-project/vllm&lt;/code&gt; 的 &lt;code&gt;PR #30908&lt;/code&gt; 提到 activation kernels 向 libtorch stable ABI 迁移。&lt;br&gt;
&lt;strong&gt;为什么重要&lt;/strong&gt;&lt;br&gt;
这类迁移通常服务于长期兼容与可维护，直接关系企业级推理服务的升级风险与运维成本。&lt;br&gt;
&lt;strong&gt;编辑点评&lt;/strong&gt;&lt;br&gt;
推理平台竞争已从“跑得快”转向“长期稳”。&lt;br&gt;
&lt;strong&gt;关注清单&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>GitHub Webhook自动部署Hugo博客到VPS</title><link>https://garlicspace.com/posts/github-webhook-auto-deploy/</link><pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/github-webhook-auto-deploy/</guid><description>实现GitHub推送后自动部署Hugo博客到CentOS 7 VPS的完整方案，包括Flask webhook服务、Nginx代理配置和常见问题解决</description></item><item><title>节点流量问题：限速 + Telegram 告警 + 自动停机守护</title><link>https://garlicspace.com/posts/node-qos/</link><pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/node-qos/</guid><description>节点流量问题：限速 + Telegram 告警 + 自动停机守护 - 节前发现 VPS 上运行节点，流量忽然增加，紧急增加了限速。整理下如何用 Linux tc 做限速、如何做月流量守护、如何通过 Telegram 实时接收告警。</description></item><item><title>关于</title><link>https://garlicspace.com/about/</link><pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate><guid>https://garlicspace.com/about/</guid><description>关于 Garlic Space</description></item><item><title>地牛：听见黄土下的回响</title><link>https://garlicspace.com/posts/earth-ox/</link><pubDate>Sun, 01 Feb 2026 12:00:00 +0800</pubDate><guid>https://garlicspace.com/posts/earth-ox/</guid><description>听得见声音，却看不到影子。献给我的姥爷谢自熬，和那个年代所有沉默的地牛。</description></item><item><title>升级 OpenSSH</title><link>https://garlicspace.com/posts/%E5%8D%87%E7%BA%A7openssh/</link><pubDate>Sun, 24 Aug 2025 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%8D%87%E7%BA%A7openssh/</guid><description>CentOS 7 和 Ubuntu 系统升级 OpenSSH 的完整指南</description></item><item><title>centos7 yum 源失效</title><link>https://garlicspace.com/posts/centos7-yum-%E6%BA%90%E5%A4%B1%E6%95%88/</link><pubDate>Wed, 22 Jan 2025 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/centos7-yum-%E6%BA%90%E5%A4%B1%E6%95%88/</guid><description>centos7 yum 源失效 - centos7 yum 源已经失效, 可以通过下面指令更换默认配置，baseurl中 mirror.* 替换为 vault*</description></item><item><title>NGINX Configuration for Multiple Certificates</title><link>https://garlicspace.com/posts/nginx-configuration-for-multiple-certificates/</link><pubDate>Mon, 06 Jan 2025 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/nginx-configuration-for-multiple-certificates/</guid><description>NGINX Configuration for Multiple Certificates - NGINX typically supports two scenarios for configuring multiple certificates:</description></item><item><title>nginx Multi-Certificates</title><link>https://garlicspace.com/posts/nginx-multi-certificates/</link><pubDate>Mon, 06 Jan 2025 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/nginx-multi-certificates/</guid><description>nginx Multi-Certificates - * * *</description></item><item><title>Build the Latest Nginx with Automation</title><link>https://garlicspace.com/posts/build-the-latest-nginx-with-automation/</link><pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/build-the-latest-nginx-with-automation/</guid><description>Build the Latest Nginx with Automation - Nginx is one of the most popular high-performance web servers and reverse proxies in the modern internet. To maximize its capabilities, we</description></item><item><title>Simplify SSL/TLS Certificate Management</title><link>https://garlicspace.com/posts/simplify-ssl-tls-certificate-management/</link><pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/simplify-ssl-tls-certificate-management/</guid><description>Simplify SSL/TLS Certificate Management - In modern network communication, SSL/TLS certificates are essential for ensuring secure data transmission. However, managing certificate c</description></item><item><title>多功能 SSL/TLS 证书生成工具</title><link>https://garlicspace.com/posts/%E5%A4%9A%E5%8A%9F%E8%83%BD-ssl-tls-%E8%AF%81%E4%B9%A6%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7/</link><pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%A4%9A%E5%8A%9F%E8%83%BD-ssl-tls-%E8%AF%81%E4%B9%A6%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7/</guid><description>多功能 SSL/TLS 证书生成工具 - 在当今的网络通信中，SSL/TLS 证书是确保数据传输安全的关键元素。然而，面对不同的加密算法和标准（如国际上的 RSA 和 ECC，以及中国的国密 SM2），生成和管理证书链往往是一项复杂的任务。为了简化这一过程，开发了一个高效、灵活的开源工具——multicertgen。</description></item><item><title>自动构建最新版本的 Nginx</title><link>https://garlicspace.com/posts/%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E7%9A%84-nginx/</link><pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E7%9A%84-nginx/</guid><description>自动构建最新版本的 Nginx - Nginx 是现代互联网中最受欢迎的高性能 Web 服务器和反向代理服务器之一。为了充分发挥其性能，我们通常需要使用最新版本的 Nginx，并静态链接最新的依赖库（如 PCRE2、zlib 和 OpenSSL）。然而，手动下载和编译这些依赖库既耗时又容易出错。</description></item><item><title>Linux chroot Environment: Principles and Detailed Applications</title><link>https://garlicspace.com/posts/linux-chroot-environment-principles-and-detailed-applications/</link><pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-chroot-environment-principles-and-detailed-applications/</guid><description>Linux chroot Environment: Principles and Detailed Applications - In Linux system management, chroot is a powerful tool that changes the root directory for a process, enabling fil</description></item><item><title>Linux chroot 环境：原理与应用详解</title><link>https://garlicspace.com/posts/linux-chroot-%E7%8E%AF%E5%A2%83%E5%8E%9F%E7%90%86%E4%B8%8E%E5%BA%94%E7%94%A8%E8%AF%A6%E8%A7%A3/</link><pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-chroot-%E7%8E%AF%E5%A2%83%E5%8E%9F%E7%90%86%E4%B8%8E%E5%BA%94%E7%94%A8%E8%AF%A6%E8%A7%A3/</guid><description>Linux chroot 环境：原理与应用详解 - 在 Linux 系统管理中，chroot 可以通过改变程序的根目录来实现文件系统的隔离。在本文中，我们将详细介绍 chroot 的原理，并通过一个模拟 Postfix 调用 SASL 的实战演示，帮助你掌握如何正确配置和验证 chroot 环境。</description></item><item><title>Detailed Configuration Guide for the NGINX Directive ssl_password_file</title><link>https://garlicspace.com/posts/detailed-configuration-guide-for-the-nginx-directive-ssl_password_file/</link><pubDate>Tue, 03 Dec 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/detailed-configuration-guide-for-the-nginx-directive-ssl_password_file/</guid><description>Detailed Configuration Guide for the NGINX Directive ssl_password_file - Title: Using ssl_password_file in NGINX for SSL/TLS Private Key Management</description></item><item><title>NGINX 指令 ssl_password_file 配置详解</title><link>https://garlicspace.com/posts/nginx-%E6%8C%87%E4%BB%A4-ssl_password_file-%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3/</link><pubDate>Tue, 03 Dec 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/nginx-%E6%8C%87%E4%BB%A4-ssl_password_file-%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3/</guid><description>NGINX 指令 ssl_password_file 配置详解 - ssl_password_file 是 NGINX 中的一个指令，用于指定一个包含密码的文件，这个文件用于提供 SSL/TLS 私钥的密码。该指令在 NGINX 启动时会读取该文件，并用于加载私钥文件时解锁加密的私钥。如果私钥是加密的，那么 NGINX 需要密码才能使用它，密码错误会导致</description></item><item><title>NGINX 中HTTP请求大小相关配置及解决方案-1</title><link>https://garlicspace.com/posts/nginx-%E4%B8%ADhttp%E8%AF%B7%E6%B1%82%E5%A4%A7%E5%B0%8F%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE%E5%8F%8A%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88-1/</link><pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/nginx-%E4%B8%ADhttp%E8%AF%B7%E6%B1%82%E5%A4%A7%E5%B0%8F%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE%E5%8F%8A%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88-1/</guid><description>NGINX 中HTTP请求大小相关配置及解决方案-1 - NGINX中收到HTTP请求大小相关的错误,以下典型错误及相关解决方案。</description></item><item><title>Troubleshooting HTTP 400/414/413 Errors in NGINX: A Complete Guide</title><link>https://garlicspace.com/posts/common-nginx-http-request-size-errors-and-their-solutions/</link><pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/common-nginx-http-request-size-errors-and-their-solutions/</guid><description>Troubleshooting HTTP 400/414/413 Errors in NGINX: A Complete Guide - Here is a sample nginx.conf configuration file:</description></item><item><title>HTTP cookie httponly secure</title><link>https://garlicspace.com/posts/http-cookie-httponly-secure/</link><pubDate>Tue, 19 Nov 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/http-cookie-httponly-secure/</guid><description>HTTP cookie httponly secure - rfc6265中描述</description></item><item><title>shell heredoc</title><link>https://garlicspace.com/posts/shell-heredoc/</link><pubDate>Thu, 14 Nov 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/shell-heredoc/</guid><description>&lt;p&gt;shell中如果定义多行的字符串可以使用heredoc&lt;/p&gt;
&lt;p&gt;先检查一下当前使用shell&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;heredoc&lt;/code&gt; 是一种在 Shell 脚本、编程语言（例如 Bash、PHP、Ruby 等）中，用来定义多行字符串的方法。它可以使代码中的字符串定义更加清晰和可读，尤其适用于需要定义包含多行内容的文本块时。以下是 &lt;code&gt;heredoc&lt;/code&gt; 的基本用法和一些示例。&lt;/p&gt;
&lt;h3 id="bash-中的-heredoc-语法"&gt;Bash 中的 Heredoc 语法&lt;/h3&gt;
&lt;p&gt;在 Bash 中，&lt;code&gt;heredoc&lt;/code&gt; 的语法如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;内容...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;command&lt;/code&gt; 表示你要将这些多行内容传递给的命令，例如 &lt;code&gt;cat&lt;/code&gt;、&lt;code&gt;echo&lt;/code&gt; 等。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;lt;&amp;amp;lt;EOF&lt;/code&gt; 表示开始使用 &lt;code&gt;heredoc&lt;/code&gt;，其中 &lt;code&gt;EOF&lt;/code&gt; 是一个标识符，用来定义多行文本的结束位置。你可以使用其他标识符来替代 &lt;code&gt;EOF&lt;/code&gt;，例如 &lt;code&gt;END&lt;/code&gt;，但开始和结束的标识符必须一致。&lt;/li&gt;
&lt;li&gt;结束标识符必须单独一行，且通常没有前后的空格。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;示例&lt;/h3&gt;
&lt;h4 id="1-输出多行文本"&gt;1. 输出多行文本&lt;/h4&gt;
&lt;p&gt;你可以使用 &lt;code&gt;heredoc&lt;/code&gt; 来输出多行文本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;这是第一行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;这是第二行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;这是第三行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;输出结果为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;这是第一行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;这是第二行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;这是第三行&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="2-写入文件"&gt;2. 写入文件&lt;/h4&gt;
&lt;p&gt;你可以将 &lt;code&gt;heredoc&lt;/code&gt; 的内容重定向到一个文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;lt; myfile.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;这是要写入文件的内容
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第二行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第三行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这会将文本块写入名为 &lt;code&gt;myfile.txt&lt;/code&gt; 的文件中。&lt;/p&gt;</description></item><item><title>^@与控制字符</title><link>https://garlicspace.com/posts/%E4%B8%8E%E6%8E%A7%E5%88%B6%E5%AD%97%E7%AC%A6/</link><pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E4%B8%8E%E6%8E%A7%E5%88%B6%E5%AD%97%E7%AC%A6/</guid><description>^@与控制字符 - 在应用服务日志中看到了服务器日志记录错误NumberFormatExeception input string ^@^@^@^@，对于 ^@ 这个控制字符没有什么映像了于是vi打开一个临时文件 ctrl + V, ctrl + @ 输入到文件中然后hexdump 看了一下二进制内容发现是</description></item><item><title>intermediate CA certificate 中间证书</title><link>https://garlicspace.com/posts/intermediate-ca-certificate-%E4%B8%AD%E9%97%B4%E8%AF%81%E4%B9%A6/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/intermediate-ca-certificate-%E4%B8%AD%E9%97%B4%E8%AF%81%E4%B9%A6/</guid><description>intermediate CA certificate 中间证书 - 中间证书的使用是随着公共密钥基础设施（PKI）的发展而逐渐普及。</description></item><item><title>证书common name</title><link>https://garlicspace.com/posts/%E8%AF%81%E4%B9%A6common-name/</link><pubDate>Wed, 03 Jul 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E8%AF%81%E4%B9%A6common-name/</guid><description>证书common name - 项目自签名证书，common name 超过64个字节报错</description></item><item><title>linux arp 参数整理 – arp_filter</title><link>https://garlicspace.com/posts/linux-arp-%E5%8F%82%E6%95%B0%E6%95%B4%E7%90%86-arp_filter/</link><pubDate>Sun, 23 Jun 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-arp-%E5%8F%82%E6%95%B0%E6%95%B4%E7%90%86-arp_filter/</guid><description>linux arp 参数整理 – arp_filter - arp_filter：</description></item><item><title>linux arp 参数整理</title><link>https://garlicspace.com/posts/linux-arp-%E5%8F%82%E6%95%B0%E6%95%B4%E7%90%86-1/</link><pubDate>Sat, 22 Jun 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-arp-%E5%8F%82%E6%95%B0%E6%95%B4%E7%90%86-1/</guid><description>linux arp 参数整理 - 在 Linux 中，有多个内核参数可以控制 ARP（地址解析协议）的行为。这些参数可以通过 /proc/sys/net/ipv4/conf/*/ 目录下的文件来配置，或者使用 sysctl 命令来设置。以下是一些常用的 ARP 内核参数及其含义：</description></item><item><title>负载均衡</title><link>https://garlicspace.com/posts/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</link><pubDate>Sun, 02 Jun 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</guid><description>负载均衡 - In computing, load balancing is the process of distributing a set of tasks over a set of resources computing units, with the aim of making their overall processing mor</description></item><item><title>VLAN</title><link>https://garlicspace.com/posts/vlan/</link><pubDate>Sun, 05 May 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/vlan/</guid><description>VLAN - A virtual local area network VLAN is any broadcast domain that is partitioned and isolated in a computer network at the data link layer OSI layer 2.23 In thi</description></item><item><title>C语言宏参数转换为字符串</title><link>https://garlicspace.com/posts/c%E8%AF%AD%E8%A8%80%E5%AE%8F%E5%8F%82%E6%95%B0%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%AD%97%E7%AC%A6%E4%B8%B2/</link><pubDate>Thu, 25 Apr 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/c%E8%AF%AD%E8%A8%80%E5%AE%8F%E5%8F%82%E6%95%B0%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%AD%97%E7%AC%A6%E4%B8%B2/</guid><description>C语言宏参数转换为字符串 - 用宏定义来定义一个SQL语句， 用来指定字段的长度。那就拼接一下</description></item><item><title>conflicts with file from package kernel-debuginfo</title><link>https://garlicspace.com/posts/conflicts-with-file-from-package-kernel-debuginfo/</link><pubDate>Sat, 13 Apr 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/conflicts-with-file-from-package-kernel-debuginfo/</guid><description>conflicts with file from package kernel-debuginfo - dnf upgrade-minimal --security</description></item><item><title>案例学习-Sysbench压测故障</title><link>https://garlicspace.com/posts/%E6%A1%88%E4%BE%8B%E5%AD%A6%E4%B9%A0-sysbench%E5%8E%8B%E6%B5%8B%E6%95%85%E9%9A%9C/</link><pubDate>Mon, 01 Apr 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%A1%88%E4%BE%8B%E5%AD%A6%E4%B9%A0-sysbench%E5%8E%8B%E6%B5%8B%E6%95%85%E9%9A%9C/</guid><description>案例学习-Sysbench压测故障 - 故障源于知识星球的一个案例：</description></item><item><title>LeetCode - First Duplicate Value</title><link>https://garlicspace.com/posts/leetcode-first-duplicate-value/</link><pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-first-duplicate-value/</guid><description>&lt;h4 id="问题"&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;给定一个整数数组，编写一个函数，返回从左到右读取数组时出现多次的第一个整数。数组元素取值范围是整数1到n， 数组长度为n.&lt;/p&gt;
&lt;p&gt;比较特殊情况&lt;/p&gt;
&lt;p&gt;[2,3,4,2,3,5] 返回2&lt;/p&gt;
&lt;p&gt;[2,3,4,4,2,5] 返回4， 虽然2也是重复数字但是再2之后。&lt;/p&gt;
&lt;h4 id="解答"&gt;解答：&lt;/h4&gt;
&lt;p&gt;遍历查找， 两次嵌套循环，同时标注最小索引。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def firstDuplicateValue(array):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # Write your code here.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; max = len(array)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; value = -1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for i in range(len(array)):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for j in range(len(array)):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (j &amp;gt; i and array[j] == array[i]):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (j &amp;lt; max):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; max = j
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; value = array[i]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return value&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;使用哈希表&lt;/p&gt;</description></item><item><title>MQTT</title><link>https://garlicspace.com/posts/mqtt/</link><pubDate>Sun, 17 Mar 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/mqtt/</guid><description>MQTT - MQTT Message Queuing Telemetry Transport.它是一种轻量级的发布-订阅网络协议，用于在设备之间传输消息。 MQTT 专为硬件资源有限或网络带宽有限的远程位置连接而设计，非常适合 machine-to-machine M2M 通信和物联网 IoT 应用。</description></item><item><title>curl support TLCP using TASSL</title><link>https://garlicspace.com/posts/curl-support-tlcp-using-tassl/</link><pubDate>Fri, 16 Feb 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/curl-support-tlcp-using-tassl/</guid><description>curl support TLCP using TASSL - 传输层密码协议TLCP 对应 TLS协议， 在GB/T 38636-2020规范中定义。支持国密sm2, sm3, sm4密钥套件。增加加密证书， 6.4.5.3章节中提到 选择ECC, ECDHE算法，密钥交换算法使用用加密证书公钥。</description></item><item><title>http3 - nginx with quictls</title><link>https://garlicspace.com/posts/http3-nginx-with-quictls/</link><pubDate>Fri, 16 Feb 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/http3-nginx-with-quictls/</guid><description>http3 - nginx with quictls - nginx 从1.25开始支持QUIC和http3</description></item><item><title>Product of Array Except Self</title><link>https://garlicspace.com/posts/product-of-array-except-self/</link><pubDate>Mon, 08 Jan 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/product-of-array-except-self/</guid><description>&lt;h4 id="问题"&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Given an array arr[] of n integers, construct a Product Array prod[] (of the same size) such that prod[i] is equal to the product of all the elements of arr[] except arr[i].&lt;/p&gt;
&lt;h4 id="解答"&gt;&lt;strong&gt;解答:&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;遍历数组循环跳过当前元素，需要两层循环， 时间复杂度O(n^2),空间复杂度O(n)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def arrayOfProducts(array):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; products = [1 for _ in range(len(array))]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for i in range(len(array)):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; runningProduct = 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for j in range(len(array)):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if i != j:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; runningProduct = runningProduct * array[j]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; products[i] = runningProduct
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return products&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description></item><item><title>io_uring echo-server</title><link>https://garlicspace.com/posts/io_uring-echo-server/</link><pubDate>Sun, 07 Jan 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/io_uring-echo-server/</guid><description>io_uring echo-server - io_uring是Linux特有的异步I/O API。io_uring的名称来自用户空间和内核空间之间共享的环形缓冲区。在内核和用户空间之间进行通信使用环形缓冲区作为主要的通信模式。这种思想在业务系统中还是挺常见的： 比如用MQ、Kafka消息队列推送信息。一个接收队列， 一个发送队列，另外设计上也有Acto</description></item><item><title>C struct检查成员是否存在</title><link>https://garlicspace.com/posts/c-struct%E6%A3%80%E6%9F%A5%E6%88%90%E5%91%98%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/c-struct%E6%A3%80%E6%9F%A5%E6%88%90%E5%91%98%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8/</guid><description>&lt;p&gt;如何判断C struct中是否存在某一成员，最开始想法是通过offsetof宏定义&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#define offsetof(st, m) \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    ((size_t)&amp;amp;(((st *)0)-&amp;gt;m))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;C语言的&lt;code&gt;offsetof()&lt;/code&gt;宏是ANSI C标准库中的一个特性，位于&lt;code&gt;stddef.h&lt;/code&gt;头文件中。它用于计算给定结构体或联合体类型中某个成员的偏移量（以字节为单位）， 但是这种方式仅能检查存在的成员， 不存在编译会有下面类似报错&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;XXX.c:11:35: error: ‘struct MyStruct’ has no member named ‘member3’; did you mean ‘member1’?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="生成成员名的map"&gt;&lt;strong&gt;生成成员名的map&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;C/C++ 不支持反射，与例如 Java 或 C# 不同。这意味着在 C/C++ 中，你不能在运行时&amp;quot;检测&amp;quot;未知结构（或类）的成员，你必须在编译时知道它 - 通常是通过 #include 包含定义结构的头文件。实际上，你不能访问未定义结构的内容 - 只能传递指针。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;from &lt;a href="https://cplusplus.com/forum/beginner/283156/"&gt;https://cplusplus.com/forum/beginner/283156/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;同样作者给出了一个解决方案，那就是把对象放到map中， 对于C语言的，可以使用脚本处理一下。&lt;/p&gt;
&lt;p&gt;大概思路根据脚本解析结构体，生成包含成员的数组，通过数组判断&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# generate_struct_member_array.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;filter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Remove comments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\/\*[\s\S]*?\*\/|\/\/.*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Remove #define statements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#define\s+\w+\s+\w+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header_content&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;struct_pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;struct\s+(\w+)\s*{([^}]*)};&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DOTALL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;structs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct_pattern&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header_content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;struct_member_arrays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;struct_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;struct_body&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;structs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;members&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\b\w+\s+(\w+)\s*(?:\[\w*\])?;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;struct_body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;struct_member_arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;struct_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;members&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;struct_member_arrays&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_array_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;struct_member_arrays&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;struct_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;members&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;struct_member_arrays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;const char *{struct_name}_member_names[] = {{&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;member&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;members&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;&amp;#34;{member}&amp;#34;,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt; &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;};&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write_to_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_and_generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_file_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Read the input header file content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;header_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;header_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;header_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Filter content (remove comments and #define statements)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;filtered_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header_content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Parse the header file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;struct_member_arrays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parse_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered_content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Generate code for arrays&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;array_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generate_array_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;struct_member_arrays&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Write generated code to a new file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;write_to_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;array_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Generated code has been written to {output_file_path}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Specify the path to the input header file and the output header file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;input_header_file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hello.h&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;output_header_file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;generated_define.h&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Read the input header file, generate code, and write to the output header file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;read_and_generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_header_file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_header_file_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;hello.h&lt;/p&gt;</description></item><item><title>SNI</title><link>https://garlicspace.com/posts/sni/</link><pubDate>Mon, 11 Dec 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/sni/</guid><description>SNI - SNI是TLS协议扩展， 在握手的开始标识其尝试连接的主机名， 当多个HTTPS服务部署在同一IP地址上，客户端就可以通过这个标识指定它将使用哪一个服务， 同时服务端也无需使用相同的证书，它在概念上相当于HTTP/1.1基于名称的虚拟主机。SNI扩展最早在2003年的RFC 3546中出现。</description></item><item><title>LeetCode-longest-peak</title><link>https://garlicspace.com/posts/leetcode-longest-peak/</link><pubDate>Sun, 26 Nov 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-longest-peak/</guid><description>LeetCode-longest-peak - Given an array arr with N elements, the task is to find out the longest sub-array which has the shape of a mountain</description></item><item><title>systemctl 启动服务缓慢</title><link>https://garlicspace.com/posts/systemctl-%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%E7%BC%93%E6%85%A2/</link><pubDate>Sat, 21 Oct 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/systemctl-%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%E7%BC%93%E6%85%A2/</guid><description>systemctl 启动服务缓慢 - 使用systemd配置服务启动慢</description></item><item><title>linux sendfile</title><link>https://garlicspace.com/posts/linux-sendfile/</link><pubDate>Sat, 16 Sep 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-sendfile/</guid><description>linux sendfile - 使用c语言实现一下文件复制功能：</description></item><item><title>linux 生成指定大小文件</title><link>https://garlicspace.com/posts/linux-%E7%94%9F%E6%88%90%E6%8C%87%E5%AE%9A%E5%A4%A7%E5%B0%8F%E6%96%87%E4%BB%B6/</link><pubDate>Sat, 19 Aug 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-%E7%94%9F%E6%88%90%E6%8C%87%E5%AE%9A%E5%A4%A7%E5%B0%8F%E6%96%87%E4%BB%B6/</guid><description>linux 生成指定大小文件 - linux生成指定大小文件常用的几个命令：</description></item><item><title>getopt_long</title><link>https://garlicspace.com/posts/getopt_long/</link><pubDate>Wed, 09 Aug 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/getopt_long/</guid><description>&lt;p&gt;getopt_long可以用来解析命令行参数，也可以进行参数解析。例如&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt; /* for printf */&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt; /* for exit */&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;getopt.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;verbose_flag&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;digit_optind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;this_option_optind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optind&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nl"&gt;optind&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;option_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="n"&gt;long_options&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;verbose&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no_argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;verbose_flag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;add&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required_argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;append&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no_argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;delete&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required_argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;verbose&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no_argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;create&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required_argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required_argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getopt_long&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;abc:d:012&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;long_options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;option_index&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;option %s&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;long_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;option_index&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optarg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34; with arg %s&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optarg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;digit_optind&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;digit_optind&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;this_option_optind&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;digits occur in two different argv-elements.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;digit_optind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;this_option_optind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;option %c&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;option a&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;option b&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;option c with value &amp;#39;%s&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optarg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;option d with value &amp;#39;%s&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optarg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;?? getopt returned character code 0%o ??&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optind&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;non-option ARGV-elements: &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optind&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;%s &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;optind&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verbose_flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;verbose flag is set&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;prog1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;--add&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;AA&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;BB&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;--verbose&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;optind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;prog2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;--file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;CC&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;argv2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;--verbose&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//argv2[3] = &amp;#34;--delete&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="c1"&gt;//argv2[4] = &amp;#34;DD&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description></item><item><title>A kernel debugger in Python: drgn</title><link>https://garlicspace.com/posts/a-kernel-debugger-in-python-drgn/</link><pubDate>Tue, 01 Aug 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/a-kernel-debugger-in-python-drgn/</guid><description>A kernel debugger in Python: drgn - 原文链接：</description></item><item><title>leetcode – spiral matrix</title><link>https://garlicspace.com/posts/leetcode-spiral-matrix/</link><pubDate>Sun, 30 Jul 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-spiral-matrix/</guid><description>&lt;h4 id="问题"&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Given an &lt;code&gt;m x n&lt;/code&gt; &lt;code&gt;matrix&lt;/code&gt;, return &lt;em&gt;all elements of the&lt;/em&gt; &lt;code&gt;matrix&lt;/code&gt; &lt;em&gt;in spiral order&lt;/em&gt;.&lt;strong&gt;Input:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;array = [[1, 2, 3, 4],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [5, 6, 7, 8],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [9, 10, 11, 12],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [13, 14, 15, 16 ]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[1,2,3,4,8,12,11,10,9,5,6,7]&lt;/p&gt;
&lt;h4 id="解答"&gt;&lt;strong&gt;解答:&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;首先确定行列的边界值， startRow，endRow，startCol，endCol&lt;/li&gt;
&lt;li&gt;按照题目的要求进行螺旋便利 ， 分别向右， 向下， 向左， 向上移动，对应四个循环。&lt;/li&gt;
&lt;li&gt;特殊情况检查， 当出现单行或者单列的情况，在向左或向上遍历前， 分别检查行或列的边界值是否相等， startRow == endRow 或 startCol == endCol ， 相等则停止遍历。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def spiralTraverse(array):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # Write your code here.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; result = []
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; startRow , endRow = 0, len(array) - 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; startCol, endCol = 0, len(array[0]) - 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; while startRow &amp;lt;= endRow and startCol &amp;lt;= endCol:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # right col
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for col in range(startCol, endCol + 1):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; result.append(array[startRow][col])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # down row
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for row in range(startRow + 1, endRow + 1):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; result.append(array[row][endCol])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # left col reversed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for col in reversed(range(startCol, endCol)):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if startRow == endRow:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; break;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; result.append(array[endRow][col])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # up row reversed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for row in reversed(range(startRow+1, endRow)):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if startCol == endCol:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; break;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; result.append(array[row][startCol])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; startRow = startRow + 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; endRow = endRow -1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; startCol = startCol + 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; endCol = endCol - 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return result&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description></item><item><title>nginx realserver 使用域名方式功能分析</title><link>https://garlicspace.com/posts/nginx-realserver-%E4%BD%BF%E7%94%A8%E5%9F%9F%E5%90%8D%E6%96%B9%E5%BC%8F%E5%8A%9F%E8%83%BD%E5%88%86%E6%9E%90/</link><pubDate>Thu, 27 Jul 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/nginx-realserver-%E4%BD%BF%E7%94%A8%E5%9F%9F%E5%90%8D%E6%96%B9%E5%BC%8F%E5%8A%9F%E8%83%BD%E5%88%86%E6%9E%90/</guid><description>nginx realserver 使用域名方式功能分析 - nginx使用域名方式访问RS的一些方案整理：</description></item><item><title>SNMP</title><link>https://garlicspace.com/posts/snmp/</link><pubDate>Tue, 06 Jun 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/snmp/</guid><description>SNMP - 全称为Simple Network Management Protocol（简单网络管理协议），是一种广泛使用的网络管理协议，允许管理员监视和管理网络设备，如路由器、交换机、服务器和打印机。它是一种应用层协议，促进网络设备与集中的网络管理系统之间的管理信息交换。</description></item><item><title>linux sudoers</title><link>https://garlicspace.com/posts/linux-sudoers/</link><pubDate>Tue, 16 May 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-sudoers/</guid><description>linux sudoers - linux安装完有些系统会默认禁用root登录， 所以我习惯创建一个普通用户然后配置sudoers登录。</description></item><item><title>Linux hostname</title><link>https://garlicspace.com/posts/linux-hostname/</link><pubDate>Thu, 11 May 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-hostname/</guid><description>Linux hostname - linux下设置hostname有以下两个命令</description></item><item><title>用 flex和bison 解析配置文件</title><link>https://garlicspace.com/posts/%E7%94%A8-flex%E5%92%8Cbison-%E8%A7%A3%E6%9E%90%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/</link><pubDate>Mon, 24 Apr 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E7%94%A8-flex%E5%92%8Cbison-%E8%A7%A3%E6%9E%90%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/</guid><description>&lt;p&gt;flex和bison是常用的词法分析和语法分析工具， flex可以将源文本以指定个规则识别为单词， bison可以将这些识别出来的单词进行结构化处理。下面可以通过一个bind9 config 解析程序进行说明。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;词法分析，语法分析编译过程也是两个过程，通过词法分析， 语法分析， 语义分析&lt;strong&gt;前端工作&lt;/strong&gt;完成输入源代码的识别， 通过中间语言，优化方式完成实现代码可扩展和优化（&lt;strong&gt;中端工作&lt;/strong&gt;）， 最终通过生成目标码， 一般也成为&lt;strong&gt;后端工作， 实现把&lt;/strong&gt;源代码变成目标代码的过程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用flex和bison可以方便的解析配置文件。就是把字符串分解为token，再将这些token解析到配置文件对应的结构。为之后提供查询修改。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;仅简单分析一下包含zone block的bind9配置&lt;/p&gt;
&lt;h4 id="识别token"&gt;&lt;strong&gt;识别token&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;bind9.l 标识出要是别的关键字， 也可以过滤掉一些注释和空白字符&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;y.tab.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;tree.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="cm"&gt;/* ignore whitespace*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;#34;//&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;(.)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt; &lt;span class="cm"&gt;/* ignore single-line comments */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;#34;/*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;(.)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*/&amp;#34;&lt;/span&gt; &lt;span class="cm"&gt;/* ignore multi-line comments */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;#34;{&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;LBRACE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;#34;}&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RBRACE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;#34;;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;SEMICOLON&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;EQUALS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;#34;zone&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ZONE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Z0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;yylval&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;strdup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yytext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;NAME&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;[^&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;&amp;#34; { yylval.value = strdup(yytext); return STRING; }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;%%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;yywrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description></item><item><title>SSL证书与私钥的编码格式和文件扩展名</title><link>https://garlicspace.com/posts/ssl%E8%AF%81%E4%B9%A6%E4%B8%8E%E7%A7%81%E9%92%A5%E7%9A%84%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F%E5%92%8C%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D/</link><pubDate>Sun, 09 Apr 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/ssl%E8%AF%81%E4%B9%A6%E4%B8%8E%E7%A7%81%E9%92%A5%E7%9A%84%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F%E5%92%8C%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D/</guid><description>SSL证书与私钥的编码格式和文件扩展名 - &amp;lt;!--more--&amp;gt;</description></item><item><title>Emiller’s Advanced Topics In Nginx Module Development</title><link>https://garlicspace.com/posts/emillers-advanced-topics-in-nginx-module-development/</link><pubDate>Thu, 30 Mar 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/emillers-advanced-topics-in-nginx-module-development/</guid><description>Emiller’s Advanced Topics In Nginx Module Development - 原文链接</description></item><item><title>X.509 certificates</title><link>https://garlicspace.com/posts/x-509-certificates/</link><pubDate>Thu, 09 Mar 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/x-509-certificates/</guid><description>X.509 certificates - X.509是定义的一个公钥证书格式标准。 RFC 5280 详细描述公钥证书，包括它们的字段和扩展名。</description></item><item><title>Emiller’s Guide To Nginx Module Development</title><link>https://garlicspace.com/posts/emillers-guide-to-nginx-module-development/</link><pubDate>Sun, 05 Mar 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/emillers-guide-to-nginx-module-development/</guid><description>Emiller’s Guide To Nginx Module Development - 原文链接：</description></item><item><title>The Hump</title><link>https://garlicspace.com/posts/the-hump/</link><pubDate>Mon, 30 Jan 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/the-hump/</guid><description>&lt;p&gt;前一阵偶尔看到一个介绍驼峰航线的视频，想起了我的姥爷。&lt;/p&gt;
&lt;p&gt;1942年5月，日军切断滇缅公路， 这是中国最后一条陆上联外交通线，中美两国被迫在印度东北部的阿萨姆邦和中国云南昆明之间开辟了一条转运战略物资的空中通道，这条空中通道就叫&lt;strong&gt;驼峰航线&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我的姥爷，谢自熬，老家陕西长武县，他小时候上过两年私塾， 后来充壮丁参了军。&lt;/p&gt;
&lt;p&gt;他很少主动给我讲他当兵时候的事情，我上初中的时候问到他的时候， 他给我讲了他在印度经历，当时坐了很长时间的飞机，飞机颠簸的很厉害， 后来飞到了印度。 当时给他们发的杯子上都印着摩登女郎， 平时训练完还可以去酒吧， 当时他还给我秀了两句英文， “a cup of coffee”。开始他是在高炮旅（不知道准不准确）， 做过后勤的司务长，后来他回了国，从云南到内蒙，后来进了傅作义的部队， 一直到和平解放。&lt;/p&gt;
&lt;p&gt;我们上学的历史书上也没有介绍过这段历史， 后来翻阅了相关资料，确实有这部分记载， “根据中美协议，远征军第一路司令长官部撤销，改称为&lt;a href="https://zh.m.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E9%A9%BB%E5%8D%B0%E5%86%9B" title="中国驻印军"&gt;中国驻印军&lt;/a&gt;总指挥部。&lt;a href="https://zh.m.wikipedia.org/wiki/%E5%8F%B2%E8%BF%AA%E5%A8%81" title="史迪威"&gt;史迪威&lt;/a&gt;为总指挥，&lt;a href="https://zh.m.wikipedia.org/wiki/%E7%BD%97%E5%8D%93%E8%8B%B1" title="罗卓英"&gt;罗卓英&lt;/a&gt;为副总指挥。同时，国民政府利用驼峰空运飞机回航的机会，每天空运几百名士兵到印度”（wiki）&lt;/p&gt;
&lt;p&gt;我小时候跟着姥姥姥爷长大， 姥爷是一个非常乐观的老头， 姥姥暴躁脾气， 不过对我很好，现在他们都已经不在了， 今年春节回家找出来和他们合影。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2023/01/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230130114026-768x1024.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2023/01/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230130114034-1024x768.jpg"&gt;&lt;/p&gt;
&lt;p&gt;姥姥、姥爷：我很想念你们。&lt;/p&gt;</description></item><item><title>Why does calloc exist?</title><link>https://garlicspace.com/posts/why-does-calloc-exist/</link><pubDate>Sun, 29 Jan 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/why-does-calloc-exist/</guid><description>Why does calloc exist? - 原文链接：</description></item><item><title>leetcode - Monotonic Array</title><link>https://garlicspace.com/posts/leetcode-monotonic-array/</link><pubDate>Mon, 23 Jan 2023 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-monotonic-array/</guid><description>&lt;h4 id="问题"&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;An array is &lt;strong&gt;monotonic&lt;/strong&gt; if it is either monotone increasing or monotone decreasing.&lt;/p&gt;
&lt;p&gt;An array &lt;code&gt;nums&lt;/code&gt; is monotone increasing if for all &lt;code&gt;i &amp;lt;= j&lt;/code&gt;, &lt;code&gt;nums[i] &amp;lt;= nums[j]&lt;/code&gt;. An array &lt;code&gt;nums&lt;/code&gt; is monotone decreasing if for all &lt;code&gt;i &amp;lt;= j&lt;/code&gt;, &lt;code&gt;nums[i] &amp;gt;= nums[j]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Given an integer array &lt;code&gt;nums&lt;/code&gt;, return &lt;code&gt;true&lt;/code&gt; &lt;em&gt;if the given array is monotonic, or&lt;/em&gt; &lt;code&gt;false&lt;/code&gt; &lt;em&gt;otherwise&lt;/em&gt;.&lt;/p&gt;
&lt;h4 id="解答"&gt;&lt;strong&gt;解答:&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;单调数组，当数组个数大于2时， 遍历数组， 通过比较当当前值与前一个值的，确定其是递增还是递减， 遍历过程中，如果有变化那么则不满足单调性。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def isMonotonic(array):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if len(array) &amp;lt;= 2:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; direction = array[1] - array[0]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for i in range(2, len(array)):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if direction == 0:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; direction = array[i] - array[i-1]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; continue
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if breakDirection(direction , array[i], array[i-1]):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return False;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return True;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def breakDirection (direction, val, preval):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; diff = val - preval
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if direction &amp;gt; 0:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return diff &amp;lt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return diff &amp;gt; 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description></item><item><title>Linux sed 中的&amp;</title><link>https://garlicspace.com/posts/linux-sed-%E4%B8%AD%E7%9A%84/</link><pubDate>Sat, 03 Dec 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-sed-%E4%B8%AD%E7%9A%84/</guid><description>Linux sed 中的&amp;amp; - 一次使用sed 替换操作，替换后的字符串包含 &amp;amp;，替换文本如下</description></item><item><title>ubuntu 忘记密码</title><link>https://garlicspace.com/posts/ubuntu-%E5%BF%98%E8%AE%B0%E5%AF%86%E7%A0%81/</link><pubDate>Sat, 03 Dec 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/ubuntu-%E5%BF%98%E8%AE%B0%E5%AF%86%E7%A0%81/</guid><description>ubuntu 忘记密码 - &amp;lt;!--more--&amp;gt;</description></item><item><title>window下查找监听端口进程并关闭</title><link>https://garlicspace.com/posts/window%E4%B8%8B%E6%9F%A5%E6%89%BE%E7%9B%91%E5%90%AC%E7%AB%AF%E5%8F%A3%E8%BF%9B%E7%A8%8B%E5%B9%B6%E5%85%B3%E9%97%AD/</link><pubDate>Tue, 29 Nov 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/window%E4%B8%8B%E6%9F%A5%E6%89%BE%E7%9B%91%E5%90%AC%E7%AB%AF%E5%8F%A3%E8%BF%9B%E7%A8%8B%E5%B9%B6%E5%85%B3%E9%97%AD/</guid><description>window下查找监听端口进程并关闭 - 测试mock服务程序在windows下运行，强制关闭后终端cmd后再次启动时发现， 端口已经被占用。</description></item><item><title>Nginx Development guide</title><link>https://garlicspace.com/posts/nginx-development-guide/</link><pubDate>Tue, 15 Nov 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/nginx-development-guide/</guid><description>Nginx Development guide - 这篇文章来自nginx document /</description></item><item><title>python tuple 一个元素时需要增加逗号</title><link>https://garlicspace.com/posts/python-tuple%E4%B8%80%E4%B8%AA%E5%85%83%E7%B4%A0%E9%9C%80%E8%A6%81%E5%A2%9E%E5%8A%A0%E9%80%97%E5%8F%B7/</link><pubDate>Sun, 08 May 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python-tuple%E4%B8%80%E4%B8%AA%E5%85%83%E7%B4%A0%E9%9C%80%E8%A6%81%E5%A2%9E%E5%8A%A0%E9%80%97%E5%8F%B7/</guid><description>&lt;p&gt;项目中使用python tuple时如果是一个元素一定要增加一个逗号,使用python3看下输出。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; t(0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Traceback (most recent call last):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;&amp;lt;stdin&amp;gt;&amp;#34;, line 1, in &amp;lt;module&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NameError: name &amp;#39;t&amp;#39; is not defined
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; t=(0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; print(type(t))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;class &amp;#39;int&amp;#39;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; print(t)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; t=(0,)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; print(type(t))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;class &amp;#39;tuple&amp;#39;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; print(t)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(0,)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;官方文档中描述：&lt;/p&gt;
&lt;p&gt;Note that it is actually the comma which makes a tuple, not the parentheses. The parentheses are optional, except in the empty tuple case, or when they are needed to avoid syntactic ambiguity. For example, &lt;code&gt;f(a, b, c)&lt;/code&gt; is a function call with three arguments, while &lt;code&gt;f((a, b, c))&lt;/code&gt; is a function call with a 3-tuple as the sole argument.&lt;/p&gt;</description></item><item><title>单元测试</title><link>https://garlicspace.com/posts/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/</link><pubDate>Sun, 08 May 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/</guid><description>单元测试 - 单元测试的目的并不是查找bug，而是帮助我们更好的设计我们的代码，如何合理的来拆分我们的代码。</description></item><item><title>Non-Constructible Change</title><link>https://garlicspace.com/posts/non-constructible-change/</link><pubDate>Wed, 04 May 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/non-constructible-change/</guid><description>&lt;h5 id="问题"&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;给定一系列正整数，代表硬币的面值，找到无法从这些整数组连续组合成的最小值。比如 coins=[1,2,5], 最小不能组合成的值为4.&lt;/p&gt;
&lt;h5 id="解答"&gt;&lt;strong&gt;解答：&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;如果下一个整数大于前面所有值的累积和 + 1，那么就知道最小值，如果能被组合范围[0, sum], 下一个数据为y， 如果能构造出联系数据 sum+1 要在 [y，sum+y]范围内。也就是y&amp;lt;=sum+1&amp;lt;=sum+y。 由于排序数组 y&amp;gt;=1, 也就是满足y&amp;gt;sum+1。就可以找到最小组合值。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def nonConstructibleChange(coins):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # Write your code here.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; coins.sort()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; currentChangeCreated = 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for coin in coins:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if coin &amp;gt; currentChangeCreated + 1:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return currentChangeCreated + 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; currentChangeCreated += coin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return currentChangeCreated + 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description></item><item><title>Debugging NGINX</title><link>https://garlicspace.com/posts/debugging-nginx/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/debugging-nginx/</guid><description>Debugging NGINX - 这篇文章来自nginx document</description></item><item><title>mysql error 1364 Field doesn't have a default values</title><link>https://garlicspace.com/posts/mysql-error-1364-field-doesnt-have-a-default-values/</link><pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/mysql-error-1364-field-doesnt-have-a-default-values/</guid><description>mysql error 1364 Field doesn&amp;#39;t have a default values - 前一阵在做一个系统迁移工作， mysql数据库版本进行了升级，</description></item><item><title>git 常用命令</title><link>https://garlicspace.com/posts/git-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><pubDate>Tue, 05 Apr 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/git-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><description>&lt;h5 id="查看分支"&gt;&lt;strong&gt;查看分支&lt;/strong&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git branch -av&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h5 id="导出分支"&gt;&lt;strong&gt;导出分支&lt;/strong&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add origin ssh://git@ip:port/branch.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout -b localbranch origin/remotebranch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h5 id="稀疏导出"&gt;&lt;strong&gt;稀疏导出&lt;/strong&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init &amp;lt;project&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd &amp;lt;project&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config core.sparsecheckout true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#34;path1/&amp;#34; &amp;gt;&amp;gt; .git/info/sparse-checkout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#34;path2/&amp;#34; &amp;gt;&amp;gt; .git/info/sparse-checkout
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull origin remotebranch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h5 id="恢复误删除文件"&gt;&lt;strong&gt;恢复误删除文件&lt;/strong&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git reset HEAD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h5 id="non-fast-forward"&gt;&lt;strong&gt;non-fast-forward&lt;/strong&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch origin master
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git merge origin FETCH_HEAD&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h5 id="本地rebase导致non-fast-forward"&gt;&lt;strong&gt;本地rebase导致non-fast-forward&lt;/strong&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git reflog 查看HEAD的移动历史
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git reset --hard xxxx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h5 id="提交"&gt;&lt;strong&gt;提交&lt;/strong&gt;&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push origin localbranchname&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description></item><item><title>Message-Based Load Balancing</title><link>https://garlicspace.com/posts/message-based-load-balancing/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/message-based-load-balancing/</guid><description>&lt;p&gt;最近工作中涉及到一些负载均衡一些知识这里今天这篇文章是F5的 Message-Based Load Balancing。 这是2009年发布的一篇文章，后续F5已经建议从MBLB迁移到MRP功能模块。&lt;/p&gt;
&lt;p&gt;原文链接： &lt;a href="https://www.f5.com/services/resources/white-papers/message-based-load-balancing"&gt;https://www.f5.com/services/resources/white-papers/message-based-load-balancing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Migrating MBLB Functionality to MRPF Functionality &lt;a href="https://techdocs.f5.com/kb/en-us/products/big-ip"&gt;https://techdocs.f5.com/kb/en-us/products/big-ip&lt;/a&gt;_ltm/manuals/product/bigip-mblb-to-mrf-migration-12-0-0/2.html&lt;/p&gt;
&lt;p&gt;在高可用可扩展性应用场景中，经常能看到负载均衡身影，有硬件设备也有软件实现，由于Web应用广泛应用负载平衡也变得更加适用于HTTP这些协议。&lt;/p&gt;
&lt;p&gt;与HTTP不同也会有一些异步的协议：Diameter，RADIUS and SIP，由于大多数负载的设计针对同步消息传输环境，这使得原有的负载难以分发这些协议。&lt;/p&gt;
&lt;p&gt;文中主要提到SIP协议的复杂性，SIP是一种基于文本的协议，它的语法和消息非常类似于HTTP协议，不同之处在于SIP不仅可以用TCP,也可以用UDP封装， 对移动业务支持比较好。&lt;/p&gt;
&lt;p&gt;如果举一个更好理解的例子， 由于在金融机构工作，一些系统使用长连接异步的通讯方式，比如银联CUPS系统卡接口， 使用的是异步长链接模式，如何做到在前端接入和后端系统均为长连接情况下做到，报文级别的负载？&lt;/p&gt;
&lt;h4 id="挑战"&gt;&lt;strong&gt;挑战&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Asynchronous Messaging 异步消息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是同步场景，客户端发送一个请求同步等待一个响应。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2022/04/aa59d49dab03de6d26e6ba8cb98e95c.png"&gt;&lt;/p&gt;
&lt;p&gt;下面是异步场景，客户端发送n个请求，服务端返回n个响应。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2022/04/82a6626bc99fb2b9e70e372b01a20ee.png"&gt;&lt;/p&gt;
&lt;p&gt;这种场景下没有明显的客户端服务端之分，可以看到右边的服务也可能主动发起请求到左边的服务。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Long-Lived Sessions 长连接&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在传统负载中，每次会话或连接基础上完成。在同一会话中收到的所有请求都是相同服务器的负载平衡。当通信完成时，会话终止。&lt;/p&gt;
&lt;p&gt;长连接场景中导致流量无法均匀分配到指定服务上。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Message-Oriented Communication 消息处理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;传统负载均衡维护请求和服务器端连接之间的1：1关系， 针对这种异步长连接场景，就需要做到1：n。也就是需要将请求均匀发送到后端的服务上。这时候就需要区分服务边界，需要多报文进行标识处理。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里文档中提到AVP， 对AVP的理解，就是报文的标识，也就是需要从报文中找到唯一能标识他的信息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="解决方案"&gt;&lt;strong&gt;解决方案&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;也就是MBLB （Message-Based Load Balancing）。&lt;/p&gt;
&lt;p&gt;MBLB使Big-IP LTM能够以交钥匙方式实现特定协议支持，同时仍通过iRules实现客户和环境特定的自定义。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2022/04/de63c76131cb02fa063e21989855caa.png"&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;可以看到他提取A报文中的AVP代码根据负载策略送到上面服务器， 提起B报文的AVP送到下面服务器。&lt;/p&gt;
&lt;h4 id="总结"&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;F5 TMOS架构提供了F5能够快速实现基于消息的协议， 保持通过iRules翻遍实现了各位异步并进行双向通信的协议适配。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h4 id="参考及引用"&gt;&lt;strong&gt;参考及引用&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;文中图片来自原文&lt;/p&gt;
&lt;p&gt;封面图片from &lt;a href="https://www.facebook.com/groups/474930279315210/user/100010173011046/?__cft__%5B0%5D=AZX1zTGTiRcuH1HkTQzBE5ML17mtmmvLTyG8cAnMzLF1rV1xMYeeRM-VWYKRRqpG6taHuXQD36y5oQPrbLP5hlfAvirQxum6gxBI9PcVmRQrUoiMRK9f-22SpT_7eGGIDcdiZZd6BYbfAiodbeJVeLRvKvUIip5keF8oXESMlIsgPxEfPcl7WM4Jb3ksgu43_IA&amp;amp;__tn__=-UC*F"&gt;陳丁光&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Tournament winner</title><link>https://garlicspace.com/posts/tournament-winner/</link><pubDate>Wed, 30 Mar 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/tournament-winner/</guid><description>&lt;h4 id="问题"&gt;&lt;strong&gt;问题&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;循环赛每个队对战所有其他对手， 胜利者记3分， 失败者记1分. 两个数组做为输入， competitions，存放主场队和客场队， results存放结果， 1表示主队获胜， 0表示客队获胜。返回分数最高的队伍。&lt;/p&gt;
&lt;h4 id="解答"&gt;&lt;strong&gt;解答&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;使用一个hash表，key为队伍名称， 值为累计分数。时间复杂度O(n) 循环赛的数量， 空间复杂度O(k), 参赛队数量。对应hash表需要的容量。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tournamentWinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;competitions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;currentBestTeam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;currentBestTeam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;competition&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;competitions&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;homeTeam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;awayTeam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;competition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;winningTeam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;homeTeam&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;awayTeam&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;updateScores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;winningTeam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;winningTeam&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;currentBestTeam&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;currentBestTeam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;winningTeam&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;currentBestTeam&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;updateScores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;team&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;team&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;team&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;team&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h4 id="参考及引用"&gt;&lt;strong&gt;参考及引用&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;图片from &lt;a href="https://www.facebook.com/groups/794976960528620/user/100002418785273/?__cft__%5B0%5D=AZW9pL5IQxrLNnHaTv5qqSZUuJc8pzdcOXbPh6OUgTdJhTsZwiUoAxfitrn-_qtfCGdQGYSTYcxlSGTTJtW-PmvtvQBg7nJukz1MgDchXSLqIF_4FPnwcvBWq3sTktU8fG5Fd5HpPA1Jv72UZf4tVKeWVsjeqCKlUHWEnWbymVEJ54tN2DMDXEGFMf032lP-mg0&amp;amp;__tn__=-UC*F"&gt;Akihito Ichiyama&lt;/a&gt;&lt;/p&gt;</description></item><item><title>vim putty gruvbox</title><link>https://garlicspace.com/posts/vim-putty-gruvbox/</link><pubDate>Mon, 21 Mar 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/vim-putty-gruvbox/</guid><description>&lt;ul&gt;
&lt;li&gt;putty&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用的是&lt;strong&gt;putty&lt;/strong&gt;进行访问，可以使用gruvbox 提供的配色访问进行调整。&lt;/p&gt;
&lt;p&gt;可以使用下面链接进去：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/morhetz/gruvbox-contrib/tree/master/putty&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;其他工具&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果使用是&lt;strong&gt;其他工具&lt;/strong&gt;也可以找到对应的工具&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/morhetz/gruvbox-contrib&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;操作系统自带Vim&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果使用的操作系统自带Vim工具，可以下载下面工具编辑~/.vimrc&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fLo&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;autoload&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vim&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dirs&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;githubusercontent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;junegunn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vim&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat ~/.vimrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;。。。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;call plug#begin()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plug &amp;#39;morhetz/gruvbox&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;call plug#end()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;。。。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;vi打开后&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:PlugInstall&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;grubbox提供的一些安装方法&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/morhetz/gruvbox/wiki/Installation&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h4 id="参考及引用"&gt;参考及引用&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://opensource.com/article/20/2/how-install-vim-plugins"&gt;https://opensource.com/article/20/2/how-install-vim-plugins&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;图片from &lt;a href="https://www.facebook.com/groups/474930279315210/user/100005798739099/?__cft__%5B0%5D=AZVXMQFBlHzXiVaac2Sbzee6jVPweEs81LFRAsYO50hhcIZmwlJBEpuGWLiHR8A0D0DLFIP65IvKjegc9TWZv6mhTFn7v3mKuCyRusZOiWzeMzhZnB2i7DGHDuH8UlpjCen1kSP82GPrErOx-DFjaPgs&amp;amp;__tn__=-UC%2CP-R"&gt;&lt;strong&gt;江金倫&lt;/strong&gt;&lt;/a&gt; 彰化縣-竹塘鄉-竹塘木棉道&lt;/p&gt;</description></item><item><title>ISO8583协议</title><link>https://garlicspace.com/posts/iso8583%E5%8D%8F%E8%AE%AE/</link><pubDate>Sat, 19 Mar 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/iso8583%E5%8D%8F%E8%AE%AE/</guid><description>ISO8583协议 - 在银行卡支付领域，经常提到“8583”， 他是金融机构中银行卡交易使用的一种内部协议。使用场景主要是终端如POS, ATM等金融终端到银行收单系统， 以及银行卡系统间。协议出现时期， 网络主要还是PSTN网络，电话拨号方式接入方式。考虑到带宽限制以及交易实时性要求，所以结构设计很紧凑，报文长度是1K左右，一般不会大于2K， 涉及数字的</description></item><item><title>centos8 yum 相关国内镜像仓库弃用(deprecated)</title><link>https://garlicspace.com/posts/centos8-yum-%E7%9B%B8%E5%85%B3%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93%E5%BC%83%E7%94%A8deprecated/</link><pubDate>Thu, 03 Feb 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/centos8-yum-%E7%9B%B8%E5%85%B3%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93%E5%BC%83%E7%94%A8deprecated/</guid><description>centos8 yum 相关国内镜像仓库弃用deprecated - 今天centos8使用yum安装软件时报错。</description></item><item><title>centos8 过滤 syslog信息</title><link>https://garlicspace.com/posts/centos8-%E8%BF%87%E6%BB%A4-syslog%E4%BF%A1%E6%81%AF/</link><pubDate>Sun, 02 Jan 2022 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/centos8-%E8%BF%87%E6%BB%A4-syslog%E4%BF%A1%E6%81%AF/</guid><description>&lt;p&gt;服务器（centos8）在用户登录的时候会出现一些登录日志。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;mount&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Created&lt;/span&gt; &lt;span class="n"&gt;slice&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Slice&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;UID&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;UID&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="mi"&gt;51&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Bus&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;Bus&lt;/span&gt; &lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Reached&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Timers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Reached&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Listening&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Bus&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;Bus&lt;/span&gt; &lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Reached&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Sockets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Reached&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Reached&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Startup&lt;/span&gt; &lt;span class="n"&gt;finished&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;UID&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;51.&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Succeeded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopping&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;UID&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopped&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopped&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopped&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Sockets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopped&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;dbus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Succeeded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Closed&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Bus&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;Bus&lt;/span&gt; &lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Reached&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Shutdown&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="n"&gt;Exit&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20871&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopped&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;Timers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Killing&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="mi"&gt;20967&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;systemctl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="k"&gt;signal&lt;/span&gt; &lt;span class="n"&gt;SIGKILL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Succeeded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopped&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;UID&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopping&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;mount&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Removed&lt;/span&gt; &lt;span class="n"&gt;slice&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Slice&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;UID&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="n"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Succeeded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Succeeded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopped&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;mount&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;通过下面命令生成rsyslog的过滤规则；&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#39;if $programname == &amp;#34;systemd&amp;#34; and ($msg contains &amp;#34;Started /run/$msg&amp;#34; or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$msg contains &amp;#34;Starting Session&amp;#34; or $msg contains &amp;#34;Started Session&amp;#34; or $msg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;contains &amp;#34;Created slice User&amp;#34; or $msg contains &amp;#34;Starting User Manager&amp;#34; or $msg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;contains &amp;#34;Starting User&amp;#34; or $msg contains &amp;#34;Starting D-Bus&amp;#34; or $msg contains
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;Reached target&amp;#34; or $msg contains &amp;#34;Listening on D-Bus&amp;#34; or $msg contains
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;Startup finished&amp;#34; or $msg contains &amp;#34;session-&amp;#34; or $msg contains &amp;#34;Stopping User
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Manager&amp;#34; or $msg contains &amp;#34;Stopped target&amp;#34; or $msg contain &amp;#34;dbus.socket&amp;#34; or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$msg contains &amp;#34;Stopped target &amp;#34; or $msg contains &amp;#34;Removed session&amp;#34; or $msg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;contains &amp;#34;Removed slice User Slice of&amp;#34; or $msg contains &amp;#34;Stopped /run/user&amp;#34; or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$msg contains &amp;#34;Stopped User Manager&amp;#34; or $msg contains &amp;#34;Stopping User Slice of&amp;#34; ) then stop&amp;#39; &amp;gt;/etc/rsyslog.d/ignore-systemd-session-slice.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;根据实际情况， 新增相关过滤规则即可&lt;/p&gt;</description></item><item><title>C++ pointers 和reference</title><link>https://garlicspace.com/posts/c-pointers-%E5%92%8Creference/</link><pubDate>Mon, 25 Oct 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/c-pointers-%E5%92%8Creference/</guid><description>&lt;p&gt;Pointer 和 references&lt;/p&gt;
&lt;h4 id="主要区别"&gt;&lt;strong&gt;主要区别&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;reference：总代表一个对象， 没有null reference；pointer则没有限制，可以为null&lt;/li&gt;
&lt;li&gt;poiner可以被重新赋值； reference不可以被重新赋值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="应用场景"&gt;&lt;strong&gt;应用场景&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;如果在不同时间指向不同对象则使用pointer， 如果一旦代表该对象就不能改变选择reference.&lt;/p&gt;
&lt;h4 id="相关代码"&gt;&lt;strong&gt;相关代码：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;使用reference更富效率, 如下面的例子，不需要测试rd的值，他代表某一个double&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;printDouble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;rd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;而如果用pointers，那么就得测试下他是否为null。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;printDouble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h4 id="其他"&gt;&lt;strong&gt;其他：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;当然也有例外， 比如leveldb中就可以看到一下issue，&lt;a href="https://github.com/google/leveldb/issues/140"&gt;DB::Get API should use reference instead of pointer #140&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以看到在下面一段描述，这里主要讨论关于函数参数使用引用还是指针。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Original&lt;/span&gt; &lt;span class="n"&gt;issue&lt;/span&gt; &lt;span class="mi"&gt;134&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;jvb127&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="mi"&gt;2013&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="n"&gt;T06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;56.000&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;virtual&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ReadOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Slice&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;However&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;optional&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;checked&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;It&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;considered&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;reference&lt;/span&gt; &lt;span class="n"&gt;rather&lt;/span&gt; &lt;span class="n"&gt;than&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;virtual&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ReadOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Slice&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;可以看到在google早些年的开发指南中，使用指针定义参数列表的参数和引用，通过const区分输入，输出参数。&lt;/p&gt;</description></item><item><title>What every programmer should know about memory，Part 1</title><link>https://garlicspace.com/posts/what-every-programmer-should-know-about-memorypart-1/</link><pubDate>Sat, 16 Oct 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/what-every-programmer-should-know-about-memorypart-1/</guid><description>&lt;p&gt;这篇文章  &lt;a href="https://lwn.net/Articles/250967/"&gt;What every programmer should know about memory, Part 1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;是出自lwn.net 作者 Ulrich Drepper&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h4 id="总线结构"&gt;&lt;strong&gt;总线结构&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;常见的商用计算机结构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;北桥南桥结构：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CPU通过FSB连接到北桥， 北桥包含内存控制器，通过不同内存控制器链接不同的RAM，如DRAM，SDRAM， Rambus，南桥主要连接I/O设备，支持不同总线接口如：PCI，SATA，USB。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2021/09/cpumemory.4.png"&gt;&lt;/p&gt;
&lt;p&gt;特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cpu到cpu之间数据要过北桥&lt;/li&gt;
&lt;li&gt;所有设备与RAM需要通过北桥&lt;/li&gt;
&lt;li&gt;RAM仅一个端口&lt;/li&gt;
&lt;li&gt;通过南桥链接设备与cpu通讯需要经过北桥&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;瓶颈； 北桥处理能力成为瓶颈。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设备与内存：&lt;/li&gt;
&lt;li&gt;北桥与内存&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;早些年设备间通讯需要通过cpu， 为了减少CPU压力，出现DMA，虽然减少cpu压力，但是占用北桥带宽。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为了增强北桥内存访问能力，有些系统支持北桥连接外部更多的内存控制器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;北桥连接外部内存控制器南北桥结构&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2021/09/cpumemory.5.png"&gt;&lt;/p&gt;
&lt;p&gt;特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;增强北桥处理能力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;瓶颈：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内部带宽&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;北桥成为中心关键节点，内存控制器接入越多&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;另外一种解决方法是将外部控制器集成到CPU中（ NUMA）&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2021/09/cpumemory.6.png"&gt;将内存控制器集成到cpu中，不同cpu连接不同内存， 没有北桥瓶颈，但当访问链接到其他CPU的内存时使得访问变得复杂。&lt;/p&gt;
&lt;p&gt;NUMA - Non-Uniform Memory Architecture&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h4 id="ram类型"&gt;&lt;strong&gt;RAM类型&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Static RAM&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要多个晶体管，文章中提到有6个或4个的。&lt;/li&gt;
&lt;li&gt;单元状态稳定，不需要刷新周期。&lt;/li&gt;
&lt;li&gt;断电后数据丢失&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Dynamic RAM&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要一个晶体管和一个电容&lt;/li&gt;
&lt;li&gt;需要刷新不断刷新&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;DRAM 访问&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2021/09/cpumemory.9.png"&gt;&lt;/p&gt;
&lt;p&gt;如果要访问一个4G地址， 4GB的RAM需要2^32个地址线， 使用二进制编码，&lt;em&gt;N&lt;/em&gt; 个地址线可以完成 2_N_ 个地址，使用N个地址线，除了电路设计复杂之外需要大量的芯片，DRAM设计时使用矩阵方式，将一维的操作转化为二维操作。使用行地址选择器和列地址选择器方式。简化了电路的设计。仅需要很少地址线，为了能区分行或列需要额外的一些lines。&lt;/p&gt;
&lt;p&gt;总结：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;处于成本考虑内存大多使用DRAM&lt;/li&gt;
&lt;li&gt;需要单独选择存储单元才能使用&lt;/li&gt;
&lt;li&gt;由于性价比考虑选择DRAM地址线设计使用矩阵方式。&lt;/li&gt;
&lt;li&gt;在读取或写入操作的可用之前由于电器特性需要一段时间&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;/p&gt;</description></item><item><title>ACME 证书自动化管理</title><link>https://garlicspace.com/posts/acme-%E8%AF%81%E4%B9%A6%E8%87%AA%E5%8A%A8%E5%8C%96%E7%AE%A1%E7%90%86/</link><pubDate>Sat, 28 Aug 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/acme-%E8%AF%81%E4%B9%A6%E8%87%AA%E5%8A%A8%E5%8C%96%E7%AE%A1%E7%90%86/</guid><description>ACME 证书自动化管理 - 在搭建blog使用https服务，需要申请配置一个域名证书，使用了Let’s Encrypt申请了免费的https证书。</description></item><item><title>docker 安装 Wordpress 及更新</title><link>https://garlicspace.com/posts/docker-%E5%AE%89%E8%A3%85-wordpress-%E5%8F%8A%E6%9B%B4%E6%96%B0/</link><pubDate>Tue, 24 Aug 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/docker-%E5%AE%89%E8%A3%85-wordpress-%E5%8F%8A%E6%9B%B4%E6%96%B0/</guid><description>docker 安装 Wordpress 及更新 - 今天登录到博客提示需要升级php，更新了下镜像顺便把之前搭建的步骤整理了一下。</description></item><item><title>leetcode - Squares of a Sorted Array</title><link>https://garlicspace.com/posts/leetcode-squares-of-a-sorted-array/</link><pubDate>Fri, 11 Jun 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-squares-of-a-sorted-array/</guid><description>leetcode - Squares of a Sorted Array - Given an integer array nums sorted in non-decreasing order, return _an array of the squares of each number sorted in non-decreasing</description></item><item><title>Leetcode-Is Subsequence</title><link>https://garlicspace.com/posts/leetcode-is-subsequence/</link><pubDate>Tue, 18 May 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-is-subsequence/</guid><description>Leetcode-Is Subsequence - Given two strings s and t, check if s is a subsequence of t</description></item><item><title>DeFi</title><link>https://garlicspace.com/posts/defi/</link><pubDate>Wed, 12 May 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/defi/</guid><description>DeFi - DeFi：Decentralized finance 是一种基于block-chain的金融形式。他不依赖于券商，银行，交易所等中心话的机构。</description></item><item><title>LeetCode-3Sum</title><link>https://garlicspace.com/posts/leetcode-3-sum/</link><pubDate>Mon, 10 May 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-3-sum/</guid><description>LeetCode-3Sum - Given an integer array nums, return all the triplets numsi, numsj, numsk such that i != j, i != k, and j != k, and numsi + numsj + numsk == 0</description></item><item><title>LeetCode-Two Sum</title><link>https://garlicspace.com/posts/leetcode-two-sum/</link><pubDate>Mon, 10 May 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-two-sum/</guid><description>LeetCode-Two Sum - Given an array of integers nums and an integer target, return _indices of the two numbers such that they add up to target</description></item><item><title>Vagrant 创建Centos8 环境</title><link>https://garlicspace.com/posts/vagrant-%E5%88%9B%E5%BB%BAcentos8-%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83/</link><pubDate>Fri, 07 May 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/vagrant-%E5%88%9B%E5%BB%BAcentos8-%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83/</guid><description>Vagrant 创建Centos8 环境 - 使用Vagrant重新搭建一个测试环境，只需要简单几步就可以启动一个测试环境。</description></item><item><title>Effective Go-5</title><link>https://garlicspace.com/posts/effective-go-5/</link><pubDate>Tue, 27 Apr 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/effective-go-5/</guid><description>Effective Go-5 - Do not communication by sharing memory; instead,share memory by communicating</description></item><item><title>Effective Go-4</title><link>https://garlicspace.com/posts/effective-go-4/</link><pubDate>Mon, 19 Apr 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/effective-go-4/</guid><description>&lt;h4 id="interfaces-and-other-types"&gt;&lt;strong&gt;Interfaces and other types&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id="interface"&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;Sequence这个例子，调用sort package中的方法，对于集合要实现sort的接口：Len(), Less(i,j int) bool 和 Swap(i,j int)。Sequence同时通过String()对集合内容进行格式化。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;sequence_test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;sort&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;testing&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="ne"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Less&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ne"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ne"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ne"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;copy&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ne"&gt;String&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Stringsprint&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;StringIntSlice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IntSlice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestSequence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;86&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;%#v&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stringsprint&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringIntSlice&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=== RUN TestSequence
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f:\GO\go_test\sequence\sequence_test.go:54: sequence_test.Sequence{100, 12, 83, 34, 59, 86}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f:\GO\go_test\sequence\sequence_test.go:55: [12 34 59 83 86 100]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f:\GO\go_test\sequence\sequence_test.go:56: [12 34 59 83 86 100]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f:\GO\go_test\sequence\sequence_test.go:57: [12 34 59 83 86 100]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f:\GO\go_test\sequence\sequence_test.go:58: [12 34 59 83 86 100]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--- PASS: TestSequence (0.00s)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PASS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ok loop/sequence 1.996s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h5 id="类型转换"&gt;&lt;strong&gt;类型转换&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;String()接口通过 “for i, elem := range”方式实现，也可以像Stringsprint直接调用fmt.Sprint处理实现。&lt;/p&gt;</description></item><item><title>Effective Go-3</title><link>https://garlicspace.com/posts/effective-go-3/</link><pubDate>Thu, 15 Apr 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/effective-go-3/</guid><description>&lt;h4 id="data"&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;分配&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过new和make分配空间：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;new分配空间，返回指针&lt;/li&gt;
&lt;li&gt;make可以进行生成slices，maps，channels，返回类型&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;data_test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;testing&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestCreateslices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestCreatemap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="ne"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;k1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;k2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestCreatechannel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chan&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ping&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h5 id="数组arrays和切片slices"&gt;&lt;strong&gt;数组（Arrays）和切片（Slices）&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;go中更推荐使用切片而不是数组。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数组长度固定&lt;/li&gt;
&lt;li&gt;切片可以动态调整容量（cap）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;data_test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;testing&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestCreatearray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="ne"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="ne"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;TestCreatearray&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;GO&lt;/span&gt;\&lt;span class="n"&gt;go_test&lt;/span&gt;\&lt;span class="n"&gt;data&lt;/span&gt;\&lt;span class="n"&gt;data_test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;GO&lt;/span&gt;\&lt;span class="n"&gt;go_test&lt;/span&gt;\&lt;span class="n"&gt;data&lt;/span&gt;\&lt;span class="n"&gt;data_test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;GO&lt;/span&gt;\&lt;span class="n"&gt;go_test&lt;/span&gt;\&lt;span class="n"&gt;data&lt;/span&gt;\&lt;span class="n"&gt;data_test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;GO&lt;/span&gt;\&lt;span class="n"&gt;go_test&lt;/span&gt;\&lt;span class="n"&gt;data&lt;/span&gt;\&lt;span class="n"&gt;data_test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;PASS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TestCreatearray&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.00&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h5 id="二维切片two-dimensional-slices"&gt;&lt;strong&gt;二维切片（Two-dimensional Slices）&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;下面是二位数组和二位切片的示例。&lt;/p&gt;</description></item><item><title>Effective Go-2</title><link>https://garlicspace.com/posts/effective-go-2/</link><pubDate>Wed, 07 Apr 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/effective-go-2/</guid><description>&lt;h4 id="分号"&gt;&lt;strong&gt;分号&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;若在一行最后一个标识符为以下类型&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数字&lt;/li&gt;
&lt;li&gt;字符串常量&lt;/li&gt;
&lt;li&gt;特殊标识符号；break continue fallthrough return ++ &amp;ndash; ) }&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;词法分析器会在标识符后添加分号， 与C不同GO很多地方都省略分号。&lt;/p&gt;
&lt;p&gt;另在在if for switch select控制结构后要接 “{”, 例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if i &amp;lt; f() {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; g()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;而不要写成&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if i &amp;lt; f()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; g()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h4 id="控制结构"&gt;&lt;strong&gt;控制结构&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;if/switch/for&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If switch语句中可以接受初始化语句&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if err := file.Chmod(0664); err != nil {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; log.Print(err)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return err
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;For 遍历数组，切片，字符串或者map时，可以使用range子句&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;for key, value := range oldMap {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; newMap[key] = value
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Switch中有两个比较特殊的地方，&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;break跳出指定一个标签范围：&lt;/p&gt;</description></item><item><title>LeetCode-Palindrome Pairs Solution</title><link>https://garlicspace.com/posts/leetcode-palindrome-pairs-solution/</link><pubDate>Thu, 01 Apr 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-palindrome-pairs-solution/</guid><description>LeetCode-Palindrome Pairs Solution - Given a list of unique words, return all the pairs of the _distinct_ indices i, j in the given list, so that the concatenation of</description></item><item><title>查询和清除文件系统缓存</title><link>https://garlicspace.com/posts/%E6%9F%A5%E8%AF%A2%E5%92%8C%E6%B8%85%E9%99%A4%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%BC%93%E5%AD%98/</link><pubDate>Tue, 30 Mar 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%9F%A5%E8%AF%A2%E5%92%8C%E6%B8%85%E9%99%A4%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%BC%93%E5%AD%98/</guid><description>查询和清除文件系统缓存 - 为了减少磁盘I/O，加快读写速度，Linux内核使用文件系统的Cache，Page Cache。</description></item><item><title>视频的版权识别与管理</title><link>https://garlicspace.com/posts/%E8%A7%86%E9%A2%91%E7%9A%84%E7%89%88%E6%9D%83%E8%AF%86%E5%88%AB%E4%B8%8E%E7%AE%A1%E7%90%86/</link><pubDate>Wed, 24 Mar 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E8%A7%86%E9%A2%91%E7%9A%84%E7%89%88%E6%9D%83%E8%AF%86%E5%88%AB%E4%B8%8E%E7%AE%A1%E7%90%86/</guid><description>&lt;p&gt;昨天正在听一位老师的英语的直播课， 当时她正在用影片的片段讲解英文听力课，讲到一半的时候，直播中断了。 显示“​stream suspended for policy violations”&lt;/p&gt;
&lt;p&gt;后来查了下资料才知道， 平台通过&lt;strong&gt;Connent ID系统&lt;/strong&gt;的运作方式来识别和管理上传的视频和音频版权。 &lt;a href="https://tech.sina.cn/csj/2019-06-27/doc-ihytcitk7982933.d.html"&gt;千亿美金的YouTube：收购后的13年里 Google做了什么？&lt;/a&gt;这篇文章比较详细的介绍了Google收购YouTube后， 对其版权管理和内容变现盈利模式做的一些工作。 Youtube的成功离不开 Google 长远的眼光，而“ Google的生态数据、广告销售体系和Google Cloud的支持，也放大了YouTube的商业价值。” &lt;/p&gt;
&lt;h3 id="content-id系统"&gt;&lt;strong&gt;Content ID系统&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Google收购Youtube后为解决其版权问题，建立一个能识别版权内容的Content ID系统。&lt;/p&gt;
&lt;p&gt;版权所有者可以向YouTube上传自己的音频或视频文件，Content ID数据库根据这些文件来创建内容“指纹”。&lt;/p&gt;
&lt;p&gt;如果发现有翻拍或模仿的内容，平台会给版权所有者三个选择：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;禁播&lt;/strong&gt;：禁止用户观看整个视频&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获利&lt;/strong&gt;：通过在视频中投放广告来利用视频获利；有时可以与上传者分享收益&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跟踪&lt;/strong&gt;：跟踪视频的观看情况统计信息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官网的一个&lt;a href="https://www.youtube.com/watch?v=9g2U12SsRns"&gt;视频介绍&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="实现思路及相关知识点整理"&gt;&lt;strong&gt;实现思路及相关知识点整理&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;关于Content ID系统闭源实现， 目前没找到相关资料， 个人理解应该涉及三个方面。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;视频识别&lt;/li&gt;
&lt;li&gt;处理流程&lt;/li&gt;
&lt;li&gt;服务整合&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="视频识别"&gt;&lt;strong&gt;视频识别&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;视频识别主要涉及计算机视觉技术**（Computer Vision， CV），**涉及计算机视觉的基础模型，特征提取，近几年都受到深度学习的影响，出现了基于深度学习计算机视觉模型。&lt;/p&gt;
&lt;h5 id="计算机视觉"&gt;&lt;strong&gt;计算机视觉&lt;/strong&gt; &lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;计算机视觉通过模仿人类的视觉系统，从照相机，摄影机等视频采集设备中获取原始信息，通过这些原始信息，进行语义（Semantic）解释或者逻辑理解。比如我们使用的电脑，我们需要识别显示器， 键盘，鼠标，并在头脑中形成这些物体的概念。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;领域特点&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**跨学科领域：**计算机视觉涉及多个领域&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;生物学领域&lt;/strong&gt;：人眼及&lt;strong&gt;视觉神经系统&lt;/strong&gt;，理解&lt;strong&gt;人脑&lt;/strong&gt;的处理机制
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;物理学领域&lt;/strong&gt;：设备越精密，越能完整的额捕获外界信息，主要涉及&lt;strong&gt;光学领域&lt;/strong&gt;的研究。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算机科学&lt;/strong&gt;：信息检索，计算机体系结构，机器学习。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;相关难题：&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图像信息与语义之间巨大鸿沟&lt;/strong&gt;。例如：如何将一个200*200RGB图像，对应12万数字组成的矩阵与具体的事物关联起来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;识别速度&lt;/strong&gt;。实验表明，一副普通场景图片，人类需要150毫秒，人类在理解图片时，依靠过去的记忆、经验、外界知识来对图像中物体进行判断。这些都是计算机系统难以企及的。&lt;/li&gt;
&lt;li&gt;**实现方式。**是模仿人类视觉系统还是需要开辟其他研究道路。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;应用：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;视频识别已经在人脸识别，光学字符识别，电影特效，视觉搜索，自动驾驶，无人商店，虚拟现实，增强现实等方面有了广泛应用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基础模型及操作：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;像素表达：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;根据不同的图像类型像素表达也不同.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;黑白图像&lt;/strong&gt;:转化0或1的二元矩阵
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;灰度图像&lt;/strong&gt;:每一个像素代表灰度的“强度”Intensity 范围在0-255&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;彩色图像&lt;/strong&gt;:比较流行的RGB，三种颜色叠加，RGB代表三种不同的通道，每一个通道都是一个矩阵表达，每个像素代表0-255，彩色图像是一个**张量（Tensor），**也就是三个矩阵叠加一起的结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;像素本身是真实世界中的“采样”&lt;/strong&gt;，连续的信号采样到离散像素，难免会有失真的情况，不同分辨率会有不同程度的像素表达。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;关键字 &lt;strong&gt;Pixel&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;过滤器：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;移动平均&lt;/strong&gt;(Moving Average)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个过滤器的本质就是针对每个像素点对周围的9个像素点，计算其平均值，并形成心得矩阵。然后对新像素点视觉化。&lt;/p&gt;</description></item><item><title>Effective Go - 1</title><link>https://garlicspace.com/posts/effective-go-1/</link><pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/effective-go-1/</guid><description>Effective Go - 1 - 为了减少格式化问题带来的争议， 可以使用 gofmt程序对源码进行格式化。</description></item><item><title>LeetCode-Word Search II Solution</title><link>https://garlicspace.com/posts/leetcode-word-search-ii-solution/</link><pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-word-search-ii-solution/</guid><description>LeetCode-Word Search II Solution - Given an m x n board of characters and a list of strings words, return _all words on the board</description></item><item><title>Linux跨文件系统的文件夹和文件映射关系</title><link>https://garlicspace.com/posts/linux%E8%B7%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E5%92%8C%E6%96%87%E4%BB%B6%E6%98%A0%E5%B0%84%E5%85%B3%E7%B3%BB/</link><pubDate>Sat, 06 Mar 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E8%B7%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E5%92%8C%E6%96%87%E4%BB%B6%E6%98%A0%E5%B0%84%E5%85%B3%E7%B3%BB/</guid><description>Linux跨文件系统的文件夹和文件映射关系 - Everything is a file 是Unix的设计理念，由其派生的Linux也如此。</description></item><item><title>mount操作导致磁盘数据丢失</title><link>https://garlicspace.com/posts/mount%E6%93%8D%E4%BD%9C%E5%AF%BC%E8%87%B4%E7%A3%81%E7%9B%98%E6%95%B0%E6%8D%AE%E4%B8%A2%E5%A4%B1/</link><pubDate>Tue, 02 Mar 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/mount%E6%93%8D%E4%BD%9C%E5%AF%BC%E8%87%B4%E7%A3%81%E7%9B%98%E6%95%B0%E6%8D%AE%E4%B8%A2%E5%A4%B1/</guid><description>mount操作导致磁盘数据丢失 - - cenos7X86_64 + openssh</description></item><item><title>DIY esp8266 小盒子</title><link>https://garlicspace.com/posts/diy%E5%B0%8F%E7%9B%92%E5%AD%90/</link><pubDate>Sun, 28 Feb 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/diy%E5%B0%8F%E7%9B%92%E5%AD%90/</guid><description>&lt;p&gt;前些天看到用esp8266开发的小盒子，按照教程https://www.instructables.com/3D-Printer-Monitor-Wemos-D1-Mini-ESP8266/操作了一下。&lt;/p&gt;
&lt;h4 id="3d打印的外壳"&gt;3D打印的外壳&lt;/h4&gt;
&lt;p&gt;作者提供了3D模型 &lt;a href="https://www.thingiverse.com/thing:2884823"&gt;https://www.thingiverse.com/thing:2884823&lt;/a&gt;， 我是使用速加网打印的， 质量和价格还不错，大概20元左右不含运费。&lt;/p&gt;
&lt;p&gt;可能芯片规格不一样， 如果有打印机的话可以根据芯片尺寸，把盒子厚度加大一些。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2021/02/3Dbox.png"&gt;&lt;/p&gt;
&lt;h4 id="相关芯片联接"&gt;相关芯片联接&lt;/h4&gt;
&lt;p&gt;主要是两个芯片：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ESP8266 D1 Mini：这个普通就可以， 10元左右。&lt;/li&gt;
&lt;li&gt;0.96 OLED : 这个建议买老款的， 新款的屏幕有些小。10元左右。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;芯片链接及焊接：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2021/02/join.png"&gt;&lt;/p&gt;
&lt;p&gt;焊接完成后&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2021/02/board2.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://garlicspace.com/wp-content/uploads/2021/02/board1.png"&gt;&lt;/p&gt;
&lt;p&gt;这里需要注意的是看好&lt;strong&gt;GND和5V接口&lt;/strong&gt;，8266与OLED对接时线不要接错了， 将5V接到GND上， 烧坏了一块OLED的板子。&lt;/p&gt;
&lt;p&gt;焊接：由于是第一次弄，大概来回焊接了3，4次，温度太高容易烧到板子， 太低焊锡又化不了。最好能固定一下， 我是拿透明胶固定了一下。&lt;/p&gt;
&lt;h4 id="应用刷新"&gt;应用刷新&lt;/h4&gt;
&lt;p&gt;1  开发环境&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用Arduino IDE，配置附加的电路板的配置链接http://arduino.esp8266.com/stable/package_esp8266com_index.json ，&lt;/li&gt;
&lt;li&gt;开发版选择“WeMos D1 R2 &amp;amp; mini”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2  相关库选择&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WiFiManager&lt;/li&gt;
&lt;li&gt;Json：arduinojson&lt;/li&gt;
&lt;li&gt;OLED：esp8266-oled-ssd1306&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3  源码应用下载&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Qrome/printer-monitor"&gt;https://github.com/Qrome/printer-monitor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;源码及配置调整地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Settings.h,注释掉以下几行&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//#include &amp;lt;WiFi.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//#include &amp;lt;WiFiClient.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//#include &amp;lt;WiFiServer.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;//#include &amp;lt;WiFiUdp.h&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;配置选择了， “WeMos D1 R2 &amp;amp; mini”， 工具菜单中关于flash的选项。&lt;strong&gt;选择“Flash Size-&amp;gt;3M (1M SPIFFS)”，&lt;/strong&gt; 如果选择，(NO SPIFFS)， 应用无法启动，会提示文件打开失败。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;SPIFFS 是一个嵌入式文件系统， 由于应用中会生成配置文件， 保存相关配置信息， 配置文件生成所以该文件系统支持。&lt;/p&gt;</description></item><item><title>LeetCode-Maximum XOR of Two Numbers in an Array</title><link>https://garlicspace.com/posts/maximum-xor-of-two-numbers-in-an-array/</link><pubDate>Sat, 27 Feb 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/maximum-xor-of-two-numbers-in-an-array/</guid><description>LeetCode-Maximum XOR of Two Numbers in an Array - Given an integer array nums, return _the maximum result of numsi XOR numsj_, where 0 ≤ i ≤ j &amp;lt; n</description></item><item><title>比特币，区块链与自由软件</title><link>https://garlicspace.com/posts/%E5%BC%80%E6%BA%90btc%E5%8C%BA%E5%9D%97%E9%93%BE%E4%B8%8E%E8%87%AA%E7%94%B1%E8%BD%AF%E4%BB%B6/</link><pubDate>Wed, 24 Feb 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%BC%80%E6%BA%90btc%E5%8C%BA%E5%9D%97%E9%93%BE%E4%B8%8E%E8%87%AA%E7%94%B1%E8%BD%AF%E4%BB%B6/</guid><description>比特币，区块链与自由软件 - 这篇文章 Open source money: Bitcoin, blockchain, and free software</description></item><item><title>开源许可证</title><link>https://garlicspace.com/posts/%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF%E8%AF%81/</link><pubDate>Sun, 21 Feb 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF%E8%AF%81/</guid><description>开源许可证 - 最近在学习python 使用到在操作package的时候，有一个步骤就是要增加一个“LICENSE”文件。</description></item><item><title>python语言学习</title><link>https://garlicspace.com/posts/python%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A0/</link><pubDate>Wed, 17 Feb 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A0/</guid><description>python语言学习 - 最新学习极客时间物联网课程中，老师使用的语言是python。之前也没有系统学习过，利用假期，跟着两个极客时间专栏学习了一下python 。</description></item><item><title>python 的 __name__</title><link>https://garlicspace.com/posts/python-if-__name__-__main__/</link><pubDate>Mon, 08 Feb 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python-if-__name__-__main__/</guid><description>python 的 name - 这篇文章The Reason Behind if name == ‘main’ in Python 是出自med</description></item><item><title>python将多个excel合并</title><link>https://garlicspace.com/posts/python%E5%B0%86%E5%A4%9A%E4%B8%AAexcel%E5%90%88%E5%B9%B6/</link><pubDate>Wed, 03 Feb 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python%E5%B0%86%E5%A4%9A%E4%B8%AAexcel%E5%90%88%E5%B9%B6/</guid><description>&lt;p&gt;同一个excel文件，分配到各组填写， 最后统一汇总成一个文档反馈。&lt;/p&gt;
&lt;h4 id="环境"&gt;环境&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;windows10
&lt;ul&gt;
&lt;li&gt;python3.7 + openpyxl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="目标"&gt;目标&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;in目录存放各个组填写的文档
&lt;ul&gt;
&lt;li&gt;out目录存放合并后的结果文件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="实现"&gt;实现&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;表格&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;产品&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;th&gt;反馈1&lt;/th&gt;
&lt;th&gt;反馈2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;01&lt;/td&gt;
&lt;td&gt;产品1&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;00000&lt;/td&gt;
&lt;td&gt;999999&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;02&lt;/td&gt;
&lt;td&gt;产品2&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;11111&lt;/td&gt;
&lt;td&gt;888888&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;03&lt;/td&gt;
&lt;td&gt;产品3&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;22222&lt;/td&gt;
&lt;td&gt;777777&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;代码:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openpyxl&lt;/span&gt; &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openpyxl&lt;/span&gt; &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Workbook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 获取所有的文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getfilelist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;li&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.xlsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;li&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;li&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 更新&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 1. 打开输出文件，处理一个sheet页面， &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 2. 循环获取某一行记录，放入字典结构从所有的输入文件中获取补充记录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 3. 如果是单条直接更新， 如果出现重复记录入职(暂不处理)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 4. 依据以上处理方式，处理完所有sheet页面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;INPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;in&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;OUTPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;out&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;productlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;product1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;product2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 1. sheetname名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 2. 位置1: 过滤条件 product 所在列位置，判断是否productlist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 3. 位置2：通过判断第一个需要填写项判断是否填写数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheetlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sheet1）&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sheet2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sheet3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sheet4&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;inlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getfilelist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;in&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;outlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getfilelist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;out&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;li&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sheetlist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sheetname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;li&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;li&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;firstfilled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;li&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readdata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inlist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sheetname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;firstfilled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writedata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outlist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sheetname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;readdata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inlist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sheetname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;firstfilled&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inlist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;INPATH&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wb&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sheetname&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;productlist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;firstfilled&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;writedata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outlist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sheetname&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wbout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OUTPATH&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;outlist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wsout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wbout&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sheetname&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sheetname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#for key in d.keys(): for key in d:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wsout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_column&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wsout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wbout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OUTPATH&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;outlist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;代码调整:&lt;/p&gt;</description></item><item><title>LeetCode- Add and Search Word - Data structure design Solution</title><link>https://garlicspace.com/posts/leetcode-add-and-search-word-data-structure-design-solution/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-add-and-search-word-data-structure-design-solution/</guid><description>LeetCode- Add and Search Word - Data structure design Solution - leetcode 211 Trie的添加及搜索</description></item><item><title>python map &amp; filter &amp; reduce</title><link>https://garlicspace.com/posts/python-map-filter-reduce/</link><pubDate>Sun, 17 Jan 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python-map-filter-reduce/</guid><description>&lt;p&gt;map, filter, reduce 是函数式编程的函数, 不再需要循环分支使得代码更加简洁。map/reduce 和google的map/reduce功能是类似的， filter有些类似shuffle, 当然shuffle更多的工作是将相同的key放到同一个reduce计算中&lt;/p&gt;
&lt;h3 id="map"&gt;map&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;map(function_to_apply, list_of_inputs)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;squared&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;squared&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;lt;=&amp;gt; 等价于&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;squared&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="filter"&gt;filter&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;filter(function_to_apply, list_of_inputs)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;接着上面的代码继续&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;less_than_ten&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;squared&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;less_than_ten&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;less_than_ten&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;lt;=&amp;gt; 等价于&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;less_than_ten&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;less_than_ten&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;squared&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;less_than_ten&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="reduce"&gt;reduce&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reduce(function_to_apply, list_of_inputs)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;和上面两个函数不同， reduce将进行迭代合并操作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;less_than_ten&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;lt;=&amp;gt; 等价于&lt;/p&gt;</description></item><item><title>可逆计算 reversible computing</title><link>https://garlicspace.com/posts/%E5%8F%AF%E9%80%86%E8%AE%A1%E7%AE%97-reversible-computing/</link><pubDate>Sun, 17 Jan 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%8F%AF%E9%80%86%E8%AE%A1%E7%AE%97-reversible-computing/</guid><description>&lt;blockquote&gt;
&lt;p&gt;本周在学习Trie数据结构的时候，看到了他的发明者 Edward Fredkin，他也在研究reversible computing&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;弗雷德金（Fredkin）对计算，硬件和软件一直很感兴趣。 在1960年代初期，他在BBN编写了第一台PDP-1汇编程序。 他是&lt;code&gt;trie数据结构&lt;/code&gt;，&lt;code&gt;Fredkin gate&lt;/code&gt;和&lt;code&gt;Billiard-Ball&lt;/code&gt;计算机模型的可逆计算的发明者。 他的主要贡献包括他在&lt;code&gt;可逆计算&lt;/code&gt;和&lt;code&gt;元胞自动机&lt;/code&gt;方面的工作。 他还研究领域还包括计算机视觉，人工智能研究和计算机象棋。&lt;/p&gt;</description></item><item><title>关于Trie</title><link>https://garlicspace.com/posts/%E5%85%B3%E4%BA%8Etrie/</link><pubDate>Sat, 16 Jan 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%85%B3%E4%BA%8Etrie/</guid><description>关于Trie - 最早提及Trie树的一篇文章</description></item><item><title>LeetCode- Replace Words Solution</title><link>https://garlicspace.com/posts/leetcode-replace-words-solution/</link><pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-replace-words-solution/</guid><description>&lt;h3 id="题目"&gt;题目：&lt;/h3&gt;
&lt;p&gt;In English, we have a concept called &lt;strong&gt;root&lt;/strong&gt;, which can be followed by some other word to form another longer word - let&amp;rsquo;s call this word &lt;strong&gt;successor&lt;/strong&gt;. For example, when the &lt;strong&gt;root&lt;/strong&gt; &lt;code&gt;&amp;quot;an&amp;quot;&lt;/code&gt; is followed by the &lt;strong&gt;successor&lt;/strong&gt; word &lt;code&gt;&amp;quot;other&amp;quot;&lt;/code&gt;, we can form a new word &lt;code&gt;&amp;quot;another&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Given a &lt;code&gt;dictionary&lt;/code&gt; consisting of many &lt;strong&gt;roots&lt;/strong&gt; and a &lt;code&gt;sentence&lt;/code&gt; consisting of words separated by spaces, replace all the &lt;strong&gt;successors&lt;/strong&gt; in the sentence with the &lt;strong&gt;root&lt;/strong&gt; forming it. If a &lt;strong&gt;successor&lt;/strong&gt; can be replaced by more than one &lt;strong&gt;root&lt;/strong&gt;, replace it with the &lt;strong&gt;root&lt;/strong&gt; that has &lt;strong&gt;the shortest length&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>docker安装 zookeeper, dubbo-admin</title><link>https://garlicspace.com/posts/docker%E5%AE%89%E8%A3%85-zookeeper-dubbo-admin/</link><pubDate>Wed, 23 Dec 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/docker%E5%AE%89%E8%A3%85-zookeeper-dubbo-admin/</guid><description>docker安装 zookeeper, dubbo-admin - 1 . 环境：</description></item><item><title>docker安装tomcat</title><link>https://garlicspace.com/posts/docker%E5%AE%89%E8%A3%85tomcat/</link><pubDate>Tue, 22 Dec 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/docker%E5%AE%89%E8%A3%85tomcat/</guid><description>docker安装tomcat - 1 . 环境：</description></item><item><title>cenos7 docker安装</title><link>https://garlicspace.com/posts/cenos7-docker%E5%AE%89%E8%A3%85/</link><pubDate>Mon, 21 Dec 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/cenos7-docker%E5%AE%89%E8%A3%85/</guid><description>cenos7 docker安装 - - 环境：</description></item><item><title>spring boot+maven 生成多模块项目</title><link>https://garlicspace.com/posts/spring-bootmaven-%E7%94%9F%E6%88%90%E5%A4%9A%E6%A8%A1%E5%9D%97%E9%A1%B9%E7%9B%AE/</link><pubDate>Mon, 21 Dec 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/spring-bootmaven-%E7%94%9F%E6%88%90%E5%A4%9A%E6%A8%A1%E5%9D%97%E9%A1%B9%E7%9B%AE/</guid><description>&lt;p&gt;spring boot + maven配置, 创建一个包含多个模块项目的步骤&lt;/p&gt;
&lt;h3 id="项目创建"&gt;项目创建&lt;/h3&gt;
&lt;p&gt;使用&lt;a href="https://start.spring.io/"&gt;spring的initializr&lt;/a&gt; 选择一下就可以生成代码&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;项目: tongda (jar)&lt;/li&gt;
&lt;li&gt;模块: user (war) order (war) common (jar)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project : Maven Project&lt;/li&gt;
&lt;li&gt;Language : Java&lt;/li&gt;
&lt;li&gt;Spring Boot : 2.4.1&lt;/li&gt;
&lt;li&gt;Dependencies:&lt;/li&gt;
&lt;li&gt;Java : 11&lt;/li&gt;
&lt;li&gt;Packaging :jar/war&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="调整-parent-pom"&gt;调整 parent POM&lt;/h4&gt;
&lt;p&gt;修改tongda的&lt;code&gt;pom.xml&lt;/code&gt;, 打包类型设置为&lt;code&gt;pom&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新增&lt;code&gt;packaging&lt;/code&gt; 标签并设置为&lt;code&gt;pom&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;packaging&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pom&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;packaging&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;通知增加模块配置&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;各个模块中调整&lt;code&gt;parent&lt;/code&gt;标签&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;order&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt;模块 &lt;code&gt;pom.xml&lt;/code&gt;文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tongda&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tongda&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;0.0.1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SNAPSHOT&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;relativePath&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;relativePath&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;验证&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mvn&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Reactor&lt;/span&gt; &lt;span class="nl"&gt;Summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;tongda&lt;/span&gt; &lt;span class="mf"&gt;0.0.1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SNAPSHOT&lt;/span&gt; &lt;span class="p"&gt;..............................&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;1.250&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;...............................................&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;9.161&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="p"&gt;..............................................&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;6.106&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt; &lt;span class="mf"&gt;0.0.1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SNAPSHOT&lt;/span&gt; &lt;span class="p"&gt;..............................&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;4.226&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;------------------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;BUILD&lt;/span&gt; &lt;span class="n"&gt;SUCCESS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;------------------------------------------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="参考引用"&gt;参考引用&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.baeldung.com/maven-multi-module"&gt;https://www.baeldung.com/maven-multi-module&lt;/a&gt; &lt;a href="https://github.com/bz51/SpringBoot-Dubbo-Docker-Jenkins"&gt;https://github.com/bz51/SpringBoot-Dubbo-Docker-Jenkins&lt;/a&gt; Photo by Zaksheuskaya from Pexels&lt;/p&gt;</description></item><item><title>用Spring boot 生成Java项目</title><link>https://garlicspace.com/posts/2138/</link><pubDate>Wed, 16 Dec 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/2138/</guid><description>用Spring boot 生成Java项目 - 学习java, 尝试用了spring boot创建了一个项目， 使用是maven配置, spring boot 提供很多的模板， 创建项目非常方便， 这让我想起了visual studio 点击几下鼠标自动生成模板代码。</description></item><item><title>LeetCode- Map Sum Pairs Solution</title><link>https://garlicspace.com/posts/leetcode-map-sum-pairs-solution/</link><pubDate>Tue, 22 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-map-sum-pairs-solution/</guid><description>LeetCode- Map Sum Pairs Solution - Implement a MapSum class with insert, and sum methods</description></item><item><title>Ext4 布局及inode,block信息统计</title><link>https://garlicspace.com/posts/ext4-%E5%B8%83%E5%B1%80%E5%8F%8Ainodeblock%E4%BF%A1%E6%81%AF%E7%BB%9F%E8%AE%A1/</link><pubDate>Wed, 16 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/ext4-%E5%B8%83%E5%B1%80%E5%8F%8Ainodeblock%E4%BF%A1%E6%81%AF%E7%BB%9F%E8%AE%A1/</guid><description>Ext4 布局及inode,block信息统计 - The inode index node is a data structure in a Unix-style file system that describes a file-system object such as a file or a directory. Each inode store</description></item><item><title>Understanding Linux filesystems: ext4 and beyond</title><link>https://garlicspace.com/posts/understanding-linux-filesystems-ext4-and-beyond/</link><pubDate>Wed, 16 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/understanding-linux-filesystems-ext4-and-beyond/</guid><description>Understanding Linux filesystems: ext4 and beyond - 这篇文章Understanding Linux filesystems: ext4 and beyond</description></item><item><title>查看inode相关信息</title><link>https://garlicspace.com/posts/%E6%9F%A5%E7%9C%8Binode%E7%9B%B8%E5%85%B3%E4%BF%A1%E6%81%AF/</link><pubDate>Tue, 15 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%9F%A5%E7%9C%8Binode%E7%9B%B8%E5%85%B3%E4%BF%A1%E6%81%AF/</guid><description>查看inode相关信息 - The inode index node is a data structure in a Unix-style file system that describes a file-system object such as a file or a directory. Each inode stores the attrib</description></item><item><title>close-on-exec</title><link>https://garlicspace.com/posts/close-on-exec/</link><pubDate>Wed, 09 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/close-on-exec/</guid><description>close-on-exec - Donald E. Porter 教授的 CSE 506: Operating Systems 教材 VFS 部分中提到Linux文件操作使用的一个标识</description></item><item><title>LeetCode – Populating Next Right Pointers in Each Node Solution</title><link>https://garlicspace.com/posts/leetcode-populating-next-right-pointers-in-each-node-solution/</link><pubDate>Mon, 07 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-populating-next-right-pointers-in-each-node-solution/</guid><description>LeetCode – Populating Next Right Pointers in Each Node Solution - You are given a perfect binary tree where all leaves are on the same level, and every parent has two children</description></item><item><title>LeetCode –Populating Next Right Pointers in Each Node II</title><link>https://garlicspace.com/posts/leetcode-populating-next-right-pointers-in-each-node-ii/</link><pubDate>Mon, 07 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-populating-next-right-pointers-in-each-node-ii/</guid><description>LeetCode –Populating Next Right Pointers in Each Node II - Given a binary tree</description></item><item><title>LeetCode- Implement Trie (Prefix Tree)</title><link>https://garlicspace.com/posts/leetcode-implement-trie-prefix-tree/</link><pubDate>Thu, 03 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-implement-trie-prefix-tree/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Implement a trie with &lt;code&gt;insert&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt;, and &lt;code&gt;startsWith&lt;/code&gt; methods.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Trie trie = new Trie();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;trie.insert(&amp;#34;apple&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;trie.search(&amp;#34;apple&amp;#34;); // returns true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;trie.search(&amp;#34;app&amp;#34;); // returns false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;trie.startsWith(&amp;#34;app&amp;#34;); // returns true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;trie.insert(&amp;#34;app&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;trie.search(&amp;#34;app&amp;#34;); // returns true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You may assume that all inputs are consist of lowercase letters &lt;code&gt;a-z&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;All inputs are guaranteed to be non-empty strings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="实现"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;      TrieTree是一个多叉树，是解决字符串快速匹配问题的数据结构，  他用于存储一个字符串，每个TrieTree的节点代表一个字符串/字符串前缀，每个节点可以有多个孩子节点，指向不同子节点不同路径代表不同的字符串，子节点的字符串是由本子节点的字符加上从根节点到本节点路径上的字符组成。 &lt;/p&gt;
&lt;p&gt;     本地实现上， 节点的子节点使用数组或哈希表存储，只处理26个字母，通过判断子节点指针是否为空判断该字符是否存在。 具体实现参考leetcode提供的伪代码&lt;/p&gt;</description></item><item><title>MezzFS文件系统</title><link>https://garlicspace.com/posts/mezzfs%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/</link><pubDate>Wed, 02 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/mezzfs%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/</guid><description>MezzFS文件系统 - 这篇文章MezzFS — Mounting object storage in Netflix’s media processing platfor</description></item><item><title>Tiny Core Linux 安装配置</title><link>https://garlicspace.com/posts/tiny-core-linux-%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/</link><pubDate>Tue, 01 Sep 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/tiny-core-linux-%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/</guid><description>Tiny Core Linux 安装配置 - Tiny Core Linux是一个mini Linux操作系统,基于 BusyBox和FLTK提供基本功能。 其发行版本在11M-16M 官网上也提供Plus版本也只有106M。它很精致。</description></item><item><title>dhclient error while loading shared libraries libdns-export.so.1102</title><link>https://garlicspace.com/posts/dhclient-error-while-loading-shared-libraries-libdns-export-so-1102/</link><pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/dhclient-error-while-loading-shared-libraries-libdns-export-so-1102/</guid><description>dhclient error while loading shared libraries libdns-export.so.1102 - - 环境：</description></item><item><title>python excel文件中指定字段是否相等</title><link>https://garlicspace.com/posts/python%E6%A3%80%E6%9F%A5%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E6%8C%87%E5%AE%9A%E5%AD%97%E6%AE%B5%E6%98%AF%E5%90%A6%E7%9B%B8%E7%AD%89/</link><pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python%E6%A3%80%E6%9F%A5%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E6%8C%87%E5%AE%9A%E5%AD%97%E6%AE%B5%E6%98%AF%E5%90%A6%E7%9B%B8%E7%AD%89/</guid><description>&lt;p&gt;工作需要检查相关excel数据信息, 查询一个表格中的指定位置编号，检查相关多个个相关表格中指定位置编号是否相同。&lt;/p&gt;
&lt;h4 id="环境"&gt;环境&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;windows10&lt;/li&gt;
&lt;li&gt;python3.7 + openpyxl + xlrd&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="测试数据"&gt;测试数据&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;目录结构&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ checklist.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ reference.xlsx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─newdir
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─dir1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ data1.xls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─dir2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; data2.xls&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;文件内容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参考表格 &lt;code&gt;reference.xlsx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CODE-12345&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;表格1 &lt;code&gt;data1.xls&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CODE-12345&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;表格2 &lt;code&gt;data2.xlsx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CODE-67890&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="代码"&gt;代码&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;openpyxl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;openpyxl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Workbook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;xlrd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 获取待检查清单列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;all_files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root_path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 检查文件名包含&amp;#34;功能点&amp;#34;， 以 &amp;#34;xls&amp;#34;, &amp;#34;xlsx&amp;#34;为后缀的文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.xls&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.xlsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;XXXX&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;all_files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root_path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 如果是目录，目录后增加&amp;#39;/&amp;#39;递归查找符合条件的文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;get_file&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;root_path&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;all_files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;all_files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 获取参考文件指定位置编号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_request_no&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root_path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.xls&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.xlsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;YYYY&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## only xlsx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wb_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ws_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wb_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## 查找第2行，第5列的编号 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;request_no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ws_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_no&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;##break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;request_no&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 遍历参考列表文件记录与参考文件表中需求编号不同的文件名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request_no&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## 由于openpyxl, 不支持xls，这里使用的是xlrd库 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wb_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xlrd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ws_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wb_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sheets&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## 编号是从0开始计数， 第8行， 第2列中的数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file_request_no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ws_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rowx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_request_no&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_no&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file_request_no&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;result.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;ZZZZ&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;get_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;get_request_no&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;check_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;write_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="运行结果"&gt;运行结果&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; python check.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; type result.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CODE-67890.\\newdir/dir2/data2.xls&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="参考"&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://openpyxl.readthedocs.io/en/stable/index.html#"&gt;Openpyxl Doc&lt;/a&gt; &lt;a href="https://xlrd.readthedocs.io/en/latest/api.html"&gt;xlrd- API Reference&lt;/a&gt;&lt;/p&gt;</description></item><item><title>LeetCode – Count Univalue Subtrees</title><link>https://garlicspace.com/posts/leetcode-count-univalue-subtrees/</link><pubDate>Wed, 19 Aug 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-count-univalue-subtrees/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree, count the number of uni-value subtrees.&lt;/p&gt;
&lt;p&gt;A Uni-value subtree means all nodes of the subtree have the same value.&lt;/p&gt;
&lt;p&gt;Example :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Input: root = [5,1,5,5,5,null,5]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1 5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \ \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5 5 5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output: 4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="实现"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建判断相同值子树方法isUnivalSubtrees， 判断其左、右节点与父节点是否相同，判定为&lt;strong&gt;Uni-value subtree&lt;/strong&gt;（比较子节点与父节点val值时要先判断下对应left， right是否为空）， 分别判断左子树和右子树的是否为&lt;strong&gt;Uni-value subtree&lt;/strong&gt;， 如果是计数器累加。&lt;/li&gt;
&lt;li&gt;isUnivalSubtrees 时间 复杂度O(n) 嵌入 countUnivalSubtrees后 O(n^2)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * Definition of TreeNode:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * class TreeNode {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * int val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode *left, *right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode(int val) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * this-&amp;gt;val = val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * this-&amp;gt;left = this-&amp;gt;right = NULL;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * @param root: the given tree
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * @return: the number of uni-value subtrees.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int countUnivalSubtrees(TreeNode * root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int total = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root == nullptr){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return 0;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total = countUnivalSubtrees(root-&amp;gt;left) + countUnivalSubtrees(root-&amp;gt;right);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (isUnivalSubtrees(root)){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total +=1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return total;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;private:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bool isUnivalSubtrees(TreeNode * root){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root == nullptr) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return true;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;left!=nullptr &amp;amp;&amp;amp; root-&amp;gt;left-&amp;gt;val != root-&amp;gt;val) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;right!=nullptr &amp;amp;&amp;amp; root-&amp;gt;right-&amp;gt;val != root-&amp;gt;val){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (isUnivalSubtrees(root-&amp;gt;left) &amp;amp;&amp;amp; isUnivalSubtrees(root-&amp;gt;right)){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return true;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="实现-1"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt; 判断是否为&lt;strong&gt;Uni-value subtree&lt;/strong&gt;的同时累计符合条件的子树数量，一起返回。&lt;/li&gt;
&lt;li&gt; O(N)      &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * Definition of TreeNode:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * class TreeNode {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * int val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode *left, *right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode(int val) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * this-&amp;gt;val = val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * this-&amp;gt;left = this-&amp;gt;right = NULL;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * @param root: the given tree
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * @return: the number of uni-value subtrees.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int countUnivalSubtrees(TreeNode * root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bool isUnival = true;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return helperCount(root, isUnival);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int helperCount(TreeNode *root, bool&amp;amp; isUnival) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root == nullptr) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; isUnival = true;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return 0;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bool isLeftunival = true;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bool isRightunival = true;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int leftCount = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int rightCount = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; leftCount = helperCount(root-&amp;gt;left, isLeftunival);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rightCount = helperCount(root-&amp;gt;right, isRightunival);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (!isLeftunival || !isRightunival){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; isUnival = false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;left !=nullptr &amp;amp;&amp;amp; root-&amp;gt;left-&amp;gt;val != root-&amp;gt;val ){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; isUnival = false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;right !=nullptr &amp;amp;&amp;amp; root-&amp;gt;right-&amp;gt;val != root-&amp;gt;val ){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; isUnival = false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (isUnival){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return leftCount+rightCount+1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return leftCount+rightCount;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="实现-2"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用C++ pair ，判断&lt;strong&gt;Uni-value subtree&lt;/strong&gt;和累计值放到一起返回。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * Definition of TreeNode:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * class TreeNode {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * int val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode *left, *right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode(int val) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * this-&amp;gt;val = val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * this-&amp;gt;left = this-&amp;gt;right = NULL;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * @param root: the given tree
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * @return: the number of uni-value subtrees.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int countUnivalSubtrees(TreeNode * root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pair&amp;lt;int, bool&amp;gt; re = helperCount(root);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return re.first;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pair&amp;lt;int,bool&amp;gt; helperCount(TreeNode *root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pair&amp;lt;int, bool&amp;gt; res = {0, true};
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root == nullptr) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pair&amp;lt;int, bool&amp;gt; left, right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; left = helperCount(root-&amp;gt;left);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; right = helperCount(root-&amp;gt;right);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (!left.second || !right.second){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res.second = false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;left !=nullptr &amp;amp;&amp;amp; root-&amp;gt;left-&amp;gt;val != root-&amp;gt;val ){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res.second = false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;right !=nullptr &amp;amp;&amp;amp; root-&amp;gt;right-&amp;gt;val != root-&amp;gt;val ){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res.second = false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (res.second){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res = {left.first+right.first+1, true};
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res = {left.first+right.first, false};
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="参考及引用"&gt;参考及引用:&lt;/h3&gt;
&lt;p&gt;   https://www.youtube.com/watch?v=7HgsS8bRvjo&lt;/p&gt;</description></item><item><title>出色管理者如何帮助团队成员解决问题</title><link>https://garlicspace.com/posts/%E5%87%BA%E8%89%B2%E7%AE%A1%E7%90%86%E8%80%85%E5%A6%82%E4%BD%95%E5%B8%AE%E5%8A%A9%E5%9B%A2%E9%98%9F%E6%88%90%E5%91%98%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98/</link><pubDate>Wed, 12 Aug 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%87%BA%E8%89%B2%E7%AE%A1%E7%90%86%E8%80%85%E5%A6%82%E4%BD%95%E5%B8%AE%E5%8A%A9%E5%9B%A2%E9%98%9F%E6%88%90%E5%91%98%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98/</guid><description>出色管理者如何帮助团队成员解决问题 - 这篇文章Don’t solve problems if you want to be a great manager</description></item><item><title>伙伴系统分配物理页后如何转换成为虚拟地址</title><link>https://garlicspace.com/posts/%E4%BC%99%E4%BC%B4%E7%B3%BB%E7%BB%9F%E5%88%86%E9%85%8D%E7%89%A9%E7%90%86%E9%A1%B5%E5%90%8E%E5%A6%82%E4%BD%95%E8%BD%AC%E6%8D%A2%E6%88%90%E4%B8%BA%E8%99%9A%E6%8B%9F%E5%9C%B0%E5%9D%80/</link><pubDate>Tue, 11 Aug 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E4%BC%99%E4%BC%B4%E7%B3%BB%E7%BB%9F%E5%88%86%E9%85%8D%E7%89%A9%E7%90%86%E9%A1%B5%E5%90%8E%E5%A6%82%E4%BD%95%E8%BD%AC%E6%8D%A2%E6%88%90%E4%B8%BA%E8%99%9A%E6%8B%9F%E5%9C%B0%E5%9D%80/</guid><description>伙伴系统分配物理页后如何转换成为虚拟地址 - 极客时间 26 | 内核态内存映射：如何找到正确的会议室？ 一道课后问题</description></item><item><title>文件时间信息</title><link>https://garlicspace.com/posts/%E6%96%87%E4%BB%B6%E6%97%B6%E9%97%B4%E4%BF%A1%E6%81%AF/</link><pubDate>Thu, 30 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%96%87%E4%BB%B6%E6%97%B6%E9%97%B4%E4%BF%A1%E6%81%AF/</guid><description>文件时间信息 - 文件时间信息一般包含，文件创建时间，文件修改时间，文件访问时间。 Unix/Linux 文件修改时间有两个一个是Modify Time 文件内容修改/ Change Time:文件权限状态/权限, 根据不同的文件系统，文件时间信息属性会有一些差别。Unix/Linux在挂载文件系统的时候会设置相关文件时间属性相关参数。</description></item><item><title>python修改excel文档相关日期信息</title><link>https://garlicspace.com/posts/python%E4%BF%AE%E6%94%B9excel%E6%96%87%E6%A1%A3%E7%9B%B8%E5%85%B3%E6%97%A5%E6%9C%9F%E4%BF%A1%E6%81%AF/</link><pubDate>Wed, 29 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python%E4%BF%AE%E6%94%B9excel%E6%96%87%E6%A1%A3%E7%9B%B8%E5%85%B3%E6%97%A5%E6%9C%9F%E4%BF%A1%E6%81%AF/</guid><description>&lt;p&gt;工作需要修改excel文件&lt;code&gt;创建内容时间&lt;/code&gt;(excel属性非文件属性)和&lt;code&gt;上次修改时间&lt;/code&gt;, 用python写了一个脚本处理了一下。&lt;/p&gt;
&lt;h4 id="环境"&gt;环境：&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;windows10&lt;/li&gt;
&lt;li&gt;python3.7 + openpyxl&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="1-使用openpyxl修改excel属性"&gt;1. 使用&lt;code&gt;openpyxl&lt;/code&gt;修改excel属性&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;openpyxl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openpyxl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;results.xlsx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt; &lt;span class="c1"&gt;#To get old properties&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# print old properties&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;created&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modified&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;##similarly you can set other fields ##&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;new_obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt; &lt;span class="c1"&gt;#Now get new properties&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;new_obj&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# print new properties&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;results2.xlsx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="2使用osutime方法修改文件属性的访问时间修改时间"&gt;2.使用&lt;code&gt;os.utime&lt;/code&gt;方法修改文件属性的&lt;code&gt;访问时间&lt;/code&gt;,&lt;code&gt;修改时间&lt;/code&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Showing stat information of file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;stinfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;results.xlsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stinfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Using os.stat to recieve atime and mtime of file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;access time of results.xlsx: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;stinfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;st_atime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;modified time of results.xlsx: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;stinfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;st_mtime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Modifying atime and mtime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2008&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;atime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mktime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timetuple&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2009&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mtime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mktime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timetuple&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;results.xlsx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="n"&gt;atime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mtime&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;done!!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="3使用pywin32-setfiletime方法修改文件属性的创建日期-访问时间修改时间"&gt;3.使用&lt;code&gt;pywin32&lt;/code&gt;-&lt;code&gt;SetFileTime&lt;/code&gt;方法修改文件属性的&lt;code&gt;创建日期&lt;/code&gt;, &lt;code&gt;访问时间&lt;/code&gt;,&lt;code&gt;修改时间&lt;/code&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;win32file&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SetFileTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GetFileTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;win32file&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GENERIC_WRITE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pywintypes&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;modifyFileTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;createTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modifyTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accessTime&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GENERIC_READ&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;GENERIC_WRITE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OPEN_EXISTING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;createTimes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;createTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;accessTimes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modifyTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;modifyTimes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;createTimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accessTimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modifyTimes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SetFileTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;createTimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accessTimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modifyTimes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;CloseHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mktime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timetuple&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mktime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timetuple&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;aTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mktime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timetuple&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;results.xlsx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;modifyFileTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;修改完成&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;修改失败&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="参考及引用"&gt;参考及引用&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://openpyxl.readthedocs.io/en/stable/index.html#"&gt;Openpyxl Doc&lt;/a&gt; &lt;a href="https://www.cnblogs.com/suwanbin/p/12037497.html"&gt;python 修改文件的创建时间、修改时间、访问时间&lt;/a&gt; &lt;a href="https://docs.python.org/2/library/os.html#os.utime"&gt;pythondoc-os.utime&lt;/a&gt; &lt;a href="https://stackoverflow.com/questions/7852855/in-python-how-do-you-convert-a-datetime-object-to-seconds/7852891#7852891"&gt;In Python, how do you convert a datetime object to seconds?&lt;/a&gt; &lt;a href="https://stackoverflow.com/questions/55551188/python-importerror-no-module-named-win32file"&gt;python ImportError: No module named win32file&lt;/a&gt;&lt;/p&gt;</description></item><item><title>LeetCode-Construct Binary Tree from Preorder and Inorder Traversal</title><link>https://garlicspace.com/posts/leetcode-construct-binary-tree-from-preorder-and-inorder-traversal/</link><pubDate>Tue, 28 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-construct-binary-tree-from-preorder-and-inorder-traversal/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given preorder and inorder traversal of a tree, construct the binary tree.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
You may assume that duplicates do not exist in the tree.&lt;/p&gt;
&lt;p&gt;For example, given&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;preorder = [3,9,20,15,7]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;inorder = [9,3,15,20,7]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Return the following binary tree:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 9 20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 15 7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="实现"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;递归方式，根据二叉树中序遍历和前续遍历，创建二叉树。中序遍历： 左-根-右，前续遍历： 根-左-右， 所以可以通过前续遍历的第一个节点找到根节点，并生成根节点， 因为二叉树没有重复节点， 就 可以在中序遍历数据中找到根节点，再分成左右两个子树，递归执行下去，遍历完所有节点。 通过preorder获取根节点， 通过inorder生成左右子树，查找节点在中序遍历数据组里位置，java可以通过HashMap实现。 &lt;/li&gt;
&lt;li&gt;不使用map情况下   时间复杂度 O(N^2)    , 使用map查找O(N)      &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/** java
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * Definition for a binary tree node.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * public class TreeNode {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * int val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode left;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode() {}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode(int val) { this.val = val; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode(int val, TreeNode left, TreeNode right) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * this.val = val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * this.left = left;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * this.right = right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; public TreeNode buildTree(int[] preorder, int[] inorder) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Map&amp;lt;Integer, Integer&amp;gt; treemap = new HashMap &amp;lt;&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for (int i=0; i&amp;lt;inorder.length; i++){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; treemap.put(inorder[i], i);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; AtomicInteger rootindex = new AtomicInteger(0);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return helper(preorder, inorder, 0, inorder.length -1, rootindex, treemap);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; public TreeNode helper(int[] preorder, int[] inoder, int left, int right, AtomicInteger index, Map&amp;lt;Integer, Integer&amp;gt; treemap) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (left &amp;gt; right){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return null;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //new node, set root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int val = preorder[index.intValue()];
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TreeNode node = new TreeNode(val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //search inorder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int root = treemap.get(val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //left substree
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; node.left = helper(preorder, inoder, left, root-1, index, treemap);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //right substree
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; node.right = helper(preorder, inoder, root+1, right, index, treemap);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return node ;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="参考及引用"&gt;参考及引用:&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.techiedelight.com/construct-binary-tree-from-inorder-preorder-traversal/"&gt;techiedelight-construct-binary-tree-from-inorder-preorder-traversal&lt;/a&gt;&lt;/p&gt;</description></item><item><title>LeetCode-Lowest Common Ancestor of a Binary Tree Solution</title><link>https://garlicspace.com/posts/leetcode-lowest-common-ancestor-of-a-binary-tree-solution/</link><pubDate>Tue, 28 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-lowest-common-ancestor-of-a-binary-tree-solution/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.&lt;/p&gt;
&lt;p&gt;According to the &lt;a href="https://en.wikipedia.org/wiki/Lowest_common_ancestor"&gt;definition of LCA on Wikipedia&lt;/a&gt;: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow &lt;strong&gt;a node to be a descendant of itself&lt;/strong&gt;).”&lt;/p&gt;
&lt;p&gt;Given the following binary tree:  root = [3,5,1,6,2,0,8,null,null,7,4]&lt;/p&gt;</description></item><item><title>LeetCode – Construct Binary Tree from Inorder and Postorder Traversal</title><link>https://garlicspace.com/posts/leetcode-construct-binary-tree-from-inorder-and-postorder-traversal/</link><pubDate>Sat, 25 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-construct-binary-tree-from-inorder-and-postorder-traversal/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given inorder and postorder traversal of a tree, construct the binary tree.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
You may assume that duplicates do not exist in the tree.&lt;/p&gt;
&lt;p&gt;For example, given&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;inorder = [9,3,15,20,7]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;postorder = [9,15,7,20,3]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Return the following binary tree:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 9 20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 15 7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="实现"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;递归方式，根据二叉树中序遍历和后续遍历，创建二叉树。中序遍历： 左-根-右， 后续遍历： 左-右-根， 所以可以通过后续遍历的最后一个节点找到根节点，并生成根节点， 因为二叉树没有重复节点， 就 可以在中序遍历数据中找到根节点，再分成左右两个子树，递归执行下去，遍历完所有节点。 通过postorder获取根节点， 通过inorder生成左右子树，查找节点在中序遍历数据组里位置，可以通过unordered_map实现。 &lt;/li&gt;
&lt;li&gt;不使用map情况下   时间复杂度 O(N^2)    , 使用map查找O(N)      &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * Definition for a binary tree node.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * struct TreeNode {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * int val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode *left;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode *right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode() : val(0), left(nullptr), right(nullptr) {}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * };
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TreeNode* buildTree(vector&amp;lt;int&amp;gt;&amp;amp; inorder, vector&amp;lt;int&amp;gt;&amp;amp; postorder) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; unordered_map &amp;lt;int, int&amp;gt; treemap;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for (int i=0; i&amp;lt;inorder.size();i++) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; treemap[inorder[i]] = i;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int index = inorder.size()-1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return helper(inorder, postorder, 0, inorder.size()-1, &amp;amp;index, treemap);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TreeNode *helper(vector&amp;lt;int&amp;gt; &amp;amp; inorder, vector&amp;lt;int&amp;gt;&amp;amp; postorder, int left, int right,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int *index , unordered_map&amp;lt;int, int&amp;gt;&amp;amp;treemap){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //check
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (left &amp;gt; right){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return NULL;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; // create root node
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /* destory postorder vector
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int val = postorder.back();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TreeNode *node = new TreeNode(val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; postorder.pop_back();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int val = postorder[*index];
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TreeNode *node = new TreeNode(val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (*index)--;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; // search inorder by array
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int root = -1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for (int i=left ; i &amp;lt;=right; i ++){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (val == inorder[i]){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root = i;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; break;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root == -1){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return node;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }*/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; // search inorder by map
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; int root = treemap[val];
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; // create left &amp;amp; right node
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; node-&amp;gt;right = helper(inorder, postorder, root+1, right, index, treemap);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; node-&amp;gt;left = helper(inorder, postorder, left, root-1, index, treemap);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return node;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Why mmap is faster than system calls</title><link>https://garlicspace.com/posts/why-mmap-is-faster-than-system-calls/</link><pubDate>Fri, 24 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/why-mmap-is-faster-than-system-calls/</guid><description>Why mmap is faster than system calls - 原文链接 作者 Alexandra Sasha Fedorova</description></item><item><title>mmap相关API</title><link>https://garlicspace.com/posts/mmap%E7%9B%B8%E5%85%B3api/</link><pubDate>Wed, 22 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/mmap%E7%9B%B8%E5%85%B3api/</guid><description>mmap相关API - mmap调用进程的虚拟进程空间中一段新的内存映射。</description></item><item><title>centos7 升级 glibc &amp;&amp; gcc</title><link>https://garlicspace.com/posts/centos7-%E5%8D%87%E7%BA%A7-glibc-gcc/</link><pubDate>Sat, 18 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/centos7-%E5%8D%87%E7%BA%A7-glibc-gcc/</guid><description>centos7 升级 glibc &amp;amp;&amp;amp; gcc - - cenos7X86_64</description></item><item><title>cenos7+openssh 修改SSH服务端口</title><link>https://garlicspace.com/posts/cenos7openssh-%E4%BF%AE%E6%94%B9ssh%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%8F%A3/</link><pubDate>Mon, 13 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/cenos7openssh-%E4%BF%AE%E6%94%B9ssh%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%8F%A3/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;环境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cenos7(X86_64) + openssh&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ssh端口配置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;修改端口 例如&lt;code&gt;8888&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;文件 /etc/ssh/sshd_config&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#Port 22
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;&lt;span class="n"&gt;Port&lt;/span&gt; &lt;span class="mi"&gt;8888&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启服务&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;restart&lt;/span&gt; &lt;span class="n"&gt;sshd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;sshd&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;防火墙配置: 我这里配置比较简单仅&lt;code&gt;zone&lt;/code&gt;配置了一个public&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;firewall&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;permanent&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8888&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tcp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;重启服务&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;restart&lt;/span&gt; &lt;span class="n"&gt;firewalld&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;firewalld&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>LeetCode – Path Sum Solution</title><link>https://garlicspace.com/posts/leetcode-path-sum-solution/</link><pubDate>Sun, 12 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-path-sum-solution/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A leaf is a node with no children.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Given the below binary tree and &lt;code&gt;sum = 22&lt;/code&gt;,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 4 8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 11 13 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \ \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7 2 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;return true, as there exist a root-to-leaf path &lt;code&gt;5-&amp;gt;4-&amp;gt;11-&amp;gt;2&lt;/code&gt; which sum is 22.&lt;/p&gt;</description></item><item><title>LeetCode – Symmetric Tree Solution</title><link>https://garlicspace.com/posts/leetcode-symmetric-tree-solution/</link><pubDate>Sun, 12 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-symmetric-tree-solution/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).&lt;/p&gt;
&lt;p&gt;For example, this binary tree &lt;code&gt;[1,2,2,3,4,4,3]&lt;/code&gt; is symmetric:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \ / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3 4 4 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But the following &lt;code&gt;[1,2,2,null,3,null,3]&lt;/code&gt; is not:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; \ \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Follow up:&lt;/strong&gt; Solve it both recursively and iteratively.&lt;/p&gt;</description></item><item><title>Linux slob/slab/slub</title><link>https://garlicspace.com/posts/linux-slob-slab-slub/</link><pubDate>Sat, 11 Jul 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-slob-slab-slub/</guid><description>Linux slob/slab/slub - Linux初始化通过bootmem/memblock引导内存分配进行内存管理，支持buddy system完成相关初始化后，将物理内存分配的功能转交给buddy system，buddy system是以page为单位分配方式。 对于内核要经常创建的对象， 如task_struct，</description></item><item><title>为什么x86无法生存-Why x86 won’t survive</title><link>https://garlicspace.com/posts/%E4%B8%BA%E4%BB%80%E4%B9%88x86%E6%97%A0%E6%B3%95%E7%94%9F%E5%AD%98-why-x86-wont-survive/</link><pubDate>Mon, 29 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E4%B8%BA%E4%BB%80%E4%B9%88x86%E6%97%A0%E6%B3%95%E7%94%9F%E5%AD%98-why-x86-wont-survive/</guid><description>为什么x86无法生存-Why x86 won’t survive - 前不久， 评估CEO 库克在其全球开发者大宣布，Mac笔记本以及个人电脑将会改用苹果自家的ARM架构处理器。这将是自2006年从PowerPC处理器改用英特尔x86处理器后，又一次CPU架构的调整。下面这篇文章是Medium推送的，不过文章贬低X86中提到的漏洞, 我查</description></item><item><title>通过alternatives进行多版本间切换</title><link>https://garlicspace.com/posts/%E9%80%9A%E8%BF%87alternatives%E8%BF%9B%E8%A1%8C%E5%A4%9A%E7%89%88%E6%9C%AC%E9%97%B4%E5%88%87%E6%8D%A2/</link><pubDate>Sun, 28 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E9%80%9A%E8%BF%87alternatives%E8%BF%9B%E8%A1%8C%E5%A4%9A%E7%89%88%E6%9C%AC%E9%97%B4%E5%88%87%E6%8D%A2/</guid><description>通过alternatives进行多版本间切换 - 上周在学习单点登录安装CAS Overlay Template要使用指定版本,当时机器上安装了多个版本的jdk使用alternatives命令进行了切换</description></item><item><title>LeetCode – Maximum Depth of Binary Tree</title><link>https://garlicspace.com/posts/leetcode-maximum-depth-of-binary-tree/</link><pubDate>Tue, 23 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-maximum-depth-of-binary-tree/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree, find its maximum depth.&lt;/p&gt;
&lt;p&gt;The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A leaf is a node with no children.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Given binary tree &lt;code&gt;[3,9,20,null,null,15,7]&lt;/code&gt;,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 9 20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 15 7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;return its depth = 3.&lt;/p&gt;
&lt;h3 id="解题"&gt;&lt;strong&gt;解题：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;     深度优先搜索方式，分别找到左右子树最大的深度+1即可；广度优先搜索，逐层遍历找到最大层数返回。 &lt;/p&gt;</description></item><item><title>LeetCode – Minimum Depth of Binary Tree</title><link>https://garlicspace.com/posts/leetcode-minimum-depth-of-binary-tree/</link><pubDate>Tue, 23 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-minimum-depth-of-binary-tree/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree, find its minimum depth.&lt;/p&gt;
&lt;p&gt;The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A leaf is a node with no children.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Given binary tree &lt;code&gt;[3,9,20,null,null,15,7]&lt;/code&gt;,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 9 20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 15 7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;return its minimum depth = 2.&lt;/p&gt;</description></item><item><title>Linux Swap 启停及swappiness设置</title><link>https://garlicspace.com/posts/linux-swap-%E5%90%AF%E5%81%9C%E5%8F%8Aswappiness%E8%AE%BE%E7%BD%AE/</link><pubDate>Sun, 21 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-swap-%E5%90%AF%E5%81%9C%E5%8F%8Aswappiness%E8%AE%BE%E7%BD%AE/</guid><description>Linux Swap 启停及swappiness设置 - 可以通过磁盘分区和文件两种方式进行操作</description></item><item><title>The XY Problem</title><link>https://garlicspace.com/posts/the-xy-problem/</link><pubDate>Sun, 21 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/the-xy-problem/</guid><description>The XY Problem - 原文链接 The XY Problem</description></item><item><title>安全攻防技能-安全基础概念</title><link>https://garlicspace.com/posts/%E5%AE%89%E5%85%A8%E6%94%BB%E9%98%B2%E6%8A%80%E8%83%BD-%E5%AE%89%E5%85%A8%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5/</link><pubDate>Sat, 20 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%AE%89%E5%85%A8%E6%94%BB%E9%98%B2%E6%8A%80%E8%83%BD-%E5%AE%89%E5%85%A8%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5/</guid><description>安全攻防技能-安全基础概念 - - cybersecurity: 网络空间安全涉及旨在保护设备，网络，程序和数据免受攻击和未经授权的访问的一系列实践，流程和技术; 网络安全不仅可以保护数据，还可以保护存储数据的资源和技术。</description></item><item><title>LeetCode – Binary Tree Level Order Traversal Solution</title><link>https://garlicspace.com/posts/leetcode-binary-tree-level-order-traversal-solution/</link><pubDate>Tue, 09 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-binary-tree-level-order-traversal-solution/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree, return the &lt;em&gt;level order&lt;/em&gt; traversal of its nodes&amp;rsquo; values. (ie, from left to right, level by level).&lt;/p&gt;
&lt;p&gt;For example:&lt;br&gt;
Given binary tree &lt;code&gt;[3,9,20,null,null,15,7]&lt;/code&gt;,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 9 20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 15 7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;return its level order traversal as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [3],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [9,20],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [15,7]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="解题"&gt;&lt;strong&gt;解题：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;       两种方式处理， 广度优先搜索借助队列，一层一层处理，并放入二维数组； 深度优先搜索借助栈， 一个一个处理， 将每一个元素方式所属层对应的一维数组中。 &lt;/p&gt;</description></item><item><title>Timers and time management in the Linux kernel. Part 7.</title><link>https://garlicspace.com/posts/linux%E5%86%85%E6%A0%B8%E4%B8%AD%E7%9A%84%E5%AE%9A%E6%97%B6%E5%99%A8%E5%92%8C%E6%97%B6%E9%97%B4%E7%AE%A1%E7%90%86-part-7/</link><pubDate>Sun, 07 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E5%86%85%E6%A0%B8%E4%B8%AD%E7%9A%84%E5%AE%9A%E6%97%B6%E5%99%A8%E5%92%8C%E6%97%B6%E9%97%B4%E7%AE%A1%E7%90%86-part-7/</guid><description>Timers and time management in the Linux kernel. Part 7. - 这篇文章 Timers and time management in the Linux kernel. Part 7</description></item><item><title>/proc/buddyinfo文件</title><link>https://garlicspace.com/posts/proc-buddyinfo%E6%96%87%E4%BB%B6/</link><pubDate>Sat, 06 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/proc-buddyinfo%E6%96%87%E4%BB%B6/</guid><description>/proc/buddyinfo文件 - /proc/buddyinfo 文件可以查看Linux机器上可用的内存页， 可以查看每个节点，不同区域的每个order大小的块的可用数量, 下面是我们虚拟机的信息：</description></item><item><title>LeetCode –Binary Tree Postorder Traversal</title><link>https://garlicspace.com/posts/leetcode-binary-tree-postorder-traversal/</link><pubDate>Thu, 04 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-binary-tree-postorder-traversal/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree, return the &lt;em&gt;postorder&lt;/em&gt; traversal of its nodes&amp;rsquo; values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;code&gt;[1,null,2,3]&lt;/code&gt; 1 \ 2 / 3&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;code&gt;[3,2,1]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Follow up:&lt;/strong&gt; Recursive solution is trivial, could you do it iteratively?&lt;/p&gt;
&lt;h3 id="解题"&gt;&lt;strong&gt;解题：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;       遍历顺序“根-左-右”&lt;/p&gt;
&lt;h3 id="实现"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用栈实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;         从根节点开始，先将根节点压入栈，保存结果值，然后移动到右节点， 保证“根-右边”顺序， 为空后出栈，取其左节点入栈中。这样入栈就保证了访问顺序为“根-右-左”， 出栈实现“左-右-根”。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector&amp;lt;int&amp;gt; postorderTraversal(TreeNode* root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector&amp;lt;int&amp;gt; res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stack&amp;lt;TreeNode*&amp;gt; ss;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TreeNode *p= root, *t;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; while(!ss.empty()||p){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (p){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ss.push(p);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res.insert(res.begin(), p-&amp;gt;val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; p = p-&amp;gt;right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; p=ss.top();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ss.pop();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; p= p-&amp;gt;left;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="实现-1"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;递归实现&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector&amp;lt;int&amp;gt; postorderTraversal(TreeNode* root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector &amp;lt;int&amp;gt; res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; postorder(root, res);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; void postorder(TreeNode *root, vector&amp;lt;int&amp;gt; &amp;amp;res){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (!root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;left) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; postorder(root-&amp;gt;left, res);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;right){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; postorder(root-&amp;gt;right, res);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res.push_back(root-&amp;gt;val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="参考"&gt;参考:&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.cnblogs.com/grandyang/p/4251757.html"&gt;[LeetCode] 145. Binary Tree Postorder Traversal 二叉树的后序遍历&lt;/a&gt;&lt;/p&gt;</description></item><item><title>功能点分析法整理</title><link>https://garlicspace.com/posts/%E5%8A%9F%E8%83%BD%E7%82%B9%E5%88%86%E6%9E%90%E6%B3%95%E6%95%B4%E7%90%86/</link><pubDate>Thu, 04 Jun 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%8A%9F%E8%83%BD%E7%82%B9%E5%88%86%E6%9E%90%E6%B3%95%E6%95%B4%E7%90%86/</guid><description>&lt;p&gt;由于工作需要，需要在项目立项前都需要进行功能点估算, 为后续计算项目组的的工作效率做准备。目前做了几次估算，在这里整理和总结一下。 我们目前使用的评估的标准参考 &lt;code&gt;IFPUG: ISO/IEC 20926:2009&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="概述"&gt;概述&lt;/h3&gt;
&lt;p&gt;定义:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The function point is a &amp;#34;unit of measurement&amp;#34; to express the amount of
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;business functionality an information system (as a product) provides to
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;a user.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;功能点是业务功能的单位, 也就是从用户视角的进行评估， 是可以和用户交流的。对于我现在实施的外包项目来说就是用一种方法和甲方达成共识。相比较与之前的根据经验评估更有依据些。&lt;/p&gt;
&lt;h3 id="步骤"&gt;步骤&lt;/h3&gt;
&lt;h4 id="1-功能点应用的分类"&gt;1. 功能点应用的分类&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;开发项目: 从无到有&lt;/li&gt;
&lt;li&gt;升级项目: 功能升级&lt;/li&gt;
&lt;li&gt;应用项目: 基线评估&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-识别应用边界"&gt;2. 识别应用边界&lt;/h4&gt;
&lt;p&gt;被测应用与用户间的边界。&lt;/p&gt;
&lt;h4 id="3-确认功能点"&gt;3. 确认功能点&lt;/h4&gt;
&lt;p&gt;被测应用与用户间的边界。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据功能
&lt;ul&gt;
&lt;li&gt;ILF: 容纳本应用维护的一组业务数据, 控制数据&lt;/li&gt;
&lt;li&gt;ELF: 容纳外部应用维护的数据， 对于外部数据来说是他的ILF&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;处理功能
&lt;ul&gt;
&lt;li&gt;EI: 处理来自应用外部的的数据， 主要实现ILF的维护, 应用的控制&lt;/li&gt;
&lt;li&gt;EO: 通过ILF生成新数据， 已报表，数据流形式送到应用以外&lt;/li&gt;
&lt;li&gt;EQ: 请求来自应用外部, 处理过程包含输入，输出, 但输入不进行ILF文件的维护&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="复杂度"&gt;复杂度&lt;/h3&gt;
&lt;h4 id="1-复杂度评估涉及三种元素-ret--det--ftr"&gt;1. 复杂度评估涉及三种元素 RET &amp;amp; DET &amp;amp; FTR&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;DET :用户可识别的，非重复的域&lt;/li&gt;
&lt;li&gt;RET :用户可识别的数据的子集合&lt;/li&gt;
&lt;li&gt;FTR: 引用文件类型&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-ilf--eif-的复杂度"&gt;2. ILF &amp;amp; EIF 的复杂度&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ILF &amp;amp; EIF&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;1 to 19 DET&lt;/th&gt;
&lt;th&gt;20 to 50 DET&lt;/th&gt;
&lt;th&gt;51 or more DET&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 RET&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 to 5 RET&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6 or more RET&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;ILF:&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Functional Complexity Rating&lt;/th&gt;
&lt;th&gt;Unadjusted Function Points&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;EIF:&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Functional Complexity Rating&lt;/th&gt;
&lt;th&gt;Unadjusted Function Points&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="3-ei--eo--eq-的复杂度"&gt;3. EI &amp;amp; EO &amp;amp; EQ 的复杂度&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;EI:&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;1 to 4 DET&lt;/th&gt;
&lt;th&gt;5 to 15 DET&lt;/th&gt;
&lt;th&gt;16 or more DET&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0 to 1 FTR&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 FTRs&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 or more FTRs&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;EO &amp;amp; EQ&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;1 to 5 DET&lt;/th&gt;
&lt;th&gt;6 to 19 DET&lt;/th&gt;
&lt;th&gt;20 or more DET&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0 to 1 FTR&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 to 3 FTRs&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4 or more FTRs&lt;/td&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;EI &amp;amp; EQ:&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Functional Complexity Rating&lt;/th&gt;
&lt;th&gt;Unadjusted Function Points&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;EO:&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Functional Complexity Rating&lt;/th&gt;
&lt;th&gt;Unadjusted Function Points&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;关于复杂度我们实际场景中目前取的都是平均数， 没有对功能点负责度进一步分析，后续会对数据进行统计， 折算出应用的固定的权重。&lt;/p&gt;</description></item><item><title>buddy memory allocation相关整理</title><link>https://garlicspace.com/posts/buddy-memory-allocation%E7%9B%B8%E5%85%B3%E6%95%B4%E7%90%86/</link><pubDate>Fri, 29 May 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/buddy-memory-allocation%E7%9B%B8%E5%85%B3%E6%95%B4%E7%90%86/</guid><description>&lt;h3 id="概述"&gt;概述&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Buddy_memory_allocation#cite_note-3"&gt;wiki&lt;/a&gt;上的定义:&lt;/p&gt;
&lt;p&gt;The buddy memory allocation technique is a memory allocation algorithm that divides memory into partitions to try to satisfy a memory request as suitably as possible. This system makes use of splitting memory into halves to try to give a best fit.&lt;/p&gt;
&lt;p&gt;伙伴内存分配技术是一种内存分配算法，它将内存划分为多个分区，以尝试尽可能适当地满足内存请求。 该系统利用将内存分成两半来尝试提供最佳匹配。&lt;/p&gt;
&lt;h3 id="算法"&gt;算法&lt;/h3&gt;
&lt;p&gt;伙伴系统有多种形式； 将每个块细分为两个较小块的块是最简单，最常见的一种。 选定块的大小要根据实际情况选取，太小则需要更多的内存记录跟踪内存分配， 太大又容易产生空间浪费,另外，就是如果选择2的次幂单位的话， 最大的块有可能不会覆盖整个内存.&lt;/p&gt;
&lt;h3 id="例子"&gt;例子&lt;/h3&gt;
&lt;p&gt;同样是wiki的例子，申请的内存调整了下&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;th&gt;64K&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;A:20&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;A:20&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;B: 21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;A:20&lt;/td&gt;
&lt;td&gt;C:20&lt;/td&gt;
&lt;td&gt;B: 21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.1&lt;/td&gt;
&lt;td&gt;A:20&lt;/td&gt;
&lt;td&gt;C:20&lt;/td&gt;
&lt;td&gt;B: 21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;A:20&lt;/td&gt;
&lt;td&gt;C:20&lt;/td&gt;
&lt;td&gt;B: 21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;D: 21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;A:20&lt;/td&gt;
&lt;td&gt;C:20&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;D: 21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.1&lt;/td&gt;
&lt;td&gt;A:20&lt;/td&gt;
&lt;td&gt;C:20&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.2&lt;/td&gt;
&lt;td&gt;A:20&lt;/td&gt;
&lt;td&gt;C:20&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;C:20&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9.1&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9.3&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9.4&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9.5&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;初始化状态，每块64K， 最大的块包含 24 个块, 一个4阶块.&lt;/p&gt;</description></item><item><title>python根据excel内容生成文件夹</title><link>https://garlicspace.com/posts/python%E6%A0%B9%E6%8D%AEexcel%E5%86%85%E5%AE%B9%E7%94%9F%E6%88%90%E6%96%87%E4%BB%B6%E5%A4%B9/</link><pubDate>Fri, 01 May 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python%E6%A0%B9%E6%8D%AEexcel%E5%86%85%E5%AE%B9%E7%94%9F%E6%88%90%E6%96%87%E4%BB%B6%E5%A4%B9/</guid><description>&lt;h3 id="python根据excel内容生成文件夹"&gt;python根据excel内容生成文件夹&lt;/h3&gt;
&lt;p&gt;工作需要根据excel数据信息，生成对应的文件夹，用python写了一个脚本处理了一下。 样例中表格内容也进行了调整。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;环境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;windows10&lt;/li&gt;
&lt;li&gt;python3.7 + openpyxl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目标：&lt;/p&gt;
&lt;p&gt;以list.xlsx数据为准，抽取指定sheet页中的指定字段信息，生成目录, 并在目录中创建固定的子目录.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;表格格式:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表格sheet-A01&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;项目名称&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;项目1&lt;/td&gt;
&lt;td&gt;张三&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;项目2&lt;/td&gt;
&lt;td&gt;李四&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;表格sheet-A02&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;项目名称&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;项目1&lt;/td&gt;
&lt;td&gt;王五&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;每一个sheet存放一个批次的任务信息, total为批次名称&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代码:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;openpyxl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;openpyxl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Workbook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 获取项目清单列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;list.xlsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#ws_in = wb_in.active&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;outpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;out&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 名字列表开始结束行号 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;start_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;##end_index = &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 目录编号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dir_no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 1. 找到指定的sheet页面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheets_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A01&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;A02&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 3. 组成符合要求的目录字符串创建目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CREATE&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;FileExistsError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;EXIST, NO CREATE&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Get all dirs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mksubdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dirnames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;model&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;model&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dirnames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; CREATE SUB DIR ERROR &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sheets_name&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wb&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sheets_name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## 2. 找到相关的任务信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_row&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## 1. 判断内容是否空格 0 or 1? &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;None&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch_no&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; is over&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;##2. 获取表格内容生成目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;task_no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;batch_no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;task_context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;task_manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;张三|李四|王五&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;task_leader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;task_manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#(序号)-批次号-批次序号-任务名称(负责人)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# mkdir(path)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dir_no_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dir_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;02d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;task_no_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;02d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dir_no_str&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;batch_no&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;task_no_str&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;task_context&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;task_leader&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outpath&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# mksubdir(path)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mksubdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outpath&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dir_no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dir_no&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;运行结果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;├─01-A01-01-项目1-张三 │ ├─01_文档目录1 │ └─02_文档目录2 ├─02-A01-02-项目2-李四 │ ├─01_文档目录1 │ └─02_文档目录2 └─03-A02-01-项目3-王五 ├─01_文档目录1 └─02_文档目录2&lt;/p&gt;</description></item><item><title>Timers and time management in the Linux kernel. Part 6</title><link>https://garlicspace.com/posts/timers-and-time-management-in-the-linux-kernel-part-6/</link><pubDate>Mon, 27 Apr 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/timers-and-time-management-in-the-linux-kernel-part-6/</guid><description>Timers and time management in the Linux kernel. Part 6 - 这篇文章 Timers and time management in the Linux kernel. Part 6</description></item><item><title>LeetCode –Binary Tree Preorder Traversal</title><link>https://garlicspace.com/posts/binary-tree-preorder-traversal/</link><pubDate>Thu, 16 Apr 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/binary-tree-preorder-traversal/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree, return the &lt;em&gt;inorder&lt;/em&gt; traversal of its nodes&amp;rsquo; values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [1,null,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [1,3,2]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Follow up:&lt;/strong&gt; Recursive solution is trivial, could you do it iteratively?&lt;/p&gt;
&lt;h3 id="解题"&gt;&lt;strong&gt;解题：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;       遍历顺序“根-左-右”&lt;/p&gt;
&lt;h3 id="实现"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用栈实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;         从根节点开始，先将根节点压入栈，保存结果值，然后移动到左节点， 保证“根-左”顺序， 为空后出栈，取其右节点入栈中。这样就保证了访问顺序为“根-左-右”。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * Definition for a binary tree node.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * struct TreeNode {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * int val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode *left;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode *right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * };
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector&amp;lt;int&amp;gt; preorderTraversal(TreeNode* root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector&amp;lt;int&amp;gt; res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stack&amp;lt;TreeNode*&amp;gt; ss;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TreeNode *p = root;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; while (!ss.empty()||p){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (p!=NULL){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ss.push(p);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res.push_back(p-&amp;gt;val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; p = p-&amp;gt;left;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; p = ss.top();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ss.pop();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; p=p-&amp;gt;right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="实现-1"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;递归实现&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector&amp;lt;int&amp;gt; preorderTraversal(TreeNode* root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector&amp;lt;int&amp;gt; res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; preorder(root, res);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; void preorder(TreeNode *root, vector&amp;lt;int&amp;gt; &amp;amp;res){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (!root) return;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res.push_back(root-&amp;gt;val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; preorder(root-&amp;gt;left, res);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; preorder(root-&amp;gt;right, res);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="参考"&gt;参考:&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.cnblogs.com/grandyang/p/4146981.html"&gt;[LeetCode] 144. Binary Tree Preorder Traversal 二叉树的先序遍历&lt;/a&gt;&lt;/p&gt;</description></item><item><title>通过inode删除特殊字符文件</title><link>https://garlicspace.com/posts/%E9%80%9A%E8%BF%87inode%E5%88%A0%E9%99%A4%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E6%96%87%E4%BB%B6/</link><pubDate>Thu, 16 Apr 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E9%80%9A%E8%BF%87inode%E5%88%A0%E9%99%A4%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E6%96%87%E4%BB%B6/</guid><description>&lt;p&gt;对于正常使用rm无法删除的文件可以通过查找inode进行删除&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find -inum xxx -delete&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find -inum xxx -exec rm -i &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;直接删除&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@centosgpt vm&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# ls -i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2278688&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="m"&gt;13592459&lt;/span&gt; memdump2.c~ &lt;span class="m"&gt;13592454&lt;/span&gt; memzero &lt;span class="m"&gt;7506486&lt;/span&gt; test.c~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2275894&lt;/span&gt; 118902.mem &lt;span class="m"&gt;2275882&lt;/span&gt; memdump2.py &lt;span class="m"&gt;13592461&lt;/span&gt; memzero.c &lt;span class="m"&gt;9733651&lt;/span&gt; translate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@centosgpt vm&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# find -inum 2278688 -delete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@centosgpt vm&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# ls&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;118902.mem idle.py~ memdump3.c memory_layout processwrite.c test.c~ vsyscall.c
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;18&lt;/span&gt; memdump memdump4 memory_layout.c processwrite.c~ translate &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;交互式&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@centosgpt vm&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# ls -i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;7506464&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="m"&gt;13592459&lt;/span&gt; memdump2.c~ &lt;span class="m"&gt;13592454&lt;/span&gt; memzero &lt;span class="m"&gt;7506486&lt;/span&gt; test.c~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2275894&lt;/span&gt; 118902.mem &lt;span class="m"&gt;2275882&lt;/span&gt; memdump2.py &lt;span class="m"&gt;13592461&lt;/span&gt; memzero.c &lt;span class="m"&gt;9733651&lt;/span&gt; translate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@centosgpt vm&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# find -inum 7506464 -exec rm -i {} \;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm: remove regular empty file ‘./&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;gt&lt;span class="p"&gt;;&lt;/span&gt;’? y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@centosgpt vm&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# ls&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;118902.mem idle.py~ memdump3.c memory_layout processwrite.c test.c~ vsyscall.c
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;18&lt;/span&gt; memdump memdump4 memory_layout.c processwrite.c~ translate &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Linux进程内存布局及映射信息</title><link>https://garlicspace.com/posts/linux%E8%BF%9B%E7%A8%8B%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80%E5%8F%8A%E6%98%A0%E5%B0%84%E4%BF%A1%E6%81%AF/</link><pubDate>Sun, 12 Apr 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E8%BF%9B%E7%A8%8B%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80%E5%8F%8A%E6%98%A0%E5%B0%84%E4%BF%A1%E6%81%AF/</guid><description>Linux进程内存布局及映射信息 - 处理器在运行程序时，需要存储器来存放程序和程序使用的数据， 现代操作系统提供了存储器的抽象:虚拟存储器, 使得应用程序来说不用过多的考虑物理存储使用，简化了内存管理</description></item><item><title>python汇总excel数据</title><link>https://garlicspace.com/posts/python%E6%B1%87%E6%80%BB%E5%A4%84%E7%90%86excel%E6%95%B0%E6%8D%AE%E4%BE%8B%E5%AD%90/</link><pubDate>Fri, 31 Jan 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python%E6%B1%87%E6%80%BB%E5%A4%84%E7%90%86excel%E6%95%B0%E6%8D%AE%E4%BE%8B%E5%AD%90/</guid><description>&lt;p&gt;工作需要汇总整理相关excel数据信息，并按照规定格式进行反馈，用python写了一个脚本处理了一下。 样例中表格内容也进行了调整。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;环境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;windows10&lt;/li&gt;
&lt;li&gt;python3.7 + openpyxl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目标：&lt;/p&gt;
&lt;p&gt;以data1数据为准，通过查找data2补全相关信息, 将数据填入要求的result文件中。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;表格格式:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表格1 &lt;code&gt;data1.xlsx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;张三&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;李四&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;表格2 &lt;code&gt;data2.xlsx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;姓 名&lt;/th&gt;
&lt;th&gt;性别&lt;/th&gt;
&lt;th&gt;身份证号&lt;/th&gt;
&lt;th&gt;联系电话&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;01&lt;/td&gt;
&lt;td&gt;张三&lt;/td&gt;
&lt;td&gt;男&lt;/td&gt;
&lt;td&gt;130012345678901234&lt;/td&gt;
&lt;td&gt;13911111111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;02&lt;/td&gt;
&lt;td&gt;李四&lt;/td&gt;
&lt;td&gt;男&lt;/td&gt;
&lt;td&gt;123012345678901234&lt;/td&gt;
&lt;td&gt;13922222222&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;03&lt;/td&gt;
&lt;td&gt;王五&lt;/td&gt;
&lt;td&gt;男&lt;/td&gt;
&lt;td&gt;123012345678901234&lt;/td&gt;
&lt;td&gt;13933333333&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;表格3 &lt;code&gt;result.xlsx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;所属部门&lt;/th&gt;
&lt;th&gt;厂商&lt;/th&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;身份证号&lt;/th&gt;
&lt;th&gt;联系电话&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代码:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;openpyxl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;openpyxl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Workbook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wb_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;data1.xlsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ws_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wb_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 名字列表开始结束行号 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;start_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;end_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wb_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;data2.xlsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ws_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wb_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wb_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;result.xlsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ws_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wb_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;out_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 找到要统计人员姓名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;end_index&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ws_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## 查找要统计人员附件信息并更新到统计表格中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;find_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ws_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iter_rows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#print(col.value)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;find_flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## 第四列 身份证 第五列 联系电话&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;idno&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ws_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;phoneno&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ws_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## 更新到统计文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ws_out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_index&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_index&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ws_out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_index&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;XX部&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ws_out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_index&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;XXX&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ws_out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_index&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ws_out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_index&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idno&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ws_out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out_index&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;phoneno&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;out_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;out_index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;find_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;find_flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wb_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;result.xlsx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;运行结果&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;所属部门&lt;/th&gt;
&lt;th&gt;厂商&lt;/th&gt;
&lt;th&gt;姓名&lt;/th&gt;
&lt;th&gt;身份证号&lt;/th&gt;
&lt;th&gt;联系电话&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;XX部&lt;/td&gt;
&lt;td&gt;XXX&lt;/td&gt;
&lt;td&gt;张三&lt;/td&gt;
&lt;td&gt;130012345678901234&lt;/td&gt;
&lt;td&gt;13911111111&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;XX部&lt;/td&gt;
&lt;td&gt;XXX&lt;/td&gt;
&lt;td&gt;李四&lt;/td&gt;
&lt;td&gt;130012345678901234&lt;/td&gt;
&lt;td&gt;13922222222&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="参考"&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://openpyxl.readthedocs.io/en/stable/index.html#"&gt;Openpyxl Doc&lt;/a&gt; &lt;a href="https://stackoverflow.com/questions/51800122/using-openpyxl-to-find-rows-that-contain-cell-with-specific-value-python-3-6"&gt;Using openpyxl to find rows that contain cell with specific value (Python 3.6)&lt;/a&gt;&lt;/p&gt;</description></item><item><title>linux-sides-Timers and time management in the Linux kernel. Part 5.</title><link>https://garlicspace.com/posts/linux-sides-timers-and-time-management-in-the-linux-kernel-part-5/</link><pubDate>Sun, 19 Jan 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-sides-timers-and-time-management-in-the-linux-kernel-part-5/</guid><description>linux-sides-Timers and time management in the Linux kernel. Part 5. - 这篇文章 Timers and time management in the Linux kernel. Part 5</description></item><item><title>LeetCode – Keys and Rooms</title><link>https://garlicspace.com/posts/leetcode-keys-and-rooms/</link><pubDate>Tue, 14 Jan 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-keys-and-rooms/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;There are &lt;code&gt;N&lt;/code&gt; rooms and you start in room &lt;code&gt;0&lt;/code&gt;.  Each room has a distinct number in &lt;code&gt;0, 1, 2, ..., N-1&lt;/code&gt;, and each room may have some keys to access the next room.&lt;/p&gt;
&lt;p&gt;Formally, each room &lt;code&gt;i&lt;/code&gt; has a list of keys &lt;code&gt;rooms[i]&lt;/code&gt;, and each key &lt;code&gt;rooms[i][j]&lt;/code&gt; is an integer in &lt;code&gt;[0, 1, ..., N-1]&lt;/code&gt; where &lt;code&gt;N = rooms.length&lt;/code&gt;.  A key &lt;code&gt;rooms[i][j] = v&lt;/code&gt; opens the room with number &lt;code&gt;v&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>内存管理 - 页面大小</title><link>https://garlicspace.com/posts/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86-%E9%A1%B5%E9%9D%A2%E5%A4%A7%E5%B0%8F/</link><pubDate>Fri, 10 Jan 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86-%E9%A1%B5%E9%9D%A2%E5%A4%A7%E5%B0%8F/</guid><description>&lt;h2 id="内存管理发展阶段"&gt;内存管理发展阶段&lt;/h2&gt;
&lt;p&gt;内存(RAM)是计算机一种重要资源, 随着应用越来越复杂，&lt;code&gt;不管存储器有多大,程序都可以把他填满&lt;/code&gt;,这就迫使人们不断寻找解决方案去管理它.&lt;/p&gt;
&lt;p&gt;内存管理经历的几个阶段；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无存储抽象阶段 (No Memory abstraction)&lt;/li&gt;
&lt;li&gt;地址空间 (Address Spaces)&lt;/li&gt;
&lt;li&gt;虚拟内存 (Virtual Memory)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;无存储抽象阶段: 直接使用物理地址, 简单和划分了用户和操作系统，(驱动程序)使用的内存. 早期的MSDOS采用这种管理方案。&lt;/li&gt;
&lt;li&gt;通过每个进程基址寄存器和界限寄存器实现动态重定位,映射到不通的物理内存。通过交换技术和空闲内存管理， 处理内存超载&lt;/li&gt;
&lt;li&gt;构建虚拟地址空间，通过MMU(内存管理单元)完成虚拟内存与物理内存的映射。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="分页"&gt;分页&lt;/h2&gt;
&lt;p&gt;分页就是出现虚拟内存这个阶段.虚拟地址按照固定大小划分成若干个页面Page， 物理内存中对应为页框 Page Frame (物理内存最小数据单位), 当程序试图访问内存时，MMU根据虚拟地址映射为物理地址.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="页面大小"&gt;页面大小&lt;/h2&gt;
&lt;h3 id="不同处理器体系结构页面大小"&gt;不同处理器体系结构页面大小&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;体系结构&lt;/th&gt;
&lt;th&gt;最小页面&lt;/th&gt;
&lt;th&gt;支持大页面&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;32-bit x86&lt;/td&gt;
&lt;td&gt;4 KiB&lt;/td&gt;
&lt;td&gt;4 MiB, 2 MiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x86-64&lt;/td&gt;
&lt;td&gt;4 KiB&lt;/td&gt;
&lt;td&gt;2 MiB, 1 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IA-64 (Itanium)&lt;/td&gt;
&lt;td&gt;4 KiB&lt;/td&gt;
&lt;td&gt;8 KiB, 64 KiB, 256 KiB, 1 MiB, 4 MiB, 16 MiB, 256 MiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power ISA&lt;/td&gt;
&lt;td&gt;4 KiB&lt;/td&gt;
&lt;td&gt;64 KiB, 16 MiB, 16 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPARC v8 with SPARC Reference MMU&lt;/td&gt;
&lt;td&gt;4 KiB&lt;/td&gt;
&lt;td&gt;256 KiB, 16 MiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARMv7&lt;/td&gt;
&lt;td&gt;4 KiB&lt;/td&gt;
&lt;td&gt;64 KiB, 1 MiB , 16 MiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UltraSPARC Architecture 2007&lt;/td&gt;
&lt;td&gt;8 KiB&lt;/td&gt;
&lt;td&gt;64 KiB, 512 KiB , 4 MiB, 32 MiB, 256 MiB, 2 GiB, 16 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="页面大小考虑因素wiki"&gt;页面大小考虑因素(&lt;a href="https://en.wikipedia.org/wiki/Page_(computer_memory)#Page_table_size"&gt;wiki&lt;/a&gt;)&lt;/h3&gt;
&lt;p&gt;页面大小通常有处理器体系结构决定， 目前常用页面大小4KB。选择最佳页面大小要考虑一下几个因素：&lt;/p&gt;</description></item><item><title>HugeTLB Pages</title><link>https://garlicspace.com/posts/hugetlb-pages/</link><pubDate>Tue, 07 Jan 2020 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/hugetlb-pages/</guid><description>HugeTLB Pages - 这篇文章 Huge TLB Pages是出Linux Kernel文档</description></item><item><title>putty免密登录SSH服务</title><link>https://garlicspace.com/posts/putty%E6%97%A0%E5%AF%86%E7%A0%81%E7%99%BB%E5%BD%95ssh%E6%9C%8D%E5%8A%A1/</link><pubDate>Tue, 31 Dec 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/putty%E6%97%A0%E5%AF%86%E7%A0%81%E7%99%BB%E5%BD%95ssh%E6%9C%8D%E5%8A%A1/</guid><description>putty免密登录SSH服务 - - - cenos7X86_64 + openssh - windows10 - putty</description></item><item><title>LeetCode – 01 Matrix</title><link>https://garlicspace.com/posts/leetcode-01-matrix/</link><pubDate>Mon, 30 Dec 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-01-matrix/</guid><description>LeetCode – 01 Matrix - Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell</description></item><item><title>LeetCode – Flood Fill</title><link>https://garlicspace.com/posts/leetcode-flood-fill/</link><pubDate>Sun, 03 Nov 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-flood-fill/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;An &lt;code&gt;image&lt;/code&gt; is represented by a 2-D array of integers, each integer representing the pixel value of the image (from 0 to 65535).&lt;/p&gt;
&lt;p&gt;Given a coordinate &lt;code&gt;(sr, sc)&lt;/code&gt; representing the starting pixel (row and column) of the flood fill, and a pixel value &lt;code&gt;newColor&lt;/code&gt;, &amp;ldquo;flood fill&amp;rdquo; the image.&lt;/p&gt;
&lt;p&gt;To perform a &amp;ldquo;flood fill&amp;rdquo;, consider the starting pixel, plus any pixels connected 4-directionally to the starting pixel of the same color as the starting pixel, plus any pixels connected 4-directionally to those pixels (also with the same color as the starting pixel), and so on. Replace the color of all of the aforementioned pixels with the newColor.&lt;/p&gt;</description></item><item><title>Linux Swap 分区相关命令</title><link>https://garlicspace.com/posts/linux-swap-%E5%88%86%E5%8C%BA%E7%9B%B8%E5%85%B3%E5%91%BD%E4%BB%A4/</link><pubDate>Sun, 03 Nov 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-swap-%E5%88%86%E5%8C%BA%E7%9B%B8%E5%85%B3%E5%91%BD%E4%BB%A4/</guid><description>Linux Swap 分区相关命令 - - /proc/swaps 文件</description></item><item><title>Netflix Blog- Mantis 开源</title><link>https://garlicspace.com/posts/netflix-blog-mantis-%E5%BC%80%E6%BA%90/</link><pubDate>Sun, 03 Nov 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/netflix-blog-mantis-%E5%BC%80%E6%BA%90/</guid><description>&lt;p&gt;这篇文章&lt;a href="https://medium.com/netflix-techblog/open-sourcing-mantis-a-platform-for-building-cost-effective-realtime-operations-focused-5b8ff387813a"&gt;Open Sourcing Mantis: A Platform For Building Cost-Effective, Realtime, Operations-Focused Applications&lt;/a&gt; 是出自 Netflix Technology Blog。&lt;/p&gt;
&lt;p&gt;作为流式微服务生态系统，Mantis平台为工程师提供将观察和操作复杂分布式系统的成本降至最低的功能。 &lt;a href="https://netflix.github.io/mantis/"&gt;Mantis&lt;/a&gt;已开源&lt;/p&gt;
&lt;h3 id="特点"&gt;特点：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;解决问题变得容易 开发人员可以根据需要从任何检测的应用程序中获取事件流。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解决问题成本降低 能够在事件上实现基于流的可观察性，同时使工程师能够使用工具来降低原本会对业务造成不利影响的成本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;指导原则&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;访问原始事件&lt;/li&gt;
&lt;li&gt;实时访问这些事件&lt;/li&gt;
&lt;li&gt;对获取数据进行新维度分析&lt;/li&gt;
&lt;li&gt;保证最小花费，不抢占正常业务使用资源&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mantis-一些应用"&gt;Mantis 一些应用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Netflix流健康实时监控&lt;/li&gt;
&lt;li&gt;上下文报警&lt;/li&gt;
&lt;li&gt;Raven,MQL Mantis查询语言&lt;/li&gt;
&lt;li&gt;Cassandra 健康检查&lt;/li&gt;
&lt;li&gt;日志监控&lt;/li&gt;
&lt;li&gt;Chaos监控&lt;/li&gt;
&lt;li&gt;PII快速识别敏感数据。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>物理内存管理</title><link>https://garlicspace.com/posts/%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/</link><pubDate>Sun, 03 Nov 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/</guid><description>物理内存管理 - - SMP: CPU 通过总线访问内存, 称为 SMP 对称多处理器, 采用平坦内存模型, 物理页号连续, 总线成为瓶颈 - NUMA: CPU 都有本地内存, 访问内存不用总线, 称为 NUMA 非一致内存访问 采用非连续内存模型，页号不连续 - 稀疏内存模型</description></item><item><title>linux-sides-Timers and time management in the Linux kernel. Part 4.</title><link>https://garlicspace.com/posts/linux-sides-timers-and-time-management-in-the-linux-kernel-part-4/</link><pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-sides-timers-and-time-management-in-the-linux-kernel-part-4/</guid><description>linux-sides-Timers and time management in the Linux kernel. Part 4. - 这篇文章 Timers and time management in the Linux kernel. Part 4</description></item><item><title>进程内存布局</title><link>https://garlicspace.com/posts/%E8%BF%9B%E7%A8%8B%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80/</link><pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E8%BF%9B%E7%A8%8B%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80/</guid><description>进程内存布局 - - 物理内存管理 - 虚拟内存管理 - 物理内存与虚拟内存的映射</description></item><item><title>查看进程内存布局</title><link>https://garlicspace.com/posts/%E6%9F%A5%E7%9C%8B%E8%BF%9B%E7%A8%8B%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80/</link><pubDate>Sat, 19 Oct 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%9F%A5%E7%9C%8B%E8%BF%9B%E7%A8%8B%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80/</guid><description>&lt;h3 id="进程内存布局"&gt;进程内存布局&lt;/h3&gt;
&lt;p&gt;可以通过一下方法查看:&lt;/p&gt;
&lt;p&gt;命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pmap&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;proc filesystem maps&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="使用-pmap"&gt;使用 &lt;code&gt;pmap&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;可以从其说明看到 &lt;code&gt;-X&lt;/code&gt; 也是从/proc/PID/smaps获取了更详细的信息&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@centosgpt ~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# pmap 1704&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1704: -bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0000000000400000&lt;/span&gt; 884K r-x-- bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000000006dd000 4K r---- bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000000006de000 36K rw--- bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00007f3c65515000 28K r--s- gconv-modules.cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00007f3c6551c000 4K rw--- &lt;span class="o"&gt;[&lt;/span&gt; anon &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00007f3c6551d000 4K r---- ld-2.17.so
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00007f3c6551e000 4K rw--- ld-2.17.so
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00007f3c6551f000 4K rw--- &lt;span class="o"&gt;[&lt;/span&gt; anon &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00007ffd64655000 132K rw--- &lt;span class="o"&gt;[&lt;/span&gt; stack &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00007ffd64769000 12K r---- &lt;span class="o"&gt;[&lt;/span&gt; anon &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00007ffd6476c000 4K r-x-- &lt;span class="o"&gt;[&lt;/span&gt; anon &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ffffffffff600000 4K r-x-- &lt;span class="o"&gt;[&lt;/span&gt; anon &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total 115580K&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id="查看-proc-filesystem-maps"&gt;查看 &lt;code&gt;proc filesystem maps&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;/proc/PID/smaps&lt;/code&gt;&lt;/p&gt;</description></item><item><title>LeetCode – Decode String</title><link>https://garlicspace.com/posts/leetcode-decode-string/</link><pubDate>Wed, 16 Oct 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-decode-string/</guid><description>LeetCode – Decode String - Given an encoded string, return its decoded string</description></item><item><title>wiki-Capability Maturity Model Integration</title><link>https://garlicspace.com/posts/wiki-capability-maturity-model-integration/</link><pubDate>Tue, 15 Oct 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/wiki-capability-maturity-model-integration/</guid><description>&lt;p&gt;这是 &lt;a href="https://en.wikipedia.org/wiki/Capability_Maturity_Model_Integration"&gt;CMMI的wiki&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;能力成熟度模型集成（CMMI）是一个过程级改进培训和评估程序。 它是由ISACA的子公司CMMI Institute管理的，由卡内基梅隆大学（CMU）开发。 许多美国国防部（DoD）和美国政府合同都要求这样做，尤其是在软件开发方面。 CMU声称CMMI可用于指导整个项目，部门或整个组织的流程改进。 CMMI为流程定义了以下成熟度级别：初始，已管理，已定义，已量化管理和优化中。 2.0版于2018年发布（1.3版于2010年发布，是此Wiki文章中其余信息的参考模型）。 CMMI由CMU在美国专利商标局注册。&lt;/p&gt;
&lt;h3 id="概述"&gt;概述&lt;/h3&gt;
&lt;p&gt;&lt;img alt="avatar" loading="lazy" src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Characteristics_of_Capability_Maturity_Model.svg/1024px-Characteristics_of_Capability_Maturity_Model.svg.png"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;成熟度水平的特征 picture from wiki&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最初，CMMI涉及三个感兴趣的领域：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;产品和服务开发-CMMI for Development（CMMI-DEV）;&lt;/li&gt;
&lt;li&gt;服务的建立，管理，—CMMI for Services (CMMI-SVC);&lt;/li&gt;
&lt;li&gt;产品和服务获取— CMMI for Acquisition（CMMI-ACQ）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在2.0版中，这三个区域（以前每个区域都有一个单独的模型）被合并为一个模型。&lt;/p&gt;
&lt;p&gt;CMMI由行业，政府和CMU的软件工程学院（SEI）组成的小组开发。 CMMI模型为开发或改进满足组织业务目标的流程提供了指导。 CMMI模型也可以用作评估组织流程成熟度的框架。 到2013年1月，整个CMMI产品套件已从SEI转移到卡耐基梅隆大学新成立的组织CMMI研究所。&lt;/p&gt;
&lt;h3 id="历史"&gt;历史&lt;/h3&gt;
&lt;p&gt;CMMI由CMMI项目开发，旨在通过将许多不同的模型集成到一个框架中来提高成熟度模型的可用性。该项目由行业，政府和卡内基梅隆软件工程学院（SEI）的成员组成。主要赞助商包括国防部长办公室（OSD）和国防工业协会。&lt;/p&gt;
&lt;p&gt;CMMI是功能成熟度模型（CMM）或软件CMM的后继产品。 CMM是从1987年到1997年开发的。2002年发布了1.1版，随后在2006年8月发布了1.2版，并在2010年11月发布了1.3版。CMMIV1.3的一些重大更改是对敏捷软件开发的支持， 对高成熟度实践的改进和实施流程的改进。&lt;/p&gt;
&lt;p&gt;根据软件工程学院（SEI，2008）的说法，CMMI帮助 &amp;quot; 整合传统上独立的组织功能，设置流程改进目标和优先级，为质量流程提供指导，并为评估当前流程提供参考点。&amp;quot;&lt;/p&gt;
&lt;p&gt;2016年3月，CMMI研究所被ISACA收购。&lt;/p&gt;
&lt;h3 id="cmmi主题"&gt;CMMI主题&lt;/h3&gt;
&lt;h4 id="表示"&gt;表示&lt;/h4&gt;
&lt;p&gt;在1.3版中，CMMI有两种表示形式：连续表示和分段表示。 连续表示的目的是使用户可以专注于对组织的近期业务目标重要的特定过程，或组织为之分配高度风险的特定过程。 分阶段的表示旨在提供标准的改进顺序，并且可以用作比较不同项目和组织的成熟度的基础。 分阶段的表示还提供了从SW-CMM到CMMI的轻松迁移。&lt;/p&gt;
&lt;p&gt;在2.0版中，以上表示分离已被取消，现在只有一个内聚模型。&lt;/p&gt;
&lt;h4 id="模型框架v13"&gt;模型框架（v1.3）&lt;/h4&gt;
&lt;p&gt;取决于所使用的关注领域（收购，服务，开发），其包含的过程领域将有所不同。 流程区域是组织的流程将覆盖的区域。下表列出了版本1.3中所有感兴趣的CMMI领域共有的17个CMMI核心过程领域。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;领域&lt;/th&gt;
&lt;th&gt;成熟度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OT&lt;/td&gt;
&lt;td&gt;Organizational Training&lt;/td&gt;
&lt;td&gt;Process Management&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPP&lt;/td&gt;
&lt;td&gt;Organizational Process Performance&lt;/td&gt;
&lt;td&gt;Process Management&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPM&lt;/td&gt;
&lt;td&gt;Organizational Performance Management&lt;/td&gt;
&lt;td&gt;Process Management&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPF&lt;/td&gt;
&lt;td&gt;Organizational Process Focus&lt;/td&gt;
&lt;td&gt;Process Management&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPD&lt;/td&gt;
&lt;td&gt;Organizational Process Definition&lt;/td&gt;
&lt;td&gt;Process Management&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSKM&lt;/td&gt;
&lt;td&gt;Risk Management&lt;/td&gt;
&lt;td&gt;Project Management&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REQM&lt;/td&gt;
&lt;td&gt;Requirements Management&lt;/td&gt;
&lt;td&gt;Project Management&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QPM&lt;/td&gt;
&lt;td&gt;Quantitative Project Management&lt;/td&gt;
&lt;td&gt;Project Management&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PP&lt;/td&gt;
&lt;td&gt;Project Planning&lt;/td&gt;
&lt;td&gt;Project Management&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PMC&lt;/td&gt;
&lt;td&gt;Project Monitoring and Control&lt;/td&gt;
&lt;td&gt;Project Management&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPM&lt;/td&gt;
&lt;td&gt;Integrated Project Management&lt;/td&gt;
&lt;td&gt;Project Management&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAM&lt;/td&gt;
&lt;td&gt;Supplier Agreement Management&lt;/td&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PPQA&lt;/td&gt;
&lt;td&gt;Process and Product Quality Assurance&lt;/td&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MA&lt;/td&gt;
&lt;td&gt;Measurement and Analysis&lt;/td&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DAR&lt;/td&gt;
&lt;td&gt;Decision Analysis and Resolution&lt;/td&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CM&lt;/td&gt;
&lt;td&gt;Configuration Management&lt;/td&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAR&lt;/td&gt;
&lt;td&gt;Causal Analysis and Resolution&lt;/td&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="服务的成熟度级别"&gt;服务的成熟度级别&lt;/h4&gt;
&lt;p&gt;针对服务模型CMMI，列出了以下过程域及其成熟度级别：&lt;/p&gt;</description></item><item><title>CMMI3相关</title><link>https://garlicspace.com/posts/cmmi3%E7%9B%B8%E5%85%B3/</link><pubDate>Mon, 14 Oct 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/cmmi3%E7%9B%B8%E5%85%B3/</guid><description>CMMI3相关 - 公司近期进行CMMI3, 公司目标很明确:招投标用的，过程中准备了一些材料，对于我们外包工作来说,还是有一定指导作用的。</description></item><item><title>进程中线程查看及线程栈查看</title><link>https://garlicspace.com/posts/%E8%BF%9B%E7%A8%8B%E4%B8%AD%E7%BA%BF%E7%A8%8B%E6%9F%A5%E7%9C%8B%E5%8F%8A%E7%BA%BF%E7%A8%8B%E6%A0%88%E6%9F%A5%E7%9C%8B/</link><pubDate>Sat, 12 Oct 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E8%BF%9B%E7%A8%8B%E4%B8%AD%E7%BA%BF%E7%A8%8B%E6%9F%A5%E7%9C%8B%E5%8F%8A%E7%BA%BF%E7%A8%8B%E6%A0%88%E6%9F%A5%E7%9C%8B/</guid><description>&lt;h3 id="进程线程查看"&gt;进程线程查看&lt;/h3&gt;
&lt;p&gt;可以通过一下方法查看:&lt;/p&gt;
&lt;p&gt;命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;top&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pidstat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pstree&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文件:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;proc filesystem&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="使用-ps"&gt;使用 &lt;code&gt;ps&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ps&lt;/code&gt;与线程相关的参数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;THREAD DISPLAY
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; H Show threads as &lt;span class="k"&gt;if&lt;/span&gt; they were processes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -L Show threads, possibly with LWP and NLWP columns.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; m Show threads after processes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -m Show threads after processes.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -T Show threads, possibly with SPID column.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;使用-L ps -eLo pid,tid,tgid,pgrp,args&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;ps&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;eLo&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;tgid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pgrp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Es&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tuned&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1594&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Es&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tuned&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1595&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Es&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tuned&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1596&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Es&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tuned&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1613&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="mi"&gt;1173&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Es&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tuned&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;77189&lt;/span&gt; &lt;span class="mi"&gt;77189&lt;/span&gt; &lt;span class="mi"&gt;77189&lt;/span&gt; &lt;span class="mi"&gt;77188&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;使用-m显示 ps -mLe&lt;/p&gt;</description></item><item><title>LeetCode – Implement Stack using Queues</title><link>https://garlicspace.com/posts/leetcode-implement-stack-using-queues/</link><pubDate>Mon, 07 Oct 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-implement-stack-using-queues/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Implement the following operations of a stack using queues.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;push(x) &amp;ndash; Push element x onto stack.&lt;/li&gt;
&lt;li&gt;pop() &amp;ndash; Removes the element on top of the stack.&lt;/li&gt;
&lt;li&gt;top() &amp;ndash; Get the top element.&lt;/li&gt;
&lt;li&gt;empty() &amp;ndash; Return whether the stack is empty.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MyStack stack = new MyStack();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stack.push(1);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stack.push(2);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stack.top(); // returns 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stack.pop(); // returns 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stack.empty(); // returns false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Linux进程调度</title><link>https://garlicspace.com/posts/linux%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6/</link><pubDate>Thu, 03 Oct 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6/</guid><description>Linux进程调度 - wiki上的关于scheduler的定义:</description></item><item><title>linux-sides-Timers and time management in the Linux kernel. Part 3.</title><link>https://garlicspace.com/posts/linux-sides-timers-and-time-management-in-the-linux-kernel-part-3/</link><pubDate>Fri, 13 Sep 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-sides-timers-and-time-management-in-the-linux-kernel-part-3/</guid><description>linux-sides-Timers and time management in the Linux kernel. Part 3. - 这篇文章 Timers and time management in the Linux kernel. Part 3</description></item><item><title>LeetCode – Implement Queue using Stacks</title><link>https://garlicspace.com/posts/leetcode-implement-queue-using-stacks/</link><pubDate>Sun, 08 Sep 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-implement-queue-using-stacks/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Implement the following operations of a queue using stacks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;push(x) &amp;ndash; Push element x to the back of queue.&lt;/li&gt;
&lt;li&gt;pop() &amp;ndash; Removes the element from in front of queue.&lt;/li&gt;
&lt;li&gt;peek() &amp;ndash; Get the front element.&lt;/li&gt;
&lt;li&gt;empty() &amp;ndash; Return whether the queue is empty.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MyQueue queue = new MyQueue();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;queue.push(1);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;queue.push(2);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;queue.peek(); // returns 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;queue.pop(); // returns 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;queue.empty(); // returns false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Graph-Easy ascii图片绘制</title><link>https://garlicspace.com/posts/graph-easy-ascii%E5%9B%BE%E7%89%87%E7%BB%98%E5%88%B6/</link><pubDate>Sat, 07 Sep 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/graph-easy-ascii%E5%9B%BE%E7%89%87%E7%BB%98%E5%88%B6/</guid><description>Graph-Easy ascii图片绘制 - - 环境：</description></item><item><title>Linux内核参数sysctl_sched_child_runs_first</title><link>https://garlicspace.com/posts/linux%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0sysctl_sched_child_runs_first/</link><pubDate>Fri, 06 Sep 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0sysctl_sched_child_runs_first/</guid><description>Linux内核参数sysctl_sched_child_runs_first - Linux2.6.23版本引入了CFS调度器,通过sched_child_runs_first设置是否子进程优先运行, 下面是 SUSE Documentation</description></item><item><title>Linuxjournal-The Linux Scheduler</title><link>https://garlicspace.com/posts/linuxjournal-the-linux-scheduler/</link><pubDate>Wed, 04 Sep 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linuxjournal-the-linux-scheduler/</guid><description>Linuxjournal-The Linux Scheduler - 这篇文章 The Linux Scheduler作者Moshe Bar发表在linuxjournal, 是一篇2000年的文章.从L</description></item><item><title>Linux 与 Windows 文本文件格式转换</title><link>https://garlicspace.com/posts/linux-%E4%B8%8E-windows-%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2/</link><pubDate>Sun, 01 Sep 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-%E4%B8%8E-windows-%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2/</guid><description>Linux 与 Windows 文本文件格式转换 - 由于Windows与Linux对换行的定义不同,导致Windows应用不能正常按行显示Linux文本，Linux显示Windows文本时会带有^M</description></item><item><title>awk中的'数组'</title><link>https://garlicspace.com/posts/awk%E4%B8%AD%E7%9A%84%E6%95%B0%E7%BB%84/</link><pubDate>Sat, 31 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/awk%E4%B8%AD%E7%9A%84%E6%95%B0%E7%BB%84/</guid><description>&lt;p&gt;awk中的&amp;rsquo;&lt;code&gt;数组&lt;/code&gt;&amp;lsquo;是一种关联数组，又称作&lt;code&gt;maps&lt;/code&gt;、&lt;code&gt;字典&lt;/code&gt;，他的索引不需要连续， 可以使用字符串、数字做为索引， 此外，不需要事先声明数组的大小 - 数组可以在运行时扩展/收缩。&lt;/p&gt;
&lt;h4 id="语法"&gt;语法：&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;赋值：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;array_name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;删除：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;array_name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;多维数组(使用字符串模拟)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0,0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;遍历：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;arrayname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;actions&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="实例"&gt;实例&lt;/h3&gt;
&lt;h4 id="统计汇总"&gt;统计汇总&lt;/h4&gt;
&lt;p&gt;数据：Iplogs.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;180607&lt;/span&gt; &lt;span class="mi"&gt;093423&lt;/span&gt; &lt;span class="mf"&gt;123.12.23.122&lt;/span&gt; &lt;span class="mi"&gt;133&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;180607&lt;/span&gt; &lt;span class="mi"&gt;121234&lt;/span&gt; &lt;span class="mf"&gt;125.25.45.221&lt;/span&gt; &lt;span class="mi"&gt;153&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;190607&lt;/span&gt; &lt;span class="mi"&gt;084849&lt;/span&gt; &lt;span class="mf"&gt;202.178.23.4&lt;/span&gt; &lt;span class="mi"&gt;44&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;190607&lt;/span&gt; &lt;span class="mi"&gt;084859&lt;/span&gt; &lt;span class="mf"&gt;164.78.22.64&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;200607&lt;/span&gt; &lt;span class="mo"&gt;012312&lt;/span&gt; &lt;span class="mf"&gt;202.188.3.2&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;210607&lt;/span&gt; &lt;span class="mi"&gt;084849&lt;/span&gt; &lt;span class="mf"&gt;202.178.23.4&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;210607&lt;/span&gt; &lt;span class="mi"&gt;121435&lt;/span&gt; &lt;span class="mf"&gt;202.178.23.4&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;210607&lt;/span&gt; &lt;span class="mi"&gt;132423&lt;/span&gt; &lt;span class="mf"&gt;202.188.3.2&lt;/span&gt; &lt;span class="mi"&gt;167&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;total.awk:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Ip&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;END&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;access&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Ip&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s"&gt;&amp;#34; times&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;注意下END后的&lt;code&gt;{&lt;/code&gt;需要和&lt;code&gt;END&lt;/code&gt;在一行&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;输出:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;awk&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;awk&lt;/span&gt; &lt;span class="n"&gt;Iplogs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;123.12.23.122&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;164.78.22.64&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;202.188.3.2&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;125.25.45.221&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;202.178.23.4&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;说明: &lt;code&gt;$3&lt;/code&gt;是一个IP地址, Ip做为数组的索引。 对于每一行，它会增加相应IP地址索引的值。 最后在END部分中，所有索引都将是唯一IP地址的列表，其对应的值是出现次数。&lt;/p&gt;</description></item><item><title>FTP ASCII上传下载</title><link>https://garlicspace.com/posts/ftp-ascii%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD/</link><pubDate>Sat, 31 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/ftp-ascii%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD/</guid><description>FTP ASCII上传下载 - 近期在进行AIX到Linux迁移，发现从windows终端ftp时，客户端设置ASCII传输模式, 服务端并不能自动转换换行符号,脚本出现^M,需要手工删除。 Linux环境为RedHat7.3+vsftpd3.0.2,vsftpd.conf中ascii_download_enable/ascii_u</description></item><item><title>LeetCode – Binary Tree Inorder Traversal</title><link>https://garlicspace.com/posts/leetcode-binary-tree-inorder-traversal/</link><pubDate>Sat, 31 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-binary-tree-inorder-traversal/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Given a binary tree, return the &lt;em&gt;inorder&lt;/em&gt; traversal of its nodes\&amp;rsquo; values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [1,null,2,3]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [1,3,2]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Follow up:&lt;/strong&gt; Recursive solution is trivial, could you do it iteratively?&lt;/p&gt;
&lt;h3 id="解题"&gt;&lt;strong&gt;解题：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;树的中序遍历：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果当前节点的左孩子为空，则输出当前节点并将其右孩子作为当前节点。&lt;/li&gt;
&lt;li&gt;如果当前节点的左孩子不为空，在当前节点的左子树中找到当前节点在中序遍历下的前驱节点。&lt;br&gt;
a) 如果前驱节点的右孩子为空，将它的右孩子设置为当前节点。当前节点更新为当前节点的左孩子。&lt;br&gt;
b) 如果前驱节点的右孩子为当前节点，将它的右孩子重新设为空（恢复树的形状）。输出当前节点。当前节点更新为当前节点的右孩子。&lt;/li&gt;
&lt;li&gt;重复以上1、2直到当前节点为空。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="实现"&gt;&lt;strong&gt;实现：&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;递归方式：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对左子结点调用递归函数，根节点访问值，右子节点再调用递归函数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * Definition for a binary tree node.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * struct TreeNode {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * int val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode *left;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode *right;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * };
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;public:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector&amp;lt;int&amp;gt; inorderTraversal(TreeNode* root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vector &amp;lt;int&amp;gt; res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; inorder(root, res);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return res;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; void inorder(TreeNode *root, vector&amp;lt;int&amp;gt; &amp;amp;res){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (!root) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;left) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; inorder(root-&amp;gt;left, res);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res.push_back(root-&amp;gt;val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (root-&amp;gt;right){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; inorder(root-&amp;gt;right, res);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;空间复杂度：O(n)，
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;时间复杂度：O(n)。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;使用栈实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;         从根节点开始，先将根节点压入栈，然后再将其所有左子结点压入栈，然后取出栈顶节点，保存节点值，再将当前指针移到其右子节点上，若存在右子节点，则在下次循环时又可将其所有左子结点压入栈中。这样就保证了访问顺序为左-根-右，&lt;/p&gt;</description></item><item><title>linux kernel documentation-CFS Scheduler</title><link>https://garlicspace.com/posts/linux-kernel-documentation-cfs-scheduler/</link><pubDate>Thu, 29 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-kernel-documentation-cfs-scheduler/</guid><description>linux kernel documentation-CFS Scheduler - 这篇文章 CFS Scheduler是Linux Kernel文档</description></item><item><title>LeetCode – Target Sum</title><link>https://garlicspace.com/posts/leetcode-target-sum/</link><pubDate>Tue, 20 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-target-sum/</guid><description>&lt;h3 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;You are given a list of non-negative integers, a1, a2, &amp;hellip;, an, and a target, S. Now you have 2 symbols &lt;code&gt;+&lt;/code&gt; and &lt;code&gt;-&lt;/code&gt;. For each integer, you should choose one from &lt;code&gt;+&lt;/code&gt; and &lt;code&gt;-&lt;/code&gt; as its new symbol.&lt;/p&gt;
&lt;p&gt;Find out how many ways to assign symbols to make sum of integers equal to target S.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Input: nums is [1, 1, 1, 1, 1], S is 3.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output: 5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-1+1+1+1+1 = 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+1-1+1+1+1 = 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+1+1-1+1+1 = 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+1+1+1-1+1 = 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+1+1+1+1-1 = 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There are 5 ways to assign symbols to make the sum of nums be target 3.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>linux-sides-Timers and time management-Introduction to the clocksource framework</title><link>https://garlicspace.com/posts/linux-sides-timers-and-time-management-introduction-to-the-clocksource-framework/</link><pubDate>Tue, 20 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-sides-timers-and-time-management-introduction-to-the-clocksource-framework/</guid><description>linux-sides-Timers and time management-Introduction to the clocksource framework - 这篇文章 Timers and time management in the Linux kernel. Part 2</description></item><item><title>旧版本应用与win10兼容</title><link>https://garlicspace.com/posts/%E6%97%A7%E7%89%88%E6%9C%AC%E5%BA%94%E7%94%A8%E4%B8%8Ewin10%E5%85%BC%E5%AE%B9/</link><pubDate>Tue, 20 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%97%A7%E7%89%88%E6%9C%AC%E5%BA%94%E7%94%A8%E4%B8%8Ewin10%E5%85%BC%E5%AE%B9/</guid><description>&lt;p&gt;大多数早期windows版本创建的应用可以在win10下正常运行，但也有部分程序无法正常运行, 可以尝试通过兼容性设置解决.&lt;/p&gt;
&lt;h3 id="修改高dpi设置"&gt;修改高DPI设置&lt;/h3&gt;
&lt;p&gt;在使用一款windows客户端产品时，由于机器分辨率较高导致其中某一个可执行文件无法运行, 通过修改高DPI设置解决，下面是具体的解决方法:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;环境说明:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;操作环境： win10， 屏幕分辨路1920*1080&lt;/li&gt;
&lt;li&gt;应用环境： 双琦弱视治疗系统v4.0.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解决方式:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;右击属性， 选择高优先级设置&lt;/li&gt;
&lt;li&gt;弹出新对话框后，勾选&lt;code&gt;替代高DPI缩放行为缩放执行&lt;/code&gt;, 并选择&lt;code&gt;应用程序&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="microsoft-帮助文档中整理设置兼容性的方法"&gt;Microsoft 帮助文档中整理设置兼容性的方法&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;设置&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;兼容性模式&lt;/td&gt;
&lt;td&gt;使用早期版本的 Windows 中的设置运行程序。如果你确信此程序是为某个特定版本的 Windows 设计（或用于该版本）的，请尝试使用此设置。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;降低颜色模式&lt;/td&gt;
&lt;td&gt;在程序中使用数量有限的一组颜色。某些旧版程序在设计时所用的颜色较少。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;使用 640 × 480 的屏幕分辨率运行&lt;/td&gt;
&lt;td&gt;如果此程序的图形出现锯齿或显示不正确，请尝试使用此设置。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;更改高 DPI 设置&lt;/td&gt;
&lt;td&gt;如果你的程序无法在具有高 DPI 显示屏的电脑上正常显示（其功能显得模糊或太大或太小），请选择“更改高 DPI 设置”，然后再尝试使用“属性”对话框中的以下选项之一: &lt;strong&gt;选择要使用的 DPI&lt;/strong&gt; 1. 在“程序 DPI”部分中，选中“使用此设置修复此程序的缩放问题，而不是‘设置’中的缩放问题”，以使用想要用于此程序的 DPI 设置。 &lt;code&gt;注意 此操作只会更改你正在调整的应用的 DPI。如果你想要为所有应用调整此设置，请选择“开始”菜单 &amp;gt;“设置” &amp;gt;“高级缩放设置”，然后按照说明进行操作。 有关更改所有应用的设置的详细信息，请参阅修复显示模糊的应用。&lt;/code&gt; 若要“使用主显示器默认的 DPI” 请选择以下选项之一： - &lt;strong&gt;已登录到 Windows&lt;/strong&gt; -登录到 Windows 时使用为主显示器设置的 DPI。这是默认设置。 - &lt;strong&gt;打开此程序&lt;/strong&gt; - 打开特定程序时使用为主显示器设置的 DPI。 &lt;strong&gt;更改应用程序的高 DPI 缩放模式&lt;/strong&gt; 在“高 DPI 缩放替代”区域中，选中“覆盖高 DPI 缩放行为”，然后再尝试使用以下选项之一： - &lt;strong&gt;应用程序&lt;/strong&gt; &amp;gt; - 禁用所有的 Windows 缩放设置，并仅使用应用开发人员的设置。在先前版本的 Windows 中，此选项被称为“高 DPI 设置时禁用显示缩放”。 - &lt;strong&gt;系统&lt;/strong&gt; - 覆盖程序的 DPI 设置，让该程序像在低 DPI 显示屏上一样运行。在高 DPI 显示屏上，这将导致程序显示模糊。 - &lt;strong&gt;系统(增强)&lt;/strong&gt; &amp;gt;- Windows 将尝试对此程序使用增强的 DPI 缩放。因此，某些程序将以清晰的文本显示在高 DPI 显示屏上。这不适用于所有程序。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;以管理员身份运行此程序&lt;/td&gt;
&lt;td&gt;某些程序需要管理员权限才能正常运行。以管理员身份登录电脑以使用此选项。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;更改所有用户的设置&lt;/td&gt;
&lt;td&gt;将该程序的设置应用到电脑上的所有帐户，然后选择 需要管理员权限“更改所有用户的设置”。系统可能会提示你提供管理员密码或确认你的选择。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="参考"&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://support.microsoft.com/zh-cn/help/15078/windows-10-make-older-apps-or-programs-compatible"&gt;使旧版应用或程序与 Windows 10 兼容&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Linux进程创建</title><link>https://garlicspace.com/posts/linux%E8%BF%9B%E7%A8%8B%E5%88%9B%E5%BB%BA/</link><pubDate>Sun, 18 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E8%BF%9B%E7%A8%8B%E5%88%9B%E5%BB%BA/</guid><description>Linux进程创建 - 以fork函数为例，看下Linux进程创建具体工作流程:</description></item><item><title>LeetCode – Clone Graph</title><link>https://garlicspace.com/posts/leetcode-clone-graph/</link><pubDate>Fri, 09 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-clone-graph/</guid><description>LeetCode – Clone Graph - Given a reference of a node in a connected Connected_graph undirected graph, return a *</description></item><item><title>linux-sides-Timers and time management-Introduction</title><link>https://garlicspace.com/posts/linux-sides-timers-and-time-management-introduction/</link><pubDate>Wed, 07 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-sides-timers-and-time-management-introduction/</guid><description>linux-sides-Timers and time management-Introduction - 这篇文章 Timers and time management in the Linux kernel. Part 1</description></item><item><title>sysctl-查询修改Linux内核参数</title><link>https://garlicspace.com/posts/sysctl-%E6%9F%A5%E8%AF%A2%E4%BF%AE%E6%94%B9linux%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0/</link><pubDate>Tue, 06 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/sysctl-%E6%9F%A5%E8%AF%A2%E4%BF%AE%E6%94%B9linux%E5%86%85%E6%A0%B8%E5%8F%82%E6%95%B0/</guid><description>sysctl-查询修改Linux内核参数 - sysctl命令可以_实时_（runtime）查看和修改linux 内核参数。这个命令可以在大多数发行版本找到， 另外内核参数，也可以通过procfs 文件系统，在 /proc/sys/kernel下 进行查看和修改。</description></item><item><title>asm-offset.h生成过程</title><link>https://garlicspace.com/posts/asm-offset-h%E4%B8%8Esed/</link><pubDate>Mon, 05 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/asm-offset-h%E4%B8%8Esed/</guid><description>asm-offset.h生成过程 - asm-offset.h 文件是在内核编译过程中生成的，生成过程 之前整理了一份笔记 TASK_threadsp的实现及asm-offsets.h， 其中涉及sed处理包含在内核代</description></item><item><title>LeetCode – Evaluate Reverse Polish Notation</title><link>https://garlicspace.com/posts/leetcode-evaluate-reverse-polish-notation/</link><pubDate>Sun, 04 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-evaluate-reverse-polish-notation/</guid><description>&lt;h4 id="题目"&gt;&lt;strong&gt;题目：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Evaluate the value of an arithmetic expression in &lt;a href="http://en.wikipedia.org/wiki/Reverse_Polish_notation"&gt;Reverse Polish Notation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Valid operators are &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;. Each operand may be an integer or another expression.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Division between two integers should truncate toward zero.&lt;/li&gt;
&lt;li&gt;The given RPN expression is always valid. That means the expression would always evaluate to a result and there won&amp;rsquo;t be any divide by zero operation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [&amp;#34;2&amp;#34;, &amp;#34;1&amp;#34;, &amp;#34;+&amp;#34;, &amp;#34;3&amp;#34;, &amp;#34;*&amp;#34;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Linux如何管理和度量时间</title><link>https://garlicspace.com/posts/linux%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E5%92%8C%E5%BA%A6%E9%87%8F%E6%97%B6%E9%97%B4/</link><pubDate>Sat, 03 Aug 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E5%92%8C%E5%BA%A6%E9%87%8F%E6%97%B6%E9%97%B4/</guid><description>Linux如何管理和度量时间 - Linux 内核的Timer必须要完成两种定时测量（timing measurement）</description></item><item><title>kill多个同名进程</title><link>https://garlicspace.com/posts/kill%E5%A4%9A%E4%B8%AA%E5%90%8C%E5%90%8D%E8%BF%9B%E7%A8%8B/</link><pubDate>Fri, 26 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/kill%E5%A4%9A%E4%B8%AA%E5%90%8C%E5%90%8D%E8%BF%9B%E7%A8%8B/</guid><description>&lt;h2 id="问题"&gt;问题：   &lt;/h2&gt;
&lt;p&gt;       本周在配合系统测试过程中，发现系统报文接收异常， 排查过程中发现应用进程启动异常。 当时状态模拟如下： &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@centosgpt server]# ps -ef|grep daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dbus 934 1 0 Jul22 ? 00:01:15 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 941 1 0 Jul22 ? 00:00:15 /usr/sbin/NetworkManager --no-daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81345 1 0 09:27 ? 00:00:00 daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81348 1 0 09:27 ? 00:00:00 daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81351 1 0 09:27 ? 00:00:00 daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81354 1 0 09:27 ? 00:00:00 daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81357 1 0 09:28 ? 00:00:00 daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81360 1 0 09:28 ? 00:00:00 daemon status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81364 1 0 09:28 ? 00:00:00 daemon start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81367 1 0 09:28 ? 00:00:00 daemon status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81370 1 0 09:28 ? 00:00:00 daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root 81372 80347 0 09:28 pts/2 00:00:00 grep --color=auto daemon&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;  daemon status， daemon start 都属于异常进程。&lt;/p&gt;</description></item><item><title>Airbnb Blog- 分布式支付系统中交易完整性的测量</title><link>https://garlicspace.com/posts/airbnb-blog-%E5%88%86%E5%B8%83%E5%BC%8F%E6%94%AF%E4%BB%98%E7%B3%BB%E7%BB%9F%E4%B8%AD%E4%BA%A4%E6%98%93%E5%AE%8C%E6%95%B4%E6%80%A7%E7%9A%84%E6%B5%8B%E9%87%8F/</link><pubDate>Thu, 25 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/airbnb-blog-%E5%88%86%E5%B8%83%E5%BC%8F%E6%94%AF%E4%BB%98%E7%B3%BB%E7%BB%9F%E4%B8%AD%E4%BA%A4%E6%98%93%E5%AE%8C%E6%95%B4%E6%80%A7%E7%9A%84%E6%B5%8B%E9%87%8F/</guid><description>Airbnb Blog- 分布式支付系统中交易完整性的测量 - 这篇文章 Measuring Transactional Integrity in Airbnb’s Distributed Payment Ecosystem</description></item><item><title>LeetCode – Daily Temperatures</title><link>https://garlicspace.com/posts/leetcode-daily-temperatures/</link><pubDate>Tue, 23 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-daily-temperatures/</guid><description>LeetCode – Daily Temperatures - Daily Temperatures</description></item><item><title>Netflix Blog- 重构视频GateKeeper</title><link>https://garlicspace.com/posts/netflix-blog-%E9%87%8D%E6%9E%84%E8%A7%86%E9%A2%91gatekeeper/</link><pubDate>Mon, 22 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/netflix-blog-%E9%87%8D%E6%9E%84%E8%A7%86%E9%A2%91gatekeeper/</guid><description>&lt;p&gt;      这篇文章&lt;a href="https://medium.com/netflix-techblog/re-architecting-the-video-gatekeeper-f7b0ac2f6b00"&gt;Re-Architecting the Video Gatekeeper&lt;/a&gt;  是出自 &lt;a href="https://medium.com/@NetflixTechBlog"&gt;Netflix Technology Blog。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;       Netflix上的视频需要通过Title Operations 团队的策划，使其遵守的合同；字幕、配音、翻译能够提供给合适的人群；标题名称和概要可供使用和翻译；满足各个国家的成熟度等级（分级）。&lt;/p&gt;
&lt;p&gt;        Gatekeeper是Netflix的系统， 他通过汇集多个上游系统数据， 应用一些业务逻辑，为每一个国家地区每一个视频状态的输出来完成器规定任务。GateKeeper 设置这些视频是否对用户可见。为Title Operations 指出缺少的内容， 协助其工作。&lt;/p&gt;
&lt;h3 id="现存问题"&gt;    现存问题：&lt;/h3&gt;
&lt;p&gt;      GateKeeper是一个事件驱动的系统，上游系统每个改变都会向GateKeeper发送事件，GateKeep再通过访问每个上游服务来响应事件。可能会出现下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I/O  瓶颈&lt;/li&gt;
&lt;li&gt;处理延时&lt;/li&gt;
&lt;li&gt;事件丢失&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;    而主动扫描处理一些指定目录可以缓解这些问题， 但是增加了更多的事件。&lt;/p&gt;
&lt;h3 id="解决方案"&gt;    解决方案：&lt;/h3&gt;
&lt;p&gt;      使用技术：&lt;strong&gt;Hollow&lt;/strong&gt;  可以看下这篇文章使用技术  &lt;a href="https://medium.com/netflix-techblog/netflixoss-announcing-hollow-5f710eefca4b"&gt;Hollow&lt;/a&gt; ( &lt;a href="https://www.linkedin.com/in/koszewnik?source=post_page---------------------------"&gt;&lt;em&gt;Drew Koszewnik&lt;/em&gt;&lt;/a&gt;)，（ 2016年，是这篇的作者）&lt;/p&gt;
&lt;p&gt;      Netflix Hollow是一个java库和工具集，用于将内存数据集从单个生产者传播到许多消费者，以实现高性能的只读访问。 适合小到中级数据集  &lt;a href="http://hollow.how/?source=post_page---------------------------"&gt;Hollow&lt;/a&gt;&lt;/p&gt;
&lt;h5 id="第一阶段"&gt;     第一阶段：&lt;/h5&gt;
&lt;p&gt;     使用Hollow为每个上游系统在GateKeeper增加缓存， 在指定周期内循环迭代处理所有国家地区的视频，并生成完整输出。&lt;/p&gt;
&lt;h5 id="第二阶段"&gt;     第二阶段：&lt;/h5&gt;
&lt;p&gt;      由于第一个阶段时间片相对较长， 整个数据来自实际数据源，一个迭代周期需要很长时间。需要进一步优化。&lt;/p&gt;
&lt;p&gt;     将Hollow分为更小时间片单位， 应用程序将每次的更改通过kafka推送 Hollow，辅助周期性的整个数据源扫描来防止数据遗漏。&lt;/p&gt;
&lt;h3 id="效果"&gt;  效果：&lt;/h3&gt;
&lt;p&gt;    性能及可用性提高：消除了I/O瓶颈，提高了性能，单个上游系统故障下可以通过过时数据进行评估。&lt;/p&gt;
&lt;p&gt;    对于新投产版本，将某一个时间X的数据做为输入， 将其输出结果其与生产版本应用的输出结果进行对比（&lt;a href="https://hollow.how/tooling/?source=post_page---------------------------#diff-tool"&gt;&lt;em&gt;diffed&lt;/em&gt;&lt;/a&gt; ）来准确判断是否达到预期效果。对于开发，验证，部署都比之前有了很大提高， 安全性方面也比以前架构更高。&lt;/p&gt;
&lt;p&gt;    在文末也写道将在未来几个季度实现这一目标。&lt;/p&gt;
&lt;p&gt;    对于文中描述的实时推送，全量补齐方式，实施的项目中也使用过，不过是联机+批量模式：报文从一个系统A实时推送到系统B， 夜间再通过下发批量进行全量更新补全推送时丢失的信息。&lt;/p&gt;
&lt;p&gt;     对于数据重放到预发布版本，与生产版本比较执行执行结果， 来验证新版本是否达到预期效果，和我现在项目中验证方式不一样， 目前投产后通过实际交易进行验证， 如果能方便将相关数据重放到新版本进行验证，确实将减少不少验证的工作， 不过也需要相应的应用做出相关的改造才可以。&lt;/p&gt;</description></item><item><title>TASK_threadsp的实现及asm-offsets.h</title><link>https://garlicspace.com/posts/task-threadsp%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8F%8Aasm-offsets-h/</link><pubDate>Sun, 21 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/task-threadsp%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8F%8Aasm-offsets-h/</guid><description>TASK_threadsp的实现及asm-offsets.h - - 主动调度与上下文切换</description></item><item><title>查看进程运行时间及上下文切换次数</title><link>https://garlicspace.com/posts/%E6%9F%A5%E7%9C%8B%E8%BF%9B%E7%A8%8B%E8%BF%90%E8%A1%8C%E6%97%B6%E9%97%B4%E5%8F%8A%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E6%AC%A1%E6%95%B0/</link><pubDate>Sat, 20 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%9F%A5%E7%9C%8B%E8%BF%9B%E7%A8%8B%E8%BF%90%E8%A1%8C%E6%97%B6%E9%97%B4%E5%8F%8A%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E6%AC%A1%E6%95%B0/</guid><description>查看进程运行时间及上下文切换次数 - CentOS Linux release 7.5.1804 CoreLinux centosgpt 5.2.0-rc4 1 SMP Sun Jun 16 13:25:49 CST 2019 x86_64 x86_64 x86_64 GNU/Linux</description></item><item><title>LeetCode – Valid Parentheses</title><link>https://garlicspace.com/posts/leetcode-valid-parentheses/</link><pubDate>Fri, 19 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-valid-parentheses/</guid><description>LeetCode – Valid Parentheses - Given a string containing just the characters &amp;#39;&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;{&amp;#39;, &amp;#39;}&amp;#39;, &amp;#39;&amp;#39; and &amp;#39;&amp;#39;, determine if the input string is valid</description></item><item><title>Linux 进程，线程的调度策略API</title><link>https://garlicspace.com/posts/linux-%E8%BF%9B%E7%A8%8B%E7%BA%BF%E7%A8%8B%E7%9A%84%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5api/</link><pubDate>Tue, 16 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-%E8%BF%9B%E7%A8%8B%E7%BA%BF%E7%A8%8B%E7%9A%84%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5api/</guid><description>Linux 进程，线程的调度策略API - 实时进程的调度策略：</description></item><item><title>Netflix Blog- Netflix的应用安全</title><link>https://garlicspace.com/posts/netflix-blog-netflix%E7%9A%84%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8/</link><pubDate>Sat, 13 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/netflix-blog-netflix%E7%9A%84%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8/</guid><description>&lt;p&gt;这篇文章 &lt;a href="https://medium.com/@NetflixTechBlog/scaling-appsec-at-netflix-6a13d7ab6043"&gt;Scaling Appsec at Netflix&lt;/a&gt;  是出自 &lt;a href="https://medium.com/@NetflixTechBlog"&gt;Netflix Technology Blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Netflix的 应用安全团队的主要服务对象是在云基础架构上发布应用的工程团队，&lt;/p&gt;
&lt;p&gt;Netflix安全主张：安全是每个产品团队的责任&lt;/p&gt;
&lt;p&gt;Netflix安全团队工作主要分为三类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;应用安全运营功能：传统的AppSec活动： BUG赏金分类，测试， 威胁建模，漏洞管理，产品安全。&lt;/li&gt;
&lt;li&gt;安全合作伙伴关系：推动整体安全改进降低风险。&lt;/li&gt;
&lt;li&gt;应用安全自动化：构建全面的应用程序库并启动自助安全指导。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;运营Appsec功能由于存在高度中断，非持续性，过去的几个月，团队进行了重组，分为自动化和合作伙伴小组两个团队。&lt;/p&gt;
&lt;p&gt;          APPsec自动化队目标是提供 一致，可操作， 自我服务，为开发提供指导。通过&lt;a href="https://www.spinnaker.io/"&gt;Spinnaker&lt;/a&gt; 的平台，为开发人员提供单一的视图提供相关操作， 确保应用安全。   安全工作从过去的使用一些传动的DevSecOps方法如：静态代码扫描，动态测试，反模式grep， 转变为使用自动化方式提供自助服务。&lt;/p&gt;
&lt;p&gt;          合作伙伴小组更关注于与具有高风险的工程和产品团队（例如支付工程）密切合作， 目标是确定安全风险领域， 专注于更大的战略举措从而降低风险。&lt;/p&gt;
&lt;p&gt;          团队的最终目标是退出运营职责，将工作重点放到自动化和合作伙伴两种工作模式上。&lt;/p&gt;</description></item><item><title>python 解压指定路径下zip文件</title><link>https://garlicspace.com/posts/python-%E8%A7%A3%E5%8E%8B%E6%8C%87%E5%AE%9A%E8%B7%AF%E5%BE%84%E4%B8%8Bzip%E6%96%87%E4%BB%B6/</link><pubDate>Fri, 12 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/python-%E8%A7%A3%E5%8E%8B%E6%8C%87%E5%AE%9A%E8%B7%AF%E5%BE%84%E4%B8%8Bzip%E6%96%87%E4%BB%B6/</guid><description>&lt;h1 id="概述"&gt;概述：&lt;/h1&gt;
&lt;p&gt;项目变更版本需要源码包， 检查关键代码是否缺失，其中有一个步骤需要进入指定目录解压所有.ZIP压缩包&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="问题"&gt;问题：&lt;/h1&gt;
&lt;p&gt;1. 并行处理；&lt;/p&gt;
&lt;p&gt;2. zipfile extract后中文名称乱码；&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="解决"&gt;解决：&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt; 并行处理使用 ，参考之前的&lt;a href="https://garlicspace.com/2019/05/20/%E6%89%AB%E6%8F%8F%E7%AB%AF%E5%8F%A3python%E5%AE%9E%E7%8E%B0/"&gt;扫描端口&lt;/a&gt;的套路修改；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt; zipfile   解压乱码，踏着前人的足迹，查看了下python zipfile 源码open 函数中 如果zinfo.flag_bits 不是utf-8 都默认设为cp437   &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; def open(self, name, mode=&amp;#34;r&amp;#34;, pwd=None, *, force_zip64=False):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if zinfo.flag_bits &amp;amp; 0x800:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # UTF-8 filename
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fname_str = fname.decode(&amp;#34;utf-8&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fname_str = fname.decode(&amp;#34;cp437&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;      &lt;a href="https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT"&gt;ZIP File Format Specification&lt;/a&gt; 中描述      &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;APPENDIX D - Language Encoding (EFS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;D.1 The ZIP format has historically supported only the original IBM PC character
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;encoding set, commonly referred to as IBM Code Page 437. This limits storing
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file name characters to only those within the original MS-DOS range of values
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;and does not properly support file names in other character encodings, or
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;languages. To address this limitation, this specification will support the
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;following change. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 id="代码"&gt;代码：&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import os
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import zipfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from queue import Queue
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import time
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import threading
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from pathlib import Path
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print_lock = threading.Lock()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def unzip(file):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; file_name, ext = os.path.splitext(file)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if ext == &amp;#34;.zip&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; try:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f = zipfile.ZipFile(file, &amp;#39;r&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for fn in f.namelist():
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; extract_path = Path(f.extract(fn))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; extract_path.replace(fn.encode(&amp;#39;cp437&amp;#39;).decode(&amp;#39;gbk&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; with print_lock:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(file, &amp;#39;unzip ok&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; except:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; with print_lock:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(file, &amp;#39;unzip error&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pass
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def threader():
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; while True:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; worker = q.get()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; unzip(worker)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; q.task_done()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def create_thread( threadnums ):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for x in range(threadnums):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; t = threading.Thread(target=threader)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; t.daemon = True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; t.start()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if __name__ == &amp;#34;__main__&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; q = Queue()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; startTime = time.time()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; path = os.getcwd()+&amp;#39;\\源码&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; os.chdir(path)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; file_list = os.listdir(path)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(file_list)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; create_thread(100)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for unzipfile in file_list:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; q.put(unzipfile)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; q.join()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#39;Time taken:&amp;#39;, time.time()-startTime)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 id="参考"&gt;参考：&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://blog.csdn.net/xinxinnogiveup/article/details/80342044"&gt;python zipfile extract 解压 中文文件名&lt;/a&gt;&lt;/p&gt;</description></item><item><title>LeetCode – Min Stack</title><link>https://garlicspace.com/posts/leetcode-min-stack/</link><pubDate>Wed, 10 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-min-stack/</guid><description>&lt;h1 id="题目"&gt;题目：&lt;/h1&gt;
&lt;p&gt;Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;push(x) &amp;ndash; Push element x onto stack.&lt;/li&gt;
&lt;li&gt;pop() &amp;ndash; Removes the element on top of the stack.&lt;/li&gt;
&lt;li&gt;top() &amp;ndash; Get the top element.&lt;/li&gt;
&lt;li&gt;getMin() &amp;ndash; Retrieve the minimum element in the stack.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MinStack minStack = new MinStack();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minStack.push(-2);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minStack.push(0);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minStack.push(-3);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minStack.getMin(); --&amp;gt; Returns -3.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minStack.pop();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minStack.top(); --&amp;gt; Returns 0.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;minStack.getMin(); --&amp;gt; Returns -2.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 id="解题"&gt;解题：&lt;/h1&gt;
&lt;p&gt;    与普通栈不同，增加了一个返回栈最小值的功能， 这里使用了两个栈， 一个保存数据 ， 一个保存压栈过程中出现过的最小值。&lt;/p&gt;</description></item><item><title>汇编文件中的CFI指令</title><link>https://garlicspace.com/posts/%E6%B1%87%E7%BC%96%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84cfi%E6%8C%87%E4%BB%A4/</link><pubDate>Tue, 09 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%B1%87%E7%BC%96%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84cfi%E6%8C%87%E4%BB%A4/</guid><description>&lt;p&gt;这篇文章&lt;a href="https://www.imperialviolet.org/2017/01/18/cfi.html"&gt;CFI directives in assembly file&lt;/a&gt; (18 Jan 2017)，   是出自google 工程师&lt;a href="https://github.com/agl"&gt;Adam Langley&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="问题提出"&gt;   问题提出：&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3 id="函数调用栈"&gt;     函数调用栈&lt;/h3&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;: :
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| caller&amp;#39;s stack |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----------------+ &amp;lt;----$rsp value before CALL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| return address |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----------------+ &amp;lt;----$rsp at function entry
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| caller&amp;#39;s rbp |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----------------+ &amp;lt;----$rbp always points here
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| callee&amp;#39;s stack | &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;函数调用中 调用call指令时将call指令的下一条指令 return address 入栈， 其中return address存放在RIP寄存器中也就是将 RIP入栈，之后进入子函数后会将父函数的栈基地址入栈，其中父函数的栈基地保存在RBP寄存器中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3 id="函数栈调用框架"&gt;     函数栈调用框架：&lt;/h3&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;push rbp&lt;/p&gt;
&lt;p&gt;mov rbp, rsp&lt;/p&gt;</description></item><item><title>函数栈的调用</title><link>https://garlicspace.com/posts/%E5%87%BD%E6%95%B0%E6%A0%88%E7%9A%84%E8%B0%83%E7%94%A8/</link><pubDate>Sun, 07 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%87%BD%E6%95%B0%E6%A0%88%E7%9A%84%E8%B0%83%E7%94%A8/</guid><description>函数栈的调用 - 本篇主要通过反汇编与GDB两种方式分析函数栈的使用过程。</description></item><item><title>获取进程信息相关命令</title><link>https://garlicspace.com/posts/%E8%8E%B7%E5%8F%96%E8%BF%9B%E7%A8%8B%E4%BF%A1%E6%81%AF%E7%9B%B8%E5%85%B3%E5%91%BD%E4%BB%A4/</link><pubDate>Wed, 03 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E8%8E%B7%E5%8F%96%E8%BF%9B%E7%A8%8B%E4%BF%A1%E6%81%AF%E7%9B%B8%E5%85%B3%E5%91%BD%E4%BB%A4/</guid><description>获取进程信息相关命令 - - pid： 进程ID - tid：线程ID - tgid：主线程ID</description></item><item><title>LeetCode – Perfect Squares</title><link>https://garlicspace.com/posts/leetcode-perfect-squares/</link><pubDate>Tue, 02 Jul 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-perfect-squares/</guid><description>&lt;h1 id="题目"&gt;题目：&lt;/h1&gt;
&lt;p&gt;Given a positive integer &lt;em&gt;n&lt;/em&gt;, find the least number of perfect square numbers (for example, &lt;code&gt;1, 4, 9, 16, ...&lt;/code&gt;) which sum to &lt;em&gt;n&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; &lt;em&gt;n&lt;/em&gt; = &lt;code&gt;12&lt;/code&gt; &lt;strong&gt;Output:&lt;/strong&gt; 3 &lt;strong&gt;Explanation:&lt;/strong&gt; &lt;code&gt;12 = 4 + 4 + 4.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; &lt;em&gt;n&lt;/em&gt; = &lt;code&gt;13&lt;/code&gt; &lt;strong&gt;Output:&lt;/strong&gt; 2 &lt;strong&gt;Explanation:&lt;/strong&gt; &lt;code&gt;13 = 4 + 9. &lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="解题1"&gt;解题1：&lt;/h1&gt;
&lt;p&gt;        数学方式的解法：基于四平方和理论（Lagrange&amp;rsquo;s four-square theorem）， 每个正整数均可表示为4个整数的平方和。 &lt;/p&gt;
&lt;p&gt;         1. 如果整数包含因子4， 可以去掉不影响结果；&lt;/p&gt;
&lt;p&gt;         2. 如果除8余7的话， 肯定是由四个完全平方数组成；&lt;/p&gt;
&lt;p&gt;         3.  之后按照两个数的平方和拆解整数， 其中！！逻辑取反判断是否正整数还是0， 正整数！！后为1， 0！！后为0；    &lt;/p&gt;</description></item><item><title>linux 任务状态定义</title><link>https://garlicspace.com/posts/linux%E4%BB%BB%E5%8A%A1%E7%8A%B6%E6%80%81%E5%AE%9A%E4%B9%89/</link><pubDate>Sat, 29 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E4%BB%BB%E5%8A%A1%E7%8A%B6%E6%80%81%E5%AE%9A%E4%B9%89/</guid><description>linux 任务状态定义 - Linux task_struct 结构中 涉及进程状态的属性有三个，其中进程对应的状态分为两类， 一类是运行中状态， 另一类是进程退出状态。</description></item><item><title>Netflix Blog-令人愉快的用户界面：复活节彩蛋</title><link>https://garlicspace.com/posts/netflix-blog-%E4%BB%A4%E4%BA%BA%E6%84%89%E5%BF%AB%E7%9A%84%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%E5%A4%8D%E6%B4%BB%E8%8A%82%E5%BD%A9%E8%9B%8B/</link><pubDate>Thu, 27 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/netflix-blog-%E4%BB%A4%E4%BA%BA%E6%84%89%E5%BF%AB%E7%9A%84%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%E5%A4%8D%E6%B4%BB%E8%8A%82%E5%BD%A9%E8%9B%8B/</guid><description>Netflix Blog-令人愉快的用户界面：复活节彩蛋 - 这篇文章 Delightful User Interfaces: Easter Eggs 是出自 Netflix</description></item><item><title>文件签名及校验方法</title><link>https://garlicspace.com/posts/%E6%96%87%E4%BB%B6%E7%AD%BE%E5%90%8D%E5%8F%8A%E6%A0%A1%E9%AA%8C%E6%96%B9%E6%B3%95/</link><pubDate>Thu, 27 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%96%87%E4%BB%B6%E7%AD%BE%E5%90%8D%E5%8F%8A%E6%A0%A1%E9%AA%8C%E6%96%B9%E6%B3%95/</guid><description>文件签名及校验方法 - 在上网下载镜像或安装文件时经常会看到MD5,SHA-1,SHA-256 ，signature，一起显示，这些文件帮助我们验证下载的文件是否损坏或者被篡改以及文件的真实性， 散列值可以使用windows， macOS，Linux内置命令进行验证。 文件签名可以使用工具gpg进行校验。</description></item><item><title>LeetCode – Open the Lock</title><link>https://garlicspace.com/posts/leetcode-open-the-lock/</link><pubDate>Sun, 23 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-open-the-lock/</guid><description>&lt;h1 id="题目"&gt;题目：&lt;/h1&gt;
&lt;p&gt;You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: &lt;code&gt;'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'&lt;/code&gt;. The wheels can rotate freely and wrap around: for example we can turn &lt;code&gt;'9'&lt;/code&gt; to be &lt;code&gt;'0'&lt;/code&gt;, or &lt;code&gt;'0'&lt;/code&gt; to be &lt;code&gt;'9'&lt;/code&gt;. Each move consists of turning one wheel one slot.&lt;/p&gt;
&lt;p&gt;The lock initially starts at &lt;code&gt;'0000'&lt;/code&gt;, a string representing the state of the 4 wheels.&lt;/p&gt;</description></item><item><title>Netflix Blog-容器的预测性CPU隔离</title><link>https://garlicspace.com/posts/netflix-blog-%E5%AE%B9%E5%99%A8%E7%9A%84%E9%A2%84%E6%B5%8B%E6%80%A7cpu%E9%9A%94%E7%A6%BB/</link><pubDate>Thu, 20 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/netflix-blog-%E5%AE%B9%E5%99%A8%E7%9A%84%E9%A2%84%E6%B5%8B%E6%80%A7cpu%E9%9A%94%E7%A6%BB/</guid><description>Netflix Blog-容器的预测性CPU隔离 - 这篇文章 Predictive CPU isolation of containers at Netflix</description></item><item><title>Posix Threads API 整理</title><link>https://garlicspace.com/posts/posix-threads-api-%E6%95%B4%E7%90%86/</link><pubDate>Thu, 20 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/posix-threads-api-%E6%95%B4%E7%90%86/</guid><description>&lt;h1 id="定义"&gt;定义：&lt;/h1&gt;
&lt;h2 id="并发与并行"&gt;并发与并行：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;并发（concurrency）:实际上串行发生的事情好像同时发生，表述了单核处理器中线程或者进程的行为特点&lt;/li&gt;
&lt;li&gt;并行（parallelism）：并发序列同时执行， 真正的并行只能在多处理其上存在。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="异步与同步"&gt;异步与同步：&lt;/h2&gt;
&lt;p&gt;       异步（asynchronous）与同步（synchronous）区别在于发需求的人是否需要等到需要完成才可以执行其他事情。&lt;/p&gt;
&lt;h2 id="线程安全和可重入"&gt;线程安全和可重入：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;  线程安全：能够被多个线程调用而不会产生灾难性结果，大部分函数可以利用互斥量，条件变量，线程私有数据实现线程安全。 &lt;/li&gt;
&lt;li&gt;  可重入：采用比将函数和库转换为一系列更为复杂方式使得代码成为线程安全。可重入函数应该避免任何静态数据和共享全局数据，避免依赖线程间任何形式的同步。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="数据类型"&gt;数据类型：&lt;/h1&gt;
&lt;h2 id="线程相关数据类型"&gt;线程相关数据类型&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pthread_t&lt;/td&gt;
&lt;td&gt;线程标识符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pthread_mutex_t&lt;/td&gt;
&lt;td&gt;互斥量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pthread_spinlock_t&lt;/td&gt;
&lt;td&gt;自旋锁&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pthread_cond_t&lt;/td&gt;
&lt;td&gt;条件变量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pthread_key_t&lt;/td&gt;
&lt;td&gt;线程私有数据访问键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pthread_attr_t&lt;/td&gt;
&lt;td&gt;线程属性对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pthread_mutexattr_t&lt;/td&gt;
&lt;td&gt;互斥量属性对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pthread_rwlockattr_t&lt;/td&gt;
&lt;td&gt;读写锁属性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pthread_condattr_t&lt;/td&gt;
&lt;td&gt;条件变量属性对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pthread_once_t&lt;/td&gt;
&lt;td&gt;一次性初始化属性对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sigevent&lt;/td&gt;
&lt;td&gt;线程通知机制&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h1 id="线程posix-api"&gt;线程POSIX API：&lt;/h1&gt;
&lt;h2 id="基本操作"&gt;基本操作&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;建立与终止&lt;/th&gt;
&lt;th&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_create.txt"&gt;pthread_create&lt;/a&gt;   &lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_exit.txt"&gt;pthread_exit&lt;/a&gt; &lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;等待&lt;/td&gt;
&lt;td&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_join.txt"&gt;pthread_join&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;取消&lt;/td&gt;
&lt;td&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_cancel.txt"&gt;pthread_cancel&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; 线程分离&lt;/td&gt;
&lt;td&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_detach.txt"&gt;pthread_detach&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; 获取线程标识符&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.oracle.com/cd/E19253-01/819-7051/tlib-89129/index.html"&gt;pthread_self&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;比较线程标识符&lt;/td&gt;
&lt;td&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_equal.txt"&gt;pthread_equal&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="基本操作-example"&gt;    基本操作 example&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt; 建立与终止
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_create.txt"&gt;pthread_create&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_exit.txt"&gt;pthread_exit&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;等待
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_join.txt"&gt;pthread_join&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//线程创建
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;thread&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread() entered with argument &amp;#39;%s&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;malloc&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;malloc() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;strcpy&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;This is a test&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_create&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;thread 1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_create() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_join&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_create() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread exited with &amp;#39;%s&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="n"&gt;threaddemo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;entered&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;exited&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;取消
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_cancel.txt"&gt;pthread_cancel&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//线程取消， 通过pthread_cancel 取消正在运行的线程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;thstatus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;thread&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread has started. now sleeping&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_create&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_create failed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_cancel&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_cancel failed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_join&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_join failed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread was cancelled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread was not cancelled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="n"&gt;threaddemo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cancel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="n"&gt;sleeping&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;cancelled&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt; 线程分离
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_detach.txt"&gt;pthread_detach&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 线程分离， 线程退出后自动释放资源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;thread&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread() entered with argument &amp;#39;%s&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;malloc&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;malloc() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;strcpy&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;This is a test&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_create&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;thread 1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_create() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_detach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_detach() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread exited with &amp;#39;%s&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="n"&gt;threaddemo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;detach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;entered&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;exited&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="n"&gt;threaddemo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;detach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;pthread_detach&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Success&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt; 获取线程标识符
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/cd/E19253-01/819-7051/tlib-89129/index.html"&gt;pthread_self&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;比较线程标识符
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_equal.txt"&gt;pthread_equal&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IPT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;thread&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_equal&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;the thread is the IPT...?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;the thread is not the IPT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;IPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pthread_self&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_create&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_create() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_join&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_create() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="n"&gt;threaddemo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;IPT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="n"&gt;threaddemo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="私有数据"&gt;私有数据&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;私有数据创建&lt;/th&gt;
&lt;th&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_key_create.txt"&gt;pthread_key_create&lt;/a&gt; &lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_key_delete.txt"&gt;pthread_key_delete&lt;/a&gt; &lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;私有数据使用  &lt;/td&gt;
&lt;td&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_setspecific.txt"&gt;pthread_setspecific&lt;/a&gt;    &lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_getspecific.txt"&gt;pthread_getspecific&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="私有数据-example"&gt;私有数据 example&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;私有数据创建
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_key_create.txt"&gt;pthread_key_create&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_key_delete.txt"&gt;pthread_key_delete&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;私有数据使用
&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_setspecific.txt"&gt;pthread_setspecific&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;  &lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_getspecific.txt"&gt;pthread_getspecific&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;span class="lnt"&gt;116
&lt;/span&gt;&lt;span class="lnt"&gt;117
&lt;/span&gt;&lt;span class="lnt"&gt;118
&lt;/span&gt;&lt;span class="lnt"&gt;119
&lt;/span&gt;&lt;span class="lnt"&gt;120
&lt;/span&gt;&lt;span class="lnt"&gt;121
&lt;/span&gt;&lt;span class="lnt"&gt;122
&lt;/span&gt;&lt;span class="lnt"&gt;123
&lt;/span&gt;&lt;span class="lnt"&gt;124
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#include &amp;lt;errno.h&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#include &amp;lt;pthread.h&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#define threads 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#define BUFFSZ 48&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pthread_key_t&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;threadfunc&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;parm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="n"&gt;threadnum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tnum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;getvalue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BUFFSZ&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tnum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;threadnum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tnum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Thread &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; executing&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threadnum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;malloc&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeof&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Thread &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; could not allocate storage, errno = &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;threadnum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errno&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sprintf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Thread &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; executing&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threadnum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pthread_setspecific&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pthread_setspecific failed, thread &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;, errno &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;threadnum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errno&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pthread_exit&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Thread &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; setspecific value: &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threadnum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;getvalue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;getvalue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pthread_getspecific&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pthread_getspecific failed, thread &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;, errno &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;threadnum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errno&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pthread_exit&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;key = &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getvalue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getvalue&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;getvalue not valid, getvalue=&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;getvalue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pthread_exit&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;68&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pthread_exit&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;void&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;destr_fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;parm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Destructor function invoked&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;free&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parm&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="n"&gt;getvalue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="n"&gt;threadparm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;threadid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="n"&gt;thread_stat&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pthread_key_create&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;destr_fn&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pthread_key_create failed, errno=&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errno&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;threadparm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pthread_create&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;threadid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threadfunc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;threadparm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pthread_create failed, errno=&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errno&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pthread_join&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;threadid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;thread_stat&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pthread_join failed, thread &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;, errno=&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errno&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thread_stat&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bad thread status, thread &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;, status=&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;thread_stat&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="n"&gt;threaddemo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# ./key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ne"&gt;Thread&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;executing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ne"&gt;Thread&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;executing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ne"&gt;Thread&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;setspecific&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1140848448&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ne"&gt;Thread&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;executing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ne"&gt;Thread&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;setspecific&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1275066176&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ne"&gt;Thread&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;executing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ne"&gt;Thread&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;executing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ne"&gt;Thread&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;setspecific&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1207957312&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ne"&gt;Thread&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;executing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Destructor&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;invoked&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Destructor&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;invoked&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Destructor&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;invoked&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 id="同步"&gt;同步：&lt;/h1&gt;
&lt;h2 id="互斥量"&gt;互斥量&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;互斥量创建与销毁&lt;/th&gt;
&lt;th&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_init.txt"&gt;pthread_mutex_init&lt;/a&gt; &lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_destroy.txt"&gt;pthread_mutex_destroy&lt;/a&gt; &lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;加锁解锁互斥量（阻塞）&lt;/td&gt;
&lt;td&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_lock.txt"&gt;pthread_mutex_lock&lt;/a&gt; &lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_unlock.txt"&gt;pthread_mutex_unlock&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;加锁解锁互斥量（非阻塞）&lt;/td&gt;
&lt;td&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_trylock.txt"&gt;pthread_mutex_trylock&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;互斥变量优先级上限&lt;/td&gt;
&lt;td&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_getprioceiling.txt"&gt;pthread_mutex_getprioceiling&lt;/a&gt; &lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_setprioceiling.txt"&gt;pthread_mutex_setprioceiling&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="互斥量-example"&gt;互斥量 example&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;互斥量创建与销毁：
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_init.txt"&gt;pthread_mutex_init&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_destroy.txt"&gt;pthread_mutex_destroy&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;加锁解锁互斥量（阻塞）
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_lock.txt"&gt;pthread_mutex_lock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_unlock.txt"&gt;pthread_mutex_unlock&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;## 阻塞模式 pthread_mutex_lock
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;pthread_mutex_t&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;thread&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_lock&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_lock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread was granted the mutex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_unlock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_init&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_init() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_create&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_create() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_lock&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_lock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;IPT was granted the mutex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_unlock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_join&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_trylock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_destroy() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="n"&gt;threaddemo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mutexb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;IPT&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;granted&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;granted&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;加锁解锁互斥量（非阻塞）
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_trylock.txt"&gt;pthread_mutex_trylock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&lt;/span&gt;&lt;span class="lnt"&gt;88
&lt;/span&gt;&lt;span class="lnt"&gt;89
&lt;/span&gt;&lt;span class="lnt"&gt;90
&lt;/span&gt;&lt;span class="lnt"&gt;91
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;### 非阻塞模式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;&lt;span class="kt"&gt;pthread_mutex_t&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;thread&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_trylock&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;EBUSY&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread was denied access to the mutex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sub pthread_mutex_trylock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sub thread can do other thing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;thread was granted the mutex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_unlock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_init&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_init() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_create&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_create() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_trylock&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;EBUSY&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;IPT was denied access to the mutex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;main pthread_mutex_trylock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;main thread can do other thing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;puts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;IPT was granted the mutex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_unlock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_join&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_trylock() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pthread_mutex_destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pthread_mutex_destroy() error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;centosgpt&lt;/span&gt; &lt;span class="n"&gt;threaddemo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;IPT&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;granted&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;denied&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;granted&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;互斥变量优先级上限
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_getprioceiling.txt"&gt;pthread_mutex_getprioceiling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_setprioceiling.txt"&gt;pthread_mutex_setprioceiling&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;依赖于互斥锁属性的协议的设置&lt;/p&gt;</description></item><item><title>insmod: ERROR: could not insert module *.ko: Unknown symbol in module</title><link>https://garlicspace.com/posts/insmod-error-could-not-insert-module-ko-unknown-symbol-in-module/</link><pubDate>Mon, 17 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/insmod-error-could-not-insert-module-ko-unknown-symbol-in-module/</guid><description>insmod: ERROR: could not insert module *.ko: Unknown symbol in module - 在实际编译运行 什么是RCU ：API 中的例子 rcu_examplehttps:/</description></item><item><title>LeetCode – Number of Islands</title><link>https://garlicspace.com/posts/leetcode-number-of-islands/</link><pubDate>Mon, 17 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-number-of-islands/</guid><description>&lt;h1 id="题目"&gt;题目：&lt;/h1&gt;
&lt;p&gt;Given a 2d grid map of &lt;code&gt;'1'&lt;/code&gt;s (land) and &lt;code&gt;'0'&lt;/code&gt;s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Input:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;11110
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;11010
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;11000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output: 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; 11000 11000 00100 00011 &lt;strong&gt;Output:&lt;/strong&gt; 3&lt;/p&gt;</description></item><item><title>什么是RCU ：API</title><link>https://garlicspace.com/posts/%E4%BB%80%E4%B9%88%E6%98%AFrcu-api/</link><pubDate>Sat, 15 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E4%BB%80%E4%B9%88%E6%98%AFrcu-api/</guid><description>什么是RCU ：API - 这篇文章 RCU part 3: the RCU API</description></item><item><title>LeetCode – Design Circular Queue</title><link>https://garlicspace.com/posts/leetcode-design-circular-queue/</link><pubDate>Fri, 14 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-design-circular-queue/</guid><description>&lt;h2 id="题目"&gt;题目：&lt;/h2&gt;
&lt;p&gt;Design your implementation of the circular queue. The circular queue is a linear data structure in which the operations are performed based on FIFO (First In First Out) principle and the last position is connected back to the first position to make a circle. It is also called &amp;ldquo;Ring Buffer&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;One of the benefits of the circular queue is that we can make use of the spaces in front of the queue. In a normal queue, once the queue becomes full, we cannot insert the next element even if there is a space in front of the queue. But using the circular queue, we can use the space to store new values.&lt;/p&gt;</description></item><item><title>shell16进制hex和10进制转换</title><link>https://garlicspace.com/posts/shell16%E8%BF%9B%E5%88%B6hex%E5%92%8C10%E8%BF%9B%E5%88%B6%E8%BD%AC%E6%8D%A2/</link><pubDate>Fri, 14 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/shell16%E8%BF%9B%E5%88%B6hex%E5%92%8C10%E8%BF%9B%E5%88%B6%E8%BD%AC%E6%8D%A2/</guid><description>&lt;h1 id="方法"&gt;方法：&lt;/h1&gt;
&lt;h2 id="1-bc命令"&gt;1  bc命令&lt;/h2&gt;
&lt;p&gt;[root@centosgpt ~]# echo &amp;ldquo;ibase=16; FF&amp;rdquo; |bc 255&lt;/p&gt;
&lt;h2 id="2-bash"&gt;2.  bash&lt;/h2&gt;
&lt;p&gt;[root@centosgpt ~]# echo $((0xFF)) 255&lt;/p&gt;
&lt;h2 id="3-printf"&gt;3.  printf&lt;/h2&gt;
&lt;p&gt;[root@centosgpt ~]# printf &amp;ldquo;%d\n&amp;rdquo; 0xFF 255&lt;/p&gt;
&lt;h2 id="4-dc"&gt;4. dc&lt;/h2&gt;
&lt;p&gt;[root@centosgpt ~]# dc -e &amp;lsquo;16i FF p&amp;rsquo; 255&lt;/p&gt;
&lt;h1 id="限制"&gt;限制：&lt;/h1&gt;
&lt;p&gt;其中bc，dc 可以不受整数位数限制  如：64-bit integer limit of 2^64， 当大于64位时验证下各个脚本的处理结果&lt;/p&gt;
&lt;h2 id="1-bc"&gt;1 bc&lt;/h2&gt;
&lt;p&gt;[root@centosgpt ~]# echo &amp;ldquo;ibase=16; 7FFFFFFFFFFFFFFFF&amp;rdquo; |bc 147573952589676412927&lt;/p&gt;
&lt;h2 id="2-echo"&gt;2 echo&lt;/h2&gt;
&lt;p&gt;[root@centosgpt ~]# echo $((0x7FFFFFFFFFFFFFFFF)) -1&lt;/p&gt;
&lt;h2 id="3-printf-1"&gt;3. printf&lt;/h2&gt;
&lt;p&gt;[root@centosgpt ~]# printf &amp;ldquo;%ld\n&amp;rdquo; 0x7FFFFFFFFFFFFFFFF -bash: printf: warning: 0x7FFFFFFFFFFFFFFFF: Numerical result out of range 9223372036854775807&lt;/p&gt;</description></item><item><title>什么是RCU：用法</title><link>https://garlicspace.com/posts/%E4%BB%80%E4%B9%88%E6%98%AFrcu%E7%94%A8%E6%B3%95/</link><pubDate>Wed, 12 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E4%BB%80%E4%B9%88%E6%98%AFrcu%E7%94%A8%E6%B3%95/</guid><description>什么是RCU：用法 - 这篇文章 What is RCU? Part 2: Usage</description></item><item><title>ELF 文件格式分析</title><link>https://garlicspace.com/posts/elf-%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E5%88%86%E6%9E%90/</link><pubDate>Tue, 11 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/elf-%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E5%88%86%E6%9E%90/</guid><description>ELF 文件格式分析 - ELF： Executable and Linkable Format</description></item><item><title>Vmware + Centos7 + NAT 方式连接公网</title><link>https://garlicspace.com/posts/vmware-centos7-nat-%E6%96%B9%E5%BC%8F%E8%BF%9E%E6%8E%A5%E5%85%AC%E7%BD%91/</link><pubDate>Thu, 06 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/vmware-centos7-nat-%E6%96%B9%E5%BC%8F%E8%BF%9E%E6%8E%A5%E5%85%AC%E7%BD%91/</guid><description>Vmware + Centos7 + NAT 方式连接公网 - 使用gdb调试时， Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7.x86_64， 需要虚拟机联网更新。</description></item><item><title>LeetCode – Rotate List</title><link>https://garlicspace.com/posts/leetcode-rotate-list/</link><pubDate>Mon, 03 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-rotate-list/</guid><description>&lt;h2 id="题目"&gt;题目：&lt;/h2&gt;
&lt;p&gt;Given a linked list, rotate the list to the right by &lt;em&gt;k&lt;/em&gt; places, where &lt;em&gt;k&lt;/em&gt; is non-negative.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Input: 1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5-&amp;gt;NULL, k = 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output: 4-&amp;gt;5-&amp;gt;1-&amp;gt;2-&amp;gt;3-&amp;gt;NULL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rotate 1 steps to the right: 5-&amp;gt;1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;NULL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rotate 2 steps to the right: 4-&amp;gt;5-&amp;gt;1-&amp;gt;2-&amp;gt;3-&amp;gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; 0-&amp;gt;1-&amp;gt;2-&amp;gt;NULL, k = 4
&lt;strong&gt;Output:&lt;/strong&gt; &lt;code&gt;2-&amp;gt;0-&amp;gt;1-&amp;gt;NULL&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;br&gt;
rotate 1 steps to the right: 2-&amp;gt;0-&amp;gt;1-&amp;gt;NULL&lt;br&gt;
rotate 2 steps to the right: 1-&amp;gt;2-&amp;gt;0-&amp;gt;NULL&lt;br&gt;
rotate 3 steps to the right: &lt;code&gt;0-&amp;gt;1-&amp;gt;2-&amp;gt;NULL&lt;/code&gt;&lt;br&gt;
rotate 4 steps to the right: &lt;code&gt;2-&amp;gt;0-&amp;gt;1-&amp;gt;NULL&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Linux下实现一个系统调用</title><link>https://garlicspace.com/posts/linux%E4%B8%8B%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8/</link><pubDate>Sun, 02 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E4%B8%8B%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8/</guid><description>Linux下实现一个系统调用 - 环境： cenos7</description></item><item><title>什么是RCU</title><link>https://garlicspace.com/posts/%E4%BB%80%E4%B9%88%E6%98%AFrcu/</link><pubDate>Sun, 02 Jun 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E4%BB%80%E4%B9%88%E6%98%AFrcu/</guid><description>什么是RCU - 这篇文章What is RCU, Fundamentally?</description></item><item><title>ORA-01795, limit on in clause</title><link>https://garlicspace.com/posts/ora-01795-limit-on-in-clause/</link><pubDate>Wed, 29 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/ora-01795-limit-on-in-clause/</guid><description>&lt;h2 id="遇到问题"&gt;遇到问题:&lt;/h2&gt;
&lt;p&gt;        实施过程中 oracle 报错 ORA-01795, limit on in clause， 发现是SQL  IN 语句中的条件从ZZ表中拼接而成。 &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT *
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM T1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WHERE T1.VAL in (&amp;#39;1111&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;2222&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ... more than 1000 here
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; );&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="相关调整方案"&gt;相关调整方案:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-- 1 子查询1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM T1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WHERE T1. VAL IN (
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SELECT VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FROM T2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-- 2. 子查询2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM (
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SELECT DISTINCT VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FROM T2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ) B
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WHERE B.VAL=A.VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-- 3. JOIN
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM (
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SELECT DISTINCT VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FROM T2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ) B
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;JOIN A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ON B.VAL=A.VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-- 4. EXISTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM T1 A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WHERE EXISTS (
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SELECT 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FROM T2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WHERE A.VAL=VAL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; );&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 id="使用in还是exists"&gt;使用IN还是EXISTS &lt;/h1&gt;
&lt;p&gt;以下引用oracle  ASK TOM 中描述：   &lt;/p&gt;</description></item><item><title>LeetCode-Copy List with Random Pointer</title><link>https://garlicspace.com/posts/leetcode-copy-list-with-random-pointer/</link><pubDate>Tue, 28 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-copy-list-with-random-pointer/</guid><description>LeetCode-Copy List with Random Pointer - A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null</description></item><item><title>linux内核中的进程列表</title><link>https://garlicspace.com/posts/linux%E5%86%85%E6%A0%B8%E8%BF%9B%E7%A8%8B%E5%88%97%E8%A1%A8%E5%AE%9E%E7%8E%B0/</link><pubDate>Sun, 26 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux%E5%86%85%E6%A0%B8%E8%BF%9B%E7%A8%8B%E5%88%97%E8%A1%A8%E5%AE%9E%E7%8E%B0/</guid><description>linux内核中的进程列表 - /include/linux/types.hstruct list_head { struct list_head *next, *prev; };与响应的结构组成双向链表。</description></item><item><title>Netflix Blog- Netflix Python技术的使用</title><link>https://garlicspace.com/posts/netflix-blog-netflix-python%E6%8A%80%E6%9C%AF%E7%9A%84%E4%BD%BF%E7%94%A8/</link><pubDate>Tue, 21 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/netflix-blog-netflix-python%E6%8A%80%E6%9C%AF%E7%9A%84%E4%BD%BF%E7%94%A8/</guid><description>Netflix Blog- Netflix Python技术的使用 - 这篇文章 Python at Netflix 是出自 Netflix Technology Blog</description></item><item><title>LeetCode – Flatten a Multilevel Doubly Linked List</title><link>https://garlicspace.com/posts/leetcode-flatten-a-multilevel-doubly-linked-list/</link><pubDate>Mon, 20 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-flatten-a-multilevel-doubly-linked-list/</guid><description>&lt;h2 id="题目"&gt;题目：&lt;/h2&gt;
&lt;p&gt;You are given a doubly linked list which in addition to the next and previous pointers, it could have a child pointer, which may or may not point to a separate doubly linked list. These child lists may have one or more children of their own, and so on, to produce a multilevel data structure, as shown in the example below.&lt;/p&gt;
&lt;p&gt;Flatten the list so that all the nodes appear in a single-level, doubly linked list. You are given the head of the first level of the list.&lt;/p&gt;</description></item><item><title>python多线程方式扫描开放端口</title><link>https://garlicspace.com/posts/%E6%89%AB%E6%8F%8F%E7%AB%AF%E5%8F%A3python%E5%AE%9E%E7%8E%B0/</link><pubDate>Mon, 20 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%89%AB%E6%8F%8F%E7%AB%AF%E5%8F%A3python%E5%AE%9E%E7%8E%B0/</guid><description>&lt;p&gt;使用python多线程方式扫描某台机器开放端口&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import socket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import time
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import threading
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from queue import Queue
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;socket.setdefaulttimeout(0.25)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print_lock = threading.Lock()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;target = &amp;#39;127.0.0.1&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def portscan(port):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; try:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; con = s.connect_ex((target,port))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if con == 0:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; with print_lock:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#39;port&amp;#39;, port, &amp;#39;is open&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; con.close()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; except:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pass
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def threader():
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; while True:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; worker = q.get()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; portscan(worker)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; q.task_done()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;q = Queue()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;startTime = time.time()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;for x in range(1000):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; t = threading.Thread(target=threader)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; t.daemon = True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; t.start()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;for worker in range(1,65536):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; q.put(worker)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;q.join()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(&amp;#39;Time taken:&amp;#39;, time.time()-startTime)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;参考：&lt;/p&gt;</description></item><item><title>Netflix Blog-关于SVT-AV1</title><link>https://garlicspace.com/posts/%E5%85%B3%E4%BA%8Esvt-av1/</link><pubDate>Sun, 19 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%85%B3%E4%BA%8Esvt-av1/</guid><description>&lt;p&gt;这篇文章 &lt;a href="https://medium.com/netflix-techblog/introducing-svt-av1-a-scalable-open-source-av1-framework-c726cce3103a"&gt;Introducing SVT-AV1: a scalable open-source AV1 framework&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;是出自 &lt;a href="https://medium.com/@NetflixTechBlog"&gt;Netflix Technology Blog&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="svt-av1是什么-"&gt;SVT-AV1是什么 ？&lt;/h2&gt;
&lt;p&gt;      SVT-AV1是2019年4月8日， Intel与Netflix合作开发的视频软件解码器，SVT Scalable Video Technology 是Intel的开源框架，Visual Cloud(视觉云)开发技术人员提供高性能的视频编码库。 &lt;/p&gt;
&lt;h2 id="视频标准历史"&gt;视频标准历史&lt;/h2&gt;
&lt;p&gt;      视频压缩标准两大组织： ITU-T and MPEG (ISO)，  第一个成功的数字视频标准MPEG-2， 之后有 H.264/AVC是现代设备普遍支持的标准。&lt;/p&gt;
&lt;p&gt;      一些公司开发标准如Microsoft’s VC-1 and Google’s VPx  。&lt;/p&gt;
&lt;p&gt;     AOM（the Alliance for Open Media）意在生成一个先进的， 免税的视频解码器。 包括,Amazon, Apple, ARM, Cisco, Facebook, Google, IBM, Intel, Microsoft, Mozilla, Netflix, Nvidia, and Samsung, AOM在2018年发布了为AV1 解码器规范。&lt;/p&gt;
&lt;p&gt;     （对应的 ITU-T and MPEG组织退出了 HEVC（H.265， MEPG-H part2）， 这个还是收税的）&lt;/p&gt;
&lt;h2 id="av1编码器工具"&gt;AV1编码器工具&lt;/h2&gt;
&lt;p&gt;    libaom 目前是基于VP9，VP8基础上开发， 再google的git上通过AOM成员维护。&lt;/p&gt;
&lt;p&gt;    rav1e ：open-source AV1 不过是用Rust语言编写的。 &lt;/p&gt;</description></item><item><title>查看Linux分区和硬盘空间命令</title><link>https://garlicspace.com/posts/%E6%9F%A5%E7%9C%8Blinux%E5%88%86%E5%8C%BA%E5%92%8C%E7%A1%AC%E7%9B%98%E7%A9%BA%E9%97%B4%E5%91%BD%E4%BB%A4/</link><pubDate>Sat, 18 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%9F%A5%E7%9C%8Blinux%E5%88%86%E5%8C%BA%E5%92%8C%E7%A1%AC%E7%9B%98%E7%A9%BA%E9%97%B4%E5%91%BD%E4%BB%A4/</guid><description>查看Linux分区和硬盘空间命令 - 常用的硬盘分区及空间信息查看命令</description></item><item><title>grub2 配置centos7，ubuntu</title><link>https://garlicspace.com/posts/grub2-%E9%85%8D%E7%BD%AEcentos7ubuntu/</link><pubDate>Thu, 16 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/grub2-%E9%85%8D%E7%BD%AEcentos7ubuntu/</guid><description>grub2 配置centos7，ubuntu - 1. VMWARE 安装centos7 ， 参考鸟哥私房菜第三章</description></item><item><title>Blockchain</title><link>https://garlicspace.com/blockchain/</link><pubDate>Sun, 12 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/blockchain/</guid><description/></item><item><title>LeetCode - Merge Two Sorted Lists</title><link>https://garlicspace.com/posts/leetcode-merge-two-sorted-lists/</link><pubDate>Sun, 12 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-merge-two-sorted-lists/</guid><description>&lt;h2 id="题目"&gt;题目：&lt;/h2&gt;
&lt;p&gt;Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; 1-&amp;gt;2-&amp;gt;4, 1-&amp;gt;3-&amp;gt;4 &lt;strong&gt;Output:&lt;/strong&gt; 1-&amp;gt;1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;4&lt;/p&gt;
&lt;h2 id="解题"&gt;解题：&lt;/h2&gt;
&lt;p&gt;        新申请哨兵节点重组新的链表返回 。 比较两个链表选择较小的接入新链表，对于较长的链表，将其剩余部分接到新链表的尾部。&lt;/p&gt;
&lt;h2 id="实现"&gt;实现：&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; struct ListNode* result = (struct ListNode *)malloc(sizeof(struct ListNode) );
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (result == NULL){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return NULL;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; result-&amp;gt;next = NULL;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; struct ListNode* l3 = result;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; while(l1!=NULL &amp;amp;&amp;amp; l2!=NULL){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (l1-&amp;gt;val&amp;lt;l2-&amp;gt;val){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; l3-&amp;gt;next = l1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; l1= l1-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; l3= l3-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }else{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; l3-&amp;gt;next = l2;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; l2= l2-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; l3= l3-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (l1!=NULL){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; l3-&amp;gt;next = l1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else if (l2!=NULL){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; l3-&amp;gt;next = l2;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return result-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;递归方式：比较两个链表当前节点较小节点，这个结点的next节点与另外一个链表的当前节点比较，更新next节点。终止条件，如果一个节点为空，则返回另外一个节点。&lt;/p&gt;</description></item><item><title>LeetCode – Add Two Numbers</title><link>https://garlicspace.com/posts/leetcode-add-two-numbers/</link><pubDate>Sun, 12 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-add-two-numbers/</guid><description>LeetCode – Add Two Numbers - You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes</description></item><item><title>gethostbyname函数实现分析</title><link>https://garlicspace.com/posts/gethostbyname%E5%87%BD%E6%95%B0%E5%AE%9E%E7%8E%B0%E5%88%86%E6%9E%90/</link><pubDate>Sat, 11 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/gethostbyname%E5%87%BD%E6%95%B0%E5%AE%9E%E7%8E%B0%E5%88%86%E6%9E%90/</guid><description>gethostbyname函数实现分析 - DNS是一个分层级 （hierarchical ），分布式（decentralized）的网络数据库，完成主机名称和IP地址之间的相互映射。DNS名称空间包含一个树状结构，树根没有命名， 下面是树的最高层为顶级域名， 顶级域名包括： 顶级域名（gTLD），国家代码顶级域名（ccTLD）， 国际化国家设施顶级域名（i</description></item><item><title>Netflix Blog - Tips for High Availability Spinnaker介绍</title><link>https://garlicspace.com/posts/netfllix-blog-tips-for-high-availability-spinnaker%E4%BB%8B%E7%BB%8D/</link><pubDate>Sat, 11 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/netfllix-blog-tips-for-high-availability-spinnaker%E4%BB%8B%E7%BB%8D/</guid><description>Netflix Blog - Tips for High Availability Spinnaker介绍 - 这篇文章Tips for High Availability 是出自 Netflix</description></item><item><title>shell中的 2&gt;&amp;1</title><link>https://garlicspace.com/posts/shell%E4%B8%AD%E7%9A%84-21/</link><pubDate>Sat, 11 May 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/shell%E4%B8%AD%E7%9A%84-21/</guid><description>shell中的 2&amp;gt;&amp;amp;1 - strace跟踪应用程序时，有标准输出和错误输出，需要将程序执行的输出标准输出和错误输出重定向到一个日志文件中。</description></item><item><title>LeetCode - Design Linked List</title><link>https://garlicspace.com/posts/leetcode-design-linked-list/</link><pubDate>Tue, 30 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-design-linked-list/</guid><description>LeetCode - Design Linked List - Photo by Tim Swaan on Unsplash</description></item><item><title>编程规范问题导致SIGCLD 屏蔽失效</title><link>https://garlicspace.com/posts/sigcld-%E4%BF%A1%E5%8F%B7/</link><pubDate>Tue, 30 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/sigcld-%E4%BF%A1%E5%8F%B7/</guid><description>编程规范问题导致SIGCLD 屏蔽失效 - 进程出现&amp;lt;defunct&amp;gt;状态进程，（zombie process ）。对于创建多进程的场景， 子进程状态改变产生此信号， 对SIGCLD信号处理不当，会导致僵尸进程。</description></item><item><title>linux 使用chage 设置密码永不过期</title><link>https://garlicspace.com/posts/linux-%E4%BD%BF%E7%94%A8chage-%E8%AE%BE%E7%BD%AE%E5%AF%86%E7%A0%81%E7%94%A8%E8%BF%87%E6%9C%9F/</link><pubDate>Sun, 28 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/linux-%E4%BD%BF%E7%94%A8chage-%E8%AE%BE%E7%BD%AE%E5%AF%86%E7%A0%81%E7%94%A8%E8%BF%87%E6%9C%9F/</guid><description>linux 使用chage 设置密码永不过期 - vmware安装的虚拟机， 今天登录忽然提示“You must change your password now and login again!”， 密码过期了， 我登录设置了ssh免密登录， 输入原始密码，输入新密码后解决。修改成功登录后看了下，密码有效期60天。 通过chage 修改应用用户密码永不过期</description></item><item><title>ramfs, rootfs and initramfs</title><link>https://garlicspace.com/posts/ramfs-rootfs-and-initramfs/</link><pubDate>Sun, 28 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/ramfs-rootfs-and-initramfs/</guid><description>ramfs, rootfs and initramfs - 查找initramfs资料的时候看到了这篇文章 ramfs-rootfs-initramfs.txt，</description></item><item><title>LeetCode - Palindrome Linked List</title><link>https://garlicspace.com/posts/leetcode-palindrome-linked-list/</link><pubDate>Sat, 27 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-palindrome-linked-list/</guid><description>&lt;p&gt;Given a singly linked list, determine if it is a palindrome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Input: 1-&amp;gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output: false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Input: 1-&amp;gt;2-&amp;gt;2-&amp;gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output: true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Follow up:&lt;/strong&gt;&lt;br&gt;
Could you do it in O(n) time and O(1) space?&lt;/p&gt;
&lt;h2 id="解题"&gt;解题：&lt;/h2&gt;
&lt;p&gt;找到中间节点后反转判断节点回文&lt;/p&gt;
&lt;h2 id="实现"&gt;实现：&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * Definition for singly-linked list.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * struct ListNode {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * int val;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * struct ListNode *next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * };
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bool isPalindrome(struct ListNode* head){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (head == NULL || head-&amp;gt;next == NULL) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return true;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; struct ListNode* slow=head;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; struct ListNode* fast=head;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; struct ListNode* pre=NULL;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; struct ListNode* next=NULL;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //get middle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; while( fast!=NULL &amp;amp;&amp;amp; fast-&amp;gt;next!=NULL){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; slow = slow-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fast = fast-&amp;gt;next-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if(fast) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; slow=slow-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; struct ListNode* cur=slow;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //and reverse
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; while(cur!=NULL){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pre = cur;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cur = cur-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pre-&amp;gt;next = next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; next = pre;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //compare
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cur = head;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; while(pre!=NULL){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //printf(&amp;#34;%d %d\n&amp;#34;, head-&amp;gt;val, pre-&amp;gt;val);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (cur-&amp;gt;val != pre-&amp;gt;val){
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return false;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cur=cur-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pre= pre-&amp;gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return true;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>关于鸟哥是如何解开 initramfs 的：）</title><link>https://garlicspace.com/posts/%E5%85%B3%E4%BA%8E%E9%B8%9F%E5%93%A5%E6%98%AF%E5%A6%82%E4%BD%95%E8%A7%A3%E5%BC%80-initramfs-%E7%9A%84/</link><pubDate>Fri, 26 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E5%85%B3%E4%BA%8E%E9%B8%9F%E5%93%A5%E6%98%AF%E5%A6%82%E4%BD%95%E8%A7%A3%E5%BC%80-initramfs-%E7%9A%84/</guid><description>关于鸟哥是如何解开 initramfs 的：） - 鸟哥解析 CentOS 7.x 的initramfs 档案内容 文章内容时， 主要疑问是为什么使用的是512bytes去算 “initramfs 档案的前置字元容量 ”的大小</description></item><item><title>initramfs 解压方法</title><link>https://garlicspace.com/posts/initramfs-%E8%A7%A3%E5%8E%8B/</link><pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/initramfs-%E8%A7%A3%E5%8E%8B/</guid><description>initramfs 解压方法 - 最近在学习 _鸟哥私房菜第19章_，文章在分析Boot Loader 过程中， 提到到了虚拟档案系统Initial RAM Disk或Initial RAM Filesys</description></item><item><title>LeetCode - Find Pivot Index</title><link>https://garlicspace.com/posts/leetcode-find-pivot-index/</link><pubDate>Mon, 22 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/leetcode-find-pivot-index/</guid><description>&lt;h2 id="题目"&gt;题目：&lt;/h2&gt;
&lt;p&gt;Given an array of integers &lt;code&gt;nums&lt;/code&gt;, write a method that returns the &amp;ldquo;pivot&amp;rdquo; index of this array.&lt;/p&gt;
&lt;p&gt;We define the pivot index as the index where the sum of the numbers to the left of the index is equal to the sum of the numbers to the right of the index.&lt;/p&gt;
&lt;p&gt;If no such index exists, we should return -1. If there are multiple pivot indexes, you should return the left-most pivot index.&lt;/p&gt;</description></item><item><title>提升编程技巧的关键</title><link>https://garlicspace.com/posts/%E6%8F%90%E5%8D%87%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7%E7%9A%84%E5%85%B3%E9%94%AE/</link><pubDate>Mon, 22 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/posts/%E6%8F%90%E5%8D%87%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7%E7%9A%84%E5%85%B3%E9%94%AE/</guid><description>提升编程技巧的关键 - 这篇文章 The Key To Accelerating Your Coding Skills， 是皓哥推荐的文章。</description></item><item><title>About</title><link>https://garlicspace.com/about-2/</link><pubDate>Sun, 21 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/about-2/</guid><description>&lt;p&gt;我是garlic , 站点建设中。。。&lt;/p&gt;</description></item><item><title>ARTS</title><link>https://garlicspace.com/arts/</link><pubDate>Sun, 21 Apr 2019 00:00:00 +0000</pubDate><guid>https://garlicspace.com/arts/</guid><description/></item><item><title>Home</title><link>https://garlicspace.com/homepage/</link><pubDate>Thu, 08 Sep 2016 00:00:00 +0000</pubDate><guid>https://garlicspace.com/homepage/</guid><description>&lt;p&gt;[siteorigin_widget class=&amp;ldquo;Athemes_Blog&amp;rdquo;][/siteorigin_widget]&lt;/p&gt;</description></item></channel></rss>