<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Think in Hualet</title>
		<link>https://www.hualet.org/</link>
		<description>Recent content on Think in Hualet</description>
		<generator>Hugo</generator>
		<language>zh</language>
		
		
		
		
			<lastBuildDate>Sat, 05 Sep 2026 19:55:00 +0800</lastBuildDate>
		
			<atom:link href="https://www.hualet.org/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>跟 Kimi 一起实战学习 TPM</title>
				<link>https://www.hualet.org/posts/learning-tpm/</link>
				<pubDate>Sat, 05 Sep 2026 19:55:00 +0800</pubDate>
				<guid>https://www.hualet.org/posts/learning-tpm/</guid>
				<description>&lt;p&gt;一直说要系统学习一下 TPM，自己也上手试试所谓可信计算是怎么玩儿的。&lt;/p&gt;&#xA;&lt;p&gt;今天下午终于得空，零碎时间跟 Kimi 学了一下午 TPM。它设计的路子挺对我胃口：先简单讲讲概念，然后马上让我在虚拟机里动手——亲手 extend 一下 PCR、把秘密封进 TPM 再故意&amp;quot;搞破坏&amp;quot;看着它解不开，比啃十遍规范都管用。最后还真把 LUKS 全盘加密绑到 TPM 上了，开机不用输密码，舒服。&lt;/p&gt;&#xA;&lt;p&gt;怕过阵子就忘干净，顺手让它把这一下午的过程整理成了一本小书：&lt;a href=&#34;https://hualet.org/tpm_study/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;《TPM 入门实战》&lt;/a&gt;（源码在 &lt;a href=&#34;https://github.com/hualet/tpm_study&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub&lt;/a&gt;）。主要是给以后的自己翻的，有兴趣的朋友也欢迎看看、挑挑错。顶部菜单加了入口。&lt;/p&gt;</description>
			</item>
			<item>
				<title>阅读《AI Agents in Depth》有感</title>
				<link>https://www.hualet.org/posts/ai_agents_in_depth/</link>
				<pubDate>Sun, 16 Aug 2026 23:38:32 +0800</pubDate>
				<guid>https://www.hualet.org/posts/ai_agents_in_depth/</guid>
				<description>&lt;p&gt;前几周在刷 X/Twitter 的时候，看见李博杰在推自己的新书《AI Agents in Depth》。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2026/08/libojie.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;本来不是特别想入坑，因为之前看过一些 Agent 研发相关的教程，觉得对于上下文工程、工具、Agent Loop 等都有一定的认识，现在还没有到复习功课的时候。但是，看了一眼目录以后还是被吸引了：除了常见的构建 Agent 的知识，章节里面还有 Agent 评估、多模态与实时交互、Agent 的持续进化等我自己比较感兴趣、还在研究的内容，也就不知不觉入坑看了起来，甚至还推荐给了同事。&lt;/p&gt;&#xA;&lt;p&gt;今天看完了。书里的技术内容这里就不复述了，想看干货的可以直接去读原书；这篇只写几点感悟：这本书的作者是怎样一个人、它怎么让我对&amp;quot;动手&amp;quot;这件事有了新的理解，以及为什么我觉得你也该翻一翻。&lt;/p&gt;&#xA;&lt;h2 id=&#34;这本书值得翻一翻&#34;&gt;&#xA;  这本书值得翻一翻&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%bf%99%e6%9c%ac%e4%b9%a6%e5%80%bc%e5%be%97%e7%bf%bb%e4%b8%80%e7%bf%bb&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;先回答一个问题：Agent 教程看了一堆，这本书还有什么可看的？&lt;/p&gt;&#xA;&lt;p&gt;对我来说，一是它讲了教程很少覆盖的&amp;quot;下半场&amp;quot;。至少在我看过的资料里，大多止步于把上下文工程、工具、Agent Loop 讲清楚，而 Agent 评估、多模态与实时交互、Agent 的持续进化这些真正决定能不能产品化的内容，很少被系统地讲过——这几个恰好是我在折腾的课题，所以目录一眼就把我勾住了。&lt;/p&gt;&#xA;&lt;p&gt;二是它是工程和研究双料的。书里不仅包含 Agent 构建工程方面的内容，还有大量关于 AI/LLM/Agent 的前沿研究内容，两者结合起来娓娓道来，读起来既知道怎么做，也知道为什么。&lt;/p&gt;&#xA;&lt;p&gt;适合谁读呢？我觉得是像几周前的我这样，做过一点 Agent 开发、自觉&amp;quot;上下文工程、工具、Loop 都了解了&amp;quot;的人——这本书会告诉你，水位比你想的高。&lt;/p&gt;&#xA;&lt;h2 id=&#34;天才是怎么炼成的&#34;&gt;&#xA;  天才是怎么炼成的&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%a4%a9%e6%89%8d%e6%98%af%e6%80%8e%e4%b9%88%e7%82%bc%e6%88%90%e7%9a%84&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;恕我孤陋寡闻，知道李博杰还是因为他在 Twitter/X 上炮轰 DeepSeek 的面试流程，后来就开始关注他的动态，直到读了这本书，我可能才对他为什么叫天才少年有了一定的感知。后来我了解到，他的专业其实主要是在网络系统而不是人工智能，半路出家还能快速达到这种水平，我只能表示 orz 了。&lt;/p&gt;&#xA;&lt;p&gt;上一个能给我这种感觉的还是季逸超：做研究而不木讷，做技术还非常有产品思维……遂我一直有个疑问，他们到底是怎么做到的，一方面在领域内有深刻的认知，另外一方面仿佛半个圈子（夸张）都是他们的好友。所以我问了 Kimi，它给的答案比网上大部分&amp;quot;天才论&amp;quot;都有意思，概括起来是三点：&lt;/p&gt;&#xA;&lt;p&gt;一是完整闭环的经验都在极早期就建立了。季逸超高中时一个人完成猛犸浏览器，后来又打造了Magi 知识图谱搜索引擎等；李博杰博士期间从问题定义到系统实现到论文写作全程自己扛。闭环经验让人对&amp;quot;一个东西从想法到落地&amp;quot;的每个环节有直觉——所谓横跨领域，本质是抽象能力在多个领域的复用。&lt;/p&gt;&#xA;&lt;p&gt;二是理论永远被真实问题驱动。季逸超做搜索引擎才去啃信息检索和知识图谱；李博杰在华为做训练基础设施和灵衢 UB 互联架构，被逼着同时懂分布式系统、网络协议、编译器和硬件，知识体系是&amp;quot;垂直贯通&amp;quot;的：从应用层 Agent 到框架到互联协议到芯片，每一层都亲手做过。&lt;/p&gt;&#xA;&lt;p&gt;三是逆共识下注，靠判断而非跟风。李博杰两次职业选择都是逆势：2025 年大家追预训练时他去做 Agent 应用，2026 年 Agent 最热时他转向基础模型。&lt;/p&gt;</description>
			</item>
			<item>
				<title>首富世界上最大的打工仔？</title>
				<link>https://www.hualet.org/posts/musk_worker/</link>
				<pubDate>Sat, 04 Jul 2026 21:51:46 +0800</pubDate>
				<guid>https://www.hualet.org/posts/musk_worker/</guid>
				<description>&lt;p&gt;马斯克的身价过万亿，但这里面几乎没有现金，绝大部分是股票。&lt;/p&gt;&#xA;&lt;p&gt;股票的本质是什么？是千千万万投资人，用手里的钱为他“投票”，把资源交给他，押注他能为世界创造新的价值和财富。顺着这个逻辑往深里想，这位坐拥万亿身家的首富，本质上更像是一个替资本打工的人——世界上头号“打工人”。&lt;/p&gt;&#xA;&lt;p&gt;可是，&lt;/p&gt;&#xA;&lt;p&gt;从财务上看，尽管是股民们用真金白银撑起了天价市值，但他们持股极其分散。公司每增值一百块，就有可观的一大部分直接落入马斯克个人的口袋，散户们只是跟着喝一口汤。&lt;/p&gt;&#xA;&lt;p&gt;从权力上看，全球投资者用脚投票，一美元一张票，硬生生把马斯克选成了这个星球上最有权势的人物之一。他能调动的资源、能影响的产业乃至公共议程，早已超过许多主权国家。&lt;/p&gt;&#xA;&lt;p&gt;有趣的是，这不是一人一票的政治民主，却是一种极其赤裸、高效且现实的“资本民主”——它不选政客，只选最能征服物理世界、创造财富的代理者。&lt;/p&gt;</description>
			</item>
			<item>
				<title>为什么大部分人注定平庸</title>
				<link>https://www.hualet.org/posts/why_are_most_people_ordinary/</link>
				<pubDate>Sun, 24 May 2026 09:47:47 +0800</pubDate>
				<guid>https://www.hualet.org/posts/why_are_most_people_ordinary/</guid>
				<description>&lt;p&gt;最近在重读《成为乔布斯》这本书，终于在昨天读完了。&lt;/p&gt;&#xA;&lt;p&gt;第一次读这本书还是我在上大学的时候，这本书刚出版，还没有正式的中译版。刚好我在准备英语六级考试，不想背单词过于枯燥，就打印了这本书的英文版，每天啃几页，一边看书、一边记单词和锻炼阅读理解。效果果然还不错，六级顺利通过，但是这本书的精髓对于那时候的我来说，要理解透还是太难了。&lt;/p&gt;&#xA;&lt;p&gt;最近重新拿起来读，一方面是最近苹果换帅，回顾一下苹果历史；另外一方面我隐隐觉得在 AI 重塑软件行业的时代，苹果公司的 专注、重视设计和体验、追求极致、软硬结合的产品文化，含金量还会持续上升，需要时不时拿出来鞭策一下自己。&lt;/p&gt;&#xA;&lt;p&gt;在看这本书的过程中，突然一直有个疑问萦绕在我的心头：为什么大部分人注定平庸？&lt;/p&gt;&#xA;&lt;h2 id=&#34;志向&#34;&gt;&#xA;  志向&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%bf%97%e5%90%91&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;大学的时候看了不少电影，其中有一部叫《硅谷传奇》、另外一部叫《社交网络》，前者讲的是个人电脑革命、苹果和微软的诞生以及爱恨情仇，后者讲的是社交网络巨头 Facebook 的诞生。加上当时社会风气鼓励双创（大众创业、万众创新）、移动互联网浪潮高潮迭起，自然也是心潮澎湃，内心种下了一颗创业的种子。&lt;/p&gt;&#xA;&lt;p&gt;虽然后来因为各种主观和客观的因素，没有踏出创业那一步，但是跟随着 deepin/UOS 实际上也一直是创业的心态。我从来没有想过某一天我会只是打一份工，当一天和尚撞一天钟。所以技术上从来没有考虑过不再持续学习。跨界到产品，也没有只是空指挥，而是学习产品的思维、方法，坚持思考和迭代自己。后来做管理比较多，在哪里跌倒就在哪里爬起来——坚持给团队一个相对好的氛围、对人员保持高的要求、尽量保持透明和扁平，希望朝着一个伟大的组织迈进。&lt;/p&gt;&#xA;&lt;p&gt;直到最近几年，我才有点后知后觉地发现，绝大多数人对 代码、产品、公司经营、团队文化 并没有太高的期望，原因很简单——大部分公司也都是这样子。我一直觉得自己是个实用主义者，但是在这件事上我发现我居然是个理想主义者。&lt;/p&gt;&#xA;&lt;p&gt;不过没有关系，我仍然相信古话 “求其上者得其中，求其中者得其下，求其下者无所得”，认清现实更有利于脚踏实地，但是时时还要仰望星空——不能忘记自己的雄心壮志。&lt;/p&gt;&#xA;&lt;p&gt;有雄心壮志只是第一步。真正让理想落地、让人脱离平庸的，是在漫长的时间里不被挫折磨平的毅力。&lt;/p&gt;&#xA;&lt;h2 id=&#34;毅力&#34;&gt;&#xA;  毅力&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%af%85%e5%8a%9b&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;这是这篇文章最想讲的。&lt;/p&gt;&#xA;&lt;p&gt;我们在生活和工作中会不断遇到各种挫折和诱惑，尤其是当两者重叠对你产生影响的时候。为什么不放弃、为什么不选择躺平、躺平又有什么了不起的……这些问题会萦绕在你的心头，就是在这些一次又一次的消磨中，大部分人不再选择继续，或者选择了放弃、或者选择了安于现状、或者选择了躺平，自此变得平庸。&lt;/p&gt;&#xA;&lt;p&gt;放在普通人身上，这些「消磨」处处可见——技术迭代你跟不上了，学还是不学？房贷车贷压着，跳还是不跳？想做点好东西，团队没人响应；想推点新方法，上面觉得你多事。更让人泄气的是，当你真的想把事情做好，环顾四周，好像只有你在意。&lt;/p&gt;&#xA;&lt;p&gt;没有哪一件是惊天动地的大事。但就是在这些细碎的日常里，心气被磨平了，标准降下来了，「差不多行了」变成了常态。&lt;/p&gt;&#xA;&lt;p&gt;但乔布斯不是这样。&lt;/p&gt;&#xA;&lt;p&gt;外界对乔布斯的普遍印象是天才与魔鬼的形象，一方面貌似很轻松就塑造了苹果这个代表科技消费时尚的品牌、另外一方面性格乖戾到连自己亲生女儿都不相认。但如果你深入了解，会发现乔布斯也是一个有血有肉的人，对部分朋友，尤其是还对苹果发展有积极贡献的人，又非常有情有义。&lt;/p&gt;&#xA;&lt;p&gt;iPhone时期的乔布斯，在公司经营、产品打造、营销方方面面已经达到了真正的领袖地位，但是细想一下你会发现他也有无数时刻，是可以选择放弃的：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1985 年，因为跟 斯卡利 经营理念不和，被苹果董事会驱逐；&lt;/li&gt;&#xA;&lt;li&gt;1988 年，耗时三年打造的 NeXT 电脑发布，但系统和量产进度一拖再拖，直到次年才真正开始出货，首年销量寥寥——要知道，初代 Mac 首年卖了 25 万台，那还被视为失败；&lt;/li&gt;&#xA;&lt;li&gt;1990 年，皮克斯动画因硬件销售惨淡濒临破产，以 200 万美元卖掉了硬件部门，全力转向软件与动画；&lt;/li&gt;&#xA;&lt;li&gt;1993 年，NeXT 彻底放弃硬件业务，裁员过半，承认自己最初的路线走不通；&lt;/li&gt;&#xA;&lt;li&gt;1996 年末，以顾问的身份回到苹果，发现苹果已经半死不活；&lt;/li&gt;&#xA;&lt;li&gt;2000 年，受到互联网泡沫影响，艰难完成盈利的苹果，再次进入亏损；&lt;/li&gt;&#xA;&lt;li&gt;2003 年，确诊患有胰腺癌；&lt;/li&gt;&#xA;&lt;li&gt;2008 年，iPod 之父、iPhone 核心缔造者 Tony Fadell 离职；&lt;/li&gt;&#xA;&lt;li&gt;2008 年，确诊癌症转移；&lt;/li&gt;&#xA;&lt;li&gt;2009 年，接受肝移植手术，病休近半年；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这二十四年间，几乎每隔两三年就会出现一个足以让人退场的理由。但他没有。&lt;/p&gt;</description>
			</item>
			<item>
				<title>从零开始写一个终端模拟器：基于 libghostty-vt 的极简实现与进阶之路</title>
				<link>https://www.hualet.org/posts/build-terminal-with-libghostty-vt/</link>
				<pubDate>Tue, 05 May 2026 22:00:00 +0800</pubDate>
				<guid>https://www.hualet.org/posts/build-terminal-with-libghostty-vt/</guid>
				<description>&lt;p&gt;为什么基于 libghotty-vt 做新版的 deepin-terminal，在上篇博客中已经介绍过了。&lt;/p&gt;&#xA;&lt;p&gt;这个项目做下来（还未完成），最大的感受是：终端这玩意看着简单，底层知识缺口一个接一个。终端怎么跟 shell 通信、shell 集成到底集成的是不是 shell、各种测试工具怎么搭……这些问题之前完全没概念。这篇文章就是一路填坑的笔记，从概念到代码，说说写一个终端模拟器到底要搞清哪些东西。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;要写终端，Shell、PTY、Terminal Emulator、VT 序列这四个东西的关系必须搞明白。我一开始也是糊里糊涂的，以为 Terminal Emulator 就是&amp;quot;一个带图形界面的 shell&amp;quot;，其实不是。&lt;/p&gt;&#xA;&lt;h3 id=&#34;11-shell&#34;&gt;&#xA;  1.1 Shell&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#11-shell&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Shell 就是 bash、zsh、fish 这些东西。它从你给它的标准输入读命令，解析完 fork 个子进程去跑，再把结果写回标准输出。Shell 根本不在乎输出到了哪里，管道也好，文件也好，PTY 也好，对它来说都是文件描述符。&lt;/p&gt;&#xA;&lt;h3 id=&#34;12-pty&#34;&gt;&#xA;  1.2 PTY&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#12-pty&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;终端模拟器是 GUI 程序，用户通过窗口和它交互。但 Shell 和它启动的命令程序，骨子里仍觉得自己应该连在一个字符设备上。这个设备叫 TTY（电传打字机的历史遗留），程序通过检测 stdout 是不是 TTY 来决定要不要输出彩色文本、显示进度条、启动 TUI 界面。如果直接把 Shell 的标准输出接到管道上，它立刻进入哑巴模式，输出变成灰扑扑的纯文本。&lt;/p&gt;&#xA;&lt;p&gt;PTY（Pseudo Terminal，伪终端）就是来解决这个矛盾的。内核提供了一对虚拟设备文件：master 和 slave。Shell 和命令程序连在 slave 端，把它们的标准输入输出都绑到这里。slave 端的行为跟真实 TTY 一模一样，所以程序检测 stdout 时会得到&amp;quot;是 TTY&amp;quot;的结果，正常输出颜色和转义序列。终端模拟器则连在 master 端，读取程序输出、发送用户输入。&lt;/p&gt;</description>
			</item>
			<item>
				<title>最近 vibe coding 的几个小项目</title>
				<link>https://www.hualet.org/posts/recent_projects/</link>
				<pubDate>Fri, 01 May 2026 22:34:23 +0800</pubDate>
				<guid>https://www.hualet.org/posts/recent_projects/</guid>
				<description>&lt;p&gt;26年春节前后，Coding Agent 的能力又涨了一波大的。我没按捺住，春节后到现在陆陆续续 vibe coding 了些小项目——探索新能力、搞搞 Harness Engineering，顺便满足点自己的小需求。&lt;/p&gt;&#xA;&lt;p&gt;这一波模型能力（Claude Opus 4.6、GPT 5.4/5.5、GLM 5.1、Kimi K2.5/2.6、DeepSeek V4 pro）和 Coding Agent 工具链（Claude code、Opencode、codex、kimi cli）都蹿了一大截。对比去年 6 月用 Cursor 那会儿，现在 vibe coding 一次性搞对需求的概率提升得不止一丢丢——单点需求上基本 99% 不用返工。&lt;/p&gt;&#xA;&lt;p&gt;插件和 skills 这边，&amp;ldquo;蒸馏&amp;quot;了软件工程最佳实践的 omo（oh-my-opencode）、superpowers、openspec，也让 AI 辅助编码靠谱了不少。面向多 Agent 协作的 clawteams，在并行开发效率上给碳基程序员开了不少脑洞。&lt;/p&gt;&#xA;&lt;p&gt;不过 Coding Agent 本身进化太快了——一周两三个版本，plan、ralph loop、multi-agent、btw 这些能力很快就被官方收了。我现在倾向于 codex/opencode + superpowers 这套极简组合。&lt;/p&gt;&#xA;&lt;h2 id=&#34;项目列表&#34;&gt;&#xA;  项目列表&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%a1%b9%e7%9b%ae%e5%88%97%e8%a1%a8&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;dde-shell-weather-plugin&#34;&gt;&#xA;  dde-shell-weather-plugin&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#dde-shell-weather-plugin&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2026/05/dde-shell-weather-plugin-project-card.png&#34; alt=&#34;dde-shell-weather-plugin-project-card&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/hualet/dde-shell-weather-plugin&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;dde-shell-weather-plugin&lt;/a&gt;  算是年后第一个正儿八经 vibe coding 的项目，为 deepin V25 新的 dde-shell 提供了天气插件，目前已经上架应用商店，迭代了有6、7个版本。&lt;/p&gt;</description>
			</item>
			<item>
				<title>推荐一个超级无敌棒的访谈</title>
				<link>https://www.hualet.org/posts/peakji/</link>
				<pubDate>Sun, 04 Jan 2026 23:01:22 +0800</pubDate>
				<guid>https://www.hualet.org/posts/peakji/</guid>
				<description>&lt;p&gt;强烈推荐     &lt;a href=&#34;https://www.bilibili.com/video/BV1knvYBDEjs/?share_source=copy_web&amp;amp;vd_source=de5766e03e8fbd05c065e2f4ecbca51a&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Manus决定出售前最后的访谈&lt;/a&gt; ，这个视频的能量实在是太大了，大到我看了好几遍，还到处推荐给别人看。&lt;/p&gt;&#xA;&lt;p&gt;季逸超在这期访谈中表现出的 自信、坦诚、专业 和 热情，都能溢出屏幕。而且，内容绝对也是干货满满。那些关于 AI、 Agent相关的内容就不记录了，重点记录哪些非技术的感思。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;访谈的过程中他基本上处于口若悬河的状态，也难怪把张小珺也给“骗”了，觉得他是个E人。为什么他能这么侃侃而谈而且内容还这么深刻？ 因为他实践得多啊，高中就开始自己做产品 猛犸浏览器、然后被真格“忽悠”辍学创业、做下一代搜索引擎 Magi，扬言要打败 Google、到后来到夜莺科技当合伙人，一路走来都是真刀真枪地干，能不深刻嘛……所以说人生目标定好了，应该尽快向着目标做，而不是绕远路。比如你想创业，应该提前去准备，至少尝试运营一个产品、一个社区。&lt;/li&gt;&#xA;&lt;li&gt;兴趣才是人生的发动机。 季逸超研究浏览器、研究NLP，讲过往经理和技术的时候的热情都能溢出屏幕，甚至说出能自己做infra、自己做爬虫和搜索引擎、自己做模型…满足到死而无憾了。这些东西别说对一般人，就是对普通的程序员来说都是天书，要不是对这些技术有足够的兴趣和热情，很难想象他能坚持做、甚至中间沉寂那段时间还在坚持。 而且，他做哪些是2013年到2014年啊🤦♂️ ，天才少年时无疑了。&lt;/li&gt;&#xA;&lt;li&gt;圈子很重要。访谈过程中可以感受到他在主流模型圈有各种各样的朋友，能够第一时间拿到GPT3或者其他模型新版本的early access，当然还有一些有提前量的“坊间传闻”，对他们自己做 Agent 也有很大的帮助，比如3月份做完 Manus 以后，因为提前知道 Claude 新版本的模型很快就会发布，等着新版本的模型共同发布以遍能够最早享受到新一代模型能力的红利。还有一个更重要的是，他能够通过产品的影响力+自己的专业能力，去影响大模型厂商，“忽悠”他们去做自己认为模型应该去补足的地方，“让模型帮自己打工”。🥳&lt;/li&gt;&#xA;&lt;li&gt;“与其悬而未决，不如赶紧试试”。这是他说的原话，我对此无比赞同。形式变化很快的时候，可能没有已有经验、或者经验可能快速变化。不如赶紧试错，错了可以快速改正。&lt;/li&gt;&#xA;&lt;li&gt;尊重常识和保持平常心。他们几个肯定都是段永平的信徒……在产品刚做完的时候，人们更倾向于说服自己的产品是不错的！但是回归到用户视角去看，如果这个产品本身并不讨喜，那大概率发布出去也不会有人喜欢。他们花了大半年时间投入十几个人做出来的AI浏览器，做出来发现“感觉不对”，最终取消了这个产品的发布。“因为一个负责任的团队会持续维护，发布出去以后会有不少精力去自证，这有很大的机会成本”。是啊，如果他们继续了AI浏览器这条路，就失去了后来Manus这一波，这得是多大的机会成本。&lt;/li&gt;&#xA;&lt;li&gt;拥抱新事物。Manus的idea来自于他们几个人看到公司内部很多非研发的同事在用Cursor，去解决很多非研发的事情。进而发现模型和智能体的能力已经可以去支撑通用智能体的概念，才开创了第一个通用智能体——Manus。我相信是这一定是团队有大量的人当时已经在用Cursor，才可能影响周围非研发的人也用起来。我们团队其实也有类似的观察，但是却是在2025年中，已经相当晚了。所以，拥抱新事物要趁早！&lt;/li&gt;&#xA;&lt;li&gt;不做什么比做什么重要。不做基础模型、不服务普通用户、不去做大的bet、不做类Cursor的工具…这些都来自于产品定位清晰——服务好prosumer客户、竞争策略清晰——OpenAI服务普通大众，Manus服务prosumer客户更好。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;写到最后，突然感觉季逸超这种不就是大家说的很有魅力嘛——自信、谈成、又有深刻的行业洞察。粉了，哈哈。&lt;/p&gt;</description>
			</item>
			<item>
				<title>从优秀到卓越</title>
				<link>https://www.hualet.org/posts/good-to-great/</link>
				<pubDate>Mon, 29 Dec 2025 19:16:44 +0800</pubDate>
				<guid>https://www.hualet.org/posts/good-to-great/</guid>
				<description>&lt;p&gt;《从优秀到卓越》是著名的经营管理类书籍《基业长青》的姊妹篇，同为吉姆柯林斯（团队）的大作，用作者的话说：《从优秀到卓越》虽然时间上晚于《基业长青》，但实际上是它的“前传”。 因为《从优秀到卓越》讲得是一个公司如何从做得还不错，到实现跨越成为卓越的公司，而《基业长青》则是讲一家卓越的公司如何能够长盛不衰。&lt;/p&gt;&#xA;&lt;h2 id=&#34;实现跨越的三个步骤&#34;&gt;&#xA;  实现跨越的三个步骤&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%ae%9e%e7%8e%b0%e8%b7%a8%e8%b6%8a%e7%9a%84%e4%b8%89%e4%b8%aa%e6%ad%a5%e9%aa%a4&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;这本书的核心一直围绕这如何实现从优秀到卓越的跨越进行展开，主要阐述了三个步骤：&lt;/p&gt;&#xA;&lt;p&gt;1）训练有素的人、2）训练有素的思想、3）训练有素的行为。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2025/12/3steps.png&#34; alt=&#34;从优秀到卓越&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;在训练有素的人这个步骤，作者首次提出了第5级经理人的概念：谦逊+意志=第5级经理人。&lt;/p&gt;&#xA;&lt;p&gt;在作者的研究中发现，实现跨越的公司在一个阶段内总是有一类领导人，他们 “平和而执著，谦逊而无畏。”、 “从来不想成为不食人间烟火的英雄。他们从不希望被当做十全十美的人，或不可接近的偶像。他们是看似平凡却默默创造着不平凡业绩的人。”、“从来不放弃，从来不怀疑，也从不瞻前顾后”，最终带领公司实现了从优秀到卓越的跨越。&lt;/p&gt;&#xA;&lt;p&gt;这个结果令人意外，因为我们总是把目光投向那些个性十足、惹人注目、上头条、做名流的公司领导人，觉得他们才是真正的“领导者”。但恰恰相反的是这类人真正能带领公司实现跨越的并不多，反而是上面那些看起来默默无闻的第5级经理人带领公司实现了跨越。&lt;/p&gt;&#xA;&lt;p&gt;作者随后又强调了在实现跨越的过程中先人后事的原则：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;我们原以为，实现跨越的公司的领导人会从建立一套新构想、新策略入手。相反，我们发现，他们首先请进合适的人选，请出不合适的人选，并令合适的人选各就其位——然后再考虑下一步该怎么走。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这也有点反直觉，按道理一个公司要实现跨越式的发展一定是做了一个相当高明的战略选择，而不是不仅仅是选对了几个人，但作者从大量的公司研究样本来看，实现跨越的公司确实就是先人后事——有靠谱的人、事情自然能干好、也会有好的想法。&lt;/p&gt;&#xA;&lt;p&gt;我对此倒更多是惊讶于：原来真是这样！ 因为我在2023年开始整顿团队的时候，第一步其实就是把几个管理者凝聚在一起、同时剔除哪些不合格的人。虽然后来仍然有点后悔踢掉不合格的人做起来不是绝对果断，但是当时两个动作合起来的效果非常显著，整个团队在3个月内就有不一样的氛围变化。自此以后虽然不能说各方面都如何如何，但团队在靠谱的管理人员带领下，执行力变强、氛围变好、更多有才能的人浮出水面，在公司里这个团队绝对能够独当一面的存在。&lt;/p&gt;&#xA;&lt;p&gt;在训练有素的思想这个步骤，作者先是提出 “直面残酷的现实、绝不失去信念”，随后引出了著名的“刺猬理念”。&lt;/p&gt;&#xA;&lt;p&gt;我对此的理解其实就是毛主席提出的“实事求是”，前面已经捋清楚了人，那么接下来最重要的是让人发挥作用、正确地做事，我认为这里有两个前提：&lt;/p&gt;&#xA;&lt;p&gt;1）最高领导人要全面掌握现实情况，以此来做出正确的决策；&lt;/p&gt;&#xA;&lt;p&gt;2）每个岗位的人应该能坚守职责，发挥自己在岗位上应该发挥的作用。&lt;/p&gt;&#xA;&lt;p&gt;而这两点，都依赖“实事求是”的原则：先要能掌握现实情况、同时能直面现实，哪怕是最残酷的现实。千万不能变成：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;在一些对照公司中，有些高层领导用铁腕进行统治，使得他的员工担心他——他会怎么说，他会怎么想，他会怎么做——多于担心外在的事实和事实对公司的影响。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这真的就是很多中大型公司中典型的常态。也是读到这部分，我才写了 &lt;a href=&#34;https://www.hualet.org/posts/facing_the_reality/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;实事求是，直面现实&lt;/a&gt; 这篇文章。&lt;/p&gt;&#xA;&lt;p&gt;在这部分，作者还提到了另外一个反直觉的观点：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;不是说远景不重要，而是因为花大力气激励人，基本上是在浪费时间。贯穿本书的一个主旨就是，如果你按我们说的去做了，那么你根本不必花时间与精力来激励部下。如果你有合适的人才在车上，他们会有一种内在的自我驱动力。那真正亟待解决的问题就成了：你该怎样恰当地经营，才不至于使你的部下失望。而最令人沮丧的举动，莫过于对自身估计不足，最终被时代所淘汰。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;单独拿出来说，是因为我也曾经犯了这样的错误，在那段时间里整天纠结于“如何激励团队”、“如何获取到激励团队的支持”诸如此类，其实这些在客户条件下就是不成立的，反而应该早点放弃 幻想、抱怨 和沮丧的心态，尽快投入到做正确的事情上来。&lt;/p&gt;&#xA;&lt;h3 id=&#34;刺猬理念&#34;&gt;&#xA;  刺猬理念&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%88%ba%e7%8c%ac%e7%90%86%e5%bf%b5&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;终于，在前面的所有铺垫之后，作者提出了著名的 “刺猬理念”，来源于衣赛亚·伯林在他著名的小品文《刺猬与狐狸》中，把人分为刺猬和狐狸两种类型。他依据的是古希腊的一则寓言：狐狸知道很多事情，但是刺猬知道一件大事。&lt;/p&gt;&#xA;&lt;p&gt;作为对比，实现跨越的公司是刺猬，而未实现跨越的对照公司就是狐狸： “刺猬注重本质，而忽略其他。”   而 “那些领导对照公司的人倾向于做狐狸，从来没有获得刺猬理念的优势。他们的思想是分散的、不集中的、不连贯的”。&lt;/p&gt;&#xA;&lt;p&gt;这里有一个非常直观的例子：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;沃尔格林率先采用顾客开车进店买药办法，他发现顾客喜欢这样的方式，就建立了成百上千个这样的药店，并且把他的药店都紧密地聚集在一起，其原则是没有人必须穿越好几个街区才能到达一个沃尔格林药店。举例来说，在旧金山的商业区，沃尔格林在方圆1英里内聚集了9个药店。9个药店！如果仔细看，你就会发现在一些城市里沃尔格林的药店，就像西雅图的星巴克咖啡店一样星罗棋布。&lt;/p&gt;&#xA;&lt;p&gt;沃尔格林公司紧接着把这种便利观念和一个简单的经济观念联系起来，那就是提高单位顾客光顾利润。紧密聚集的药店（每英里9个药店）促进了当地的规模经济，继而为进一步的集中提供了资金，从而又吸引更多的顾客。通过增加高回报服务项目，沃尔格林提高了单位顾客光顾利润。更多的便利增加了顾客光顾的利润，就会有更多的资金回流到系统，建立更多的便利药店。药店连接药店，街区连接街区，城市连接城市，地区连接地区，沃尔格林就这样变成了一只具有惊人简单理念的刺猬。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这看起来很像是我们平常为产品、部门、公司设置的KPI，为了KPI而优化。 但是差别之处在于这是最直接关联到经营核心的北极星指标，一些都要为了这个指标服务！&lt;/p&gt;&#xA;&lt;p&gt;如何实践刺猬理论，找到那个唯一的核心指标，那就是更被广为人知的“三环图”：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2025/12/ciwei.png&#34; alt=&#34;从优秀到卓越&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;简化版：就是 你擅长的、你热爱的、能赚钱的😂&lt;/p&gt;&#xA;&lt;h2 id=&#34;为什么实现跨越这么难&#34;&gt;&#xA;  为什么实现跨越这么难&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%b8%ba%e4%bb%80%e4%b9%88%e5%ae%9e%e7%8e%b0%e8%b7%a8%e8%b6%8a%e8%bf%99%e4%b9%88%e9%9a%be&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;这本书最后讲 训练有素的文化，我认为主要是讲了要坚持前面的原则，逻辑上没什么毛病但是不够深刻。 真正深刻的是张一鸣说得那句话：“公司有好的收入是因为有好的产品、有好的产品是因为有好的团队、有好的团队是因为有好的文化”。&lt;/p&gt;</description>
			</item>
			<item>
				<title>实事求是，直面现实</title>
				<link>https://www.hualet.org/posts/facing_the_reality/</link>
				<pubDate>Wed, 17 Dec 2025 22:39:33 +0800</pubDate>
				<guid>https://www.hualet.org/posts/facing_the_reality/</guid>
				<description>&lt;p&gt;今天跟朋友聊天，聊到现在社会上弥漫着一种浮躁、大跃进式的氛围，大有“人有多大胆，地有多大产”的味道。我想大概是因为大家看惯了影视剧中厉害了我的国、看惯了某些企业宣称“我们5年走过了欧美20年才完成的壮举”……不自觉地把这个当成了政治正确，但是我跟朋友都觉得跟自己体感相差很大，有点生理不适。&lt;/p&gt;&#xA;&lt;p&gt;自然而然地就想到了在企业内部，我也经常观察到类似的现象：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;公司里存在隐形的“政治正确”，友商不能夸，夸了好像就是在否定领导&lt;/li&gt;&#xA;&lt;li&gt;汇报时习惯性报喜不报忧，毕竟机会难得，不能自己拆台&lt;/li&gt;&#xA;&lt;li&gt;定目标时气势先行，目标逐渐演变为情绪价值&lt;/li&gt;&#xA;&lt;li&gt;招聘时追求“天选之子”，最好一个人能顶三个人用&lt;/li&gt;&#xA;&lt;li&gt;用次要问题反复讨论，核心问题则能拖就拖，仿佛承认现实就是失败&lt;/li&gt;&#xA;&lt;li&gt;……&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;为什么会这样&#34;&gt;&#xA;  为什么会这样？&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%b8%ba%e4%bb%80%e4%b9%88%e4%bc%9a%e8%bf%99%e6%a0%b7&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;我觉得第一位是管理者的问题，管理者想听到真话就一定能听到，反之亦然。大家都不是傻子，上有所好，下必甚焉。国家希望现实经济繁荣、企业希望遥遥领先、领导希望自己领导有方……这些想法本身无可厚非。但问题在于：&lt;strong&gt;如果只接受“好消息”，现实就会被系统性过滤掉&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;世间不如意十之八九，企业和组织总有不顺的时候，总有做得不对的时候。团队需要在逆境中成长，他首先要意识到、承认自己在逆境中，认识到自己的不足。同时，重要的是还能积极地面对。其实，我一直觉得逆境是凝聚团队的最好时机，顺境大家向内求很容易内卷和内斗。&lt;/p&gt;&#xA;&lt;p&gt;第二个是反馈机制失灵，学过控制理论的应该都知道，控制理论中系统能达到期望的平衡态是因为有效的反馈机制。管理也是一样，上行下效这本来是人性趋利避害的正常行为，一般人抵触领导的成本跟收益不成正比。但是，最可恨的是那些围绕在管理者周围的人，他们是最大受益者群体，也是更接近一线的人，本应该承担起做好反馈的角色，但是却选择了很“聪明”地盲从，这是非常精致利己主义者的坏。&lt;/p&gt;&#xA;&lt;p&gt;第三个是文化的问题，公司没有很好的纠偏文化，而是动不动高压措施，导致大部分人都觉得做得多错得多，还不如躺平舒服。不得不参与汇报，那就讲点好的呗，至少有概率蒙混过关。&lt;/p&gt;&#xA;&lt;h2 id=&#34;问题如何解决&#34;&gt;&#xA;  问题如何解决？&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%97%ae%e9%a2%98%e5%a6%82%e4%bd%95%e8%a7%a3%e5%86%b3&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;我觉得第一还是管理者要能跟团队融为一体，躬身入局。我看《三生万物》印象最深刻的两个字是“哈哈”，宁高宁身处高位，却极其接地气，他自然能跟团队有良好的沟通和反馈机制。看到困难了，直面问题，迎难而上，不要做怂蛋。&lt;/p&gt;&#xA;&lt;p&gt;第二是干净利落地干掉那些太过聪明的人，那些精致的利己主义者。有他们在，团队一定乌烟瘴气。&lt;/p&gt;&#xA;&lt;p&gt;第三是安排工作多讲背景、讲目标，让团队跟自己同频，能在一个频道上对话、讨论、甚至争吵。该决策要决策，但一定要避免专断。安排工作尽量提目标，避免跟团队的“路线之争”，这对团队的成长以及积极性都是负向的。允许他们犯错，也要让他们承担后果，复盘清楚问题自己去解决影响。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;写到最后，其实就一句话：&#xA;&lt;strong&gt;少一点表演，多一点诚实；少一点口号，多一点面对现实的勇气。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;与大家共勉：实事求是，直面现实。&lt;/p&gt;</description>
			</item>
			<item>
				<title>最近25上遇到的几个问题和处理方案</title>
				<link>https://www.hualet.org/posts/some_25_issues/</link>
				<pubDate>Sun, 03 Aug 2025 14:17:04 +0800</pubDate>
				<guid>https://www.hualet.org/posts/some_25_issues/</guid>
				<description>&lt;p&gt;最近在 deepin 25 上遇到几个问题，处理方案记录一下，以备未来自己或者其他人需要。&lt;/p&gt;&#xA;&lt;h3 id=&#34;01-待机睡死问题&#34;&gt;&#xA;  01 待机睡死问题&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#01-%e5%be%85%e6%9c%ba%e7%9d%a1%e6%ad%bb%e9%97%ae%e9%a2%98&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;有一段时间 25 没有预装 TLP，导致系统功耗升高，有时电脑发烫明显。发现后，一方面通知系统研发做集成更新，另一方面自己先装上 TLP 做验证。&lt;/p&gt;&#xA;&lt;p&gt;装上 TLP 系统功耗是降下来了，但不出意料引入了稳定性问题：&lt;strong&gt;偶发待机睡死&lt;/strong&gt;，概率还不低。找内核同事帮忙看过，受限于出差远程调试不便，也没有立刻跑出有效线索，于是自己做了几轮尝试。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;处理器 : AMD Ryzen 7 6800H with Radeon Graphics (八核 / 十六逻辑处理器)&#xA;主板 : LNVNB161216&#xA;内存 : 4GB(MT62F1G32D4DR-031 WT  6400 MT/s)/4GB(MT62F1G32D4DR-031 WT  6400 MT/s)/4GB(MT62F1G32D4DR-031 WT  6400 MT/s)/4GB(MT62F1G32D4DR-031 WT  6400 MT/s)&#xA;显示适配器 : Rembrandt [Radeon 680M]&#xA;音频适配器 : Radeon High Definition Audio Controller [Rembrandt/Strix]/Family 17h/19h/1ah HD Audio Controller&#xA;存储设备 : SAMSUNG MZVL2512HCJQ-00BL2 (512 GB)&#xA;蓝牙 : Bluetooth Radio&#xA;网络适配器 : RTL8852BE PCIe 802.11ax Wireless Network Controller/RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller&#xA;鼠标 : M185 compact wireless mouse (Logitech M185 compact wireless mouse)/ELAN0662:00 04F3:317C Mouse (ELAN0662:00 04F3:317C Mouse)/ELAN0662:00 04F3:317C Touchpad (ELAN0662:00 04F3:317C Touchpad)&#xA;键盘 : AT Translated Set 2 keyboard (AT Translated Set 2 keyboard)&#xA;显示设备 : CSOT T3 LCD Monitor(14.0 英寸 (302x188 mm))&#xA;图像设备 : Integrated Camera (Chicony Electronics Integrated Camera)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因为明确知道是装了 TLP 后出现的问题，把现象发给 ChatGPT 后得到一些方向。&lt;/p&gt;</description>
			</item>
			<item>
				<title>开源社区和先进生产力</title>
				<link>https://www.hualet.org/posts/why_open_source/</link>
				<pubDate>Sun, 11 May 2025 11:02:04 +0800</pubDate>
				<guid>https://www.hualet.org/posts/why_open_source/</guid>
				<description>&lt;p&gt;这两天 openSUSE 移除 deepin 软件包的事情闹得满城风雨，  我们第一时间联系了下游打包者和openSUSE团队（当前还未有正式回应），并且为了避免国内一些媒体对读者的误导，专门在deepin论坛发帖 &lt;a href=&#34;https://bbs.deepin.org.cn/post/287016&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;关于 openSUSE 移除 deepin 桌面环境(DDE)的回应与改进措施&lt;/a&gt; 进行了澄清。&lt;/p&gt;&#xA;&lt;p&gt;文章内写得“正视问题，深刻反思”有些朋友觉得说得有点过了，我个人并不这样认为。 除了反思面对openSUSE社区提出的这些安全问题处理不当外，针对其他发行版移植的问题处理，更深层次的开源社区对我们的意义、以及我们在开源方面的表现都值得深刻反思。&lt;/p&gt;&#xA;&lt;h2 id=&#34;关于开源的反思&#34;&gt;&#xA;  关于开源的反思&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%85%b3%e4%ba%8e%e5%bc%80%e6%ba%90%e7%9a%84%e5%8f%8d%e6%80%9d&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;以前理解开源就是开源社区的透明开放、开源文化的取自开源回馈开源、社区可以作为产品反馈很重要的渠道……后来做商业发行版时间长了，很多事情有虚有实，可能我们自己在开源社区这条路上都有点迷失了。&lt;/p&gt;&#xA;&lt;p&gt;最近公司内部在搞AI提升工作效率这件事，就着这个事情我也在思考提效的本质是什么，不应该就是一个公司为了节省几个人力和成本，本质应该还是把团队变成代表先进生产力的团队，能力、工具、方法方方面面。&lt;/p&gt;&#xA;&lt;p&gt;这样再回去想开源，一流的开源项目和社区实际上在某种程度上代表了（软件工程）的先进生产力，我们以前做开源比较深入、耳濡目染自然也不差。所以，我反思我们做开源这件事，最深刻的本质驱动力应该在这里——让团队能代表先进生产力。&lt;/p&gt;&#xA;&lt;h2 id=&#34;开源社区的先进生产力&#34;&gt;&#xA;  开源社区的先进生产力&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%bc%80%e6%ba%90%e7%a4%be%e5%8c%ba%e7%9a%84%e5%85%88%e8%bf%9b%e7%94%9f%e4%ba%a7%e5%8a%9b&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;优秀的能力&#34;&gt;&#xA;  优秀的能力&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%bc%98%e7%a7%80%e7%9a%84%e8%83%bd%e5%8a%9b&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;自不必说，开源社区里面各种大牛，都是我们可以作为偶像/榜样的学习对象。比如鼎鼎大名的Linus 林老大，作为 Linux 的掌舵人，一方面技术能力非常强，另外一方面 “show me the code” 的务实态度和 &amp;ldquo;just for fun” 的兴趣驱动带来的持之以恒的工作热情，都是我们可以好好学习的。&lt;/p&gt;&#xA;&lt;p&gt;除了 Linus 以及一众大家所熟知的开源明星人物外，最近我还发现一个非常有意思的黑客哥们 Mitchell Hashimoto。 他以前是 Hashicorp 的 CTO，财务自由以后进入退休生活，但是退休以后更加兴趣驱动，比如最近知道他是因为他做了一个项目叫 ghotty。&lt;/p&gt;&#xA;&lt;p&gt;不仅ghostty 本身出世以后就备受欢迎，它本身的网站也非常有趣：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2025/05/ghostty.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;上次看到这么酷的网站还是在 jwz.org ：&lt;/p&gt;</description>
			</item>
			<item>
				<title>贵与便宜</title>
				<link>https://www.hualet.org/posts/expensive_vs_cheap/</link>
				<pubDate>Fri, 21 Mar 2025 23:15:31 +0800</pubDate>
				<guid>https://www.hualet.org/posts/expensive_vs_cheap/</guid>
				<description>&lt;p&gt;最早比较反直觉地认识到贵与不贵的辩证逻辑，还是源自段永平语录。当时倍觉新颖，也挺有道理。不过这两年看多了以后，发现在投资圈这个概念已经泛滥成灾，这就是后话了。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;段的大体意思：只要看懂了公司的股价是低于其长期价值的，短期再贵长远来看也是便宜的。比如他最开始重仓买茅台的时候股价只有100来块钱（便宜），后来再次重仓茅台时股价已经到接近1200块钱（看起来已经挺贵了），现在茅台股价大概在1600左右，当时的1200也显得便宜了。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;还有一个最近的例子，是肖宏做 Monica 之前，买了华科师兄的一款浏览器插件 ChatGPT for Google，据说付了不低的价格（超出正常预期价格，贵），但是对比这款插件给 Monica 导流带来的商业价值比，他认为是非常值的（便宜）。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;回到我们自己身上，时不时得惊醒一些 贵和不贵 的惯性思维作祟，导致的决策错误。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;比如，我们做一款产品或者一项功能，研发投入5人干了半年，完了后面需要每个月几千块钱的云服务费，会有人觉得这个费用很贵。但是相较来说，前者虽然是隐性的成本，却是上百万的；后者虽然是显性的成本，也只有几万块钱。哪个贵哪个便宜？ 哪个需要更需要做好管理？&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;比如，员工的团建费， 按照每个人每个月 100， 一年也就多支出1200。按照上市软件公司的人均产值 30万-50万算，如果团建费可以给工程师带来哪怕 1% 的工作积极性/效率提升，一年下来也多产出 3000-5000，完全是超出团建费的成本的。反观如果取消这个福利，看起来是省了1200， 实际上可能是赔了 1800-3800。更不必说福利费取消后带来的人员流失、招聘、培训、磨合等一系列其他成本了。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;再比如，公司全员赚钱这件事，看起来很热闹，领导可能觉得他们是完成了核心职责的情况下再去赚钱。但是，在我看来但凡部门的KPI里面有了营收，很多人很自然的就把自己的核心职责给转移到赚钱上去了。看起来只是把个别部门的人（便宜）拉出去赚钱了，但实际上他的核心职责不完成对其他部门协作的影响、“挪用”公司资源去完成自己的KPI（可以想想研发做定制）、浪费的机会成本等等，代价是非常昂贵的！&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;慎重、慎重、慎重！&lt;/p&gt;</description>
			</item>
			<item>
				<title>再谈节奏感</title>
				<link>https://www.hualet.org/posts/pacing2/</link>
				<pubDate>Wed, 19 Mar 2025 14:08:09 +0800</pubDate>
				<guid>https://www.hualet.org/posts/pacing2/</guid>
				<description>&lt;p&gt;今天有同事找过来，说最近一通研究后，发现系统很多领域存在问题/不明确，关键是还没有人负责解决，觉得好绝望。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;回忆以前，我老板也经常扔给我这样那样的问题，总觉得我们做得不够好，我很难说服让他接受我们得有所取舍，老板嘛你懂得 :P ，所以我只能把这些问题当成是鞭策和PUA。今天同事这个问题我觉得还有必要好好跟他聊一下，至少我觉得跟他有说清楚的可能性。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;听到这个问题，我第一反应就是战略取舍。但是怕他觉得我在用互联网黑话忽悠他，我就尝试性地问他是否听过雷军的互联网七字诀，毕竟雷军火遍大街小巷嘛，果然是听过一些。互联网七字诀就是“专注、极致、口碑、快”。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;其实每一个创业公司在前期都面临同样的问题，尤其小米还跟我们一样的是做操作系统的，跟我们面临的问题更为相似。操作系统太宏大了，每个模块拿出来都可以研究上好几年甚至好几十年，在不能全面覆盖的情况下，问题多不是很正常嘛。所以，小米前期就 &lt;strong&gt;专注&lt;/strong&gt; 在界面和几个应用的打磨上，做到&lt;strong&gt;极致&lt;/strong&gt;、形成&lt;strong&gt;口碑&lt;/strong&gt;，从而吸引了一波发烧友作为种子用户起步，才有了后面的发展。如果小米上来就要求有诺基亚和摩托的手机质量，要求苹果一样软硬件通吃，结局大概率不会特别好，团队直接就被拖垮了。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;回到我们自己，团队规模缩小当然有好有坏，其中有一个好处是帮我们变得更加专注。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;专注就是想清楚当前的主要矛盾，专注于这个点的解决，完了再看下个阶段的主要矛盾，一个个有节奏地解决。比如之前提系统稳定性、后来是系统兼容性、开发者生态、AI 能力 等等。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;组织能力强每次就多做一点，组织能力弱就少做一点，做事情的同时还要不断提高我们的组织能力，这样的组织才会有很好的发展。如果硬要在自己或者组织能力无法承受的阶段去解决过多的问题，人和组织可能就会崩溃。我想苹果造车就是一个很好的例子。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;这里想起来，以前看到有人（好像是宁高宁）说过，公司的目标就是提高效率和做创新，组织能力和组织活力是这两点的核心支撑啊。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;另外一点，资源受限的时候，千万不能盲目地扩大战线。一方面，战线拖长，团队长时间投入而没有结果容易产生怠惰； 另外一方面，战场增加，会让团队感觉腹背受敌没有焦点，也会产生疲惫。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;但是，发现了小问题可以快速解决的，一定要负责任地勇于去解决掉它，速战速决。软件工程是典型的“千里之堤，溃于蚁穴”，能解决一个蚁穴问题就能增加软件的成功概率。&lt;/p&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;聊完想了想，这不就是去年提的节奏感嘛，只不过去年是以产品研发和上市的例子在讲，今天这个故事则更多体现在研发和项目管理上。遂作记录，以飨读者。&lt;/p&gt;</description>
			</item>
			<item>
				<title>宁高宁对经理人关键素质的定义</title>
				<link>https://www.hualet.org/posts/manager_qualities/</link>
				<pubDate>Sat, 15 Mar 2025 22:19:26 +0800</pubDate>
				<guid>https://www.hualet.org/posts/manager_qualities/</guid>
				<description>&lt;p&gt;读书宁高宁的《选经理人》第一个章节就提到了他对经理人核心素质的理解和整理， 觉得非常受用，特整理分享如下：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;一、经理人要抓重点，抓大事，有带动公司转型的全局观。能不能每年做好最重要的十件事，做好能影响组织架构、影响团队、影响财务报表、影响战略方向的事情。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;我记得刚做管理的时候，读过Intel的CEO 格鲁夫的《给管理者的第一节课》，其中一个很重要的概念叫杠杆率：以前作为技术人员我们是单打独斗，自己发挥好最重要；但是，现在作为管理者影响的是一帮人，如果自己做的事情能影响他们发挥好，这就是发挥了杠杆的作用。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;二、要发挥团队的作用。经理人敢于为团队成员承担责任，这样团队才能不断地向前冲锋。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;三、团队有没有韧性也是非常关键的。不是任何时候、任何事情对你都公平，都理解你，所以有韧性、有毅力、能经受挫折，对经理人也是基本要求。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;韧性，能经得起挫折，是这几年下来最深刻的感悟之一。&lt;/p&gt;&#xA;&lt;p&gt;社会是残酷的，哪怕是企业有非常好的环境，也很难避免在所有时候都保证所有人的公平。这个时候我见到很多人都陷入了一种错误的状态——受害者思维，永远用这个理由去怨天尤人、去逃避责任。&lt;/p&gt;&#xA;&lt;p&gt;结果我是很清楚的，因为我也曾经是那些人之一。&lt;/p&gt;&#xA;&lt;p&gt;摆脱受害者思维，明白环境好坏只是环境，你自己的反应永远应该是围绕着你的长期目标，该做好自己的工作做好自己的工作、该带好团队还带好团队，不要让一时的环境把你影响到偏离你目标的方向。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;四、真正的企业领导人是资源的组织者，能目标坚定地把集团内部、外部所有资源组织起来。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;作为管理者，有时候本能地有问题向内求，排斥外部资源，因为这个对自己的挑战最小。&lt;/p&gt;&#xA;&lt;p&gt;很典型的例子比如外部的合作、政府的政策性项目、合作伙伴的资源等等，我们觉得怕麻烦、觉得low或者碍于面子往往不太想参与其中。&lt;/p&gt;&#xA;&lt;p&gt;仔细想来，这何尝不是给团队破局的机会，何尝不是我们外部的资源，只要能掌握好、组织利用好这些资源，不仅给团队带来额外的帮助，而且还能带来多方的互赢。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;五、把每个员工都调动起来，让他们在最好的待遇、最好的环境中工作，是领导人需具备的基本素质。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;杠杆的力量，不赘述。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;六、要提升对自己、对团队的标准，不断地自我反省、自我批评和总结经验。做人要坦诚，要直接，要有心灵的契约，这样员工对你才有期望值。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;本质上是学习型组织。第一次听到学习型组织的时候，就觉得这个概念非常好，不过理解的比较浅层，认为是在团队中倡导学习氛围。&lt;/p&gt;&#xA;&lt;p&gt;后来，慢慢体会到其中的深意，这里的学习更多是成长，不管是读书、分享、还是自己讨论，提炼问题、找解决方案、内化吸收成为组织的一部分，组织有成长，就是学习型组织。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;七、对好经理人有太多的要求，但最核心的、必须具备的就是：责任感、使命感、激情、学习、团队、诚信。中粮集团的经理人必须以好经理人的标准塑造自己，从能力到心态，否则就不会进步。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;对宁高宁的好感，主要来自于觉得他是个性情中人，果然他挑人的标准也是如此。&lt;/p&gt;&#xA;&lt;p&gt;我曾经面试产品经理的时候提到我们的选择标准：“激情”、“专业”、“负责”、“有好奇心”，这样的人果然到哪都吃香。哈哈。&lt;/p&gt;</description>
			</item>
			<item>
				<title>2024年终总结</title>
				<link>https://www.hualet.org/posts/2024_summary/</link>
				<pubDate>Sat, 11 Jan 2025 22:01:26 +0800</pubDate>
				<guid>https://www.hualet.org/posts/2024_summary/</guid>
				<description>&lt;p&gt;恍惚之间，一年时间又过去了。回顾过去一年，有愤懑、有不甘、有快乐……但是发现很难有一个结构化而清晰的思路，概括去年的得失，所以还是有必要好好总结总结。&#xA;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;“世间自有公道，付出总有回报。说到就要做到，要做就做最好。”&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;用这句话开头显得有点奇怪，但是这句话确实算是我本年度最喜欢的一句话，一方面是在更多方面了解段永平时，偶然发现他们这句广告语，所谓爱屋及乌； 另外一方面我其实早几年就把“得道多助，失道寡助”作为为人处世之道，这两句话本身意义相近，而“世间……”这句略微有点狭义之气，所以也就更为喜欢了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;工作&#34;&gt;&#xA;  工作&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%b7%a5%e4%bd%9c&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;先说说工作方面，大概有以下几点收获：&lt;/p&gt;&#xA;&lt;p&gt;1）事情有客观规律，通俗点叫节奏，掌握节奏感有助于提升成功率。&lt;/p&gt;&#xA;&lt;p&gt;去年我们有一款商业产品，客户需求旺盛，被寄予了厚望。在这个背景下，今年在做规划的时候我们就显得有点飘了，把营收目标定得特别高，可想而知结果非常惨。&lt;/p&gt;&#xA;&lt;p&gt;这里面最大的问题其实是因为团队心理膨胀，不尊重事物发展的客观规律，导致栽了跟头，还要回去补课。&lt;/p&gt;&#xA;&lt;p&gt;商业产品毕竟还是不便分享，所以举个同类型的例子一下子就好理解了——理想Mega，事实上为什么有当前这个段落所描述的感悟，也很大程度上来自对李想的学习和对理想Mega的复盘学习。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2025/01/steps.png&#34; alt=&#34;0-1&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;理想有了在前面 L6、L9 的好销量之后，对 Mega 有了过高的期望，而忽略了产品 0-1、1-10、10-100 的三个不可跨越的阶段和节奏，产品造出来、完成 0-1 之后就期望一步登天达到 100，但是事实就是 1-10 这个阶段还得回来补课，而且因为没有 1-10 的验证而投入了 100 的资源，造成了极大的资源浪费和客户口碑下降。&lt;/p&gt;&#xA;&lt;p&gt;我们这款商业产品也是一样的道理。&lt;/p&gt;&#xA;&lt;p&gt;2）在职场里，少些时间生气，或许可以节约大把时间 。&lt;/p&gt;&#xA;&lt;p&gt;今年公司做了一些内部调整，因为诸多方面的原因，导致我的不满情绪非常大，以至于在挺长一段时间内我的工作状态都不是特别好。长时间处于 积极 vs. 消极的两种情绪之中，以至于内耗非常大。&lt;/p&gt;&#xA;&lt;p&gt;这种状态大概持续了一个季度，随着这条&lt;a href=&#34;https://web.okjike.com/originalPost/66e399db1bdec5e1e75af4e7&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;即刻动态&lt;/a&gt; 的发出，算是终于能够放下。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2025/01/jike.png&#34; alt=&#34;jike&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;3）人生是自己的，职业也是自己的，不要受环境因素太大。&lt;/p&gt;&#xA;&lt;p&gt;跟前面一条算是姊妹篇了，因为有了前面的放下，也就有了当前这段的感悟。抑或是因为有了当前这段的感悟，才有了前面的放下。 总之，不论如何，今年很大的成长是可以抛开外界环境因素，考虑自己该干什么、不该干什么。&lt;/p&gt;&#xA;&lt;p&gt;比如，我们不能因为其他人不努力、躺平，而选择自己不努力、躺平； 我们不能因为其他管理者对下属放水，而同样放水；我们不能因为环境不好，而选择让自己和自己的团队成为一个不积极、没有竞争力的个体或者团队。长远来看，环境都是短期的，积极的心态、掌握好的技术、拥有竞争力、团队有活力才是长期的。&lt;/p&gt;&#xA;&lt;p&gt;4）做人做事，不能飘在上面。&lt;/p&gt;&#xA;&lt;p&gt;忘了缘由，大概率是因为《赢》和《三生万物》这两本书，亦或是看到周围不少飘在上面的领导而带来的反思，今年我给自己定下了一个目标是认识更多同事、进而跟他们熟悉、进而与他们打成一片，虽然当前主要进展还处于第一、二个阶段，但是这对于一个i人来说也已经是不错的突破。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2025/01/sanshengwanwu.png&#34; alt=&#34;sanshengwanwu&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;至于说做事方面，技术出身的人虽然不容易飘在上面，但是很容易选择在自己擅长的地方下探，但是在自己不擅长的地方完全假手于人。 我自忖在负责的各个领域，自己强项的自己参与或者授权给人，在自己弱项的领域也会很好地去跟同事学习，不至于让自己在某方面完全不懂而让团队出现问题（官僚化或者走错方向）。&lt;/p&gt;&#xA;&lt;p&gt;总得来说，在工作和管理方面，今年最大的关键词是节奏感和接地气！&lt;/p&gt;&#xA;&lt;h2 id=&#34;生活&#34;&gt;&#xA;  生活&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%94%9f%e6%b4%bb&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;生活方面最主要的变化是生了二胎。&lt;/p&gt;&#xA;&lt;p&gt;老二出生前，我这边工作一直都挺忙的，但是老婆总觉得老二出生了三年都没机会出去玩儿了。 所以，赶着我妹暑假的尾巴，一家人一起在武汉周边转了转。 两天一夜，路线 武汉——英山（桃花冲漂流）——罗田（九资河镇、天堂寨、罗田县城）——黄冈（东坡赤壁）——武汉。 开车时间比较长，但是总体上不是太累，基本上就是想到哪去哪，比较有意思的是这次豆豆的参与感比较强，甚至在天堂寨坐观光电梯的时候比我要胆子大很多。&lt;/p&gt;</description>
			</item>
			<item>
				<title>安卓发展史——产品、技术和用户量</title>
				<link>https://www.hualet.org/posts/android_history/</link>
				<pubDate>Mon, 23 Dec 2024 09:39:25 +0800</pubDate>
				<guid>https://www.hualet.org/posts/android_history/</guid>
				<description>&lt;h2 id=&#34;谷歌之前&#34;&gt;&#xA;  谷歌之前&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%b0%b7%e6%ad%8c%e4%b9%8b%e5%89%8d&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2003 创始开发；&lt;/li&gt;&#xA;&lt;li&gt;2005 被谷歌收购；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2008-年-android-10&#34;&gt;&#xA;  2008 年： Android 1.0&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2008-%e5%b9%b4-android-10&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;2008 年 9 月，Android 1.0 正式发布，包括一系列基本应用程序，如 拨打电话、发送短信、浏览器、地图 等。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2009-年-15-cup-cake&#34;&gt;&#xA;  2009 年： 1.5 Cup Cake&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2009-%e5%b9%b4-15-cup-cake&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;虚拟键盘。&lt;/li&gt;&#xA;&lt;li&gt;插件框架，支持第三方输入法。&lt;/li&gt;&#xA;&lt;li&gt;录音机应用程序。&lt;/li&gt;&#xA;&lt;li&gt;自动旋转屏幕的支持。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2009-年android-16-donut&#34;&gt;&#xA;  2009 年：Android 1.6 Donut&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2009-%e5%b9%b4android-16-donut&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;快捷搜索框（Quick Search Box）。&lt;/li&gt;&#xA;&lt;li&gt;支持 CDMA 网络。&lt;/li&gt;&#xA;&lt;li&gt;新的摄像头和图库应用程序。&lt;/li&gt;&#xA;&lt;li&gt;改进的 Android Market 应用商店。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;iOS 的商店是 2008 年 7 月上线的，安卓晚了一年时间。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;2010-年android-2021-éclair&#34;&gt;&#xA;  2010 年：Android 2.0/2.1 Éclair&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2010-%e5%b9%b4android-2021-%c3%a9clair&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Google Maps 导航应用程序。&lt;/li&gt;&#xA;&lt;li&gt;改进的用户界面和操作体验。&lt;/li&gt;&#xA;&lt;li&gt;HTML5 功能支持。&lt;/li&gt;&#xA;&lt;li&gt;改进的 Android Market 应用商店。&lt;/li&gt;&#xA;&lt;li&gt;多点触控和虚拟相机功能。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2010-年android-22-froyo&#34;&gt;&#xA;  2010 年：Android 2.2 Froyo&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2010-%e5%b9%b4android-22-froyo&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;增强的性能、速度和内存管理。&lt;/li&gt;&#xA;&lt;li&gt;改进了 Flash Player 支持。&lt;/li&gt;&#xA;&lt;li&gt;支持 Wi-Fi 热点分享。&lt;/li&gt;&#xA;&lt;li&gt;增加了 USB 和 Bluetooth Tethering 功能。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;不坚决呀，前面支持了 HTML5，没有苹果的魄力坚持 HTML5 而废弃 Flash。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;2011-年android-23-gingerbread&#34;&gt;&#xA;  2011 年：Android 2.3 Gingerbread&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2011-%e5%b9%b4android-23-gingerbread&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新增 NFC（近场通讯）支持。&lt;/li&gt;&#xA;&lt;li&gt;视频和音频格式支持改进。&lt;/li&gt;&#xA;&lt;li&gt;下拉通知栏添加快捷切换功能。&lt;/li&gt;&#xA;&lt;li&gt;增强的键盘和文本输入功能。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2011-年android-303132-honeycomb专为平板电脑设计&#34;&gt;&#xA;  2011 年：Android 3.0/3.1/3.2 Honeycomb（专为平板电脑设计）&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2011-%e5%b9%b4android-303132-honeycomb%e4%b8%93%e4%b8%ba%e5%b9%b3%e6%9d%bf%e7%94%b5%e8%84%91%e8%ae%be%e8%ae%a1&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;专门为平板电脑设计的版本。&lt;/li&gt;&#xA;&lt;li&gt;新增了更大、高分辨率的图标和控件。&lt;/li&gt;&#xA;&lt;li&gt;设计更加直观和符合人体工程学，可更好地适应平板电脑屏幕。&lt;/li&gt;&#xA;&lt;li&gt;Android 3.2 版本引入更多语言支持。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2011-年android-40-ice-cream-sandwich&#34;&gt;&#xA;  2011 年：Android 4.0 Ice Cream Sandwich&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2011-%e5%b9%b4android-40-ice-cream-sandwich&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;全新界面设计 Holo。提供了支持拉出式通知栏的新状态栏和虚拟导航栏，并支持多任务视图。&lt;/li&gt;&#xA;&lt;li&gt;改进通知系统及应用程序管理。&lt;/li&gt;&#xA;&lt;li&gt;引入 People app 和 Face Unlock 功能。&lt;/li&gt;&#xA;&lt;li&gt;增强性能和稳定性。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Android 4.0 是个变动比较大的版本，是现代安卓的基石了吧。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;2012-年android-414243-jelly-bean&#34;&gt;&#xA;  2012 年：Android 4.1/4.2/4.3 Jelly Bean&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2012-%e5%b9%b4android-414243-jelly-bean&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;项目 Butter 提升用户界面流畅度。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;VSYNC&lt;/li&gt;&#xA;&lt;li&gt;Triple Buffer&lt;/li&gt;&#xA;&lt;li&gt;Choreographer&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Siri 类似的 Google Now 功能。&lt;/li&gt;&#xA;&lt;li&gt;相片应用程序增强。&lt;/li&gt;&#xA;&lt;li&gt;蓝牙和安全性改进。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Project Butter 的内容见参考链接中 Android 之 Project Butter 详细介绍。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;2013-年android-44-kitkat&#34;&gt;&#xA;  2013 年：Android 4.4 KitKat&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2013-%e5%b9%b4android-44-kitkat&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;孵化器支持。&lt;/li&gt;&#xA;&lt;li&gt;全局打字搜索功能。&lt;/li&gt;&#xA;&lt;li&gt;原生短信应用程序变为 Hangouts。&lt;/li&gt;&#xA;&lt;li&gt;移动设备管理中新增支持个人和企业的分离数据存储和访问权限控制。&lt;/li&gt;&#xA;&lt;li&gt;增加了透明状态栏，使应用程序可以延伸到屏幕顶部。同时优化了音频、视频以及渲染&lt;/li&gt;&#xA;&lt;li&gt;引擎等方面的性能。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2014-年android-5051-lollipop&#34;&gt;&#xA;  2014 年：Android 5.0/5.1 Lollipop&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2014-%e5%b9%b4android-5051-lollipop&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Material Design 更新外观设计。&lt;/li&gt;&#xA;&lt;li&gt;多用户支持。&lt;/li&gt;&#xA;&lt;li&gt;聚合的通知和锁屏预览。&lt;/li&gt;&#xA;&lt;li&gt;设备保护功能，可以防止未经授权的用户访问丢失或被盗的设备。&lt;/li&gt;&#xA;&lt;li&gt;同时增加了 ART 虚拟机支持，大幅度提升了应用程序性能。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2015-年android-60-marshmallow&#34;&gt;&#xA;  2015 年：Android 6.0 Marshmallow&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2015-%e5%b9%b4android-60-marshmallow&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;支持运行时权限管理，用户可以在使用应用程序时授权或拒绝开启某些操作权限，如访问相机或联系人。&lt;/li&gt;&#xA;&lt;li&gt;Google Now On Tap 功能，可为你提供更加个性化和定制化的搜索结果。&lt;/li&gt;&#xA;&lt;li&gt;延长了电池寿命并减少移动数据使用量的 Doze 模式。&lt;/li&gt;&#xA;&lt;li&gt;改进的指纹识别 API。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2016-年android-7071-nougat&#34;&gt;&#xA;  2016 年：Android 7.0/7.1 Nougat&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2016-%e5%b9%b4android-7071-nougat&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新增了「分屏模式」，可将两个应用程序并排展示，同时支持优化因网络连接而打断应&lt;/li&gt;&#xA;&lt;li&gt;用程序使用体验的多窗口模式。&lt;/li&gt;&#xA;&lt;li&gt;支持多任务分屏。&lt;/li&gt;&#xA;&lt;li&gt;改进通知系统。&lt;/li&gt;&#xA;&lt;li&gt;Vulkan API 支持游戏体验改善。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2017-年android-8081-oreo&#34;&gt;&#xA;  2017 年：Android 8.0/8.1 Oreo&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2017-%e5%b9%b4android-8081-oreo&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;引入 Project Treble，简化了 Android 更新流程。&lt;/li&gt;&#xA;&lt;li&gt;最大的更新包括限制了不必要的后台任务，例如«胡萝卜和棍子»算法来保留电量；&lt;/li&gt;&#xA;&lt;li&gt;Webview 已经从系统中移除，在 Google Play 商店中分发更新。&lt;/li&gt;&#xA;&lt;li&gt;自适应图标。&lt;/li&gt;&#xA;&lt;li&gt;强化 WiFi 连接速度及安全性。&lt;/li&gt;&#xA;&lt;li&gt;新增 PiP（画中画）功能以便于多任务处理。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2018-年android-90-pie&#34;&gt;&#xA;  2018 年：Android 9.0 Pie&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2018-%e5%b9%b4android-90-pie&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;快捷启动应用程序操作。引入了名为「适配屏幕缺口」(Notch)的特性，以支持新一代手机屏幕的刘海设计。&lt;/li&gt;&#xA;&lt;li&gt;支持同时开启多个 Bluetooth、Wi-Fi 等连接，方便设备连接管理。&lt;/li&gt;&#xA;&lt;li&gt;颜色呈现增强。&lt;/li&gt;&#xA;&lt;li&gt;自适应亮度控制。&lt;/li&gt;&#xA;&lt;li&gt;全面采取高效 AI 和机器学习技术。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2019-年android-10&#34;&gt;&#xA;  2019 年：Android 10&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2019-%e5%b9%b4android-10&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;手势导航。&lt;/li&gt;&#xA;&lt;li&gt;暗黑模式。&lt;/li&gt;&#xA;&lt;li&gt;重要通知可进行回复。&lt;/li&gt;&#xA;&lt;li&gt;系统安全性支持增强。加强了隐私保护措施，支持应用程序读取短信权限的部分变化，使用非 resettable 的 MAC 地址等。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2020-年android-11&#34;&gt;&#xA;  2020 年：Android 11&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2020-%e5%b9%b4android-11&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新增了 Bubbles 聊天气泡功能，可以在不打断现有任务的情况下查看聊天内容。调&lt;/li&gt;&#xA;&lt;li&gt;整了通知样式和布局，并加强了应用程序故障监视和定位。&lt;/li&gt;&#xA;&lt;li&gt;媒体和控制，机器学习加强智能化操作。&lt;/li&gt;&#xA;&lt;li&gt;我的设备中新增“小黄车”支持。&lt;/li&gt;&#xA;&lt;li&gt;隐私提醒全方面增强。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2021-年android-12&#34;&gt;&#xA;  2021 年：Android 12&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2021-%e5%b9%b4android-12&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Material You 设计语言。&lt;/li&gt;&#xA;&lt;li&gt;多点触控增强。&lt;/li&gt;&#xA;&lt;li&gt;更快、更流畅的动画效果。&lt;/li&gt;&#xA;&lt;li&gt;对于隐私保护做出了大量改进。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;android-市占率和用户量发展历史&#34;&gt;&#xA;  Android 市占率和用户量发展历史&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#android-%e5%b8%82%e5%8d%a0%e7%8e%87%e5%92%8c%e7%94%a8%e6%88%b7%e9%87%8f%e5%8f%91%e5%b1%95%e5%8e%86%e5%8f%b2&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;根据 &lt;a href=&#34;https://backlinko.com/iphone-vs-android-statistics&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;iPhone vs Android Statistics&lt;/a&gt; 的数据：&lt;/p&gt;</description>
			</item>
			<item>
				<title>Mac 软件生态在中国的发展研究</title>
				<link>https://www.hualet.org/posts/macos_eco_cn/</link>
				<pubDate>Sat, 16 Nov 2024 23:20:30 +0800</pubDate>
				<guid>https://www.hualet.org/posts/macos_eco_cn/</guid>
				<description>&lt;h2 id=&#34;国内主要软件在-mac-上的适配情况&#34;&gt;&#xA;  国内主要软件在 Mac 上的适配情况&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%9b%bd%e5%86%85%e4%b8%bb%e8%a6%81%e8%bd%af%e4%bb%b6%e5%9c%a8-mac-%e4%b8%8a%e7%9a%84%e9%80%82%e9%85%8d%e6%83%85%e5%86%b5&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;社交类&#xA;&lt;ul&gt;&#xA;&lt;li&gt;微信：&lt;a href=&#34;https://weixin.qq.com/cgi-bin/readtemplate?t=weixin_faq_list&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20140226 发布 1.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;QQ：&lt;a href=&#34;https://zh.wikipedia.org/zh-cn/%E8%85%BE%E8%AE%AFQQ&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20080128 发布 1.0 Preview 1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;浏览器&#xA;&lt;ul&gt;&#xA;&lt;li&gt;360 浏览器 &lt;a href=&#34;https://liulanmi.com/dl/13012.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20190118 发布 1.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;音乐类&#xA;&lt;ul&gt;&#xA;&lt;li&gt;QQ 音乐 &lt;a href=&#34;https://www.iphonetaiwan.org/2013/01/qq-for-mac-v10.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20130114 发布 1.0&lt;/a&gt;，第一个版本的界面还挺 Mac（好看） 的&lt;/li&gt;&#xA;&lt;li&gt;网易云音乐 &lt;a href=&#34;https://www.waerfa.com/netease-cloud-music&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;201410xx 发布 1.0 （推测）&lt;/a&gt; 第一个版本的界面也还挺 Mac（好看）的&lt;/li&gt;&#xA;&lt;li&gt;酷狗音乐 &lt;a href=&#34;https://tech.sina.com.cn/s/2013-07-23/17008566708.shtml&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20130723 发布 1.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;虾米音乐 &lt;a href=&#34;https://jp.v2ex.com/t/75671&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20130713 前后（推测）&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;视频类&#xA;&lt;ul&gt;&#xA;&lt;li&gt;爱奇异 不可考&lt;/li&gt;&#xA;&lt;li&gt;腾讯视频 &lt;a href=&#34;https://www.ithome.com/0/307/816.htm&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20170507 发布 1.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;搜狐视频 &lt;a href=&#34;https://www.imac.vip/thread-4523-1-1.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20130601 发布 0.1 测试版&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;优酷视频 不可考&lt;/li&gt;&#xA;&lt;li&gt;暴风影音 &lt;a href=&#34;https://www.sohu.com/a/35886387_117770&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20151015 发布 1.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;工具类&#xA;&lt;ul&gt;&#xA;&lt;li&gt;搜狗输入法 &lt;a href=&#34;https://www.pcbeta.com/viewnews-25831-1.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20110617 发布 1.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;有道词典 &lt;a href=&#34;https://hk.v2ex.com/t/19864&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20111020 发布 1.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;迅雷 &lt;a href=&#34;https://www.ithome.com/0/002/051.htm&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20110713 发布 1.0.1.44 Beta1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;百度网盘 &lt;a href=&#34;https://www.ithome.com/0/002/051.htm&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20161020 发布 1.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;坚果云 &lt;a href=&#34;https://help.jianguoyun.com/?p=1419&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;20121018 之前（推测）&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mac-在国内的市场占有率发展情况&#34;&gt;&#xA;  Mac 在国内的市场占有率发展情况&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#mac-%e5%9c%a8%e5%9b%bd%e5%86%85%e7%9a%84%e5%b8%82%e5%9c%ba%e5%8d%a0%e6%9c%89%e7%8e%87%e5%8f%91%e5%b1%95%e6%83%85%e5%86%b5&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://gs.statcounter.com/os-market-share/desktop/china/2010&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;参考 statcounter 数据&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>《小Lin说》采访Anker创始人</title>
				<link>https://www.hualet.org/posts/anker/</link>
				<pubDate>Sun, 27 Oct 2024 07:29:05 +0800</pubDate>
				<guid>https://www.hualet.org/posts/anker/</guid>
				<description>&lt;p&gt;一大早看到小lin说的推送，关于 Anker 创始人的采访：&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/mjsa45U4c6E?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;以前对这家公司和产品了解不多，不过看下来觉得干货满满，而且创始人阳萌（这么萌的名字， 英文名：Steven Yang）谦虚、聪明而又蕴含大智慧，是我非常喜欢的一种创始人类型，觉得有必要总结、分享一下。&lt;/p&gt;&#xA;&lt;p&gt;总结很有意思的几个点：&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-常识大家都懂但是只有经历了才能深刻领悟&#34;&gt;&#xA;  1） 常识大家都懂，但是只有经历了才能深刻领悟。&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#1-%e5%b8%b8%e8%af%86%e5%a4%a7%e5%ae%b6%e9%83%bd%e6%87%82%e4%bd%86%e6%98%af%e5%8f%aa%e6%9c%89%e7%bb%8f%e5%8e%86%e4%ba%86%e6%89%8d%e8%83%bd%e6%b7%b1%e5%88%bb%e9%a2%86%e6%82%9f&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;这点最近几年印象深刻，尤其是看了很多段永平和自己经历了以后。段永平开始讲常识，是跟巴菲特午餐之后，原话记得不是特别清楚，但是大意就是你妈妈从小到大告诉你的就是常识，投资圈讲常识可能是为了避免投资人一时头脑过热，但是讲常识不止是投资圈才有意义。&lt;/p&gt;&#xA;&lt;p&gt;比如我们做产品，明明有一个很好的标杆放在那，我们为了显得“创新”而特别标新立异，其实就是违反常识。 比如我们做管理，大部分时候竞争就是 “以正和、以奇胜”，但是大家无视常识，不去做市场细分、不做差异化，非要靠“出奇招”，这就是违反常识。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-针对流量的hack只是术产品好才是道&#34;&gt;&#xA;  2） 针对流量的Hack只是术，产品好才是道。&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2-%e9%92%88%e5%af%b9%e6%b5%81%e9%87%8f%e7%9a%84hack%e5%8f%aa%e6%98%af%e6%9c%af%e4%ba%a7%e5%93%81%e5%a5%bd%e6%89%8d%e6%98%af%e9%81%93&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Steven 作为谷歌早期员工创业，大家默认以为他会懂得很多做谷歌SEO的方法，但是他讲谷歌等搜索引擎在搜索算法上、尤其是通过人的行为反馈来评分的算法模块，已经做到了让搜索结果无限接近于真实。那么产品要想做到出众，最主要的还是回归产品体验和质量本身，比如 Anker 的产品盯住4.5评分这个目标，全方面优化产品，才有了后面的产品口碑和很不错的销量排名。&lt;/p&gt;&#xA;&lt;p&gt;这个让我想到了段永平对央视“标王”的理解——营销只是为了让产品更有知名度，产品质量优劣真正决定了能走多远。&lt;/p&gt;&#xA;&lt;h3 id=&#34;3-4p-飞轮定义了产品商业模式和市场空间&#34;&gt;&#xA;  3） 4P 飞轮，定义了产品、商业模式和市场空间。&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#3-4p-%e9%a3%9e%e8%bd%ae%e5%ae%9a%e4%b9%89%e4%ba%86%e4%ba%a7%e5%93%81%e5%95%86%e4%b8%9a%e6%a8%a1%e5%bc%8f%e5%92%8c%e5%b8%82%e5%9c%ba%e7%a9%ba%e9%97%b4&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;4P 感觉王慧文讲得更好，但是这期讲出来也很有价值。&lt;/p&gt;</description>
			</item>
			<item>
				<title>《小而美——持续盈利的经营法则》读后感</title>
				<link>https://www.hualet.org/posts/the_minimalist_entrepreneur/</link>
				<pubDate>Sun, 06 Oct 2024 10:19:32 +0800</pubDate>
				<guid>https://www.hualet.org/posts/the_minimalist_entrepreneur/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2024/10/minimal/s34511307.jpg&#34; alt=&#34;preface&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;国庆节花了三四天时间看完了，讲述极简主义创业——也是最近很火的独立开发者——的一本书，也可以说是圣经（之一）。&lt;/p&gt;&#xA;&lt;p&gt;极简主义创业的标准步骤：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;找到一个社区，以及社区的一个问题（需求）&lt;/li&gt;&#xA;&lt;li&gt;解决这个问题（哪怕是简单的、手工的），然后产品化&lt;/li&gt;&#xA;&lt;li&gt;通过这个产品赚取利润&lt;/li&gt;&#xA;&lt;li&gt;营销你的事业，让更多人知道并且能够参与&lt;/li&gt;&#xA;&lt;li&gt;反馈、迭代&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这里面有几个精华的观点：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;立即行动，不是先学习再开始，而是先开始再学习&lt;/li&gt;&#xA;&lt;li&gt;盈利为先，企业应该以盈利为基本目标，其他的扩大规模、扩充人员都应该是次要的追求&lt;/li&gt;&#xA;&lt;li&gt;永远贴近客户，第一步是社区、第二步是通过自媒体营销，都要紧紧围绕客户：能为客户做什么、提供什么价值…&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这本书讲极简主义专业，包含的内容看似简单，但实际上包含了 社区、产品、商业、营销、财经、企业文化、投融资的方方面面，只是各有侧重，常读常新，一本不错的书，搭配《商业至简》阅读效果更佳。&lt;/p&gt;</description>
			</item>
			<item>
				<title>《张一鸣管理日志》读书分享</title>
				<link>https://www.hualet.org/posts/yiming/</link>
				<pubDate>Fri, 04 Oct 2024 10:51:47 +0800</pubDate>
				<guid>https://www.hualet.org/posts/yiming/</guid>
				<description>&lt;p&gt;突然翻到去年（2023年）在团队内做的一个关于《张一鸣管理日志》的读书分享》，&lt;/p&gt;&#xA;&lt;p&gt;觉得还行，分享给需要的朋友！&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_01.png&#34; alt=&#34;yiming_01&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_02.png&#34; alt=&#34;yiming_02&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_03.png&#34; alt=&#34;yiming_03&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_04.png&#34; alt=&#34;yiming_04&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_05.png&#34; alt=&#34;yiming_05&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_06.png&#34; alt=&#34;yiming_06&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_07.png&#34; alt=&#34;yiming_07&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_08.png&#34; alt=&#34;yiming_08&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_09.png&#34; alt=&#34;yiming_09&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_10.png&#34; alt=&#34;yiming_10&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_11.png&#34; alt=&#34;yiming_11&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_12.png&#34; alt=&#34;yiming_12&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_13.png&#34; alt=&#34;yiming_13&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_14.png&#34; alt=&#34;yiming_14&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_15.png&#34; alt=&#34;yiming_15&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_16.png&#34; alt=&#34;yiming_16&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_17.png&#34; alt=&#34;yiming_17&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_18.png&#34; alt=&#34;yiming_18&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_19.png&#34; alt=&#34;yiming_19&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_20.png&#34; alt=&#34;yiming_20&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_21.png&#34; alt=&#34;yiming_21&#34;&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2024/10/yiming/yiming_22.png&#34; alt=&#34;yiming_22&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Windows 版本特性史</title>
				<link>https://www.hualet.org/posts/windows/</link>
				<pubDate>Thu, 26 Sep 2024 15:00:07 +0800</pubDate>
				<guid>https://www.hualet.org/posts/windows/</guid>
				<description>&lt;p&gt;最近突发兴致，想系统性研究一下操作系统老大哥微软，本来想去考古微软的历史，但想想工作量太大了，先从Windows的历史开始吧。&lt;/p&gt;&#xA;&lt;p&gt;参考了很多内容 &lt;a href=&#34;##%e5%8f%82%e8%80%83%e9%93%be%e6%8e%a5&#34; &gt;参考链接&lt;/a&gt; ，跟这些文章/资料不同的是，本文不关注非桌面版、更关注产品功能和技术点。&lt;/p&gt;&#xA;&lt;p&gt;文章会持续更新，欢迎评论补充！&lt;/p&gt;&#xA;&lt;h2 id=&#34;windows-95&#34;&gt;&#xA;  Windows 95&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#windows-95&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;代号 &amp;ldquo;Chicago&amp;rdquo; 从原来 Windows 3.x 的 16 位进入 32位时代，产品方面定位为面向大众的消费品而不是面向企业技术人员。&lt;/li&gt;&#xA;&lt;li&gt;NT 内核并入主线，意味着专门为企业级使用的高级内核开始开放给大众消费者，产品线进行了融合；&lt;/li&gt;&#xA;&lt;li&gt;开创性引入 开始菜单 和 任务栏；&lt;/li&gt;&#xA;&lt;li&gt;开发新的资源管理器，替代原来的文件管理器；&lt;/li&gt;&#xA;&lt;li&gt;捆绑 IE 浏览器；&lt;/li&gt;&#xA;&lt;li&gt;技术上：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;全面支持32位处理器，但是同时仍然兼容 16 位的应用程序；&lt;/li&gt;&#xA;&lt;li&gt;支持虚拟内存和抢占式调度；&lt;/li&gt;&#xA;&lt;li&gt;支持即插即用；&lt;/li&gt;&#xA;&lt;li&gt;广泛的多媒体支持，提供 DirectX；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;windows-98&#34;&gt;&#xA;  Windows 98&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#windows-98&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;界面方面也进行了改进&#xA;&lt;ul&gt;&#xA;&lt;li&gt;任务栏上点击最小化窗口的功能&lt;/li&gt;&#xA;&lt;li&gt;新的快速启动工具栏，可将某些快捷方式固定到任务栏&lt;/li&gt;&#xA;&lt;li&gt;Windows 资源管理器（Windows Explorer）添加了后退和前进按钮以及地址栏&lt;/li&gt;&#xA;&lt;li&gt;多显示器支持&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;针对多媒体和即插即用的优化，Web TV的支持等；&lt;/li&gt;&#xA;&lt;li&gt;文件系统&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对FAT32文件系统的支持&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;深度整合网络功能，融入了更多基于 Web 的元素&#xA;&lt;ul&gt;&#xA;&lt;li&gt;附带的 Internet Explorer，还有应用程序如 Outlook Express、FrontPage Express 和 Microsoft Chat&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;引入了 Windows 驱动程序模型（WDM）来帮助硬件支持&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/DirectX&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DirectX&lt;/a&gt; （95开始提供， 98以后开始默认预装）&lt;/li&gt;&#xA;&lt;li&gt;增加在线更新的功能 &amp;ndash; 难道在此之前都是重装系统么？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;windows-me&#34;&gt;&#xA;  Windows Me&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#windows-me&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;定位为 家庭数字媒体中心的操作系统，整体上仍然是对 98 系列的延续和完善；&lt;/li&gt;&#xA;&lt;li&gt;技术创新点：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;首次引入系统还原的特性；&lt;/li&gt;&#xA;&lt;li&gt;多媒体（Me版本）&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Windows Movie Maker 视频编辑器&lt;/li&gt;&#xA;&lt;li&gt;Windows Media Player 和 Windows DVD Player&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;启动优化和图形系统改进；&lt;/li&gt;&#xA;&lt;li&gt;更加专注于 Windows 内核，而不是 DOS。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;windows-2000&#34;&gt;&#xA;  Windows 2000&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#windows-2000&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;定位为面向企业，采用 NT 内核；&lt;/p&gt;</description>
			</item>
			<item>
				<title>《埃隆·马斯克传》</title>
				<link>https://www.hualet.org/posts/elonmusk/</link>
				<pubDate>Mon, 24 Jun 2024 23:12:09 +0800</pubDate>
				<guid>https://www.hualet.org/posts/elonmusk/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2024/06/s34654248.jpg&#34; alt=&#34;caption&#34; title=&#34;埃隆·马斯克传&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;很明显这是一本讲马斯克生平的书，市面上还有另外一本讲马斯克的书《硅谷钢铁侠》，我一直以为我看过，直到看《埃隆·马斯克传》我才发现原来那本书我并没有读多少……所以又回去看了那本书的目录，简单对比下来的感受是 1）这本书在故事和细节上更为详细，2）同时也对马斯克有美化、拍马屁的嫌疑，这两点倒是很容易理解——毕竟是马斯克找人写得。&lt;/p&gt;&#xA;&lt;p&gt;需要注意的是这本书翻译得并不好，除了译者喜欢卖弄一些看不懂的词藻外，还经常出现一些翻译词不达意的情况，在微信读书的评注中有不少指出这样错误的例子，建议有条件的直接阅读英文版。&lt;/p&gt;&#xA;&lt;h2 id=&#34;马斯克其人&#34;&gt;&#xA;  马斯克其人&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%a9%ac%e6%96%af%e5%85%8b%e5%85%b6%e4%ba%ba&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2024/06/musk_tesla.png&#34; alt=&#34;musk_tesla&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;我们看人物传记，除了在某些特定的时刻能鼓舞我们以外，最重要的还是分析人物身上的特质，学习其好的一面。马斯克作为我们时代最具创新性和争议性的科技领袖、企业家、世界首富，其人不可谓不复杂：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;冒险精神，马斯克最出名的应该就是其爱冒险的性格特质，有时候可以说是为了冒险而冒险。这可能跟他的家族和生活北京有很大关系，他的家族座右铭是“冒险而审慎地生活”。&lt;/li&gt;&#xA;&lt;li&gt;极端的成本意识，为了低成本造火箭、降低Tesla的成本，就差把火箭头和汽车轮子给卸掉了，这也是著名的第一性原理的重要案例。&lt;/li&gt;&#xA;&lt;li&gt;说干就干，白天有想法晚上就干、今天有想法明天就干的例子书中比比皆是。除此之外，需要的时候该找谁找谁（比如在twitter的时候找 tim cook）。这可能就是马斯克说得没有精神内耗吧。&lt;/li&gt;&#xA;&lt;li&gt;硬核，除了本身做得事情就比较硬核以外，还推崇硬核工作文化，说白了就是敢天马行空地想、敢卖命地干。 马斯克自己也躬身入局，他除了可以自己以身作则外，还非常擅长制造紧迫感，以此来推动公司往前快速前进，住在Tesla工厂和Twitter办公室那段时间可以说把硬核文化展现的淋漓尽致了。&lt;/li&gt;&#xA;&lt;li&gt;面向未来、Think big， “埃隆是在使命感的驱动下顺势而为，先行好事，后问前程。”  求其上者得其中，求其中者得其下。&lt;/li&gt;&#xA;&lt;li&gt;时间管理大师，一个人管理 spacex、tesla、boring、nerual link、starlink、twitter 这么多公司，居然还能玩得转。 后来我发现这哥们只要不是出去嗨或者玩儿游戏，基本上都是在工作，真的是没日没夜在处理公司的事情。&lt;/li&gt;&#xA;&lt;li&gt;喜欢读书，这应该是成功人士的必备技能，不一定是看书，但是应该都非常善于学习，乔布斯、段永平、张一鸣、Larry Page等无一不是。马斯克更是通过阅读大量专业书籍成为半个行业专家。马斯克的导师是 Oracle 的 Ellison，他同时也是乔布斯的邻居和很好的朋友，马斯克跟乔布斯一样都离经叛道但充满创意，不知道是不是巧合？&lt;/li&gt;&#xA;&lt;li&gt;极度理性，这点非常像乔布斯，在工作的范畴里面个人感受和情感都算个屁。开除公司元老也是毫不犹豫，不过据说期权股票什么的倒也算慷慨。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;马斯克一些比较奇怪的癖好：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;比较喜欢搞怪，看他的Twitter/X就知道。&lt;/li&gt;&#xA;&lt;li&gt;喜欢玩电子游戏。&lt;/li&gt;&#xA;&lt;li&gt;喜欢当沙发客，这么有钱却总喜欢住别人家沙发。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2024/06/musk_sink.png&#34; alt=&#34;musk_sink&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;五步工作法&#34;&gt;&#xA;  五步工作法&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%ba%94%e6%ad%a5%e5%b7%a5%e4%bd%9c%e6%b3%95&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;抛开马斯克的种种个人特质，他总结的五步工作法以及其衍生思想非常值得推崇，那么重点来了。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;质疑每项要求。提出任何一项要求时，都应该附上提出这一要求的人。永远不要接受一项来自某个部门的要求，比如来自“法务部门”或者“安全部门”的要求。你必须知道提出这项要求的人的名字。接下来你应该质疑它，不管这个人有多聪明。聪明人提出的要求才是最危险的，因为人们不太可能质疑他们。这件事要一直做下去，即便这项要求来自我马斯克本人。质疑后，大家就要改进要求，让它变得不那么愚蠢。&lt;/li&gt;&#xA;&lt;li&gt;删除要求当中所有你能删除的部分和流程，虽然你可能还得把它们加回来。事实上，你如果最后加回来的部分还不到删除部分的10%，那就说明你删减得还不够。&lt;/li&gt;&#xA;&lt;li&gt;简化和优化。这应该放在第2步之后，因为人们常犯的错误就是简化和优化一个原本不应该存在的部分或者流程。&lt;/li&gt;&#xA;&lt;li&gt;加快周转时间。每个流程都可以加快，但只有遵循了前三个步骤之后才能这么做。在特斯拉工厂，我错误地把很多精力花在加快生产流程上，后来我才意识到有些流程原本就应该被拿掉。&lt;/li&gt;&#xA;&lt;li&gt;自动化。在内华达工厂和弗里蒙特工厂犯下的一个大错就是我一开始试图将每个步骤进行自动化改造。我们本应该先质疑所有要求，删除不必要的部分和流程，把问题筛出来、处理掉，然后再推进自动化。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这套工作法有时还衍生出一些推论，包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;所有技术经理都必须有实战经验，比如说软件团队的管理人员必须至少花20%的时间进行编程，太阳能屋顶业务的经理必须花时间在屋顶上亲自做安装工作。否则光说不练，他们就像是不会骑马的骑兵队队长、不会舞刀弄枪的将军。&lt;/li&gt;&#xA;&lt;li&gt;“你好，我好，大家好”是很危险的，人们会因此不再质疑同事的工作成果。人们天然有一种倾向是不想把要好的同事踢下船，而这种危险倾向一定要避免。&lt;/li&gt;&#xA;&lt;li&gt;犯错没关系，但错了还不肯低头就不行。&lt;/li&gt;&#xA;&lt;li&gt;永远不要要求你的团队做你自己都不愿意做的事。&lt;/li&gt;&#xA;&lt;li&gt;每当有问题需要解决时，不要只与你直接管理的相关负责人聊。深入调研就要跨层级沟通，去跟你属下的属下直接交流吧。&lt;/li&gt;&#xA;&lt;li&gt;招聘要招态度端正的人。技能是可以教的，但要扭转一个人的工作态度可就太费劲了，得给他“换个脑子”。&lt;/li&gt;&#xA;&lt;li&gt;疯狂的紧迫感是我们公司运作的法则。 唯一要遵守的规则就是物理学定律能推导出来的规则，其他一切都只是建议。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;个人感受&#34;&gt;&#xA;  个人感受&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%b8%aa%e4%ba%ba%e6%84%9f%e5%8f%97&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2024/06/falcon9.jpeg&#34; alt=&#34;falcon9&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>《抢占心智》</title>
				<link>https://www.hualet.org/posts/qiangzhanxinzhi/</link>
				<pubDate>Sun, 23 Jun 2024 23:03:32 +0800</pubDate>
				<guid>https://www.hualet.org/posts/qiangzhanxinzhi/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2024/06/s29827208.jpg&#34; alt=&#34;caption&#34; title=&#34;封面&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;一本讲品牌营销的书，综合来讲算是《定位》和《蓝海战略》的结合体，作为企业管理者看 1、2、5、6 章就差不多了，其他章节更像是江南春给自己和分众打广告。&lt;/p&gt;&#xA;&lt;p&gt;这本书最最最核心的内容是告诉企业应该&lt;strong&gt;找准自己的定位&lt;/strong&gt;，&lt;strong&gt;专注于细分市场&lt;/strong&gt;，&lt;strong&gt;在领先的窗口期内，快速进行饱和式营销&lt;/strong&gt;进而达到&lt;strong&gt;占领用户心智&lt;/strong&gt;的目标。&lt;/p&gt;&#xA;&lt;p&gt;如何创造细分市场？书里面讲要对细节有敏锐的洞察力，这依赖于对行业有深刻的认知。在此基础之上要有怀疑精神，有点类似于马斯克的第一性原理。怀疑以后提出颠覆性创新思路，这里面有个诀窍是可以做结合，比如饮料+凉茶=王老吉。&lt;/p&gt;&#xA;&lt;p&gt;如何占领用户心智？书里讲可以封杀品类，即老大进行饱和式营销不给老二老三机会。可以占据特性，在细分的小众市场作为基础，发起反攻。可以聚焦业务，类似百年传承。可以开创新品类，红海中寻找蓝海，具体操作见上一段。&lt;/p&gt;&#xA;&lt;p&gt;最后，老江分享了自己的一些经历，包括失败的并购和兼并经验，过分追求 PE 后公司迷失，以及自我膨胀等，非常难得。这可能也是为什么他把“人生是为了服务，利益只是个结果”作为自己的座右铭，以及财务自由后以加速中国企业品牌化进程和助力其他企业品牌成功为人生目标。&lt;/p&gt;&#xA;&lt;p&gt;曾经看过他的一些采访视频，讲品牌营销的头头是道、机场踱步发微信语音的姿态、朴素得衣着、以工作为生活得态度，总觉得这样的人值得敬佩。&lt;/p&gt;</description>
			</item>
			<item>
				<title>《张一鸣管理日记》读后感</title>
				<link>https://www.hualet.org/posts/journal-of-yiming/</link>
				<pubDate>Sat, 02 Sep 2023 22:41:40 +0800</pubDate>
				<guid>https://www.hualet.org/posts/journal-of-yiming/</guid>
				<description>&lt;p&gt;陆陆续续读了小一个月，不算完全读完，比如“社会责任”这一章节就没怎么读。书的内容主要是就着张一鸣的一些“只言片语”进行延展，重新分析规整，更像是作者把自己对张一鸣读者笔记分享了出来。&lt;/p&gt;&#xA;&lt;p&gt;从章节上，这本书分了比较多部分，比如 自我管理、产品和增长、竞争哲学、打造班底、培养年轻人、远景和价值观、形成组织等等，主要涵盖了张一鸣在人才观、领导力、公司治理能力、知识储备、待人处事的境界、竞争方法等方面的思考和分享。个人觉得内容有些重复，而且分得太细，没有特别组织好。 不过因为以前没怎么深入了解过字节和张一鸣，所以对我个人的启发较大，给了较好的评价。&lt;/p&gt;&#xA;&lt;p&gt;事先知道了这本书的组织形式，所以没有按照从前往后的顺序读，而是按照自己的兴趣点，大概是：竞争哲学、自我管理、打造班底、培养年轻人、形成组织、公司治理、技术创新……权供参考。&lt;/p&gt;&#xA;&lt;h2 id=&#34;印象最深刻的观点&#34;&gt;&#xA;  印象最深刻的观点&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%8d%b0%e8%b1%a1%e6%9c%80%e6%b7%b1%e5%88%bb%e7%9a%84%e8%a7%82%e7%82%b9&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;张一鸣拉张利东入伙。通过一系列“公式”说服张利东，想通了 1）其实口才好坏无所谓，关键是得有干货；2）我们需要时刻明白我们的“故事”，公司的未来在哪、产品的未来在哪、团队的未来在哪，这样才能吸引优秀人才加入、同时留住现有的人才；&lt;/li&gt;&#xA;&lt;li&gt;跟优秀的人做有挑战的事。 公司发展，团队难免变大，为了保证团队不乱，一般很多公司会增加很多流程，流程越来越细致、但人却越来越人浮于事，系统性、创新性解决问题的可能性变得非常低，因为都依赖流程和分工。张一鸣却提出来应该提高人才的密度，减少不必要的流程，增加有大局观、有很好的价值观和能力很全面的人才。一群高素质的人才，就可以让规则定得很简单，简单成少数原则。大家照着原则而不是手把手的规则来配合，甚至只要知道“目标”结合常识就可以行动。&lt;/li&gt;&#xA;&lt;li&gt;如何吸引人才。 四个要素：短期回报、长期回报、个人成长、精神生活。&lt;/li&gt;&#xA;&lt;li&gt;效率大于一切、像优化产品一样优化内部的配合效率。这个跟头一段时间看得《目标》一书遥相呼应，时刻在提醒我：要想清楚目标是什么、识别关键瓶颈、带着团队一起完成瓶颈的优化。张一鸣将公司整体看做产品，打磨完善公司这个产品的方式是不断建设团队和塑造企业文化，表现在组织方面是少汇报、少层级、多共享；表现在管理方面是减少规则、减少流程、提高效率；表现在方法论方面是定高目标、快速迭代；表现在人才战略方面是用核心高管担任HR负责人，然后寻找最聪明的人。&lt;/li&gt;&#xA;&lt;li&gt;知行合一。 张一鸣很好地践行了学以致用，我相信他的大部分才能在最开始都不是自己经历的，但是他保持了很好的学习方法：大量看书、跟别人学习……关键是他都去做了实践。比如对自己的时间做分析，实际上来自于德鲁克倡导的时间管理经典方法论：记录时间—分析时间—系统地安排时间。&lt;/li&gt;&#xA;&lt;li&gt;执行力就是态度和能力。执行力好坏其实主要看目标是否达成、结果如何。一般大家会认为执行力主要是态度，实际上除了态度还要看有没有能力，任何一个出了问题都不会有好的结果。所以，除了对态度提要求外，还要能想办法提升人员的能力。&lt;/li&gt;&#xA;&lt;li&gt;极致理性。 极致理性、时刻保持绅士般的微笑，这是张一鸣给人留下的印象。很难说是好是坏。但是我要改变的是别人跟我说得：“你可以生气、但是不要发脾气”。&lt;/li&gt;&#xA;&lt;li&gt;不要在成本上竞争，要在ROI上竞争。“我们重视技术，而重视的体现之一是工资。我一直认为，公司竞争的核心是ROI（投入产出比）水平而不是成本水平。几乎没有行业领头的公司是控制人力成本来实现领先的，公司应该有好的ROI，而这个好的ROI需要通过让员工收获好的ROI来实现。”&lt;/li&gt;&#xA;&lt;li&gt;think big。 张一鸣能从激烈的竞争中脱颖而出，有一条方法，就是团队敢于定很高的目标。愿景非常大，也能推着员工们一起前进，一起很极致地努力工作。&lt;/li&gt;&#xA;&lt;li&gt;培养年轻人。 除了具体的技能外，1）珍视年轻人身上宝贵的一面：好奇心、没包袱、精力充足。2）鼓励创新和鼓励失败。3）push团队人员“逃逸平庸的重力”。4）提供好的氛围和好的回报。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;除此之外，读这本书的同时我还翻看了一些其他关于字节的材料，比如《​TikTok内幕：张一鸣的巨浪征途》、乱翻书中关于字节的几期博客等。以前印象中的字节跳动就是头条、抖音和飞书，但是没想到不少熟悉的产品居然都属于这家新巨头，比如懂车帝、激萌、番茄小说等等。对张一鸣的了解也更加立体，以前只是觉得他是一个技术型的CEO，了解更多以后发现他身上有非常多值得学习的地方：人才观、领导力、公司治理能力、知识储备、待人处事的境界、对竞争的思考等等，算是多了一个偶像。&lt;/p&gt;&#xA;&lt;p&gt;希望最近有时间再研究一下字节和张一鸣，组织更多材料跟同事做下分享，做分享的目的用书中有一句话形容特别贴切，那就是希望同事看到字节跳动的例子以后能“保持大格局，少吵架，多做事，积极拥抱变化。”&lt;/p&gt;&#xA;&lt;h2 id=&#34;其他笔记和佳句&#34;&gt;&#xA;  其他笔记和佳句&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%85%b6%e4%bb%96%e7%ac%94%e8%ae%b0%e5%92%8c%e4%bd%b3%e5%8f%a5&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;以下是读书过程中记录的部分笔记和佳句。&lt;/p&gt;&#xA;&lt;p&gt;目的性听起来不是一个褒义词，但是现实中他可以大量应用于积极场景。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;给自己一点目的性，确定自己想要什么，然后才去做。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;不只是年轻人，什么时候都不要吝啬帮助。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;对于年轻人来说，多帮人一点，自己也会多一条路。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;我做事从不设边界。当时我负责技术，但遇到产品上有问题，也会积极地参与讨论、想产品的方案。很多人说这个不是我该做的事情。但我想说：你的责任心，你希望把事情做好的动力，会驱动你做更多事情，让你得到很大的锻炼。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;寂寞时保持耐心，困难时保持平常心。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;你必须要承受那样漫长时光的煎熬。现在回想，耐心非常重要，不仅是等待的耐心，还要有耐心作深入思考，找到更多更好的合作伙伴。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;在这种混乱的局面中，创始人保持耐心是非常重要的，处理好了会像今日头条一样获得成长，慌不择路则会走向危险境地。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;珍惜时间，安排自己的时间、提升工作效率、分析自己的时间投入、优化并重新做时间管理。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;据说，他甚至觉得一天工作16小时感觉很好，其珍惜时间的态度由此可见一斑。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;张一鸣在总裁办的会议上，会同步自己的时间规划，甚至把它做成饼状图，上面会展示他一周招人、学英语等各花多少时间。他不断分析自己的时间利用，以此修正自己时间规划，以期达成更优的结果。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;懂得精力有限，一部分做到极致、另外一部分势必要战略性舍弃一些。张一鸣说字节很多事情不做，尤其是别人已经做得不错的事情他们不做，我想差不多就是这个道理。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;我把精力主要放在两件事上：一是产品和技术；二是招聘。这两块，再小的细节我都会过问。但市场和销售，我基本上从不介入。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;人的所有精力都来自同一个精力钱包，如果你在其他事上消耗太多，在工作上就会余额不足。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;执行力就是态度和能力。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;执行力就是态度和能力，只有不断端正态度和提高能力，才能不断增强执行力。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;保守、不胡乱激进，但是think big，有ambitious，大力出奇迹。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;他是一个很保守的人，把事情翻来覆去想得很清楚，还能算得很清楚。他对很稀有的‘大东西’，充满了一种必须拿下，全力以赴地投入所有的精力、所有的资源的态度，然后去大力出奇迹。”&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;直面问题，不要逃避。这在企业管理中很常见，大问题不解决、小问题会不断涌现。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;不要给自己找借口，要直面问题。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;时刻保持自省，不要让自己被名利和地位遮盖住双眼，时刻保持清醒。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;企业家们更需要反省，他们往往被认为是社会成功人士，很容易陷入高估自己的陷阱。当他们在经济上获得优势后，身边的各种诱惑增多，歌功颂德环绕四周，稍不留意就会被欲望牵引，走入歧途。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;更重要的是，随着企业的壮大，他们与下层业务接触越来越少，对具体信息的了解也越来越少，如果缺乏自我反省能力，久而久之，他们看到的只能是虚假的数据和虚报的成绩。只要他们自我感觉良好，总有人会不断满足迎合他们。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;今日头条多位高管和离职员工曾经表示，张一鸣脾气极好，而且是真的好，不是压抑着自己，就是个谦谦君子。他不凶人，也不刻薄地批评人，即使极不满意，也只是温和地说理，温和地鼓励。这与张一鸣积极反省情绪是分不开的。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;张一鸣有自己独特的价值观、领导力和人才观，这些是让我佩服的地方。但是很难说这些部分对字节的成功有多少比例的影响。字节做得事情确实都是在风口上，顺势而为，可能是字节成功更为重要的一个因素。&lt;/p&gt;</description>
			</item>
			<item>
				<title>《硬核晋升》读后感</title>
				<link>https://www.hualet.org/posts/the-making-of-a-manager/</link>
				<pubDate>Fri, 31 Mar 2023 00:12:22 +0800</pubDate>
				<guid>https://www.hualet.org/posts/the-making-of-a-manager/</guid>
				<description>&lt;p&gt;看了一些“高级”管理书籍以后，反过来看这本书，本来觉得是定位给初级管理者的，解决不了我现在面临的问题。但是读下来后一个很明显的感受是：“管理不论是初级、中级，甚至高级，有一些基础能力和技巧永不过时”，读完仍然非常受益。&lt;/p&gt;&#xA;&lt;p&gt;在这本书中作者朱莉卓分享了她自己在担任初创公司创意总监以及在Facebook公司成长为经理的经历和教训，许多场景和问题都非常贴近我们的工作和生活，而且举例子特别多，整体读起来感觉非常亲切。除此之外，作者做管理时那种发自内心的为下属好的心态，给我一种久违了的感觉。不出意外地这本书是作者日常博客整理后所得，不得不再次感慨功夫应该做在平时的同时，也感慨文字传播思想是一种很好的影响力建设方法。&lt;/p&gt;&#xA;&lt;p&gt;从具体内容上来说，这本书涵盖的内容也不少：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;管理者的角色：管理者的核心职责是管理和领导团队，确保团队能够高效地完成工作，并不断提升业绩。管理者需要了解自己的角色，掌握管理的核心技能和知识，建立起正确的管理观念。&lt;/li&gt;&#xA;&lt;li&gt;有效的沟通：管理者需要能够与员工、同事和上级进行有效的沟通，建立起良好的人际关系。作者提供了很多实用的沟通技巧和方法，如倾听、表达、反馈等，帮助管理者更好地理解和应对各种沟通情境。&lt;/li&gt;&#xA;&lt;li&gt;团队建设：管理者需要能够有效地管理团队，建立一个高效、合作、创新的工作环境。作者提供了许多团队建设的实用方法，如招聘、培训、激励等，帮助管理者打造一支优秀的团队。&lt;/li&gt;&#xA;&lt;li&gt;有效的决策：管理者需要能够做出明智的决策，应对各种挑战和问题。作者提供了很多实用的决策框架和方法，帮助管理者快速准确地做出决策。&lt;/li&gt;&#xA;&lt;li&gt;自我管理：管理者需要能够有效地管理自己，保持高效率和良好的状态。作者提供了很多自我管理的实用方法，如时间管理、情绪管理、压力管理等，帮助管理者保持良好的工作状态和心态。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;其中，给我印象最深刻的还是“有效的沟通”，夸张一点说感觉整本书都在讲沟通——一对一沟通、做好反馈、重视高难度对话……可见沟通在管理工作中的重要程度。&lt;/p&gt;&#xA;&lt;p&gt;以下是一些书中比较好的内容摘抄和思考：&lt;/p&gt;&#xA;&lt;p&gt;刚入门的管理者，首先要学会的就是角色转变，你不再是拉车的马、而是驾车的车夫，需要给团队方向、牵引团队向前、以达到团队目标。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;这就是管理的关键：坚信团队会比个人取得的成就更大。管理意味着你意识到了自己不需要什么都亲力亲为，不需要在每一件事上都要一个人拼命做到最好，或者你不需要每一件事都知道怎么做。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这是管理者每天需要做的三件事。 跟《开放式组织》中作者表达的有点类似，其实就是 为什么、谁来做、怎么做。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;“初衷、人员、流程。即为什么、谁来做和怎么做。一个伟大的管理者应该不断地问自己，如何通过影响这些杠杆来提高团队的成绩。随着团队的不断扩大，这个经理人本身做具体的工作有多好已经越来越不重要。”&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;基础的道理，适合每个管理者时不时拿出来审视一下自己。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;因为什么事情都亲力亲为的话，你取得的成绩还是有限的。你要做的是改善你团队的初衷、人员和流程，以实现作为一个团体可以实现的最好的表现。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;所以管理为什么难，有人说要放权、有人却说要下沉，有人说要心怀员工、有人却说要“心狠手辣”…… 说白了，管理手段要因地制宜，适合的才是最好的。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;如果公司处于倒闭的边缘，那么一切都免谈。在那种情况下，你要尽可能快速地将火扑灭才行。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;仍然是在谈角色转变。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;判断你的业绩的基础是团队的成绩，所以你的职责是要竭尽全力帮助团队取得成功。如果你的团队缺乏关键的技能，那么你需要花时间对他们进行培训，或者招人。如果有人对别人造成了影响，那么你需要制止他。如果有人不知道他应该做些什么，那么你需要来为他制订一个计划。很多工作都不是那么酷炫的。但是因为这些工作很重要，所以必须要做，而且如果没有人做的话，那么就得你来做。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;不同规模、阶段的团队对管理者的要求不同。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;这就是为什么适应性是优秀经理人的关键特质。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;很少看到有 IC 这样的角色，但是确实是一类问题的解决思路。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;一旦你晋升到了一定的层级，你就可以成为经理然后继续晋升，或者成为一个“独立贡献者”（IC）&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;做过几年管理，也看过很多管理者以后，我不知道我自己算不算一个负责任的管理者，但是我（从其他管理者身上）学到了很多不负责的管理方式，就不传授给大家了。。。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;当经理们真的需要拍板的时候，这些决策必须是为团队好，否则他们就会失去信任，并且事后发现决策低效。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;还是强调让下属知道做这件事情的意义，而不只是做这个做那个，单纯地发号施令。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;这件事给我上了做管理者的第一课：最好的结果来自激发人们去行动，而不是告诉他们该做什么。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;大部分人做不到，而且反其道而行之。“SHOW自己，PUA下属”这是我学到的不负责任的管理方式之一。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;好的领导的特质就是他们有意地避开聚光灯，以便花更多的时间和精力来支持或保护他的团队”。西蒙·斯涅克&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;管理者必须有领导力，所谓领导力我理解就是正向的影响力，如果你没办法影响他人，你其实很难有办法有效地提升团队的工作效果。 带头干也算是一种初级的影响力~&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;所以，想要成为一名优秀的经理，你必须是一名领导。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;作者肯定看过《成就》这本书，或者受到过比尔·坎贝尔（Bill Campbell）的影响。教练不自己下场打球，他的作用是指导球员取得成功。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;扮演教练的角色 你现在的工作包括理解你以前的同事的职业目标，了解什么样的项目符合他们的优势和兴趣，他们需要什么帮助，以及他们的表现与期望值的差距&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;对于初级管理者挺难的，但是一定要克服这种心理障碍，这其实对你和被谈对象都有好处。而且，激励（正向或者反向）要及时。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;如果有什么事情妨碍了重大目标的实现，你就需要迅速而直接地解决它。这可能意味着要给下属不好的反馈或采取狠招。你需要对团队的结果负责，你越早领会这一点，就越容易进行这种交谈。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;发挥团队的作用，这是我到现在都还时不时会犯的错误。&#xA;同时，要保持韧性，不要让自己崩溃。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;就是我们还是继续努力做着“独立贡献者”的工作，甚至超出了我们所能承受的量。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;不负责任的管理方法之一&#xA;但是很多人是无意的，因为太迫切想让团队好，比如我。。。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;新领导最大的错误之一就是认为自己需要马上插手干预、发表自己的意见，以证明自己很有能力&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;做管理的第一步一定是模仿，这也是为什么每个人的管理方式受自己主管的影响比较大的原因，尤其是第一份工作的第一任主管，影响力最大。&#xA;但是，每个人都有自己的特质，一定要到自信，才能发挥自己的优势。我个人在15年和22年分别有两次在管理上的“顿悟”，本质上是先找到了自信，然后才能做更好的发挥。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;有一句众所周知的格言是这么说的：“做你自己。别人，自有别人去做。”你要想成为你渴望成为的领导者，就要充分发挥你的优势，而不是试图达到别人给你设立的标准，这样你会更加成功。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;OK&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;你还记得我们对管理的定义吗？经理的工作就是通过影响初衷、人员和流程，“帮助一群一起工作的人取得更好的结果”。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;主角出场了：一对一对谈。&#xA;曾几何时，我只是学会了一对一对谈这个奇招，就从“一众”（其实就几个，哈哈）管理者中脱颖而出，但是现在我居然把这个给忘了，也没有传授给更多需要的人。&#xA;对谈有太多的好处：了解事实、做好反馈、获得理解、拉近距离、建立信任、激励……&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;想要解决这个问题，第一步就是要诊断出背后的人员问题。这是动机问题还是技能问题？这不需要搞得很复杂。你可以和你的下属谈一谈，以此来理解背后的原因。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;做个服务型管理者&#xA;服务型管理者不是为了服务下属，而是为了服务团队绩效。 这是在《管理的本质》中陈春花教授的观点，觉得不错。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;你对他们的日常影响比他们对你的影响更大。这意味着在建立信任关系时，你的责任大于他们。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;我的管理理念是：一切的基础都是信任。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;你的下属会定期向你汇报他们在工作中遇到的最大挑战。当别人觉得自己可以与你分享他们的错误、挑战和恐惧时，这意味着你们已经建立了信任关系。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;高级境界&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;我的下属很乐意再次为我效力。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;对下属好的最直接方式是 花时间跟他们进行沟通、教练，建立信任，让团队成功、让下属成功。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;赢得下属信任的方法和赢得其他人信任的方法没有什么不同，这需要以下几点行动。&lt;/p&gt;</description>
			</item>
			<item>
				<title>入职深度十周年</title>
				<link>https://www.hualet.org/posts/10-years-anniversary/</link>
				<pubDate>Mon, 27 Mar 2023 23:56:30 +0800</pubDate>
				<guid>https://www.hualet.org/posts/10-years-anniversary/</guid>
				<description>&lt;p&gt;十年的时间过得好快，现在已经不能完全记起来这十年发生的事情。所以打算写个时间线，记录一下十年的点点滴滴，以供老了怀念，持续更新……&lt;/p&gt;&#xA;&lt;p&gt;感悟：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;有大佬说过，一个人可以做的事情分为三个圈圈：感兴趣的、自己专业的、能赚钱的，这三个圈圈重叠的部分，就是自己应该全情投入的。很幸运能在自己三个圈圈重叠的部分工作十年以上。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2012&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用 deepin 12.06，研究 dui 代码&lt;/li&gt;&#xA;&lt;li&gt;年底趁着过年放假，来到武汉投靠表姐夫，带我一起去深度当时的办公室，中间因为深度办公室换了（创业街换成武软）而找不到办公室，家里人一度认为我被搞传销的骗了&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2013&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;入职深度，猴哥带着做通知系统，看 Desktop Notification Sepc  实现通知系统动画…&lt;/li&gt;&#xA;&lt;li&gt;学习：大量Python高级语法（装饰器、生成器等等）、Emacs/ELisp、七周七语言、DBus、&lt;/li&gt;&#xA;&lt;li&gt;看美剧、动漫、、、&lt;/li&gt;&#xA;&lt;li&gt;第一次见刘总，他跟我微笑了一下，我不认识他&lt;/li&gt;&#xA;&lt;li&gt;公司搬家到光谷芯中心，一个当时鸟不拉屎现在仍然鸟不拉屎的地方&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2014&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;写深度影院，跟QtAV的作者配合，不停修bug、写bug、修bug…&lt;/li&gt;&#xA;&lt;li&gt;作死，为了上班方便搬家到光谷芯中心（还住着3位公司大神），连日常吃饭都成了问题，周末跟其他几位公司大神偶尔到旁边的热闹地吃点好吃的&#xA;&lt;ul&gt;&#xA;&lt;li&gt;经历一次中秋节，三个人拿了点啤酒、水果、零食到房顶上聊人生、、&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;为了深度影院菜单的美感，写 deepin-menu， 一个菜单服务、提供dbus接口、通过dbus 信号触发action执行，各种 数据解析和嵌套、grab、working area、、、有一次跟公司大神调试grab的一个问题到晚上两点，乐在其中&lt;/li&gt;&#xA;&lt;li&gt;公司试点项目组模式（之前都是几个小部门，做到哪是哪的感觉），被抽中&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2015&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;听关于张磊的一些传说，什么代码提交量永远排第一啊、什么试用notepad写代码啊、、&lt;/li&gt;&#xA;&lt;li&gt;公司接了一些国产化的活， webkit + QML 的技术路线性能达不到要求，换 C++/Qt + Go路线，启动V15项目&lt;/li&gt;&#xA;&lt;li&gt;公司试点大项目组模式，不自量力、鬼使神差地报了名，被几位大佬“面试”，对系统一无所知的情况下，还是被作为项目经理“试用”，2周以后内心萌生了强烈的不想干愿望&lt;/li&gt;&#xA;&lt;li&gt;被老板蹂躏、被同事的不配合蹂躏、被系统问题蹂躏、、、被王勇安慰&lt;/li&gt;&#xA;&lt;li&gt;一次技术方案讨论会上，完整提出一个堪称完美的技术方案，从那一刻找到了自信&lt;/li&gt;&#xA;&lt;li&gt;被送到绿盟大学做了一次管理培训，讲高效能人士的七个习惯&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2016&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;迭代 15.1、15.2、15.3，逐个推翻 V15 时候的挫架构设计……&lt;/li&gt;&#xA;&lt;li&gt;搞性能优化，大搞特稿&#xA;&lt;ul&gt;&#xA;&lt;li&gt;perf、kprobe、uprobe、systemtap、dtrace 一系列工具的掌握和尝试&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;被老板蹂躏、蹂躏不配合的同事、被系统问题蹂躏、、、把王勇当垃圾桶吐槽&lt;/li&gt;&#xA;&lt;li&gt;开始觉得deepin也是自己的作品&lt;/li&gt;&#xA;&lt;li&gt;公司搬家，从芯中心搬家到金融港&lt;/li&gt;&#xA;&lt;li&gt;第一次出国旅游，跟着公司去泰国，吐槽的人挺多，我觉得还挺好的&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2017&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;迭代 15.4、15.4.1、15.5，看到三位版本号的系统版本，一般情况下都是刘老板强插的版本&lt;/li&gt;&#xA;&lt;li&gt;买房子、结婚，一度穷到除了吃饭以外什么钱都不敢花&lt;/li&gt;&#xA;&lt;li&gt;王勇离职&lt;/li&gt;&#xA;&lt;li&gt;做过一段时间基础设施，职业生涯中离 DevOps、云、容器、Web 等前沿科技最近的时间段&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2018&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;迭代 15.6、15.7、15.8&#xA;&lt;ul&gt;&#xA;&lt;li&gt;15.6 我的得意之作之一，应该是比较早的发行版支持高分屏，而且支持小数倍缩放&lt;/li&gt;&#xA;&lt;li&gt;15.7 我的得意之作之一，大量系统优化，CPU占用、内存占用 包括功耗（引入laptop-mode-tools，代码比tlp规整一些）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;基本处于没人管的状态，开始琢磨开源社区，把所有工作流程都搬到了GitHub上&lt;/li&gt;&#xA;&lt;li&gt;个人在GitHub的贡献度达到顶峰，后面就一路下坡&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2019&lt;/p&gt;</description>
			</item>
			<item>
				<title>《比尔盖茨的野蛮兵团》读书笔记</title>
				<link>https://www.hualet.org/posts/barbariansledbybillgates/</link>
				<pubDate>Mon, 13 Mar 2023 23:30:43 +0800</pubDate>
				<guid>https://www.hualet.org/posts/barbariansledbybillgates/</guid>
				<description>&lt;p&gt;五星因为同在操作系统这个行业，跟作者一样经历了组织扩张和同事亲疏变幻，感同身受。&lt;/p&gt;&#xA;&lt;p&gt;比最近看得同样是描述操作系统开发历史的《安卓传奇》要好一些，虽然作者的视角可能比较受限（不是非常高的职位），但是刚好从一个更贴近真实的角度讲述了这些有趣的故事，从中可以看到盖茨的性格、微软的工作风格以及Windows的发展历程。&lt;/p&gt;&#xA;&lt;p&gt;比尔盖茨的性格：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;高傲：面对曾经一起奋斗的同事、以及面对PC厂商&lt;/li&gt;&#xA;&lt;li&gt;坚韧不拔：为了说服软硬件厂商为Windows开发驱动和应用软件到处跑，不知疲倦&lt;/li&gt;&#xA;&lt;li&gt;善变 &amp;amp; 兼听则明：跟汉森为了是否进行品牌定位市场调研大吵，但是转瞬间（会场上）就改变立场&lt;/li&gt;&#xA;&lt;li&gt;爱竞争对手（善于抄袭）：在一次会议上，盖茨不断地在奥斯本面前演示苹果电脑和它的数宇多媒体技术QuickTime， 在他的眼里，竞争对手的永远是最好的，而且他对媒体报道的微软自己的Windows视频软件的性能数据并不满意。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;微软的工作风格：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;好战： “正如雷克斯所说的，街厎击败莞手者在微软是一条不成文的规定，是深植于微软人脑海中的一种信念”&lt;/li&gt;&#xA;&lt;li&gt;善于做整合：新产品一般是买其他公司的产品或者公司（书中提到的手写输入法、IE浏览器、NT内核作者哪家公司）&lt;/li&gt;&#xA;&lt;li&gt;商业思维清晰：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;善于做标准，微软取得成功的套路是设定行业标准&lt;/li&gt;&#xA;&lt;li&gt;“埃勒对此丝毫不感意外。他一早就告诉过整个小组：即便是媒体卡最终不能推出，那也不意味着项目是失败的。事实是微软已经达到了它的目的-升级了自己的个人电脑平台。微软已经成功说服原始设备生产商生产更好的图像卡了，如此微软就可以为新的图像卡写新的软件，如果消费者想要这种更精彩的图像化软件的话，就会被迫买下所有的新硬件和新软件。微软可以赚钱，原始设备生产商也可以赚钱，消费者们能享受更酷的游戏，在这件事情 当中，每个人都很高兴。这是微软的一贯做法。”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;为了竞争不择手段：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;输入法之战&#xA;&lt;ul&gt;&#xA;&lt;li&gt;戴迹伟于是回去劝他的代理人，本来就已经设了耐心的两个人，这时更加怒不可遏了。他们开始到处咨询戴迹伟是否有权自己交易，最后反咬一口把戴迹伟告上了法庭。&lt;/li&gt;&#xA;&lt;li&gt;“好吧。”微软的律师说，“这帮家伙想夹硬的，我们就让他们尝尝专业的玩儿法。”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;跟GO的战争：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GO开发布会时：在观众席上坐着做软的卧底温克•索恩( Wink Thome),这是势林克和埃勒安排的。为了装得更像，素恩甚至于前天加人了电脑协会，今天则手提摄像机参加了演示会&lt;/li&gt;&#xA;&lt;li&gt;微软开发布会时：“据埃勒所知，现场并无手提摄像机的卧底，因为微软禁止他们进入”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;看到得最伤感的一段话：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;“有些人希望能够发择自己的天才和创造力来成就辉煌，有些则仅仅想听命于人。可悲的是，随着组织的扩大，几乎所有的人都只能沦为后者，微软也不能例外。人们总是有太多的命令要服从，太多的神要顶礼膜拜。微软不过是变成了另一个IBM。”&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
			</item>
			<item>
				<title>《详谈-左晖》读后感</title>
				<link>https://www.hualet.org/posts/reading-zuohui/</link>
				<pubDate>Sun, 12 Dec 2021 22:58:01 +0800</pubDate>
				<guid>https://www.hualet.org/posts/reading-zuohui/</guid>
				<description>&lt;p&gt;又是一个长期主义者，上次看到明确提出这个的是张磊在《价值》这本书里面。长期主义，其实非常类似马斯克的第一性原理，找到自己做的事情的本质价值，然后坚持去做，在这本书里面和张磊的《价值》里面也都有体现。我认为我从本质上是一个长期主义的信徒，但是有时候又免不了做比较多短期的事情。&lt;/p&gt;&#xA;&lt;p&gt;在使命愿景价值观方面，左晖提了一个我最近在思考也非常认同的事情就是使命和愿景其实是需要有画面感的，试想一个画面，你作为一个管理者在年度的规划会议上侃侃而谈，不是非常虚无地讲一堆可有可无的大道理，而是为大家描述了一个非常美好的将来的画面并且制定了实施路径，你的员工是否会因此感到热血澎湃？我想答案是肯定的，这就是visionary leadership。 请注意，这段本身也是“画面感”的应用 :)&lt;/p&gt;&#xA;&lt;p&gt;对于做产品是否要关注竞品，刘强东和左晖都表示不关注对手的动作，只关注自己的产品、团队，我最近因为跟同事交流也在思考类似的问题，我们是只需要关注自己的产品呢？还是要对标竞品？在某种程度上大佬们的话很难判断真假，对于我自己来说，不同层级做不同层级的事情，初级产品经理至少需要做功能对标、高级产品经理至少需要做战术对标、资深产品经理至少做战略对标，再往上达到刘强东和左晖级别的，自然是主要关注自己的团队和产品，开创新的产品内容。&lt;/p&gt;&#xA;&lt;p&gt;在引入人才方面，左晖提了两点，一个是看人品、要能建立背靠背的信任、另外一个是要能够有自我迭代的能力。无比赞同。如果周围的同事在共事的时候还要互相提防，不要说形成合力了，是否会因为内耗而土崩瓦解都不一定，更不要说最终达成组织的使命了。&lt;/p&gt;&#xA;&lt;p&gt;左晖非常理性，从他对自身的定位，比如说子公司都是子公司CEO的事业；公司定位，比如说觉得外界前期过于低估链家，现在高估贝壳；对于一些客观规则的尊重，比如说很多事情不是一下子就怎么怎么样，是一个线性的过程等等。但是也能看出他的重情义，比如说某次管理例会比较激动、哭了，原因是对很多管理者对其中一位管理者不满意而不满意。&lt;/p&gt;&#xA;&lt;p&gt;有时候比较有趣，比如说戏称很多联合为“大合影”，对这种看起来热闹实际上空洞的合作嗤之以鼻；有时候有比较冷酷，比如说严格执行“折腾每一位员工”，干部轮岗等。&lt;/p&gt;&#xA;&lt;p&gt;强调格局的重要性：“比如我作为一个公司，能站在行业的角度；我作为一个行业，能站在国家的高度；作为一个国家，能站在世界的角度”。这点在刘老板的几次演讲里面也能感受到，对我也挺有启发，让我在一些对外或者需要务虚的地方能准确找到比较好的定位。&lt;/p&gt;&#xA;&lt;p&gt;左晖，一个坚持长期主义、实在而又睿智的汉子，有点像是刘强东、冯大辉的合体。&lt;/p&gt;&#xA;&lt;p&gt;流水不争先，争的是滔滔不绝！&lt;/p&gt;</description>
			</item>
			<item>
				<title>对连接的思考</title>
				<link>https://www.hualet.org/posts/building-connections/</link>
				<pubDate>Sat, 23 Jan 2021 16:49:06 +0800</pubDate>
				<guid>https://www.hualet.org/posts/building-connections/</guid>
				<description>&lt;p&gt;头两天微信10周年，张小龙在产品方面对微信做了总结，我觉得特别能打动我，特别摘录如下，以便后面查看：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;微信十年，如果非要用两个词来描述微信，我想，一个是连接，一个是简单。&lt;/p&gt;&#xA;&lt;p&gt;连接是很美的。因为世界的运行就是靠万事万物的连接而进行的。对产品来说，做连接，意味着做服务的底层设施，因为基于连接可以演变出来的结果是最丰富的。&lt;/p&gt;&#xA;&lt;p&gt;很多的社交产品可能也做连接，但它止步于人，微信的连接范畴更大，公众号、小程序目标都是连接，连接人和内容、人和服务，包括微信支付也可以认为是一种货币的连接，视频号的目标也是连接。重心不是在做内容，而是在做底层的连接，这很重要。这也是为什么我们会提“去中心化“，因为连接和中心化是有些排斥的。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;再说简单。&lt;/p&gt;&#xA;&lt;p&gt;我用简单来作为美观，实用，合理，优雅的代名词。&lt;/p&gt;&#xA;&lt;p&gt;简单是很美的。从一个物理公式到一个日常用品，往往是简单的是更好的。实现同样一个目标，有一千种方法，但只有最简单的方法是最美的。正是因为有一千种方法存在，所以要真正做到简单是很难的。&lt;/p&gt;&#xA;&lt;p&gt;以前在饭否，看到很多产品越做越复杂，我吐槽说，“一个产品，要加多少功能，才能成为一个垃圾产品啊！” 不是说加功能会让产品不好，而是加了不必要的功能，或者加功能的方式不对。&lt;/p&gt;&#xA;&lt;p&gt;十年来，微信加了很多功能。我很庆幸的是，现在的微信，还几乎和十年前的微信一样简单。虽然比十年前多了非常多功能，但这些功能，都已经是用的最简单的办法了，所以增加的复杂度会小。&lt;/p&gt;&#xA;&lt;p&gt;简单才会好用。特别是一个产品有十亿人在用的时候。&lt;/p&gt;&#xA;&lt;p&gt;有时候也会想，很多用户其实并不一定很在意产品是否简单。粗制滥造的产品，也可能照样会有很多人用的。但是我们还是会追求简单，因为总有部分人，会认同这种简单背后的美感。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;微信虽然是这么大用户量的产品了，并且经历了10年之久了，但我还是希望，它能一直保持自己的风格，一直像一个小而美的产品一样，有自己的灵魂，有自己的审美，有自己的创意，有自己的观念。而不仅仅是数字的奴隶。这样的话，我和团队，才会为我们的工作而感到骄傲，并且觉得有意义，这是我对微信十年在今天的最后一个总结。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;巧的是公司产品部也有一样被这些话打动的同事，所以引发了简单的讨论，一位同事表达了自己的看法：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;我们也可以思考一下“连接”1）个人用户不同设备的互连，比如华为分屏共享，2）企业客户之间的互连，方便的传文件，发消息，视频，开会，共享日历（避免会议冲突）3）和亲朋好友的互连，传照片，分享视频等等。当然简单好用是任何一个产品都需要考虑的，不光是微信，操作系统更是这样。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;我下意识回复了一句“互联网时代，说连接怎么都不会错。。。”   讨论嘎然而止。&lt;/p&gt;&#xA;&lt;p&gt;这两天因为考虑部署出去系统的更新问题，我又开始重新思考连接这个词：我们部署了系统，有服务期限，但是我们好像没有跟用户真正建立连接，对用户和我们放出去的产品基本失去了运营的能力，这是一个面向企业级市场的产品经理深深的痛。&lt;/p&gt;&#xA;&lt;p&gt;与之相对的，互联网产品就没有这方面的问题。&lt;/p&gt;&#xA;&lt;p&gt;那么什么是互联网产品？大部分人都会觉得，互联网产品就是基于互联网的产品呀。但是它有什么特点呢？这也是一个比较模糊而又值得思考的问题。以前跟一位朋友聊天，他给我的答案是，互联网业务就是站着就能把钱给挣了，完全的“睡后收入”。说得有点夸张，但是现在想来还是有一定的道理，什么样的产品能够产生“睡后收入“？ 就是能够产生流量，并且可以流量变现的产品。其中的流量其实就是建立在连接之上的。&lt;/p&gt;&#xA;&lt;p&gt;说起这个，不由要说起靠互联网模式成长起来的小米，小米的手机性价比方面在国内的口碑一直不错，但是它却能在维持手机性价比的同时制造大量利润，最主要的原因就是高性价比的手机为小米获取了大量的客户，然后通过各种米服务跟用户建立了千丝万缕的连接，小米再通过这些连接赚取大量利润。这也是小米“手机+AIot”战略的精髓所在，只不过在Iot发展起来以后，小米的用户不再单一通过手机建立联系、而是任何智能家具都可以成为小米跟用户连接的通道。&lt;/p&gt;&#xA;&lt;p&gt;大家诟病比较多的小米的广告，广告这种东西投放的精准度是非常重要的，小米有了跟用户的连接以后，可以在服务端很方便地（当然也需要很强的技术能力支持）做好精准投放，从而会比传统媒介有更好的精准度。&lt;/p&gt;&#xA;&lt;p&gt;为什么很多App千方百计希望用户能够接受通知推送的权限，最主要原因就是App需要通过这个来主动跟你建立连接，否则依靠你主动连接（打开App）他们公司可能就要关门大吉了。&lt;/p&gt;&#xA;&lt;p&gt;最近想换一个手机，鉴于现在安卓机便宜又强大，其实非常想切换到安卓阵营。但是还是纠结了几点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;安卓和苹果体验上的差距；&lt;/li&gt;&#xA;&lt;li&gt;隐私的控制；&lt;/li&gt;&#xA;&lt;li&gt;续航；&lt;/li&gt;&#xA;&lt;li&gt;iCloud；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;前面三点基本上问题不大：虽然体验上安卓和苹果有一定差异需要适应，但是这本身就是想体验的一部分，而且现在安卓手机电池容量都超大，续航方面比苹果还要强一些。最终让我最头疼的还是是切换平台以后，我存在iCloud上的照片&amp;amp;文档，迁移太过麻烦，最后只好作罢。&lt;/p&gt;&#xA;&lt;p&gt;这是什么？这就是有了用户连接以后，可以在此基础之上创造新价值所带来的用户粘性。&lt;/p&gt;&#xA;&lt;p&gt;再回到文章开头的问题，对于内网部署操作系统的客户来说，怎么建立连接？思来想去也只能搞复古的办法——把服务做好，通过这种人工的连接，把我们能给客户提供的新价值提供给客户，增加用户粘性，提高自己被替代的成本。&lt;/p&gt;&#xA;&lt;p&gt;另外，对于同事提到的个人不同设备的互连，这个我也是非常赞同的。现在大部分用户使用手机会远远多于电脑，但是大家处理工作还是会优先使用电脑，这主要是因为电脑还是效率平台。但是如何让用户在使用两者的时候更方便，这其实是手机OS和电脑OS厂商都需要考虑的问题。&lt;/p&gt;&#xA;&lt;p&gt;作为手机和电脑都做的厂商，苹果和华为显然走在了前面：苹果很早就推出了接力，可以把一些在手机上未完成的工作同步到iPad和Mac上。华为在近几年也推出了手机同屏功能，可以直接在PC上操作手机上的内容。而且，两家公司都开始尝试把自家的笔记本芯片换成ARM架构，将来手机上的应用在电脑上运行的障碍会更小，比如目前苹果已经实现iPhone上的应用可以直接在Mac上运行。这带来了另外一种可能就是手机上没有完成的工作，以前可能还受碍于电脑端没有相应的软件可以”接力“（苹果的情况），或者受碍于同屏界面仍然太小不够高效，将来直接在电脑上运行相应的程序，并直接把未完成的工作做无缝迁移。&lt;/p&gt;&#xA;&lt;p&gt;手机会变成效率平台（PC、Mac、平板&amp;amp;Pad）的一种输入媒介。这个值得桌面操作系统厂商深思。&lt;/p&gt;&#xA;&lt;p&gt;总结来说，想表达以下几个观点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;产品要想办法跟用户建立起连接，方便为用户提供新价值，同时提高自己被替代的成本，也即增加用户粘性；&lt;/li&gt;&#xA;&lt;li&gt;在互联网出现前，产品建立连接的方式主要是人工服务，有互联网之后建立连接的方式主要是通过信息服务；&lt;/li&gt;&#xA;&lt;li&gt;桌面OS在未来有两条发展方向：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一个是消费者方向，需要做好用户设备间的连接，手机作为效率平台（PC）的输入，发便用户做切换（不是替代）；&lt;/li&gt;&#xA;&lt;li&gt;一个是企业方向，桌面轻量化，连接云平台，做好定制&amp;amp;管控接口的管理，方便用户做管控（下次论证）；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;欢迎拍砖&amp;amp;交流～&lt;/p&gt;</description>
			</item>
			<item>
				<title>《成就》读后感</title>
				<link>https://www.hualet.org/posts/trillion-dollar-coach/</link>
				<pubDate>Sun, 03 Jan 2021 15:41:39 +0800</pubDate>
				<guid>https://www.hualet.org/posts/trillion-dollar-coach/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2021/01/book1.jpg&#34; alt=&#34;成就&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;《成就》副标题是“优秀管理者成就自己，卓越管理者成就他人”（英文书名并不是这个意思，虽然书的主旨有这句话，但是副标题点明还是有点唐突和直白），是埃里克·施密特（Eric Schmidt）和他在谷歌的同事乔纳森·罗森伯格（Jonathan Rosenberg）为了纪念比尔·坎贝尔（Bill Campbell）写得一本书，主要是通过一些散文性质的小故事来展现比尔·坎贝尔的管理思想和待人之道。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;知道这本书还是在收听吴军在得到 《&lt;a href=&#34;https://m.igetget.com/share/course/pay/detail?id=PZNRwQ0qL1MVEbAskxJ3lmz4kgWEnx&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;硅谷来信2：谷歌方法论&lt;/a&gt;》专栏知道的，吴军在他的推荐序里提到坎贝尔的管理思想和人才培养方式的四个特色：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;1, 强调在IT企业里规范管理的必要性；&lt;/p&gt;&#xA;&lt;p&gt;2, 强调IT企业管理和传统工业企业的差异；&lt;/p&gt;&#xA;&lt;p&gt;3, 强调服务型管理；&lt;/p&gt;&#xA;&lt;p&gt;4, 强调管理者自身水平的提高和管理效率；&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;正是对这些点深以为然，所以才读了这本书。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;因为整本书都是一些小故事，读起来也不费什么精力，非常酣畅淋漓，但是里面的只言片语却非常值得思考，特引用如下：&lt;/p&gt;&#xA;&lt;p&gt;在推荐序一中，有一句话我认为是为本书开了一个好头：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;说到底，一个人的职位越高，他的成功就越取决于能否让别人取得成功。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;勇气和同理心的重要性：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;在比尔的管理哲学中，愿景和热爱是公司的核心和灵魂，他尤其敬重那些有勇气、有技能的初创企业创始人，因为他们每一天都面临巨大的困难，但仍然坚信自己无论如何都能成功。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔认为橄榄球教练的成功靠的是“冷静”，这或许没有错，但在商界，越来越多的证据表明，同情心是取得成功的关键因素。事实证明，让同情心融入团队的想法在商界的作用比在橄榄球场上大得多。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;本书让我了解了管理的教练属性，也是这半年来在一位同事身上学到的管理方面最重要的一点，很多情况下管不住自己的手和口，要么下场干活、要么直接给出答案，人的培养也就落下了：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;在那15年里，比尔的建议影响深远。重点并不在于他教我们做什么事——他的影响远胜于此。如果比尔对产品和战略有任何意见，他通常会隐而不发。但他会确保团队不断地进行沟通，把紧张和分歧摆到桌面上并进行充分讨论，以便在做出重大决定时，无论个人同意与否，大家都能支持最终的决策。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;感受到自己时不时好像也会这样，哈哈哈：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔的拥抱从来都不是那种怯怯地靠过来、不走心、给人感觉是“咱们可别惹恼了律师”、纯为了鼓励、外带几个飞吻式的拥抱。他只要一抱便是熊抱。他拥抱你的时候，你会感觉他很认真，而事实上，他也真的是在认真拥抱你。当李的演讲接近尾声时，他看着在座的人，邀请大家向比尔致敬，拥抱一下自己身边的人。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;以前小团队的时候，时不时有鸡毛蒜皮，但大部分齐心协力；团队大了要把团队凝聚在一起就非常困难，但是团队的管理者至少始终要记得：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;在公司里还有另一个同样重要的成功因素：精诚合作的团队。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;有时候我觉得这些浅显的道理，很多人都不明白。后来渐渐懂了，很多人做管理或者管理属性的工作（项目经理、产品经理、主管等）怕接受别人的建议，其实是怕自己的权威被挑战，本质上确实是缺乏自己，这种情况下更上级的管理者应该提供更多“安全”的环境，让这些管理者可以打开心扉，尽快走到下一个阶段。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;2014年的一项研究发现，最没自信的管理者才会害怕接受他人的建议（或者指导）。所以反过来说，公开接受教练的指导事实上是自信的表现。[插图] 2010年的一篇文章指出，“团队训练”效果很好，但公司或组织往往不会采用这种办法来提升团队或组织的表现（该文作者把团队训练称为“以目标为导向的变革”）。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;其他许多管理技能都可以授权给他人，但职场训练不能。这就是比尔教给我们的终极奥义。在一个快速发展、高度竞争、由技术驱动的商业世界中，要想成功，就要组建一个能够有效、高效工作的团队，并给它成就大事所需的资源和自由。而高绩效团队的领导者既要是个充满悟性的管理者，又得是个懂得关心他人的教练。在这一点上，比尔·坎贝尔是有史以来做得最棒的。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔认为，领导才能是卓越管理的产物。“如何凝聚人才，并让他们在公司里茁壮成长？不是靠独裁，不是靠事无巨细、亲力亲为，而是要让大家觉得和你在一起的时候，他们受到了重视。倾听，而且是用心倾听，这就是优秀的经理要做的事。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔总是会说同一个答案：员工的幸福和成功。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;确实是这样，管理者应该能有效地组织团队，同时要帮助团队成长，成长狭义上就是获取额某种能力，这本质上也是为了提升效率，试想一下没有某种能力的时候要完成某项工作需要先习得这种能力，自然效率低：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;请记住，他认为管理者最重要的工作就是帮助别人变得更有效率，并帮助大家成长和发展，而一对一会议是实现这一目标的最好机会。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;其实，不只是面对自己的下属，面对协作部门的下属也可能要保持这样的心态，才能避免为了自己&amp;amp;自己部门的利益（尊严、奖金、功劳等）去动怒、冲突，看起来是为了公司大局，实际上也锻炼了自己的心性。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔曾经说：“可以把所有下属都想象成你的孩子，你需要帮助他们纠正航向，让他们变得更好。”&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;比尔制定的一对一会议和绩效考核框架中，很值得借鉴和思考。其中，针对管理者的部分摘抄如下：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;1, 你是否在指导你的下属？&lt;/p&gt;&#xA;&lt;p&gt;2, 你处理了害群之马吗？&lt;/p&gt;&#xA;&lt;p&gt;3, 你在努力招人吗？&lt;/p&gt;&#xA;&lt;p&gt;4, 你能让你的下属不畏艰难地去完成工作吗？&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;值得反思处：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;玛丽莎·梅耶尔承认，她在谷歌时就曾遇到过这样的问题。后来比尔教了她一条新的规则：当和团队探讨一个决定时，她必须最后一个发言。比尔说，你可能知道答案，也许你是对的，但当你将它脱口而出时，你就剥夺了大家聚在一起讨论的机会。找到正确的答案很重要，但让整个团队一起找到正确的答案同样重要。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔对丹说，他在担任首席执行官时也遇到过类似情况。当时比尔和管理团队已经决定要实施某项战略，但当比尔在董事会上提出这一战略时，（一直支持该计划的）首席财务官却表示他不同意比尔的意见。会后，比尔要求首席财务官离开公司。即使他不同意这个决定，也必须坚决执行。如果不能，那么他就不再是团队中的一员了。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;比尔对管理非一般天才的建议：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;只要他们的行为不涉及不道德或虐待，他们创造的价值超过他们的行为给管理层、同事和团队造成的损失，那些表现出色但较难相处的“非一般天才”就应当被容忍甚至被保护。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔喜欢讲一个故事，当他在财捷时，公司开始涉足银行产品，于是雇用了一些有银行工作经验的产品经理。有一天，比尔参加一个会议，会上，一位产品经理向工程师们展示了一份他希望后者开发的功能清单。比尔对那位可怜的产品经理说：“如果再对财捷的工程师说你想要什么功能，我就把你扔到街上去。你要告诉他们消费者遇到了什么问题，把和消费者有关的背景资料给他们，然后让他们去想要开发哪些功能。他们会提供比你指导他们开发的解决方案好得多的方案。”&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这方面的经验是：首先要对别人抱以信任的态度，在交往的过程里面通过实际行动中表现出自己值得信任的一面，加深双方的互相信任：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔能很快构建信任，对他来说，这是一件很自然的事情，这种建立融洽关系的能力能给人一种舒适和被保护的感觉。信任是任何商业领域教练活动的基石。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这就是前面提到的建立“安全”氛围，非常凑巧的又碰到了：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;他认为，信任水平能稳定军心，让队员们更加投入：“当队员们发现管理层都非常正直，而且他们可以相信我或者队里任何一个人的话时，他们就会觉得很安全。大家觉得安全了，就不会想离开这里。如果不想离开这里，他们就会在球场上尽其所能，从而留在这里。&lt;/p&gt;&#xA;&lt;p&gt;用现在的话说，要想在团队中建立“心理安全”，建立信任是其中的关键一步。根据康奈尔大学1999年的一项研究，团队心理安全是“团队成员的一种共同信念，即团队可以承担人际风险……它还是一种团队氛围……让人们可以舒服地做自己”。[插图]这正是我们和比尔一起工作时所体验到的感觉，他能很快建立一种关系，让我们可以毫无畏惧地做自己。不出意料，当谷歌通过一次调研来确定高绩效团队背后的成功因素时，心理安全被排在了第一位。[插图]之前大家普遍认为，最好的团队是由技能互补或性格相似的人组成的，但调研结果表明这种观点并不正确；最好的团队是心理安全感最强的团队，而心理安全感源于信任。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;人才观：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔相信优秀的领导者会随着时间的推移而成长，领导力也会从他们所带的团队中慢慢累积到自己身上。他认为，好奇和想学新东西的人最适合当领导者，这个领导力成长路径容不下那些自作聪明的人和他们身上的傲慢。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;面对问题的处理方法论：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;本·霍洛维茨说：“比尔永远不会告诉我该做什么，相反，他会一次又一次地提问，以便了解真正的问题是什么。”本从比尔身上学到了这个重要的技巧，现在在和自己资助的公司的首席执行官们沟通时，本就会运用这一技巧。人们在寻求建议时，真正需要的往往是别人的认可。本说：“那些首席执行官总觉得他们需要知道问题的答案，所以当他们让我给建议时，总是会问我一个事先准备好的问题。我从来不会直接回答这些问题。”相反，像比尔一样，他会问更多的问题，努力从多个方面了解情况。这能让他跳过事先准备好的问题（和答案），发现问题的核心。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔的做法就是倾听，提供坦诚的反馈，并要求对方也报以同样的坦诚。学者称这种做法为“关系透明”，是“真诚领导力”的核心特征。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;埃米尔·迈克尔说：“比尔总是能把勇气传递给我，而我也总是会因此受到鼓舞。我从比尔身上学到一点：要做一个给予别人能量的人，不要做抽走别人能量的人。”不断鼓励他人，给予别人能量，也已经被证明是教练最重要的两大特质。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔有一条指导原则：团队至高无上。而他在人们身上寻找和期待的最重要的品质，就是“团队至上”的态度。团队要想成功，每个成员都必须忠诚，并能在必要时将团队利益置于个人利益之上。让团队取得胜利最重要。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;也有高手过招的场面：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;比尔提出了一个合理的妥协方案，并恳请埃里克保持对谷歌的忠诚。他对埃里克说：“现在你不必跟别人争辩什么，你的自尊心妨碍了你做出对公司和对你自己最好的决定。”&lt;/p&gt;</description>
			</item>
			<item>
				<title>2020年终总结</title>
				<link>https://www.hualet.org/posts/2020-summary/</link>
				<pubDate>Fri, 01 Jan 2021 10:27:25 +0800</pubDate>
				<guid>https://www.hualet.org/posts/2020-summary/</guid>
				<description>&lt;p&gt;​&#x9;最近一直在思考一件事情，年终总结到底应该是12.31号写还是应该在1.1号写，想着想着就到1.1号了…祝大家元旦快乐！&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;上一次写年终总结还是&lt;a href=&#34;https://hualet.org/blog/2019/01/03/2018-%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;2018年&lt;/a&gt;，但是2020年的年终总结是非写不可了，因为这是很不平凡的一年。&lt;/p&gt;&#xA;&lt;h2 id=&#34;疫情&#34;&gt;&#xA;  疫情&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%96%ab%e6%83%85&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;​&#x9;先说一下疫情。在 2020 这一年的时间里，全球人民一起经历了魔幻的疫情大战。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;以我自己为例，在 1.19 号的时候在武汉的办公室里跟同事谈笑风生，还打趣行政为什么准备口罩、喷消毒液；20号驱车回家（第一次开长途回家），一路在服务区收到各种疫情消息，快到家的时候叮嘱爸妈买消毒液，进门消毒；23号武汉封城，不少同事被困武汉；在老家莫名被“软禁”一个多月，在武汉的同事也经受了人间炼狱般的折磨。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;然后是全球疫情爆发，中国提前登了场并率先退了场：&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;截止目前2021.1.1病例数据概览（来源于wikipedia）&lt;/p&gt;&#xA;&lt;h3 id=&#34;中国&#34;&gt;&#xA;  中国&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%b8%ad%e5%9b%bd&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;病例总数&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;治愈&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;死亡&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;87,071&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;82,067&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4,634&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;全球&#34;&gt;&#xA;  全球&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%85%a8%e7%90%83&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;病例总数&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;治愈&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;死亡&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;8340万&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;4700万&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;182万&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;​&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;在疫情的大背景下，2020年的一切都显得悲壮、可贵、强大，悲壮是武汉封城、白衣逆行、同胞逝去，可贵是家人健康、公司发展、事业前进，强大是人类的坚韧。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;为逝去的同胞默哀，为健康的朋友祈福！&lt;/p&gt;&#xA;&lt;h2 id=&#34;升级成为奶爸&#34;&gt;&#xA;  升级成为奶爸&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%8d%87%e7%ba%a7%e6%88%90%e4%b8%ba%e5%a5%b6%e7%88%b8&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;​&#x9;2020年疫情让一切都变得很难，包括成为奶爸。 2020年4月26日早上8点55分，在历经了住院困难、陪护困难等一系列问题后，我的小公主出生。这位前世的小情人，让我真正体会到了什么叫“再苦的时候，看她一眼心都会化掉”的感觉。&lt;/p&gt;</description>
			</item>
			<item>
				<title>deepin 开发者规范</title>
				<link>https://www.hualet.org/posts/dev-conventions/</link>
				<pubDate>Tue, 30 Jul 2019 11:03:54 +0800</pubDate>
				<guid>https://www.hualet.org/posts/dev-conventions/</guid>
				<description>&lt;p&gt;为了保证研发项目的规范化，避免不一致造成的效率低下，特在此规范中对项目目录、README、代码风格、版权信息和版本控制等方面进行了一定约束，公司内部及合作项目均需按此规范进行。&lt;/p&gt;&#xA;&lt;h1 id=&#34;项目目录&#34;&gt;&#xA;  项目目录&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%a1%b9%e7%9b%ae%e7%9b%ae%e5%bd%95&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;一般情况下，项目目录结构按照下表说明进行创建和管理，对于复杂项目由开发经理按需以此为基础调整项目目录结构：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;目录名&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;说明&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;src/&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;存放项目源代码文件。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;3rdparty/&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;存放本项目引用的第三方项目源代码或者二进制。如非顶级依赖，可以适当调整放入src目录相应的模块中。另外需注意：项目依赖优先使用仓库中已有的包，尽量避免出现包裹第三方项目的情况。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;tests/&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;单元测试存放目录。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;docs/&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;用于存放帮助手册、man等文件。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;tools/&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;项目用到的工具和脚本。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;po/&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;存放项目用到的翻译文件，也可以为translations、i18n等明显可以看出是翻译文件存放目录的名称。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;misc/&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;项目需要使用到的数据文件或者不属于前面任一类型的文件。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;.desktop&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;项目的desktop文件，如有多个可以放在misc目录中。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;README&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;项目的说明文档，用于说明项目的概要情况。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;LICENSE&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;项目采用的授权协议。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Makefile&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;构建脚本，同类型的还有pro文件CMakeLists.txt文件等。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h1 id=&#34;readme&#34;&gt;&#xA;  README&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#readme&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;每个项目必需包含该README文件，README文件内需包含如下内容：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;项目描述&lt;/li&gt;&#xA;&lt;li&gt;依赖（包括编译依赖和运行时依赖）&lt;/li&gt;&#xA;&lt;li&gt;构建和安装&lt;/li&gt;&#xA;&lt;li&gt;项目目录说明&lt;/li&gt;&#xA;&lt;li&gt;获取帮助（开发项目要求）&lt;/li&gt;&#xA;&lt;li&gt;参与开发（开源项目要求）&lt;/li&gt;&#xA;&lt;li&gt;授权协议说明&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;参考模板如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# Project Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Project description.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Dependencies&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;### Build dependencies&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Qt &amp;gt;= 5.6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;### Runtime dependencies&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; git &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Installation&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;### Build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;​```&lt;span class=&#34;sb&#34;&gt;`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;$ mkdir build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;$ cd build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;$ qmake ..&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;$ make&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;​`&lt;/span&gt;``&lt;span class=&#34;sb&#34;&gt;`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;### Install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;​`&lt;/span&gt;`&lt;span class=&#34;sb&#34;&gt;`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;$ sudo make install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;​`&lt;/span&gt;`&lt;span class=&#34;sb&#34;&gt;`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;3. Install:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;​`&lt;/span&gt;``&lt;span class=&#34;sb&#34;&gt;`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;$ sudo make install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;​`&lt;/span&gt;```&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Getting help&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Any usage issues can ask for help via&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;*&lt;/span&gt; [&lt;span class=&#34;nt&#34;&gt;Gitter&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://gitter.im/orgs/linuxdeepin/rooms&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;*&lt;/span&gt; [&lt;span class=&#34;nt&#34;&gt;IRC channel&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://webchat.freenode.net/?channels=deepin&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;*&lt;/span&gt; [&lt;span class=&#34;nt&#34;&gt;Forum&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://bbs.deepin.org&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;*&lt;/span&gt; [&lt;span class=&#34;nt&#34;&gt;WiKi&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://wiki.deepin.org/&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Getting involved&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;We encourage you to report issues and contribute changes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;*&lt;/span&gt; [&lt;span class=&#34;nt&#34;&gt;Contribution guide for developers&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://github.com/linuxdeepin/developer-center/wiki/Contribution-Guidelines-for-Developers-en&lt;/span&gt;). (English)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;*&lt;/span&gt; [&lt;span class=&#34;nt&#34;&gt;开发者代码贡献指南&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://github.com/linuxdeepin/developer-center/wiki/Contribution-Guidelines-for-Developers&lt;/span&gt;) (中文)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## License&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[Project name] is licensed under [&lt;span class=&#34;nt&#34;&gt;GPLv3&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;LICENSE&lt;/span&gt;).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;代码风格&#34;&gt;&#xA;  代码风格&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%bb%a3%e7%a0%81%e9%a3%8e%e6%a0%bc&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Qt/C++ 代码风格规范详见：&lt;a href=&#34;https://docs-blog.wh-redirect.deepin.cn/?p=2788&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Qt/C++代码风格指南&lt;/a&gt;；&lt;/p&gt;</description>
			</item>
			<item>
				<title>deepin Qt/C&#43;&#43; 代码风格指南</title>
				<link>https://www.hualet.org/posts/deepin-qt-cpp-coding-style/</link>
				<pubDate>Tue, 23 Jul 2019 19:17:06 +0800</pubDate>
				<guid>https://www.hualet.org/posts/deepin-qt-cpp-coding-style/</guid>
				<description>&lt;p&gt;本代码风格为深度科技Qt/C++代码风格规范，主要是在&lt;a href=&#34;https://wiki.qt.io/Qt_Coding_Style&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Qt Coding Style&lt;/a&gt;上进行删减和修改。&lt;/p&gt;&#xA;&lt;h2 id=&#34;代码缩进&#34;&gt;&#xA;  代码缩进&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%bb%a3%e7%a0%81%e7%bc%a9%e8%bf%9b&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用4个空格进行缩进；&lt;/li&gt;&#xA;&lt;li&gt;禁止使用Tab进行缩进。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;声明变量&#34;&gt;&#xA;  声明变量&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%a3%b0%e6%98%8e%e5%8f%98%e9%87%8f&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;不同的变量声明不要放在同一行；&lt;/li&gt;&#xA;&lt;li&gt;变量尽量起有意义的变量名；&lt;/li&gt;&#xA;&lt;li&gt;单字符变量尽量避免，且只能在局部变量和临时变量处使用；&lt;/li&gt;&#xA;&lt;li&gt;需要变量时再去定义变量（对比C语言在头部声明所有变量）；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; // 错误写法&#xA; int a, b;&#xA; char *c, *d;&#xA;&#xA; // 正确写法&#xA; int height;&#xA; int width;&#xA; char *nameOfThis;&#xA; char *nameOfThat;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;变量名和函数名使用小写开头，命名规范遵循驼峰式命名规范；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; // 错误写法&#xA; short Cntr;&#xA; char ITEM_DELIM = &amp;#39; &amp;#39;;&#xA;&#xA; // 正确写法&#xA; short counter;&#xA; char itemDelimiter = &amp;#39; &amp;#39;;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;类名以大写开头，命名规范遵循驼峰式命名规范。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;空格&#34;&gt;&#xA;  空格&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%a9%ba%e6%a0%bc&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在代码段落之间使用空行隔开；&lt;/li&gt;&#xA;&lt;li&gt;任何地方的空行不要超过两行；&lt;/li&gt;&#xA;&lt;li&gt;关键词后和大括号前均需空格:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; // 错误写法&#xA; if(foo){&#xA; }&#xA;&#xA; // 正确写法&#xA; if (foo) {&#xA; }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;对于指针和引用，*和&amp;amp;需要和变量名紧挨:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; char *x;&#xA; const QString &amp;amp;myString;&#xA; const char * const y = &amp;#34;hello&amp;#34;;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;二元操作符两侧需有空格；&lt;/li&gt;&#xA;&lt;li&gt;尽量避免C风格的类型转换：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; // 错误写法&#xA; char* blockOfMemory = (char* ) malloc(data.size());&#xA;&#xA; // 正确写法&#xA; char *blockOfMemory = reinterpret_cast&amp;lt;char *&amp;gt;(malloc(data.size()));&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;不要硬把多行代码放在同一行；&lt;/li&gt;&#xA;&lt;li&gt;逻辑控制操作的执行体需换行:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; // 错误写法&#xA; if (foo) bar();&#xA;&#xA; // 正确写法&#xA; if (foo)&#xA;     bar();&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;大括号&#34;&gt;&#xA;  大括号&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%a4%a7%e6%8b%ac%e5%8f%b7&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;大括号跟逻辑控制关键字（如if、switch等）放在同一行：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; // 错误写法&#xA; if (codec)&#xA; {&#xA; }&#xA; else&#xA; {&#xA; }&#xA;&#xA; // 正确写法&#xA; if (codec) {&#xA; } else {&#xA; }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;特殊情况：函数实现（非lambda函数）和类声明时大括号都开新行写：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; static void foo(int g)&#xA; {&#xA;     qDebug(&amp;#34;foo: %i&amp;#34;, g);&#xA; }&#xA;&#xA; class Moo&#xA; {&#xA; };&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;switch语句&#34;&gt;&#xA;  switch语句&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#switch%e8%af%ad%e5%8f%a5&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;case和switch关键字对齐（包括default）；&lt;/li&gt;&#xA;&lt;li&gt;每个case处理体都需要显式使用break或者使用 Q_FALLTHROUGH()以表示刻意不进行break，除非两个case可以直接合并在一起进行处理：.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; switch (myEnum) {&#xA; case Value1:&#xA;   doSomething();&#xA;   break;&#xA; case Value2:&#xA; case Value3:&#xA;   doSomethingElse();&#xA;   Q_FALLTHROUGH();&#xA; default:&#xA;   defaultHandling();&#xA;   break;&#xA; }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;换行和折行&#34;&gt;&#xA;  换行和折行&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%8d%a2%e8%a1%8c%e5%92%8c%e6%8a%98%e8%a1%8c&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;代码一行的内容不要太长，建议保证在100个字符以内，否则进行折行处理；&lt;/li&gt;&#xA;&lt;li&gt;注释同上；.&lt;/li&gt;&#xA;&lt;li&gt;逗号写在折行末尾，操作符写在折行开始：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; // 错误写法&#xA; if (longExpression +&#xA;     otherLongExpression +&#xA;     otherOtherLongExpression) {&#xA; }&#xA;&#xA; // 正确写法&#xA; if (longExpression&#xA;     + otherLongExpression&#xA;     + otherOtherLongExpression) {&#xA; }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;配置插件&#34;&gt;&#xA;  配置插件&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%85%8d%e7%bd%ae%e6%8f%92%e4%bb%b6&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;在QtCreator中启用Beautifier插件：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img src=&#34;//img/2019/07/enable-beautifier.png&#34; alt=&#34;Enable Beautifier&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>deepin系统启动流程</title>
				<link>https://www.hualet.org/posts/linux-system-bootup/</link>
				<pubDate>Sat, 25 May 2019 16:54:55 +0800</pubDate>
				<guid>https://www.hualet.org/posts/linux-system-bootup/</guid>
				<description>&lt;p&gt;deepin系统整个的启动流程到底是怎么样子的？以前曾被同事缠问过类似的问题。遇到这种宏大而又不着边际的问题，我的回复往往是“你还太嫩，现在我告诉你还是会忘掉的，等你干上个两年，不用我说你就知道了”。我边敲着键盘，边佩服自己的聪明才智。&lt;/p&gt;&#xA;&lt;center&gt;两年后……&lt;/center&gt;&#xA;&lt;p&gt;这个小伙子长大了，并且坚定地又问了同样的问题。&lt;/p&gt;&#xA;&lt;p&gt;我一愣神，脑海中不停浮现出一个声音“出来混，迟早是要还的”。想想也罢，是时候该把压箱底儿的货拿出来了，毕竟自封了“半吊子系统工程师”的title（虽然我自封的title还有很多：半吊子客服、半吊子产品经理、半吊子研发项目经理等等），不给你们露两手看看看来还真不行……&lt;/p&gt;&#xA;&lt;h2 id=&#34;概览&#34;&gt;&#xA;  概览&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%a6%82%e8%a7%88&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;deepin系统启动，从整体上看主要分为了硬件上电、内核引导、内核启动、系统初始化、图形界面等几个阶段。如果将这几个阶段分为两个部分，那么第一部分的硬件上电、内核引导、内核启动主要是“引导（boot）”，更偏向让内核可以启动；而第二部分的系统初始化、图形界面两个阶段主要的任务则是“初始化（initialize）”了，因为对于一个系统来说仅仅有内核跑起来是不行的，还要有各种各样的服务对系统的软硬件进行管理，这也是平常大家说发行版跟纯粹的GNU/Linux内核不是一个概念的原因之一。&lt;/p&gt;&#xA;&lt;p&gt;下面我从一个软件开发者的角度说一下我对每个阶段的理解以及一些调试的方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;硬件上电&#34;&gt;&#xA;  硬件上电&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%a1%ac%e4%bb%b6%e4%b8%8a%e7%94%b5&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;既然说了是软件开发者的角度，这个部分对我来说基本上相当于黑盒子了。但是大体上我们仍然知道这个部分主要是：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;硬件上电&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;BIOS&lt;/code&gt;/&lt;code&gt;UEFI&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;bootloader&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;当你按下电源的那一刻起，电流就会“滋滋滋”的流向主板，启动&lt;code&gt;BIOS（Basic Input Output System）&lt;/code&gt;系统。&lt;code&gt;BIOS&lt;/code&gt;系统，顾名思义就是最直接跟硬件打交道的系统，因为有标准规定，所以输入输出设备的基本功能都是可以使用的，一些硬件的开关配置也可以在&lt;code&gt;BIOS&lt;/code&gt;中进行操作。除此之外，&lt;code&gt;BIOS&lt;/code&gt;还有两个重要的功能，一个是硬件自检；另外一个是加载引导。硬件自检这个跟作为一个”半吊子系统工程师“没什么关系，自不多说。加载引导的过程其实就是大家耳熟能详的&lt;code&gt;MBR&lt;/code&gt;、小蝌蚪找妈…哦不…&lt;code&gt;MBR&lt;/code&gt;中找&lt;code&gt;bootloader&lt;/code&gt;了。&lt;/p&gt;&#xA;&lt;p&gt;跟&lt;code&gt;BIOS&lt;/code&gt;对应的&lt;code&gt;UEFI&lt;/code&gt;，要说它们之间的区别，除了加载引导的方式不大一样以外。对我来说可能就是界面能够用鼠标点点点了吧，嗯……哈哈哈。&lt;/p&gt;&#xA;&lt;p&gt;这里讲个段子，之前15.7搞启动时间优化的时候，测试的同学测试系统启动时间的优化情况，老是说效果不理想，我去看看吧，原来是他们测试系统启动是从硬件启动算起的，我说你们直接从内核引导开始计算，他还问我为什么。优化时间/(&lt;code&gt;BIOS&lt;/code&gt;时间+&lt;code&gt;GRUB&lt;/code&gt;时间+内核时间+图形时间) 跟 优化时间/(内核时间+图形时间)哪个大哪个小？我只能说这个测试同学的数学不大好……😂&lt;/p&gt;&#xA;&lt;h2 id=&#34;内核引导&#34;&gt;&#xA;  内核引导&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%86%85%e6%a0%b8%e5%bc%95%e5%af%bc&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;BIOS&lt;/code&gt;在&lt;code&gt;MBR&lt;/code&gt;中（或者&lt;code&gt;UEFI&lt;/code&gt;在主板专有的存储设备中）找到&lt;code&gt;bootloader&lt;/code&gt;并加载后，&lt;code&gt;bootloader&lt;/code&gt;就会开始加载Linux内核并启动了。&lt;/p&gt;&#xA;&lt;h3 id=&#34;grub引导&#34;&gt;&#xA;  GRUB引导&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#grub%e5%bc%95%e5%af%bc&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;deepin系统默认的&lt;code&gt;bootloader&lt;/code&gt;是&lt;code&gt;GRUB（GRand Unified Bootloader）&lt;/code&gt;。其实我一直觉得这个名字挺恶心的，大神们果然都是重口味……&lt;code&gt;GRUB&lt;/code&gt;并不需要按照什么规则去硬盘中找系统，而是根据&lt;code&gt;/boot/grub/grub.cfg&lt;/code&gt;中的启动项加载内核、启动系统，而这个配置文件则是在系统安装或者手动执行&lt;code&gt;update-grub&lt;/code&gt;这个命令的时候生成和更新。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;update-grub&lt;/code&gt;这个命令其实是对&lt;code&gt;grub-mkconfig&lt;/code&gt;的一个包装，在非Debian系的发行版上是没有的。&lt;code&gt;grub-mkconfig&lt;/code&gt;会执行的动作主要是：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;加载&lt;code&gt;/etc/default/grub&lt;/code&gt;中的一些配置项。比如&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt;配置项会控制Linux的&lt;a href=&#34;https://wiki.archlinux.org/index.php/kernel_parameters&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;boot param&lt;/a&gt;。&lt;/li&gt;&#xA;&lt;li&gt;挨个执行&lt;code&gt;/etc/grub.d/&lt;/code&gt;目录中的脚本，用来生成最终的&lt;code&gt;grub.cfg&lt;/code&gt;文件。比如我们平常看到&lt;code&gt;update-grub&lt;/code&gt;命令执行时输出的哪些启动项，其实就是&lt;code&gt;/etc/grub.d/03_os-prober&lt;/code&gt;这个脚本里面执行&lt;code&gt;os-prober&lt;/code&gt;这个工具产生的。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;在&lt;code&gt;GRUB&lt;/code&gt;界面选择启动项，按&lt;code&gt;e&lt;/code&gt;编辑启动项。除了普通的上下左右键移动光标，还可以使用基本的&lt;code&gt;Emacs&lt;/code&gt;快捷键：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Ctrl+N&lt;/code&gt; 下一行&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Ctrl+P&lt;/code&gt; 上一行&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Ctrl+B&lt;/code&gt; 左移一个字符&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Ctrl+F&lt;/code&gt; 右移一个字符&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Ctrl+A&lt;/code&gt; 移动光标到行首&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Ctrl+E&lt;/code&gt; 移动光标到行尾&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;编辑完成后按&lt;code&gt;Ctrl+X&lt;/code&gt;按照编辑后的结果启动系统，但是编辑的结果不会保存，也就是说如果需要永久修改某个启动项，就要修改&lt;code&gt;grub.cfg&lt;/code&gt;文件或者会影响&lt;code&gt;grub.cfg&lt;/code&gt;生成的&lt;code&gt;/etc/default/grub&lt;/code&gt;以及&lt;code&gt;/etc/grub.d/&lt;/code&gt;中的脚本文件了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>深度数据盘和FUSE文件系统</title>
				<link>https://www.hualet.org/posts/flirting-with-fuse/</link>
				<pubDate>Sun, 10 Mar 2019 14:11:28 +0800</pubDate>
				<guid>https://www.hualet.org/posts/flirting-with-fuse/</guid>
				<description>&lt;p&gt;说起FUSE，大概很早之前就知道了，但是写文件系统这种东西，大概一辈子也没几次机会会用到，所以当时也没怎么研究，直到最近遇到一个“扭曲”的需求……&lt;/p&gt;&#xA;&lt;p&gt;这个需求是这样的。在深度系统的安装器中，有一个全盘安装的功能，这个功能看起来非常简单：扔一块全新的或者老旧的硬盘给安装器，只需一杯咖啡的功夫，你的系统也就能优雅地躺在你的硬盘上了。然而，其中有一个处心积虑，哦不，深思熟虑的细节设定，就是假如你硬盘够大，安装器就会给你多分出一个分区：数据盘。&lt;/p&gt;&#xA;&lt;p&gt;据说数据盘的主要作用是让用户存放数据文件，也就是以前用Windows的时候D盘或者E盘等的作用，放点图片、下点片之类的。用户重装系统的时候，也可以方便的做数据迁移。不过鉴于之前我们的一些客户对文件权限的设计不太理解，经常莫名其妙就出权限文件，所以，这个数据盘大概隐含了两个隐性需求：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;文件权限不要太严格；&lt;/li&gt;&#xA;&lt;li&gt;文件权限不要太严格……&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;第一次尝试&#34;&gt;&#xA;  第一次尝试&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%ac%ac%e4%b8%80%e6%ac%a1%e5%b0%9d%e8%af%95&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;收到需求的你肯定想，Linux（类Unix）把用户权限、文件权限划分地这么好，虽然也不算天衣无缝吧，但是也是大神们深思熟虑的成果，退回到上古时代的没有文件权限这种事，简直就是历史的倒退么……然而作为一名优秀的程序员，怎么能不理解这种为了用户使用方便，宁愿自己背负骂名的行为呢，所以我们毅然选择了不抵抗政策。另外，为了这个盘可以被双系统的Windows读到，当时我们很自然就选择了&lt;code&gt;NTFS&lt;/code&gt;作为数据盘的分区格式。&lt;/p&gt;&#xA;&lt;p&gt;然而，过了一段时间。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;社区用户：我的硬盘发热好厉害呀，是不是这个NTFS分区……&#xA;&#xA;商业伙伴：这个NTFS文件系统的有点不清真啊……&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这显然没有达到我们预期的目的嘛，必须想办法搞定啊。数据盘这个需求就开始了它的扭曲之旅。&lt;/p&gt;&#xA;&lt;h2 id=&#34;第二次尝试&#34;&gt;&#xA;  第二次尝试&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%ac%ac%e4%ba%8c%e6%ac%a1%e5%b0%9d%e8%af%95&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;如果不使用&lt;code&gt;NTFS&lt;/code&gt;，那就在&lt;code&gt;ext4&lt;/code&gt;上面做文章咯？在网络上搜索了半天，也没有发现什么好的方式，要么就是&lt;code&gt;chmod -R  xxx&lt;/code&gt; 这种，要么就是 &lt;code&gt;chown&lt;/code&gt;……操作系统跟用户那可是一辈子的事情，这几种显然只适合做一锤子买卖的方式显然是不适合的。然后，我突然想到之前同事提到过的ACL（限于篇幅和主题，就不展开了），就研究了一下，果然还就能解决问题，两条命令：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ setfacl -d -m &amp;#34;g:sudo:rwx&amp;#34; /xxx&#xA;$ setfacl -m &amp;#34;g:sudo:rwx&amp;#34; /xxx&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中的&lt;code&gt;/xxx&lt;/code&gt;就是数据盘的挂载点，第一行命令设定挂载点文件夹的默认ACL规则为：所有&lt;code&gt;sudo&lt;/code&gt;组的用户可以对文件夹有&lt;code&gt;rwx&lt;/code&gt;操作权限，第二句设定挂载点文件夹的ACL规则为：所有&lt;code&gt;sudo&lt;/code&gt;组的用户可以对文件夹有&lt;code&gt;rwx&lt;/code&gt;操作权限。这两句话看起来好像没有什么区别，其实不同的地方在于第一行命令设定的是文件夹的默认ACL规则，而第二行命令设定的是文件夹本身的ACL规则。设定了默认规则以后文件夹里面新创建的文件或者文件夹就会继承这个规则，如果只设置文件夹的ACL规则，则新文件和子文件夹不会继承这些ACL规则；如果只设置文件夹的默认ACL规则，而不设置文件夹本身的ACL规则，则文件夹本身没有ACL规则生效。&lt;/p&gt;&#xA;&lt;p&gt;虽然这个设定感觉有点让人发晕，但是好歹功能都实现了呀，一切都看似那么美好。&lt;/p&gt;&#xA;&lt;p&gt;然而程序员的所有美好都怕测试这种物种，测试有一天突然发现：“咦？系统里面的A用户放在数据盘里面的文件怎么B用户无法访问？”程序员就多了个BUG……&lt;/p&gt;&#xA;&lt;p&gt;经过调试，发现一种神奇的现象：Linux（可能其他系统也是）对ACL的处理有点奇怪，假如在拥有ACL规则的对象（文件或者文件夹）上进行&lt;code&gt;chmod&lt;/code&gt;操作，那么&lt;code&gt;chmod&lt;/code&gt; 会对对象的ACL规则造成影响，影响的结果就是对象虽然有ACL规则，但是ACL的有效值会变成&lt;code&gt;chmod&lt;/code&gt;要达成的效果。举个例子，假如文件原来的ACL规则如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ getfacl testacl &#xA;# file: testacl&#xA;# owner: hualet&#xA;# group: hualet&#xA;user::rw-&#xA;group::r--&#xA;group:sudo:rwx&#xA;mask::rwx&#xA;other::r--&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;文件的权限是&lt;code&gt;644&lt;/code&gt;，但是&lt;code&gt;sudo&lt;/code&gt;组的用户有&lt;code&gt;rwx&lt;/code&gt;权限。这时候如果我们使用&lt;code&gt;chmod 700 testacl&lt;/code&gt;修改一下文件的权限，再次查看文件的ACL会变成：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ getfacl testacl                &#xA;# file: testacl&#xA;# owner: hualet&#xA;# group: hualet&#xA;user::rwx&#xA;group::r--                      #effective:---&#xA;group:sudo:rwx                  #effective:---&#xA;mask::---&#xA;other::---&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以看到，&lt;code&gt;group&lt;/code&gt;和&lt;code&gt;group:sudo&lt;/code&gt;后面的有效值是&lt;code&gt;---&lt;/code&gt;，即&lt;code&gt;rwx&lt;/code&gt;权限全无，&lt;code&gt;other&lt;/code&gt;也从原来的&lt;code&gt;r--&lt;/code&gt;变成了&lt;code&gt;---&lt;/code&gt;。&lt;/p&gt;</description>
			</item>
			<item>
				<title>《走向共和》观后感</title>
				<link>https://www.hualet.org/posts/watching-for-the-sake-of-the-republic/</link>
				<pubDate>Sun, 03 Mar 2019 14:42:08 +0800</pubDate>
				<guid>https://www.hualet.org/posts/watching-for-the-sake-of-the-republic/</guid>
				<description>&lt;p&gt;​&#x9;断断续续地从2018年下半年开始看《走向共和》，到今天算是看完了。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;最开始知道这部电视剧，还是看到网友Tualatrix在Twitter上的推荐，不过当时看电视封面中最大头像的是孙中山，不太感冒，所以就没有怎么好好看，一般都是边玩游戏边看，但是看了几集以后顿时觉得过瘾，一共58集的电视剧把中国从甲午中日战争到护国、护法运动的历史算是做了非常精彩的演绎，而且电视剧的布景正是我喜欢的类似《大明王朝1566》（后来才知道原来是同一个导演张黎）、《乔家大院》、《大染坊》、《六龙飞天》那种朴素而又显得真实的布景，再加上对剧中主角的性格塑造非常细致，基本上推翻了以前从教科书中得到的对几个主角的评价，愈发觉得着实的喜欢。&lt;/p&gt;&#xA;&lt;h1 id=&#34;主角们&#34;&gt;&#xA;  主角们&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%b8%bb%e8%a7%92%e4%bb%ac&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;​&#x9;因为剧情比较宏大，所以总共算是有四个主角，按照清政府倒台作为中间线，前半段主要是李鸿章主角、后半段主要是袁世凯主角，慈禧和孙中山贯穿其中，只是作为两段历史的领袖人物，慈禧要比孙中山戏份多得多，对剧情也重要的多（个人观点）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;李鸿章&#34;&gt;&#xA;  李鸿章&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%9d%8e%e9%b8%bf%e7%ab%a0&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;​&#x9;这部剧之所以吸引我，大概就是前期对李鸿章的塑造大大刷新了我对他的认识，这哪是什么教科书中的卖国贼，片中的李鸿章分明是一个讲求实干、精于世故、老成谋国的人，苦苦支撑国事的偏于正面的形象：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;为北洋水师的军费与朝中以翁同龢为代表的清流派争斗；&lt;/li&gt;&#xA;&lt;li&gt;顾全大局（争取本来敌视他的南洋大臣张之洞，这点感觉比他的老师曾国藩对待左宗棠有手段）；&lt;/li&gt;&#xA;&lt;li&gt;有点跋扈，但是也对自己认清的现实非常坚持，视满朝的非议诋毁如过耳云烟；&lt;/li&gt;&#xA;&lt;li&gt;马关和谈时尽其所能与日本人周旋（甚至把自己在日本被刺当作谈判筹码，与伊藤博文讨价还价，苦苦哀求砍掉2000万作为回国的盘缠，真是叫人揪心……）；&lt;/li&gt;&#xA;&lt;li&gt;对政局了若指掌，戊戌变法时跑到欧洲考察，实际是为了躲避帝后之争；&lt;/li&gt;&#xA;&lt;li&gt;辛丑和谈的时候表现出的老道；&lt;/li&gt;&#xA;&lt;li&gt;签订辛丑条约时与列强的周旋（李鸿章拦住了一起主持议和的庆亲王，而只签上了自己的名字。说：王爷还年轻，这种要背千古骂名的事还是由我这老朽担当了吧)。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;​&#x9;李鸿章在政治上是一个高级玩家，狡猾地如狐狸一般，但是作为一个士大夫，还是表现出了那种家国天下的情怀，终然洞穿官场一切的潜规则，还是尽自己最大的努力来维持局面。作为晚清洋务运动的领导者之一，他可以说是举步维艰，但是仍然知难而上，运用自己的政治智慧沉着应对每个难关。&lt;/p&gt;&#xA;&lt;h3 id=&#34;金句&#34;&gt;&#xA;  金句&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%87%91%e5%8f%a5&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;“身怀利器，杀心自起，慎而重之！”&lt;/li&gt;&#xA;&lt;li&gt;“一代人只能做一代人的事情。”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;评价&#34;&gt;&#xA;  评价&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%af%84%e4%bb%b7&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;​&#x9;李鸿章作为一个天才，只能说生错了国家、生错了时代，为国苦苦经营，最后却落得个卖国贼的名分。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;用剧中伊藤博文的原话来说：“伊藤不才，然何其幸哉，能驻足日本之地，此乃立宪国之地，且举国人才辈出；李鸿章大才，然何其不幸，为政于中国之地，其乃绝对专制之地，故而有才化无才，且举国人才，一遇专制俱为奴才。”&lt;/p&gt;&#xA;&lt;h2 id=&#34;袁世凯&#34;&gt;&#xA;  袁世凯&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%a2%81%e4%b8%96%e5%87%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;​&#x9;我记得以前我的一位历史老师曾经讲过一个笑话：“袁世凯一生只做过一件好事，就是他死了”，当时全班大笑，因为在小时候的电视剧里面，真没有看到过哪个剧里面有袁世凯，但是是一个正面形象的，坏人死了的才是喜剧嘛。&lt;/p&gt;</description>
			</item>
			<item>
				<title>WPS中的字体名</title>
				<link>https://www.hualet.org/posts/fontname-locale/</link>
				<pubDate>Mon, 14 Jan 2019 18:31:08 +0800</pubDate>
				<guid>https://www.hualet.org/posts/fontname-locale/</guid>
				<description>&lt;p&gt;今天又被  &lt;code&gt;fontconfig&lt;/code&gt; 坑到了……仔细想想，半年到一年前我还对 &lt;code&gt;fontconfig&lt;/code&gt;  狗屁不通呢，而现在我已经被 &lt;code&gt;fontconfit&lt;/code&gt; 坑了有几次了，这印证了一个真理：“只要你足够迟钝，世界就是美好的，一旦你有了某种能力，麻烦就会找到你”——这只是个玩笑，事实上不管你有没有能力，现实都不会让你好过 😈&lt;/p&gt;&#xA;&lt;p&gt;在这些坑里面，有两个是跟今天主题相关的，也就是关于WPS中字体名称的两个问题：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;WPS 字体列表中中文字体在中文环境下不显示中文名（比如系统里面有宋体，列表里面显示 &lt;code&gt;SimSun&lt;/code&gt;）；&lt;/li&gt;&#xA;&lt;li&gt;WPS 设置段落字体（中文字体）后，工具栏显示的字体为英文名（比如你设置一段文字是宋体，但是标题栏显示的仍然是&lt;code&gt;SimSun&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这两个问题有点像，但是却不是同一个问题（也不只是WPS有问题，而是WPS对字体的需求比较多）：&lt;/p&gt;&#xA;&lt;p&gt;第一个问题原先是 &lt;a href=&#34;https://bbs.deepin.org/forum.php?mod=viewthread&amp;amp;tid=166999&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;论坛用户报告&lt;/a&gt; 的（实际上刘老大也报过，不过被自动忽略了😂），论坛用户又报过来以后，大家看用户的报告太详细了，感动得一塌糊涂，顿时解决问题的动力都有了。我也折腾了大半天，不过脑袋里面一直有一个同事的声音：那是字体有问题！我也挺赞同的：盗版的字体，不靠谱很正常……所以，我就考虑能不能给字体做一些别名啥的，比如 &lt;code&gt;SimSun&lt;/code&gt; 就叫 &lt;code&gt;宋体&lt;/code&gt;……当然了最后就是玩了一下 &lt;code&gt;fontconfig&lt;/code&gt; 的配置以后，默默就放弃了。&lt;/p&gt;&#xA;&lt;p&gt;最后经过 &lt;a href=&#34;https://github.com/felixonmars&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@felixonmars&lt;/a&gt; 同学的排查，发现是上游的一个 &lt;a href=&#34;https://bugs.freedesktop.org/show_bug.cgi?id=105756&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;bug&lt;/a&gt; ，而且已经修复，所以赶紧更了一波，解决了这个问题。&lt;/p&gt;&#xA;&lt;p&gt;本以为皆大欢喜了，今天又有客户报过来 bug，说 Windows 上写好的文档，调整好的字体，跑到deepin下字体就不对了，废了老大的劲儿才又调好，其中就提到了选择方正字库里面的字体，显示的不是中文字体名称的问题。&lt;/p&gt;&#xA;&lt;p&gt;怎么说呢，幸亏我脑子不好，不记得之前已经解决过中文字体名显示为英文的问题，要不然得跟客户和老板掰扯一会儿，我只记得字体的中英文名字好像是有点问题，所以默默赶紧去看了一下，还真真的有问题。&lt;/p&gt;&#xA;&lt;p&gt;因为 DDE 并没有设置过多的 &lt;code&gt;fontconfig&lt;/code&gt; 配置，所以我相信这不是 DDE 的问题，但是又觉得对于一个文字处理软件来说，如果这么重要的功能都有 BUG，我真不信 WPS 的人还能坐得住，所以就想试一下在 Ubuntu 下 WPS 的这个行为是否正确。刚好年前 ElementryOS 发新版的时候尝鲜装了一个在测试机器上，所以很快切进去下了一个 WPS 安装上，从一个正版的网站上下载了一个盗版的宋体，试了一下，果然踏马的是好的……&lt;/p&gt;&#xA;&lt;p&gt;理性的我用事实证明了感性的我是错误的，气氛一度很尴尬。&lt;/p&gt;&#xA;&lt;p&gt;更让人尴尬的是，我也不知道这是怎么回事。但是，无巧不成书，就在这种尴尬氛围的笼罩下，我鬼使神差地在 ElementryOS （太长了，下面简称 EOS ）上运行了 &lt;code&gt;fc-match 宋体&lt;/code&gt; 这个命令，而且很神奇的发现输出的 &lt;code&gt;simsun.ttf: &amp;quot;宋体&amp;quot; &amp;quot;Regular&amp;quot;&lt;/code&gt; 跟 deepin 下同样命令输出的 &lt;code&gt;simsun.ttf: &amp;quot;SimSun&amp;quot; &amp;quot;Regular&amp;quot;&lt;/code&gt; 不太一样，这可把我乐坏了——要知道一个稍微复杂点的图形软件，打开 &lt;code&gt;fontconfig&lt;/code&gt; 的调试以后，输出就是很可怕的，更别说 WPS！别问我是怎么知道的，回忆起来都是泪。但是现在使用 &lt;code&gt;fc-match&lt;/code&gt; 就能重现的问题（我打心底认为这俩是同一个问题），调试起来就比较简单了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>2018 年终总结</title>
				<link>https://www.hualet.org/posts/2018-summary/</link>
				<pubDate>Thu, 03 Jan 2019 19:10:14 +0800</pubDate>
				<guid>https://www.hualet.org/posts/2018-summary/</guid>
				<description>&lt;p&gt;2018 年也不知道为啥过得这么快，似乎“嗖”的一下就过完了，但是仔细回想一下，还是有不少事、不少感想值得留存的，所以赶紧用文字记录下，不然以我的健忘性格，不用到明年的今天，我就不会再记得 2018 年我做了什么、经历了什么和有什么感悟了。惨痛的教训比如 2017， 没有总结，我看了 &lt;a href=&#34;https://hualet.org/blog/2017/01/02/2016%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;2016年终总结&lt;/a&gt; 甚至不知道我的 2017 相比 2016 是否有进步、有没有按照规划去做了对的事情。所以在这个时间点，就算是年终刚好出去参加同学的婚礼了，也在火车上抽了时间做了脑图，整理了一年下来的总结。&lt;/p&gt;&#xA;&lt;h2 id=&#34;读书&#34;&gt;&#xA;  读书&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%af%bb%e4%b9%a6&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;总的来说18年读的书不算多，甚至可以用少来形容，不过总归还有些感悟，记录下来权做以后翻看旧书需要的介绍了。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;《南渡北归》&lt;/p&gt;&#xA;&lt;p&gt;拖拖拉拉终于几乎看完了全本，只是到国民党退到台湾以后，顿时有一种很丧的气氛在里面（不知道是书还是当时看的我），所以后面基本上就没怎么看了。&lt;/p&gt;&#xA;&lt;p&gt;对于整本书的评价还是很高的，革命/战乱的年代，杂糅这知识分子的热忱、浪漫、坚毅、吃苦耐劳，沉入其中，感受每个人面对的挣扎和选择，对于一个人对人生和价值观的思考还是非常有促进作用的。&lt;/p&gt;&#xA;&lt;p&gt;像《老残游记》和《浮生六记》一样，如果有机会，我还会再读几遍。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;《技术管理之巅》&lt;/p&gt;&#xA;&lt;p&gt;技术管理书，因为很贴近实际，所以显得比较接地气。&lt;/p&gt;&#xA;&lt;p&gt;在看这本书的过程中想通了技术和管理其实是可以很好融合在一起，而不是互相对立的。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;《把生命浪费在美好的事物上》&lt;/p&gt;&#xA;&lt;p&gt;原以为是类似汪曾祺的哪些小散文的书，但是完全被吴晓波起的书字给骗了。把生命浪费在美好的事物上，你得先跟吴晓波一样有钱 :P&lt;/p&gt;&#xA;&lt;p&gt;同上本书，这本书让我知道了“铜臭气”和“书呆子气”可以同时存在于一个人身上，并且很好地共存。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;《曾国藩的正面与侧面》&lt;/p&gt;&#xA;&lt;p&gt;青春期的时候，可能是热血漫画看多了，我总是喜欢认为自己是个“天才”，但是随着年龄增长，我越往后越发现我对于“天才”和“聪明”的需求越来越弱，反而是对“勤”和“恒”的需求越来越多。这本书并没有教会我做什么，而是加深了我早已有的很多想法，让我更知道如何为人和处事。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;《原则》&lt;/p&gt;&#xA;&lt;p&gt;忘记这本书是什么时候引起风潮的，似乎一时间所有的人都在看这本书。不过我还是因为懒没有看。等过了一段时间有次在火车上没事干，想找一本书看看就选择了这本书。&lt;/p&gt;&#xA;&lt;p&gt;初看还是很有同感的，尤其是生活部分（其实就像作者说得，前面哪些他个人的经历，其实没有什么特别有意思的地方）的一些原则，我当时甚至想给深度的开发同事也弄一个 &lt;a href=&#34;https://docs.google.com/presentation/d/1qWNYr4W_BKcaEqsqRflrhXv0gc7s_r7RCjhxceCVJGQ/edit?usp=sharing&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;深度开发者行事原则&lt;/a&gt; 的，但是碍于这个东西实在不好讲，因为每个人本身的认知程度千差万别，想一下子拉齐到同一水平很不现实，所以一拖两拖，就废掉了。&lt;/p&gt;&#xA;&lt;p&gt;不过我还是因此养成了一个把我在一些特殊时刻想到的一些感受和想法记录下来沉淀的习惯，收获也算不少吧。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;《白夜行》&lt;/p&gt;&#xA;&lt;p&gt;纯娱乐，读得相当快，好像是一两周之内读完的（这已经是我读书的最快水准）。读这本书是因为偶然一次机会在一个便利店看到一个《解忧杂货店》的舞台剧广告，上面写着“日本作家东野圭吾作品”，当时我就傻眼了——《解忧杂货店》不是村上春树的作品么？？？再三确认以后，我决定再读一本东野圭吾的作品，以示歉意，所以就选了《白夜行》。&lt;/p&gt;&#xA;&lt;p&gt;书中的故事相当粗暴，但是很吸引人，就是那种“我已经猜到答案了，你快点告诉我是不是这样”一路走下去的感觉。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;《见识》&lt;/p&gt;&#xA;&lt;p&gt;吴军老师的书，都是干货的方法论合集。&lt;/p&gt;&#xA;&lt;p&gt;按道理说一般说外企大佬写得书，多半是鸡汤（至少我认为是这样），但是吴军老师的书里面还是有很多大智慧。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;《我们台湾这些年 I》（未完）&lt;/p&gt;&#xA;&lt;p&gt;纯好奇，看着作者从小往大介绍，思绪慢慢从我的童年飘到现在，找回不少记忆。不过越往后看，越想借用《南渡北归》中蒋介石的一句话来送给自己和其他心心念互联网自由的人：“汝辈竟无革命精神若此！”&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;《奈飞文化手册》&lt;/p&gt;&#xA;&lt;p&gt;得到APP里面买的，介绍奈飞公司文化的一本书，其实给我的感觉是跟《原则》这本书交相呼应的，书里面介绍的几个价值核心：“我们只招成年人”、“要让每个人都理解公司业务”、“绝对坦诚”、“只有事实才能捍卫观点”要么是有很多共鸣——比如“要让每个人理解公司业务”，我一直觉得公司很多东西该透明要积极去透明，也一直在努力让开发部内部所有的事情都清晰透明；要么就是对我启发比较大——比如“我们只招成年人”。其他章节不是不好，而是因为需要在公司更高层面去运作，所以我的认识相对较少。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;旅行&#34;&gt;&#xA;  旅行&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%97%85%e8%a1%8c&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;全年两次旅游，一次在宜昌，一次在云南。&lt;/p&gt;&#xA;&lt;p&gt;宜昌算是散心之旅，我和小崔两个人，游记见&lt;a href=&#34;https://www.jianshu.com/p/255c6ee6f445&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;摆脱尘世繁杂——宜昌休闲4天游&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2019/01/03/we.jpg&#34; alt=&#34;we&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;云南真的是一场说走就走的旅行，因为今年公司没有组织年度旅游，所以云南游算是全年的大游了，但是其实只是一时冲动陪朋友去云南探亲，结果他的探亲成假，我们旅游去成真了。无游记。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2019/01/03/heart.jpg&#34; alt=&#34;heart&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;电视剧纪录片&#34;&gt;&#xA;  电视剧&amp;amp;纪录片&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%94%b5%e8%a7%86%e5%89%a7%e7%ba%aa%e5%bd%95%e7%89%87&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;电影就不说了，跟着小崔看了好多电影。只说下对我印象还比较深刻的电视剧和纪录片。&lt;/p&gt;</description>
			</item>
			<item>
				<title>深度滚动更新工作流程</title>
				<link>https://www.hualet.org/posts/rolling-release-in-deepin/</link>
				<pubDate>Tue, 18 Dec 2018 11:07:26 +0800</pubDate>
				<guid>https://www.hualet.org/posts/rolling-release-in-deepin/</guid>
				<description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;以前的系统发布模式为平均每3个月一次系统发布——开发周期2个月，测试周期1个月。这虽然保证了每次系统发布的状态都比较稳定，但是仍然避免不了在大量用户在不同场景下产生而发现新 BUG 的局面，而且因为这种发布模式缺少快速更新的机制，导致很多在内部已经得到修复的问题无法及时推送到外网，用户在这段时间内只能忍受一些 BUG 的干扰。所以，我们在 15.6 和 15.7 的时候引入了”发布后一个月“的概念，在这个时间段内，开发主要做问题修复工作，修复的内容可以快速推送到外网，而不用经过繁杂的测试，期望快速解决用户在使用新版本中遇到的问题，这就是深度滚动更新的原型。&lt;/p&gt;&#xA;&lt;p&gt;15.8开发的过程中，我们又思考了一下这个过程，刚巧我们决定了要尝试”开放和透明“、拥抱社区，所以觉得目前这种把”大教堂“和”集市“两种开发模式揉在一起的方式不是特别明朗，对系统发布者和开发者都是一种负担，所以”从善如流“——从 15.9 开始，deepin 系统的发布开始遵循滚动更新的模式。&lt;/p&gt;&#xA;&lt;h2 id=&#34;滚动更新流程&#34;&gt;&#xA;  滚动更新流程&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%bb%9a%e5%8a%a8%e6%9b%b4%e6%96%b0%e6%b5%81%e7%a8%8b&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;深度的滚动更新，需要参与系统发布的产品、开发和测试共同合作，所以制定了一套简单的工作流程作为大家协作的基础，从粗到细主要分为了以下几个范围：&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-系统版本&#34;&gt;&#xA;  1. 系统版本&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#1-%e7%b3%bb%e7%bb%9f%e7%89%88%e6%9c%ac&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;系统版本的概念跟以前的 15.7、15.8 等没有不同，都会提前指定这 2 - 3 个月的一个工作计划，在阶段性工作完成之后，会有新版本的 ISO 发布。与之前不同的是，新功能不是等系统发布的时候一次性放出，而是在每周开发内容完成、测试通过以后就会放出；另外一个不同是，系统发布不再以完成所有开发内容为前提，而是在系统版本计划的时间点达到以后即发布，未完成的内容放入下个版本工作内容中。&lt;/p&gt;&#xA;&lt;p&gt;工具使用：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统版本规划的内容会展示在官网的“版本规划”中进行展示；&lt;/li&gt;&#xA;&lt;li&gt;需求文档会邮件通知所有参与系统发布的同事。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-里程碑&#34;&gt;&#xA;  2. 里程碑&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2-%e9%87%8c%e7%a8%8b%e7%a2%91&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;由于前面所说的新版本不会要求计划内容都完成才发布，所以为了防止工作计划与实际工作产出相差过大，所以将每次系统版本发布做了阶段划分，也就是里程碑。举个例子来说，15.9 开发的阶段会划分为 15.8.1、15.8.2、 15.8.3、 15.8.4 等。&lt;/p&gt;</description>
			</item>
			<item>
				<title>修理 FreeRDP</title>
				<link>https://www.hualet.org/posts/add-notify-icon-support-for-freerdp/</link>
				<pubDate>Sun, 16 Dec 2018 14:41:44 +0800</pubDate>
				<guid>https://www.hualet.org/posts/add-notify-icon-support-for-freerdp/</guid>
				<description>&lt;h2 id=&#34;起因&#34;&gt;&#xA;  起因&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%b5%b7%e5%9b%a0&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;头段时间入了一个大坑儿，大概被坑了有一个月之久，出来之后同事还不忘嘲讽一番：”这么个事情就搞了一个月，看吧，你果然是老了“。听了这句话，心里真是百般滋味，但转念一想，”我年轻的时候做事好像也不怎么快“，顿时也就释怀了 :)&lt;/p&gt;&#xA;&lt;p&gt;这个坑就是”给 FreeRDP 的 RAIL 模式添加托盘支持“，当然，跟所有的需求一样，这么具有总结性而又直指根源的需求描述，绝对不是它最原始的模样——我刚接到这个坑的时候，它是这样的：FreeRDP 的 RAIL 模式下，应用的托盘在我们 DDE 下不显示。请注意这里说得是&lt;strong&gt;不显示&lt;/strong&gt;，而不是后来发现的&lt;strong&gt;压根儿没有支持&lt;/strong&gt;！&lt;/p&gt;&#xA;&lt;h3 id=&#34;freerdp&#34;&gt;&#xA;  FreeRDP&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#freerdp&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;说到这，可能有读者还不了解 FreeRDP 和 RAIL，所以先简单介绍一下。&lt;/p&gt;&#xA;&lt;p&gt;RDP 其实是一个协议名称，全称 Remote Desktop Protocol（远程桌面协议），是微软公司开发的一套用于远程桌面展示和操作的协议，FreeRDP 就是它在开源世界的实现咯。而 RAIL 的全称是 Remote Application Integrated Locally （远程应用本地集成），其实就是非常类似大家熟悉的虚拟机的”无缝模式“，通过将应用的显示跟本地环境相融合，让用户完全感受不到这个应用其实不在本机运行——就是这么一种技术。&lt;/p&gt;&#xA;&lt;p&gt;问题也就出在这，我当时第一反应是这么老的技术实现肯定比较完整了，托盘没有显示出来应该是跟 DDE 的兼容性有点小问题，稍微修一下就完了，三下五除二的事情，所以满口答应了下来……&lt;/p&gt;&#xA;&lt;h2 id=&#34;经过&#34;&gt;&#xA;  经过&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%bb%8f%e8%bf%87&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;既然答应了，硬着头皮也要顶下去的。何况调 BUG 这种事情——不管是不是我们自己的问题——在深度都是家常便饭。慢慢地，调各种项目的 BUG 竟然成了我的一种乐趣——每次开始接手一个新的项目的时候，我都把自己当成了福尔摩斯或者胡八一，或者也可以是其他全世界最聪明的那类人 😜，在通过代码找寻问题线索的过程中，慢慢成为这个项目世界中的主宰，解开真相……&lt;/p&gt;&#xA;&lt;p&gt;额……不好意思，白日梦又发作了一会儿。总之，这次也不例外，而且刚好这次在调问题的过程中有记录几个关键环节，所以打算把中间的过程写成日记性质的记录，看看能不能有更好的阅读效果：&lt;/p&gt;&#xA;&lt;h3 id=&#34;2018-11-14&#34;&gt;&#xA;  2018-11-14&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2018-11-14&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;从”沈老板“那收到需求，说 FreeRDP 在我们系统上有问题，应用的托盘显示不出来，QQ之类的程序关闭了窗口以后就没办法显示出来了，无法使用。这丫的又拿刘老大来压我……呵呵，想削他。不过看在他快要当爸爸的份上，还是算了。问了下时间要求，大概需要两周左右有初步的结果。不过我自己最近没有什么时间，先把锅丢给了印象中还比较熟悉网络协议的 @Blumia 同学。&lt;/p&gt;</description>
			</item>
			<item>
				<title>15.8研发心得</title>
				<link>https://www.hualet.org/posts/thoughts-on-15.8/</link>
				<pubDate>Wed, 21 Nov 2018 09:07:31 +0800</pubDate>
				<guid>https://www.hualet.org/posts/thoughts-on-15.8/</guid>
				<description>&lt;p&gt;不早也不晚，2018年11月15日 deepin 15.8 如期发布。这虽然是个好消息，但是没有了延期的梗，我竟然不知道这篇研发心得应该如何开头……😓&lt;/p&gt;&#xA;&lt;p&gt;开头这件事情总是很难，因为要做到一些以前没有做到的事情，就要求能将自己的水平提高哪怕那么一点点；同时，开头也不宜于高调，高调的开头太容易造成虎头蛇尾以致不能坚持的局面。在我的价值观里，与其浪费时间和精力在不能坚持的事情上，还不如什么都不做。所以很多事情我都不愿意开头，就像写这篇研发心得一样。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://upload-images.jianshu.io/upload_images/2171923-fad88bbd01959703.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&#34; alt=&#34;尬聊&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;不过，幸运的是我们对发布系统这件事情倒是充满着热情，以至于我们能在每一次系统发布的“轮回”里，都无所畏惧地开头并且坚持如一。比如 15.4 的毛玻璃效果、15.5 的高分屏、15.6 的应用深色主题、15.7的性能优化等等等等……当然，这次的主角 15.8 也不输从前。&lt;/p&gt;&#xA;&lt;h2 id=&#34;新特性介绍&#34;&gt;&#xA;  新特性介绍&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%96%b0%e7%89%b9%e6%80%a7%e4%bb%8b%e7%bb%8d&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;15.8 中新的变动着实不少，但是从一个研发的角度来看，我觉得最重要的变化应该是组织系统开发和发布的人发生了变化。之所以说这个比较重要，是因为 deepin 的前辈们把接力棒交到我这里，我终于可以把它顺利地转交到合适的人手中了，这句话的言外之意是什么呢？就是大家以后如果遇到什么 bug，进门左转找 &lt;a href=&#34;https://github.com/zccrs&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@zccrs&lt;/a&gt; 😂。&lt;/p&gt;&#xA;&lt;p&gt;说明了以上信息，就可放心地介绍这次的新功能了。不过说实话，这次的新功能都相当直观，用不着我费什么口舌，再加上本次研发心得的重点不在此，所以大部分的新功能请看 &lt;a href=&#34;https://www.deepin.org/2018/11/15/deepin15-8/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;系统发布新闻&lt;/a&gt;，这里只说两个我最喜欢的点吧。&lt;/p&gt;&#xA;&lt;p&gt;第一个要说的，是15.8 的新功能里面最让人惊喜的 Dock时尚模式 的托盘插件 的设计调整：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://upload-images.jianshu.io/upload_images/2171923-a5cc9e913b313dfd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&#34; alt=&#34;Dock的新托盘&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;为什么呢？这主要是因为以我的聪明才智，都一直认为时尚模式的托盘是一个无解的问题：系统托盘占用大量空间，应用托盘使用不方便……除非引入类似 macOS 的 topbar （估计很多人也是这么想的，所以都默默地在商店里面安装了 deepin-topbar吧）。事实上，当时我们讨论解决方案的时候也是差不多一样的状态，每个人都欲言又止，显然是还没说出口的方案就被自己推翻了，然而就在这个时候，设计师默默地上了一副设计图，把所有的应用托盘也放大成了与应用图标无异的大小。&lt;/p&gt;&#xA;&lt;p&gt;我：！？！？！？（黑人脸&lt;/p&gt;&#xA;&lt;p&gt;我刚要扔臭鸡蛋，设计师咔嚓又上传了一张图，仿佛在说 “蛋下留人～” 而转机就这样发生了，我看到设计图，就如大家在15.8看到的Dock时尚模式一样，托盘问题竟然被 almost 完美地解决了——在最后的关键时刻设计师保住了自己的颜面。&lt;/p&gt;&#xA;&lt;p&gt;怎么说呢，这基本上是我在深度继看到一个开发同事用钥匙给电脑开机感到由衷地佩服以来，再一次罕见地（尤其是被设计师？😈）觉得世界观被刷新的一次体验了。&lt;/p&gt;&#xA;&lt;p&gt;另外一个要提的是一个很小的点，不过现在想起来都会有一种吃了广告中的德芙的感觉——丝滑。是什么呢？如果你现在使用 deepin 浏览这篇文章，应该能看到我特地在文章开头、上一段和中间甩锅那一段，几乎到处都贴了 emoji 表情：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;能正常显示，而不是豆腐块！&lt;/li&gt;&#xA;&lt;li&gt;关键是它们是彩色的！！！&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://upload-images.jianshu.io/upload_images/2171923-c621e3cd37964183.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&#34; alt=&#34;getemoji&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;整篇文章不再有黑乎乎的表情——这简直是使用Linux写技术博客的 Blogger 的福音啊。如果你也想在文字编辑的时候输入开爱的 emoji 表情，可以打开 &lt;a href=&#34;https://getemoji.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://getemoji.com/&lt;/a&gt; ，只需 copy&amp;amp;paste，瞬间让你拥有进入 21 世纪互联网的赶脚。&lt;/p&gt;&#xA;&lt;p&gt;至于这个新特性为什么没有写到更新注记里面，是低调，是彩蛋，还是忘了写？咳咳，有点赶时间，继续往下写了 🙄🙄🙄 。&lt;/p&gt;&#xA;&lt;h2 id=&#34;开放和透明&#34;&gt;&#xA;  开放和透明&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%bc%80%e6%94%be%e5%92%8c%e9%80%8f%e6%98%8e&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;上面说了发系统的接力棒已经成功交（shuai）接（guo）给别人了，那我去干啥了呢？总得做点啥吧，要不被开了就不好玩儿了嘛😱。&lt;/p&gt;</description>
			</item>
			<item>
				<title>通过 Unix Domain Socket 传递文件描述符</title>
				<link>https://www.hualet.org/posts/unix-domain-socket-send-fds/</link>
				<pubDate>Sun, 28 Oct 2018 21:08:45 +0800</pubDate>
				<guid>https://www.hualet.org/posts/unix-domain-socket-send-fds/</guid>
				<description>&lt;p&gt;Unix Domain Socket 是 Unix 系统下重要的本地进程间通信（IPC）机制之一，在 DDE、GNOME、KDE 等 Linux 桌面环境中常见的进程间通信方式 DBus 有一种实现方式就是基于 Unix Domain Socket 做的。虽然一直知道它的大名，也一直知道 Unix Domain Socket 可以用来传递文件描述符，但是碍于以前经验和眼界不足，加上没有深入去了解，完全不知道能传递文件描述符是多么强大的能力和必要性。&lt;/p&gt;&#xA;&lt;p&gt;首先，我想着文件描述符不就是一个数字么，哪个 IPC 不能传递数字呢？完全没有思考到文件描述符是只在进程范围内有效，同样一个文件描述符放在不同的进程完全就不是一回事儿。这时候你肯定想，既然传递文件描述符这么麻烦，为啥非要传递文件描述符呢，使用文件名不也是一样的么？那么恭喜你，你也有更我一样在践行陶渊明老前辈看事物“不求甚解”的作风。传递文件描述符还是有它的必要性的，一方面，文件描述符代表的不只是一个文件，它还包含了文件打开的状态，比如 seek 的位置等，有点进程之于可执行程序的意思，拿到文件描述符也就拿到了这些动态的信息；另一方面，文件描述符不只对应于本地文件，它为了一众可读写对象提供了统一的读写接口，包含什么呢？本地文件、（匿名）管道、标准输入输出、甚至于 Socket 本身等……可以让你完全不关心文件描述符背后的实现是什么而方便实现自己的逻辑代码。&lt;/p&gt;&#xA;&lt;p&gt;想通了以上道理，又有了以前似曾相识的感慨“古人诚不欺我”——前人留下的东西，必然有一定的合理性。这也是为什么我比较排斥看见一个软件不满意就立即重新造，尤其是能流传很广或者流程时间很长的软件，里面很多看起来不必要的东西，可能有其存在的合理性，最好的做法是尝试去改进，改进的过程了解其历史、学习其精髓，等自己胸有成竹的时候再下手重造不迟。额，跑题了……&lt;/p&gt;&#xA;&lt;p&gt;回到正题，之所以前段时间突然研究了一下 Socket 传递文件描述符的东西，是遇到这样一个需求：一个进程将自己的标准输入、标准输出和标准错误输出映射到另外一个进程相应的位置。带着对 Unix Domain Socket 的朦胧认识，写了一个简单的实现原型：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// outlet.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;sys/un.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define SOCKET_NAME &amp;#34;/tmp/connection-uds-fd&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;make_connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;connection_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sockaddr_un&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PF_UNIX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SOCK_STREAM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun_family&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AF_UNIX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;strncpy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SOCKET_NAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sockaddr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;listen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;connection_fd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;accept&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;connection_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;send_fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;socket_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;msghdr&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmsghdr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;CMSG_SPACE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iovec&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iov&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dummy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;memset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;msghdr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;iov&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iov_base&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dummy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;iov&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iov_len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_iov&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iov&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_iovlen&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_control&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_controllen&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;CMSG_FIRSTHDR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg_len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;CMSG_LEN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg_level&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SOL_SOCKET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SCM_RIGHTS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;memcpy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;CMSG_DATA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_controllen&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg_len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;sendmsg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;socket_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// printf(&amp;#34;%d %d\n&amp;#34;, size, errno);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;connection_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;write from outlet&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;connection_fd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;make_connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;send_fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connection_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// inner.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;sys/un.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define SOCKET_NAME &amp;#34;/tmp/connection-uds-fd&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;connect_socket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sockaddr_un&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PF_UNIX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SOCK_STREAM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun_family&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AF_UNIX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;strncpy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SOCKET_NAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sockaddr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;receive_fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;socket_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dummy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iovec&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iov&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;iov&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iov_base&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dummy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;iov&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iov_len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;CMSG_SPACE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;msghdr&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;memset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_iov&lt;/span&gt;        &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;iov&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_iovlen&lt;/span&gt;     &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_control&lt;/span&gt;    &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_controllen&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmsghdr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;             &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;CMSG_FIRSTHDR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg_len&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;CMSG_LEN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg_level&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SOL_SOCKET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg_type&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SCM_RIGHTS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;memcpy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;CMSG_DATA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;recvmsg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;socket_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// printf(&amp;#34;%d \n&amp;#34;, size);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;memcpy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;CMSG_DATA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cmsg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;%d %d %d&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;msg_buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;strcpy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;write from inner&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;msg_buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;strlen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;msg_buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;socket_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;socket_fd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;connect_socket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;receive_fds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;socket_fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中，outlet 是“贡献”标准输入输出的进程，inner 是“抢占” outlet 标准输入输出的进程。整体上代码还比较好理解，只是如果需要发文文件描述符，需要注意 &lt;code&gt;send_fds&lt;/code&gt; 函数中 &lt;code&gt;cmsg-&amp;gt;cmsg_type = SCM_RIGHTS;&lt;/code&gt; 一行，必须制定 &lt;code&gt;cmsg_type&lt;/code&gt; 为 &lt;code&gt;SCM_RIGHTS&lt;/code&gt;。&lt;/p&gt;</description>
			</item>
			<item>
				<title>给 Doxygen 生成的文档中 Qt 的引用添加链接</title>
				<link>https://www.hualet.org/posts/doxygen-link-qt-classes/</link>
				<pubDate>Fri, 28 Sep 2018 16:42:40 +0800</pubDate>
				<guid>https://www.hualet.org/posts/doxygen-link-qt-classes/</guid>
				<description>&lt;p&gt;额……这个标题怎么改读着都不怎么顺口，不过不用在意这些细节，问题不大 :)&lt;/p&gt;&#xA;&lt;p&gt;上篇文章提到了 &lt;a href=&#34;https://hualet.org/blog/2018/09/26/%E5%A6%82%E4%BD%95%E7%BB%99-dtk-%E6%B7%BB%E5%8A%A0%E6%96%87%E6%A1%A3/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;如何给DTK添加文档&lt;/a&gt; ，给同事讲的时候有同事提出来最好能自动给对 Qt 的引用加上链接，我当时拍胸脯说文档里面 Qt 的类和方法随便引用，到时候一定让生成的文档可以链接到 Qt 的文档上。其实，到啥时候我也说不准……所以，还是研究了一下，翻了半天的 Stack Overflow 和 其他一些资料才搞清楚要怎么做到，这里记录一下。&lt;/p&gt;&#xA;&lt;p&gt;如何在文档中添加外部文档的链接呢？&lt;a href=&#34;https://www.stack.nl/~dimitri/doxygen/manual/external.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;官方文档&lt;/a&gt; 说得其实挺简单的： &lt;code&gt;TAGFILES&lt;/code&gt; ！最开始没有仔细看文档，理解歪了，以为 tags 文件是一个文档压缩包，添加到 &lt;code&gt;TAGFILES&lt;/code&gt; 这项后面生成文档的时候自动下载，然后自动根据索引添加引用链接到文档中。所以，根据 &lt;a href=&#34;https://stackoverflow.com/questions/22244779/doxygen-generated-documentation-with-auto-generated-links-to-qt-project&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;doxygen generated documentation with auto-generated links to qt project&lt;/a&gt; 这篇文章，Doxyfile 配置文件写了：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;TAGFILES = qtcore.tags=http://doc.qt.io/qt-5/ \&#xA;qtgui.tags=http://doc.qt.io/qt-5/ \&#xA;qtwidgets.tags=http://doc.qt.io/qt-5/ \&#xA;qtxml.tags=http://doc.qt.io/qt-5/ \&#xA;qtnetwork.tags=http://doc.qt.io/qt-5/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;生成文档，怎么都不生效…… WTF ?!&lt;/p&gt;&#xA;&lt;p&gt;继续 Google ，发现一个&lt;a href=&#34;https://github.com/pencil2d/pencil/pull/893/files&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;提交&lt;/a&gt;， 里面的&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;for i in core svg xmlpatterns; do&#xA;    curl -fsSLO &amp;#34;https://doc.qt.io/qt-5/qt$i.tags&amp;#34;;&#xA;done;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;引起了我的注意，恍然大悟：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;原来这个 tags 文件就是索引文件，需要预先下载下来，之所以有 = 加上一个网址，是因为 tags 中只有类名到文档名的映射，并没有规定使用某种协议以及host。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;不过 Qt 这些 tags 文件链接还真是难找，貌似没有任何正式的文档说明如何下载，真不知道这些人是怎么找到的。&lt;/p&gt;</description>
			</item>
			<item>
				<title>如何给 DTK 添加文档</title>
				<link>https://www.hualet.org/posts/writing-doc-for-dtk/</link>
				<pubDate>Wed, 26 Sep 2018 17:10:14 +0800</pubDate>
				<guid>https://www.hualet.org/posts/writing-doc-for-dtk/</guid>
				<description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;经过几年的摸爬滚打，DTK 作为构建 deepin 全家桶的基石，一直被说的主要有两个毛病：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;内部人员觉得它不够稳；&lt;/li&gt;&#xA;&lt;li&gt;外部人员觉得它无从下手；&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;第一个问题主要原因是 DTK 在最开始的时候缺失的东西太多，各种剧烈的变化同时进行，但是又没有比较好的版本控制和接口管理，所以经常是这个应用要用新版本，新版本删除了一个废弃的接口，用了旧接口的应用就崩了。由于最近 DTK 的变化日趋平稳，以及有了基本的版本控制，第一个问题渐渐淡出了人们的视野。&lt;/p&gt;&#xA;&lt;p&gt;第二个问题外部人员无从下手的原因是 DTK 在开发过程中并没有留下接口文档，所以目前想使用 DTK，内部靠得是口口相传，外部靠的是阅读源码，完全的石器时代……甚至连社区的小伙伴都看不下去了，自己做了一个&lt;a href=&#34;http://deepin.lolimay.cn/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;《Deepin开发指南》&lt;/a&gt; 。&lt;/p&gt;&#xA;&lt;p&gt;是时候给DTK添加一下文档了！&lt;/p&gt;&#xA;&lt;h2 id=&#34;工具选择&#34;&gt;&#xA;  工具选择&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%b7%a5%e5%85%b7%e9%80%89%e6%8b%a9&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;其实， DTK 之前是有写文档的，但是写得并不多，主要问题就是英文文档不好写。我也尝试写过，每个类、每个函数都只能憋出一句英文，这种文档跟没有是差不多的。所以，这里需要做一个艰难的决定：文档用中文来写，英文靠爱好者来翻译。&lt;/p&gt;&#xA;&lt;p&gt;用什么文档工具呢？ DTK 是基于 Qt 之上的开发库，最自然的想法是使用 QDoc，但是据使用 QDoc 搭建了 &lt;a href=&#34;https://github.com/linuxdeepin/dde-file-manager&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;dde-file-manager&lt;/a&gt; 的 &lt;a href=&#34;https://linuxdeepin.github.io/dde-file-manager/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Github Pages&lt;/a&gt; 的 @BLumia 同学说 QDoc 对国际化的支持不是特别好，我们按道理是要支持中英双语文档的，遂放弃。除了 QDoc 以外，文档生成工具就是 Doxygen、还有一个KDE 项目自己的文档工具 KApiDox ，它们三者之间是什么关系呢？Doxygen 从 QDoc 上 fork 出来的，KApiDox 是基于 Doxygen 的封装……我没有怎么看 KApiDox ，所以就选择了 Doxygen 。&lt;/p&gt;&#xA;&lt;h2 id=&#34;如何写&#34;&gt;&#xA;  如何写&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%a6%82%e4%bd%95%e5%86%99&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;下面就是规则部分了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>关于 deepin-code-release 的一点新的思考</title>
				<link>https://www.hualet.org/posts/deepin-code-release/</link>
				<pubDate>Mon, 17 Sep 2018 15:23:47 +0800</pubDate>
				<guid>https://www.hualet.org/posts/deepin-code-release/</guid>
				<description>&lt;p&gt;为什么要做 deepin-code-release 呢？其实我们在 deepin-code-release 的 &lt;a href=&#34;https://github.com/linuxdeepin/deepin-code-release/blob/6bea29e/README.md&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;README.md&lt;/a&gt; 中写得挺详细了：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;从deepin项目启动开始，伴随着越来越多的deepin子项目产生，不同开源/商业定制版本的分割加剧，项目间的版本依赖问题、上游项目的patch丢失问题和系统环境无法恢复问题越来越严重，我们迫切需要一个统一的系统来帮助我们记录不同版本的ISO/软件仓库的状态，做各个子项目版本的版本控制和patch的版本控制，以达到快速恢复开发/系统环境，进而使针对不同系统版本的开发更加高效。&lt;/p&gt;&#xA;&lt;p&gt;deepin release系统就是这样一个辅助系统，它的目标在于将它的每一个状态都对应到我们所有发布的ISO/软件仓库状态、每一个针对ISO/软件仓库的改动都能反映到这个仓库的改动上。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;简而言之，deepin-code-release 是版本的版本控制管理工具，用来管理 deepin  众多“轮子”项目的版本号的，每次系统发布都需要进行一次记录，方便以后开发修问题的时候能找到当时的代码进行bug修复。&lt;/p&gt;&#xA;&lt;p&gt;为了确保记录的准确，它的想法是这样的，每次（系统）发布前，深度的程序员各自检查一下自己负责的项目，如果需要跟随系统进行发布，就提交 CL 到 deepin-code-release 项目，这个 CL 会自动触发项目在对应仓库的打包，并且将打包结果反馈到 CL 的 Code Review 评分上，+1 分的就进行合并，反之闭门思过解决问题后再次提交，直到成功合并。&lt;/p&gt;&#xA;&lt;h2 id=&#34;问题&#34;&gt;&#xA;  问题&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%97%ae%e9%a2%98&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;以上需求还是听简单明确的，但是在目前的实现上却有一个问题：使用了 git-submodule 进行子项目的管理，再加上其他几个没有考虑的情况，这导致了好多小问题，以至于推行到现在还是阻碍重重：&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-使用起来比较麻烦&#34;&gt;&#xA;  1. 使用起来比较麻烦&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#1-%e4%bd%bf%e7%94%a8%e8%b5%b7%e6%9d%a5%e6%af%94%e8%be%83%e9%ba%bb%e7%83%a6&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;deepin 的项目都是放在 gerrit 上的，它并没有一个统一的 git 用户（类似git@github.com中的git），所以同一个项目在不同开发人员的机器上的项目地址是不一样的，当成 submodule 放到 deepin-code-release 这个项目中以后，必须驱动项目地址中的用户名部分，再在 &lt;code&gt;~/.config/ssh&lt;/code&gt; 中添加一些额外的配置（参见 &lt;a href=&#34;https://github.com/linuxdeepin/deepin-code-release/blob/6bea29e/README.md&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;README.md&lt;/a&gt; ）。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-submodule-用起来比较别扭&#34;&gt;&#xA;  2. submodule 用起来比较别扭&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2-submodule-%e7%94%a8%e8%b5%b7%e6%9d%a5%e6%af%94%e8%be%83%e5%88%ab%e6%89%ad&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;最直接、也是抱怨最多的一点，是大家平常使用 &lt;code&gt;git submodule&lt;/code&gt; 系列的命令并不多，所以对操作 &lt;code&gt;git submodule&lt;/code&gt; 有不太习惯，而且就算是我比较熟练了，也总觉得 &lt;code&gt;git submodule update&lt;/code&gt; 这个有点反直觉，感觉上应该是类似 &lt;code&gt;git pull --recurse-submodules&lt;/code&gt; 的功能，但是实际上并不是这样。以至于很多人一不小心，把别个辛辛苦苦提交的更新又给退回去了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>15.7 研发心得——最好版本的台前幕后</title>
				<link>https://www.hualet.org/posts/thoughts-on-15.7/</link>
				<pubDate>Sun, 02 Sep 2018 10:27:00 +0800</pubDate>
				<guid>https://www.hualet.org/posts/thoughts-on-15.7/</guid>
				<description>&lt;p&gt;15.7 终于如期地发布了……好吧，也就晚了2个工作日……毕竟这么好的版本，多等两天也可以的，对吧。需要多解释一句的是，我们之所以也没有按照往常的套路——拖到周五发，是因为周五刚好是情人节，毕竟程序员找个女朋友不容易，所以就拖了两天……这应该是个好借口吧 :P&lt;/p&gt;&#xA;&lt;p&gt;发完系统第一件事情当然就是写《研发心得》咯，不知道从什么时候开始，《研发心得》成了发布标配，上午发系统，晚上就要《研发心得》，我只能微笑着说……嗯，挺好的！不过虽说是研发心得，但是别人看了我的心得以后都说像软文。我的想法是这样的：像软文就像软文嘛，让各位支持deepin的朋友看得舒舒服服的同时还能了解新功能，多好！&lt;/p&gt;&#xA;&lt;p&gt;不过这次我准备换个风格，重点是真实。所以，这次的心得我准备说说 15.7 这个版本的台前幕后。&lt;/p&gt;&#xA;&lt;h2 id=&#34;台前幕后&#34;&gt;&#xA;  台前&amp;amp;幕后&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%8f%b0%e5%89%8d%e5%b9%95%e5%90%8e&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;“这是我用过的最好的deepin版本”。&lt;/p&gt;&#xA;&lt;p&gt;我预测应该有很多用户会跟我有同样的想法，毕竟，对于发了这么多版本的我来说，15.7 是第一个版本让我有重新完整安装一次这样冲动的版本。三年多以来，每逢系统发布前，我都会挑一个良辰吉日加上一个好时间，这个时间其实主要取决于版本发布的延期情况而定，隆重地安装一下即将发布的新版本的ISO，说是为了测试一下其实是骗人的，毕竟我也测试不出什么bug来……主要是装一下心里面爽啊，你们要明天才能下载，我今天就用上了，呵呵呵……&lt;/p&gt;&#xA;&lt;p&gt;虽说每次的ISO我都安装过，但是我从来没有舍得把我现在在用的系统格式化掉重新安装，因为这个老家伙从deepin切换仓库到Debian我重新安装了一次系统开始就一直陪伴着我，没有必要的话，我是想一直让它继续往上升级的。直到这次15.7发布，我感觉它又是一次值得纪念的发布才想着来一次完整重装，不过冲动归冲动，我还是按捺住了心中那团火——还是没有重新安装，因为思来想去，升级上来的也是一样的嘛 :)&lt;/p&gt;&#xA;&lt;p&gt;这次升级可以分为两大部分，一部分是DDE的优化，另一部分是仓库同步Debian上游。从一个用户的角度出发，我觉得吸引我的地方，或者说值得用户期待的地方主要有这么几个：&lt;/p&gt;&#xA;&lt;h3 id=&#34;更快的启动速度&#34;&gt;&#xA;  更快的启动速度&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%9b%b4%e5%bf%ab%e7%9a%84%e5%90%af%e5%8a%a8%e9%80%9f%e5%ba%a6&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;这个主要得益于“林姐”亲自操刀的文件预热技术&lt;code&gt;warm-sched&lt;/code&gt;，它主要的原理是这样的，大家知道操作系统在启动的过程中，会进行大量的IO操作，这个在CPU性能不是问题的平台上就是启动慢的罪魁祸首了，大家还知道Linux内核其实本身是有文件缓存机制的，被缓存的文件访问会非常非常快，所以如果我们在系统加载的适当时候能进行一定的预热，那么系统加载的时间当然就会大大缩短了。&lt;/p&gt;&#xA;&lt;p&gt;不过这个会导致的一个问题就是，用户登录的速度变得飞快（从原来的10s+变成3s），但是系统好像在deepin水波纹的时间似乎更长了，其实不用”似乎“，真的会这样，文件预热技术不是神话，它没办法吃掉那部分加载文件的时间，它能做到的只是在合适的时间点预热下一个阶段需要的文件。&lt;/p&gt;&#xA;&lt;p&gt;”这不是拆东墙补西墙么？“你可能会这么问，但是我要告诉你还真不是，如果没有预热，系统加载文件的过程是”乱序“的，这里的乱序是指文件存放不一定是顺序存放在磁道上的，乱序的文件访问会导致磁盘访问的过程中转来转去的，效率低下；相反，&lt;code&gt;warm-sched&lt;/code&gt;不仅只是对文件预热，加载的过程可以保证磁盘的顺序访问，文件多了的话，这部分优化还是比较可观的……&lt;/p&gt;&#xA;&lt;p&gt;我记得以前有位同事总是喜欢开玩笑说”苍蝇也是肉啊“，当时在饭桌上没少让人倒胃口，但是这句话用在性能优化、以及上面这个例子上算是再合适不过了。&lt;/p&gt;&#xA;&lt;h3 id=&#34;更少的资源占用&#34;&gt;&#xA;  更少的资源占用&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%9b%b4%e5%b0%91%e7%9a%84%e8%b5%84%e6%ba%90%e5%8d%a0%e7%94%a8&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;首先是电量，如果你是笔记本的话，应该能感受到笔记本续航的提升，deepin测试人员实测的数据是以前3小时续航能力的笔记本，待机会多出30分钟+的时间，也就是提升差不多有17%，跟使用&lt;code&gt;powerstat&lt;/code&gt;这个工具测试的效果基本相差不大。那是不是原来待机4个小时的笔记本，也只会多出30分钟的续航时间呢？并不是的，因为这是一个功耗比例上的变化，这次优化以后理论上可以增加的待机时间就是 原来的待机时间x17% 了，如果你的电池健康程度够的话，应该能有更大的优化效果。&lt;/p&gt;&#xA;&lt;p&gt;不过，这些都是在使用电池的情况下的数据，因为默认情况下deepin系统只有在拔掉电源的情况下才会自动进入节能模式，如果你想在连接电源的情况下也开启节能模式，我是说假如你真这么环保的话，你可以在控制中心的电源模块手动打开节能模式；相反，如果你像我一样不在乎耗电，只追求卓越的性能，你也可以随时把节能模式关掉，大丈夫就是这么帅，不怕编译的时候机器烫手；总之，由着你的性子来！&lt;/p&gt;&#xA;&lt;p&gt;另外一个能明显感受到的变化是开机内存的减少，这里所说的开机内存是指在没有任何开机启动项的情况下，DDE达到稳定状态的一个内存值，由原来的 1.1G 占用降低到 830M 左右，在使用独显的情况下，内存占用会更低，简直令人发指！好处是什么呢？更低的内存占用意味着DDE变得更加轻量，应用程序可以占用更多的系统资源，例如你是chrome这个内存占用大户的用户，15.7 可以让你在系统不变卡的情况下多开十来个标签页呢，是不是很开心？&lt;/p&gt;&#xA;&lt;p&gt;不过做这些优化的过程中最让我感到意外的是DDE对电量消耗的“助攻”竟然没有大家预想的那么多，进程抽风性地CPU占用高、间歇性地进程状态切换等居然连硬件功耗的零头都占不到，不过该改的地方一个都不少，所以，DDE 的CPU占用高的问题在15.7中也可以不用再见了。&lt;/p&gt;&#xA;&lt;h3 id=&#34;更新的软件和驱动&#34;&gt;&#xA;  更新的软件和驱动&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%9b%b4%e6%96%b0%e7%9a%84%e8%bd%af%e4%bb%b6%e5%92%8c%e9%a9%b1%e5%8a%a8&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;这个就不用多说了，搭载了Debian上游最新的一波升级，你想要的“更新的软件”、“更新的驱动”统统都给你，就是这么大方！而且，这次你收到的不仅仅是一次更新带来的快感，更是deepin更新会变得更加快、准、狠的承诺。在15.7的需求中我们争论了好多次，一方说已经有太多用户吐槽我们软件不够新、基础库不够新，用户需要新的软件；另一方说更新太快容易导致用户环境不稳定，我们毕竟是一个面向普通用户的发行版；争论不休，都可以开一个深度辩论赛了……最后终于达成一致，我们希望能更快速的将软件更新推送给用户，不再一次性积累大批量的更新，同时保证一定的节奏，确保快速更新的同时不会挂挂挂。&lt;/p&gt;&#xA;&lt;p&gt;另外，值得一提的是论坛用户和老板不停的要求、催促和威逼利诱下，我们终于——终于把&lt;code&gt;PRIME&lt;/code&gt;方案引入到了深度显卡驱动管理工具中，现在如果你是双显卡（N+i）用户，你只要小手一点，就可以方便地在几个预设方案中轻松切换了……嗯，不辛苦，用户和老板高兴就好 :)&lt;/p&gt;&#xA;&lt;h2 id=&#34;一点感悟&#34;&gt;&#xA;  一点感悟&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e4%b8%80%e7%82%b9%e6%84%9f%e6%82%9f&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;上面说了这么一大堆，其实当时为了准备这些优化的内容的时候，心里面还是比较慌的，因为系统优化这事儿做起来远没有听起来那么爽，尤其是在没有既定方法的情况下要定一个优化目标出来，还是相当无助的，而且一旦你陷入 盲目—烦躁—焦虑 的怪圈中，就很难再痛快地出来，这就是这次15.7所面临的第一个挣扎。&lt;/p&gt;</description>
			</item>
			<item>
				<title>友链</title>
				<link>https://www.hualet.org/blogroll/</link>
				<pubDate>Wed, 04 Jul 2018 23:17:40 +0800</pubDate>
				<guid>https://www.hualet.org/blogroll/</guid>
				<description>&lt;br/&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.nanpuyue.com&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;南浦月&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.felixc.at&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Felix&amp;rsquo;s Blog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.ilxz.me&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;lxz&amp;rsquo;s blog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;br/&gt;&#xA;&lt;p&gt;好不容易才把友链加回来了 :)&lt;/p&gt;</description>
			</item>
			<item>
				<title>致王勇</title>
				<link>https://www.hualet.org/posts/to-wangyong/</link>
				<pubDate>Mon, 18 Jun 2018 20:25:10 +0800</pubDate>
				<guid>https://www.hualet.org/posts/to-wangyong/</guid>
				<description>&lt;p&gt;以下内容是我在知乎对“如何看待Deepin操作系统创始人王勇离职”的&lt;a href=&#34;https://www.zhihu.com/question/281097040/answer/420113495&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;回答&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;这个月，从王勇改微博后缀，到删除deepin字样相关的代码，再到一则朋友圈，最后论坛的一篇《感谢亲爱的你们，大家继续加油》，有好几个朋友过来问、或者代朋友问王勇的情况，我虽然已经知道他的打算，但是不管朋友远近我都是说他在家休息，因为我知道他离开的消息有多大的影响。现在大家都知道了，也都震惊了，有人觉得伤感、失落，包括我自己都一样，这没什么，但是很多无良的媒体大肆渲染，最后以讹传讹，我甚至感觉我明天就不用去上班了……&lt;/p&gt;&#xA;&lt;p&gt;压抑了好久，有必要在这里说说。&lt;/p&gt;&#xA;&lt;p&gt;王勇离开深度，我觉得对我最大的影响是 &lt;strong&gt;少了一个导师，没有了精神寄托&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;跟很多deepin的粉丝一样，我还在上大学的时候就知道了deepin，随之就对deepin和ManateeLazycat（王勇的网名）产生了巨大的喜爱，成了王勇的脑残粉；幸运的是我居然凭着自学（当然也得感谢当时猴哥和xiangzhai在网上对我的指导），拿到了去深度工作的机会。而我刚进深度的第一个目标就是“王勇，我要在技术上超越你”，被王勇知道后以至于到现在还被他拿出来刺激我 :O&lt;/p&gt;&#xA;&lt;p&gt;深度当时的技术氛围非常浓厚，因为一个屋子，清一色的程序猿。所以在深度的第一年里，是我技术成长接触面最广的一年，学了很多语言，接触了很多技术，对我影响最大的可能就是跟着王勇和猴哥学了Emacs，另外也自学了Elisp和Common Lisp，虽然当时心高气傲搞了一个hualet-emacs，实际上用王勇的话说“就是对着deepin-emacs抄嘛 :P”，事实上也确实如此，那时候也是第一次看到王勇在UI细节打磨上执着，他把emacs的每个插件都折腾成自己的风格，所有插件放在一起你都不觉得他们是分开的，自成一套体系，对我影响很大。&lt;/p&gt;&#xA;&lt;p&gt;后来的一年多时间，是我在深度的沉寂期。默默无闻，但是我看到了王勇做的一些事情，其中就包括跟其他社区的人吵架，或者叫“互喷”吧。当时有点不能理解，社区都好好相处，不是挺好么，还容易积聚力量，后来慢慢懂了。前段时间看《走向共和》和《曾国藩的正面与侧面》，我觉得王勇很像晚清那些想叫醒中国人的斗士、英雄，看到开源社区很多浮在空中的“所谓的大牛”，说的话都对，却很少或者说从来不做实事，而愤怒地发出怒吼。&lt;/p&gt;&#xA;&lt;p&gt;“有了求实一念，人才会从道德制高点上下来，脚踏实地，不激不随。”我觉得王勇能成为我心目中的领袖，是他很早就知道“求实”，而不是站在道德的制高点上喷这个、吹那个。&lt;/p&gt;&#xA;&lt;p&gt;15年的时候，我迎来了自己在深度的机会：掌管桌面组和系统发布。但实际上当时我申请了这个职位以后没过两周我就后悔了，深度的用户都知道，15版本是近年来最大的一次版本变迁，首先是仓库从ubuntu切换到了debian；另外是桌面环境全换Qt重写。这对我来说不仅是巨大的工作量，关键是我当时还主要是做应用，压根儿不知道这个桌面是怎么一步一步被做出来的，还要面临的一个问题是为了赶商业机会，我们的重写必须在那3-6个月完成，那时候真的是异常痛苦。&lt;/p&gt;&#xA;&lt;p&gt;也就是这个时候，我和王勇的关系才从以前一种盲目崇拜与被崇拜，变成了学生和导师的关系。记得非常清楚，无数个加班的夜晚，我跟兄弟们加完班以后，还得找王勇“倒垃圾”，这个事情有多难、有多坚持不下去、这方面有问题怎么办、那方面又问题怎么办……有时候王勇也不见得有什么好的办法，但是有一个人一直在支撑你走下去的感觉，会产生奇迹。这种经历一生也不会有太多。&lt;/p&gt;&#xA;&lt;p&gt;那半年是我蜕变的半年，王勇在其中起了太多的作用。&lt;/p&gt;&#xA;&lt;p&gt;所以要说王勇身上背负的不仅仅是自己的压力，还要背负兄弟姐妹们身上的压力，这个压力我自忖是完全承受不来的。这也是为什么当时猜出来王勇要离职的时候，我对他说“从公司员工的身份上我对你这个决定是接受不了的，但是从朋友的角度我觉得你做这个决定我很佩服”。他确实承受了太多事情，如果都这么决定了，我们能做的就是尽量不要给他压力。&lt;/p&gt;&#xA;&lt;p&gt;王勇临离开之前做的最后一些事情，就是研发各个团队的负责人挨个谈了一遍，跟我说的内容很少涉及自己怎么样，更多的是帮我捋清方向。&lt;/p&gt;&#xA;&lt;p&gt;就这样。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;至于说深度会不会因此倒闭了，或者说deepin项目会不会凉了，我觉得至少短时间内不会。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;一方面，王勇作为武汉研发总部的负责人，长期以来从来也没有忘记去培养人，培训和言传身教，影响了一部分有想法的同事，虽说我们现在没有能力像他一样作为个人去领导一方，但是目前在做的事情是可以承担起来的；另一方面，就像 张成前辈 的回答里面说的一样，深度前期能在完全没有盈利目标的情况下开始做，到现在依然坚持在为社区做贡献，王勇的热情是一部分、刘总（deepin）对社区的看重是另外一部分。现在王勇出走了，但是我没有看到刘总说社区就此打住、不再做了，实际上公司上下稍微有点Linux背景的人都没有质疑过社区这一条方向。所以deepin项目不会就此凉了，相反我们可能会在做国产化的同时去探索更多的面向社区和普通消费者的方向。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;最后，致勇哥一声深深的谢谢！&lt;/strong&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>使用 Perf 优化程序性能</title>
				<link>https://www.hualet.org/posts/perf-training-one/</link>
				<pubDate>Sat, 16 Jun 2018 20:54:44 +0800</pubDate>
				<guid>https://www.hualet.org/posts/perf-training-one/</guid>
				<description>&lt;p&gt;因为原定deepin 15.7会做优化（能耗、资源占用等）方面的工作，所以在此之前，想提升一下团队整体的性能剖析、优化方面的水平，也就有了这次（周五）的培训。本来想用视频记录的，一个是自己回头能看看，反思和改进一下演说能力；另一个是以后有新人入职，我也就不用挨个再讲一遍，天不遂人愿，录制视频的软件半道挂了（ 所以只能这里尽量回忆当时想表述的内容，这里文字稿记录了。&lt;/p&gt;&#xA;&lt;p&gt;下面就是培训内容：&lt;/p&gt;&#xA;&lt;p&gt;好，人到齐了我们就开始了。今天要培训或者说要分享的内容是程序性能优化方面的内容，其实我们对性能优化不陌生：最开始接触龙芯和申威平台，系统组件间调用不是异步导致系统卡得无法使用；好不容易交了一个版本，控制中心各个模块还是因为切换卡顿、使用体验不好等做改进；前段时间为2G内存机器做优化等等。现在我们因为程序设计问题导致的性能问题比以前少了很多，一方面我们还要对这些部分持续改进，另一方面我们需要掌握一些性能剖析工具的使用，来帮助我们改进一些更细粒度的程序性能问题，今天我们主要集中在程序执行性能、也就是CPU占用这部分的性能优化。&lt;/p&gt;&#xA;&lt;p&gt;今天培训的内容比较基础，还是老规矩，我做敲门砖，其余的还需要各位发挥。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.001.jpeg&#34; alt=&#34;linux-perf-1.001&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;刚才说了我们以前做了几次优化，我们再来回顾一下为什么要做性能优化。第一点肯定是占用过多的系统资源，不论是CPU、内存还是IO，如果系统组件的资源占用比较高，那系统资源有限、程序间的资源又是会互相竞争的，必定导致用户使用的应用程序的可用资源减少，在一些配置普通的机器上，可能就会导致第二个问题，也就是系统使用不够流畅，当然导致系统使用不流畅也分两部分原因，一个就是我们刚才说的，系统组件占用资源过多，另外一个也是刚才提过的程序架构设计有问题，导致卡界面等等；&lt;/p&gt;&#xA;&lt;p&gt;第三个是性能问题在低配置的机器上会被无限放大，就像我们在最初的龙芯和申威平台一样，在x86上可能感受不到或者感受不太强烈的问题，在龙芯和申威上就会严重到无法使用（当然，现在的龙芯和申威平台使用已经没有问题了）；最后一个也是跟我们15.7想要解决的能耗问题息息相关，就是能耗高、发热大。主要是我们有些系统组件“不老实”，很多情况下随机“抽风”。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.002.jpeg&#34; alt=&#34;linux-perf-1.002&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个问题我们论坛用户提到的也不在少数：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.003.jpeg&#34; alt=&#34;linux-perf-1.003&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.004.jpeg&#34; alt=&#34;linux-perf-1.004&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;当然了，大家可能也知道功耗主要跟系统配置关系很大，例如CPU开不开睿频、有没有设置节能模式，各个网卡、声卡驱动有没有设置节能模式等等，但是我觉得至少我们的程序至少不能成为能耗高的帮凶吧。&lt;/p&gt;&#xA;&lt;p&gt;现在的情况是我们的程序不仅是帮凶，而且帮得很厉害，一会儿会给大家看一下。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.005.jpeg&#34; alt=&#34;linux-perf-1.005&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;刚才说了我们做了很多次性能优化，可能很多用户期待说我们能一次解决所有性能问题，但是实际上性能优化是持久战，它是一个需要持续做下去的事情。&lt;/p&gt;&#xA;&lt;p&gt;另外主要还是因为性能优化很难，第一点主要就是性能瓶颈的定位很难，比如最开始我们系统登录的过程非常慢，所有程序都是并行启动，看着所有的系统资源占用都很高，换成串行启动以后，依然如此，这个定位当时就比较麻烦； 第二点是有时候优化的效果并不明显，虽然说我们看到有时候系统的资源占用挺高，但是可能分到每个程序中就不是特别多，做性能优化得慢慢抠，可能从单个程序来看效果并不明显；第三点是有时候做性能优化的技术和经验要求比较高，一方面是性能剖析工具的使用、对程序运行的本质要熟悉，另一方面就是要对被优化程序的代码要非常了解，不然就会导致我们说的第四个问题：优化可能影响正常功能。比如我上次给Dock提交了一个性能优化的提交，虽然有让sbw同学审核代码，但是最后还是导致了一个功能性bug。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.006.jpeg&#34; alt=&#34;linux-perf-1.006&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;虽说性能优化很难，但是……不积跬步无以至千里。所有复杂的系统都不是一天两天做好的，比如我们的桌面环境，到现在经过了四个版本，基本上就是四代人的心血堆积，才做成现在这个样子。&lt;/p&gt;&#xA;&lt;p&gt;我们每个人都能做好自己那部分的话，众人拾材火焰高，解决系统性能问题我觉得没有那么麻烦，这其实也是为什么我这么迫切要组织这次培训/分享的原因，还是希望我做好敲门砖，像去年做高分屏支持一样，虽然是我开的头，但是其实最后基本上每个都比我做得好，最后我们做高分屏的效果也非常不错。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.007.jpeg&#34; alt=&#34;linux-perf-1.007&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;刚才说了性能优化很难，大家也不要害怕，其实性能优化也没有想象的那么复杂。&lt;/p&gt;&#xA;&lt;p&gt;第一个是因为现在优秀的工具很多，比如右边这个非常出名的图，来自 Brendan Gregg 大神的博客。把系统性能优化每个部分对应的工具都清楚的标出来了。&lt;/p&gt;&#xA;&lt;p&gt;第二个说实话是因为deepin的性能问题还比较多，比较容易发现，相应的上层的性能问题也多，所以说性能优化简单也是因为我们这次主要将注意力集中在 Applications &amp;amp; System Libaraies &amp;amp; System Call Interface这三部分即可。这部分的工具可以看到其实就是 perf、ltrace、strace这些，最多加上 bpfcc 、eBPF等。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.008.jpeg&#34; alt=&#34;linux-perf-1.008&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;说deepin性能问题还比较多是大家可以看到，静置状态下，我什么都不操作，几个组件就又可能时不时抽风一下（占用CPU部分）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.009.jpeg&#34; alt=&#34;linux-perf-1.009&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;看到了有性能问题，但是我们总得有办法把这些性能问题优化掉吧。&lt;/p&gt;&#xA;&lt;p&gt;性能优化一般分三个部分，第一部分就是查找程序性能热点，实际上一般我需要先定位性能瓶颈到底是在哪部分，是CPU？是内存还是IO等。不过我们这里目标很明确就是优化CPU占用，所以可以直接朝着有性能问题的程序去。&lt;/p&gt;&#xA;&lt;p&gt;第二步是热点诊断和修复，找到了性能热点，我们肯定需要修复吧，看看导致这个热点的原因，正常进行修复即可。&lt;/p&gt;&#xA;&lt;p&gt;第三步是回归测试，就像我们平常修bug一样，修了bug要测试，做了性能优化也一样，我们需要做回归测试、对比一下前后的性能数据。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/06/linux-perf-1.010.jpeg&#34; alt=&#34;linux-perf-1.010&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;我们先来看第一步，利用perf查找程序性能热点，这也是我们今天要说得重点。&lt;/p&gt;&#xA;&lt;p&gt;perf这个工具最开始是作为Performance Counter的接口引入内核的，但是慢慢引入了一堆调试接口如 tracepoint、kprobe、uprobe等等，也就慢慢发展成为Linux几乎最好用的性能调试工具了。&lt;/p&gt;&#xA;&lt;p&gt;我们平常使用的perf命令是用户态的工具，前面说得那些都是内核里面做的事情，内核态工具主要是对搜集到的数据和事件进行处理和统计。因为这个工具跟内核版本关系比较紧密，所以安装perf的时候需要注意跟内核版本对应的问题。当然，调试的时候装dbgsym包是必须的。&lt;/p&gt;&#xA;&lt;p&gt;使用perf查找程序性能热点，一般主要用到三个子命令，第一个就是 perf top，这个很好理解，top命令大家都用过，那个top主要是针对进程或者线程级别的资源占用进行统计和展示，perf top可以理解为函数级别的top，可以动态展示系统目前占用资源最高的函数分布情况，它后面的 -g 是启用函数栈，-p 后面加上进程 PID就可以针对单个进程进行追踪，这个跟top命令一致，如果不加 -p 就是默认系统级的统计和展示。&lt;/p&gt;&#xA;&lt;p&gt;第二个命令是 perf record，它跟第三个命令 perf report 是搭配使用的，record 用来记录一段时间内的程序执行情况，然后用 report 来进行展示。 -g 参数的意义跟 perf top一致，启用了函数栈以后，我们可以使用 &amp;ndash;call-graph 来制定使用哪种方式来获取函数栈：&lt;/p&gt;</description>
			</item>
			<item>
				<title>自制 Profiler 第二部分——调用栈回溯</title>
				<link>https://www.hualet.org/posts/poor-mans-profiler-part2/</link>
				<pubDate>Mon, 14 May 2018 14:19:37 +0800</pubDate>
				<guid>https://www.hualet.org/posts/poor-mans-profiler-part2/</guid>
				<description>&lt;p&gt;书接上篇，我们现在已经能在其他程序中执行我们自己的代码，并且也做到了以固定的频率去执行采样代码（我们的&lt;code&gt;printf&lt;/code&gt;），但是如何采样还是一个问题，这篇文章会就这这个问题继续探讨接下去我们面临的挑战——调用栈回溯。&lt;/p&gt;&#xA;&lt;p&gt;为什么要获取函数调用栈？一方面是因为profiler除了要分析程序存在的性能问题，即函数执行热点以外，还需要帮助我们可怜的程序员找到问题的原因，这时候能提供问题函数的堆栈信息就非常必要了；另一方面，我们上一篇文章其实说了，是为了通过堆栈信息尽量还原程序的执行过程：试想一个程序执行的过程是 main-&amp;gt;funca-&amp;gt;funcb-&amp;gt;funcc，我们第一次采样 main-&amp;gt;funca，第二次采样 main-&amp;gt;funca-&amp;gt;funcb-&amp;gt;funcc，假如我们没有堆栈信息，我们只会统计一次 funca 和一次funcc，但是这并不能反应事实，相反，我们有堆栈信息的话，就会把 funca 、funcb 和 funcc 各计数一次，更能反应实际的执行过程。&lt;/p&gt;&#xA;&lt;h2 id=&#34;概念&#34;&gt;&#xA;  概念&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%a6%82%e5%bf%b5&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;函数调用栈（Call Stack）和相应的栈帧（Stack Frame）我们其实都不陌生：在使用 gdb 调试程序的时候，bt（backtrace）命令打印出来的就是函数调用栈；而函数调用栈列表中的每一项则代表一个栈帧，我们执行 frame 命令跳转到某一个栈帧，其实就是一次回溯的过程。&lt;/p&gt;&#xA;&lt;p&gt;想要在内存中解析出我们想要的函数调用栈，首先我们需要知道的就是一个程序的stack 段里面各个栈帧是如何布局的，要搞清楚这个，我们还需要了解一个概念叫：&lt;a href=&#34;https://en.wikipedia.org/wiki/Calling_convention&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;调用约定&lt;/a&gt;（Calling Convention），调用约定主要约定了（好绕）：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;函数的参数是如何传递的，是全都放到寄存器，还是全都放在 stack 段，还是混用两者；&lt;/li&gt;&#xA;&lt;li&gt;函数的参数是按什么顺序放置到内存中的；&lt;/li&gt;&#xA;&lt;li&gt;函数中的本地变量是如何分配的；&lt;/li&gt;&#xA;&lt;li&gt;子函数调用是如何返回的；&lt;/li&gt;&#xA;&lt;li&gt;子函数的栈帧是如何清理的；&lt;/li&gt;&#xA;&lt;li&gt;等等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;所以，调用约定基本上决定了函数调用中每个栈帧的产生、压栈、出栈对内存布局的影响，而这个约定是因架构和平台而异的。我们这里只关注x86 平台下的 &lt;a href=&#34;https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;cdecl&lt;/a&gt; 约定。&lt;/p&gt;&#xA;&lt;p&gt;在这个约定下，假如我们有一个函数 &lt;code&gt;DrawSqure&lt;/code&gt; 调用了 &lt;code&gt;DrawLine&lt;/code&gt; （例子来自&lt;a href=&#34;https://en.wikipedia.org/wiki/Call_stack&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wikipedia&lt;/a&gt;），那么程序内存布局中的 stack 段就应该是类似下图所示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/05/14/Call_stack_layout.svg&#34; alt=&#34;call stack&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;每个函数调用即创建一个栈帧，每个栈帧一次压入 stack 中。&lt;/p&gt;&#xA;&lt;p&gt;其中，&lt;code&gt;Stack Pointer&lt;/code&gt;(&lt;code&gt;esp&lt;/code&gt;) 永远指向栈顶， &lt;code&gt;Frame Pointer&lt;/code&gt;(&lt;code&gt;ebp&lt;/code&gt;) 指向当前栈帧的中一个固定的地方（基地址）；函数参数以从右往左的顺序依次压栈，然后是压入&lt;code&gt;Return Address&lt;/code&gt; ，它是当前函数（或者栈帧）执行完成后，程序要继续执行的指令地址， 同时压入父函数的栈帧基地址（&lt;code&gt;Saved EBP&lt;/code&gt;），它是当前函数执行完成以后，&lt;code&gt;Stack Pointer&lt;/code&gt; 和 &lt;code&gt;Frame Pointer&lt;/code&gt; 将会指向的地方，基于这个地址，程序指令可以方便地访问函数本地变量（&lt;code&gt;ebp&lt;/code&gt;负向偏移）和函数参数（&lt;code&gt;ebp&lt;/code&gt;正向偏移）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.hualet.org/img/2018/05/14/stackIntro.png&#34; alt=&#34;stack info&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>自制 Profiler 第一部分</title>
				<link>https://www.hualet.org/posts/poor-mans-profiler-part1/</link>
				<pubDate>Sun, 13 May 2018 14:42:41 +0800</pubDate>
				<guid>https://www.hualet.org/posts/poor-mans-profiler-part1/</guid>
				<description>&lt;p&gt;​&#x9;最近对性能剖析的技术颇感兴趣。好不容易来了三分钟热度，自然不能浪费，因此在余热消失之前研究并实践了其中一部分细节，对于其中一些知识点，个人感觉对于自身编程能力提升还是比较有益的，因此在这里写出来，抛砖引玉。&lt;/p&gt;&#xA;&lt;h2 id=&#34;linux-profiler简介&#34;&gt;&#xA;  Linux profiler简介&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#linux-profiler%e7%ae%80%e4%bb%8b&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;​&#x9;性能剖析的工具，其实在Linux平台还是挺多的，比如小巧实用的strace、ltrace、latrace，大名鼎鼎的google-perftools、gprof、valgrind，以及瑞士军刀型的linux-perf等等，它们主要分为三个阵营，一个是针对程序执行的性能进行剖析，对程序执行的热点进行分析，如*trace、gprof这些工具；另一个是针对程序运行过程中内存的使用进行剖析，方便针对性地做内存优化，如valgrind；最后一部分就是“脚踏两条船”的，两个我都做，比如google-perftools、linux-perf这些，我们这个系列主要集中在“针对程序执行的性能进行剖析”方面。&lt;/p&gt;&#xA;&lt;h2 id=&#34;profiler的本质&#34;&gt;&#xA;  Profiler的本质&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#profiler%e7%9a%84%e6%9c%ac%e8%b4%a8&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;​&#x9;要自制Profiler，首先要知道Profiler的本质是什么。简单来说，Profiler的本质其实就是在程序执行的过程中对程序正在“做什么”进行搜集和统计，如何搜集呢？无非两种：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Instrumentaion - 程序主动Profiler告诉它在做什么；&lt;/li&gt;&#xA;&lt;li&gt;Sampling - Profiler自己间断性地去看程序在做什么；&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;前者的实现主要依靠程序运行时提供的某些钩子机制、代码插桩等方式，例如gprof主要是依靠 gcc 在编译程序的时候”夹带私货“来达到程序运行的时候主动提供给gprof采样样本，来达到事后分析的目的[1]。这种方式相对来说虽然比较可靠、准确，但是对于无法控制编译条件的程序就比较无可奈何了。&lt;/p&gt;&#xA;&lt;p&gt;后者的实现则主要是定期对程序当前执行的指令和对程序执行的函数堆栈进行回溯（unwind）来尽量还原程序执行的过程，例如google-perftools就是采用这种方式，这种情况下，采样的周期就显得尤为重要。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;对比以上两种方式，我们果断采用第二种。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;PS: 这里需要说明一下的是，利用ptrace系统调用完成工作的strace和ltrace，虽然不依赖编译器夹带私货，但是相当于依赖了内核的“钩子”，不属于sampling的范围；同样，latrace则是依赖了ld的LD_AUDIT“钩子”，也不属于sampling的范围。&lt;/p&gt;&#xA;&lt;h2 id=&#34;profiler启动&#34;&gt;&#xA;  Profiler启动&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#profiler%e5%90%af%e5%8a%a8&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;​&#x9;那么问题又来了，ptrace没得用，我们怎么去获取被剖析程序的执行状态呢？总不至于profiler要搞成root权限的吧？答案是：不，内核管天管地，总管不到程序自己偷看自己的数据吧？我们想办法把我们的代码塞到被剖析程序中去就可以了！&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;刚才提到了ld的LD_AUDIT，这次就轮到它的兄弟——大名鼎鼎的LD_PRELOAD——登场了。想法是这样的，我们的profiler其实只需要在程序开始的时候执行一个定时器，以后每次定时器执行的时候去抓取我们的样本就OK了，所以我们完全可以把自己伪装成一个人畜无害的动态库，等到别个程序有意无意加载到我们，哼哼……事实上，很多profiler都是采取类似的策略，比如google-perftools，再比如heaptrack等等。&lt;/p&gt;&#xA;&lt;h2 id=&#34;编码实战&#34;&gt;&#xA;  编码实战&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%bc%96%e7%a0%81%e5%ae%9e%e6%88%98&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;​&#x9;废话少说，放码过来！&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;我们在QtCreator中创建一个动态库项目 simple-profiler，主类 SimpleProfiler。首先，我们需要设置好我们的定时器：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SimpleProfiler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;enableProfile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ret&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;setitimer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ITIMER_PROF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m_tick&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;nullptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ret&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;fprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;failed to enable profiler: %s&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;strerror&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;errno&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;根据 &lt;code&gt;setitimer&lt;/code&gt; 的man文档，计时器主要有三种类型：&lt;/p&gt;</description>
			</item>
			<item>
				<title>初探Linux内核态——通过proc文件系统作快速问题定位</title>
				<link>https://www.hualet.org/posts/peeking-into-linux-kernel-land-using-proc-fs/</link>
				<pubDate>Tue, 23 Jan 2018 19:59:00 +0800</pubDate>
				<guid>https://www.hualet.org/posts/peeking-into-linux-kernel-land-using-proc-fs/</guid>
				<description>&lt;p&gt;文章翻译自 &lt;a href=&#34;https://blog.tanelpoder.com/2013/02/21/peeking-into-linux-kernel-land-using-proc-filesystem-for-quickndirty-troubleshooting/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Peeking into Linux kernel-land using /proc filesystem for quick’n’dirty troubleshooting&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;这篇博客的内容完全是关于现代Linux内核的。换句话说，指的是与RHEL6一样使用的2.6.3x系列内核，而不是古老的RHEL5所使用的2.6.18内核（都什么鬼了？！），虽然大部分企业都还在使用RHEL5。另外，这篇文章也不会涉及内核调试器或者SystemTap脚本之类的东西，完全是最最简单地在有用的proc文件系统节点上执行“cat /proc/PID/xyz”这样的命令。&lt;/p&gt;&#xA;&lt;h1 id=&#34;定位一个程序运行缓慢的问题&#34;&gt;&#xA;  定位一个程序“运行缓慢”的问题&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%ae%9a%e4%bd%8d%e4%b8%80%e4%b8%aa%e7%a8%8b%e5%ba%8f%e8%bf%90%e8%a1%8c%e7%bc%93%e6%85%a2%e7%9a%84%e9%97%ae%e9%a2%98&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;下面要举的这个例子是这样的：一个DBA反映说他们的find命令一直运行缓慢，半天都没有什么输出，他们想知道这是为什么。听到这个问题的时候我就大概有直觉造成这个问题的原因，但是他们还是想知道怎么系统地追踪这类问题，并找到解决方案。刚好出问题的现场还在……&lt;/p&gt;&#xA;&lt;p&gt;还好，系统是运行在OEL6上的，内核比较新，确切地说是2.6.39 UEK2。&lt;/p&gt;&#xA;&lt;p&gt;首先，让我们看看find进程是否还在：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;root@oel6 ~&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# ps -ef | grep find&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root     &lt;span class=&#34;m&#34;&gt;27288&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;27245&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; 11:57 pts/0    00:00:01 find . -type f&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root     &lt;span class=&#34;m&#34;&gt;27334&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;27315&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; 11:57 pts/1    00:00:00 grep find&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;跑的好好的，PID是27288（请记好这个将会伴随整篇博客的数字）。&lt;/p&gt;&#xA;&lt;p&gt;那么，我们就从最基础的开始分析它的瓶颈：如果它不是被什么操作卡住了（例如从cache中加载它所需要的内容），它应该是100%的CPU占用率；如果它的瓶颈在IO或者资源竞争，那么它应该是很低的CPU占用率，或者是%0。&lt;/p&gt;&#xA;&lt;p&gt;我们先看下top：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;root@oel6 ~&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# top -cbp 27288&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;top - 11:58:15 up &lt;span class=&#34;m&#34;&gt;7&lt;/span&gt; days,  3:38,  &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; users,  load average: 1.21, 0.65, 0.47&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Tasks:   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; total,   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; running,   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; sleeping,   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; stopped,   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; zombie&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Cpu&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:  0.1%us,  0.1%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Mem:   2026460k total,  1935780k used,    90680k free,    64416k buffers&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Swap:  4128764k total,   251004k used,  3877760k free,   662280k cached&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;27288&lt;/span&gt; root      &lt;span class=&#34;m&#34;&gt;20&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;  109m &lt;span class=&#34;m&#34;&gt;1160&lt;/span&gt;  &lt;span class=&#34;m&#34;&gt;844&lt;/span&gt; D  0.0  0.1   0:01.11 find . -type f&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果很清楚：这个进程的CPU占用率很低，几乎为零。但是CPU占用低也分情况：一种是进程完全卡住了，根本没有机会获得时间片；另一种是进程在不停进入等待的状态（例如poll动作就是时不时超时后，进程进入休眠状态）。虽然这剩下的细节top还不足以完全给我们展示，但是至少我们知道了这个进程没有在烧CPU时间。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hualet Wang</title>
				<link>https://www.hualet.org/about/</link>
				<pubDate>Thu, 14 Dec 2017 21:26:12 +0800</pubDate>
				<guid>https://www.hualet.org/about/</guid>
				<description>&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;职业&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;开发操作系统&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2013 年开始在 deepin 实习、转正，并随后到统信： &lt;a href=&#34;https://hualet.org/posts/10-years-anniversary/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;在deepin的过往&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;信念&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;以正和，以奇胜&lt;/li&gt;&#xA;&lt;li&gt;得道多助，失道寡助&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;原则&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;不要随着年龄的增长而变得油腻&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;喜好&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;喜欢的人&#xA;&lt;ul&gt;&#xA;&lt;li&gt;聪明、悟性高、有活力&lt;/li&gt;&#xA;&lt;li&gt;踏实、努力&lt;/li&gt;&#xA;&lt;li&gt;有追求&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;喜欢的企业家&#xA;&lt;ul&gt;&#xA;&lt;li&gt;乔布斯、张一鸣、王兴、刘强东&lt;/li&gt;&#xA;&lt;li&gt;段永平&lt;/li&gt;&#xA;&lt;li&gt;杰克·韦尔奇、杰夫·贝索斯&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;喜欢的黑客&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://geohot.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;George Hotz&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;技术栈&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;编程语言&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Python：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;熟悉/喜欢&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;C++：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;不熟悉/不喜欢，主要是写Qt&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;ELisp/Common Lisp：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;学习过，代码即数据的精髓也忘得差不多了&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;QML：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;曾经很熟悉，挺好用的&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;编程工具&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;git：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;熟悉，有肌肉记忆&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;tmux：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;熟悉，有肌肉记忆&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GDB：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;系统学过，使用偏基础，break/info/bt/frame之类的吧&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;perf/bpfcc/flamegraph：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://hualet.org/posts/perf-training-one/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;使用perf优化程序性能&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;ELF/loader:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://hualet.org/posts/poor-mans-profiler-part1/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;自制profiler系列&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Emacs/Vim：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;早期玩Emacs，还为此专门学习了ELisp/Common Lisp，做了很多配置，后来不怎么用了&lt;/li&gt;&#xA;&lt;li&gt;后来用Vim，基本上不做配置，主要是方便查看/快速编辑文件/代码&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;图形框架&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;X11/Wayland&lt;/li&gt;&#xA;&lt;li&gt;Linux Gfx 图形栈（的配置 ）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Linux系统构建&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;initramfs:  &lt;a href=&#34;https://hualet.org/posts/linux-system-bootup/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;系统启动流程&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;systemd:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;bootchart、analyze、cgls&lt;/li&gt;&#xA;&lt;li&gt;service 配置、slice 配置&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;人工智能&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;看书、看教程，简单实践，不深入&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;基础设施&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;docker/podman/docker-compose&lt;/li&gt;&#xA;&lt;li&gt;Jenkins&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;管理&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;以团队为本、目标/结果导向&lt;/li&gt;&#xA;&lt;li&gt;未完待续……&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;产品&lt;/p&gt;</description>
			</item>
			<item>
				<title>15.5研发心得</title>
				<link>https://www.hualet.org/posts/15.5-yan-fa-jing-yan/</link>
				<pubDate>Mon, 04 Dec 2017 21:26:48 +0800</pubDate>
				<guid>https://www.hualet.org/posts/15.5-yan-fa-jing-yan/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://upload-images.jianshu.io/upload_images/2171923-97bcf1239dfd26c3.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&#34; alt=&#34;经典15.5&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;迟到的经典&#34;&gt;&#xA;  迟到的经典&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%bf%9f%e5%88%b0%e7%9a%84%e7%bb%8f%e5%85%b8&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;2017年11月29日，农历十月十二，经过一番挣扎，deepin 15.5的ISO终于安静地躺在了内网服务器上，静待着属于它的时刻的到来。&lt;/p&gt;&#xA;&lt;p&gt;是的，deepin在重新定义了十月一日为农历十月初一以后，甚至连“保证月底发布”的底线也没有守住，妥妥地把发布时间拖到了十一月（阳历）中旬。即便如此，我也觉得这次“迟到”是值得的，在“手机不赚钱，交个朋友”的时代，PC操作系统的研发需要特别用心，才能留住那些对我们期待了那么久的用户朋友。我想，在未来可以预见的时间内，所有deepin的用户都会记住这个特殊的版本号：15.5。这个能让我们在视觉体验上有质的飞跃，在应用包格式上走在世界前面，自带修复工具箱——live修复系统，并且在稳定性和易用性上大幅提升的版本。&lt;/p&gt;&#xA;&lt;p&gt;deepin15.5注定成为经典。&lt;/p&gt;&#xA;&lt;h2 id=&#34;故事&#34;&gt;&#xA;  故事&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%95%85%e4%ba%8b&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;按照传统，一年中各大版本的主要功能都是预先定义好的，搭配一点重要的bug修复和用户体验改进，基本上就妥妥的了。但是15.5是个奇葩。在七八月份定义15.5详细需求的时候，我们梳理github上的issue，发现一条一岁半“高龄”的&lt;a href=&#34;https://github.com/linuxdeepin/developer-center/issues/50&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;主题&lt;/a&gt;，大意是“跪求高分屏支持”；同样早在16年初，公司成立了一个神秘的组织叫“Alpha Team”，这个小组的第一个任务就是“独立包格式”；在记忆都稍微有点模糊的14年，就有用户想要在deepin下创建热点……这几个严重拖延的任务让人汗颜，所以我们当时就任性地决定15.5主要来解决这些问题。虽说是决定，但是并没有人特别自信，“毕竟是拖了这么长时间都没有解决的问题”，再加上高分屏涉及面太广，深度全家桶都要“挨刀子”；独立包格式本身社区也不统一；WiFi热点挑硬件，Linux下的网卡驱动又不都是那么好……越想越恐怖。&lt;/p&gt;&#xA;&lt;p&gt;“要不再加点其他任务？”，我提议。&#xA;众人惊恐状。&#xA;“这样万一前面几个任务完成不了，做点其他任务应付一下老王嘛”。&lt;/p&gt;&#xA;&lt;p&gt;逆向思维有时候还是挺管用的。&lt;/p&gt;&#xA;&lt;p&gt;就这样，像是一锅羊肉火锅一样，15.5的配菜变成了主菜，也就是前面提到的三个点；又加入了新的配菜，VPN导入导出、应用代理、触摸板手势、色温调节、bug修复和其他一大波新应用等。&lt;/p&gt;&#xA;&lt;p&gt;当所有人都以为15.5就这样的时候，一个不识趣的朋友跟老王说我们系统的恢复模式进不了root，所以系统一旦出了问题就只能靠重装大法解决。我闻风一边心想绝对不可能，一边赶紧试了下，结果是果然不好用。 还没等我返回神儿来，老王已经在Tower上建好了“live系统支持”的任务。&lt;/p&gt;&#xA;&lt;h2 id=&#34;高分屏&#34;&gt;&#xA;  高分屏&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%ab%98%e5%88%86%e5%b1%8f&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://upload-images.jianshu.io/upload_images/2171923-bb87d95b04d43b9a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&#34; alt=&#34;高分屏&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;高分屏支持的话题由来已久，大概是在我刚进入deepin(14年）的时候就有人在“布局”：图片资源一定要用svg、尺寸不能写死等等，然而坚持了一段时间以后，大家发现这种坚持似乎毫无意义，因为没有人用高分屏，自然发现不了高分屏那种细腻到看不到“痘痘”的美，于是乎慢慢地各种png、死尺寸就满天飞了。&lt;/p&gt;&#xA;&lt;p&gt;俗话说“出来混总要还的”，因为以前的任性，在适配高分屏的过程中，deepin团队可谓吃尽了苦头。不仅几乎所有程序中用到的图片资源都要重新绘制（还好图标主题一直坚持svg），还差点在x2.png的道路上栽了个跟头，还好悬崖勒马，及时止损。&lt;/p&gt;&#xA;&lt;p&gt;普通应用适配高分屏在如今的环境下，Qt和GTK等界面库的高分屏支持已经比较成熟，还算是比较简单的。但是桌面环境和一些特殊应用，如启动器、截图、录屏等，就需要些功夫了，在适配的时候还要考虑缩放前后的窗口大小、窗口位置等等，恰巧这些地方Qt的处理又比较坑，有时候实在受不了了，只能patch Qt来处理。&lt;/p&gt;&#xA;&lt;p&gt;看图的适配也比较麻烦，很多地方都用到了缩略图。缩略图也要支持高分屏！听起来有点好笑，但事实是不仅是缩略图，很多情况下一条线、一个圆角的瑕疵，在高分屏下都可能被放大，变得非常恼人。&lt;/p&gt;&#xA;&lt;p&gt;15.5的细腻就是在这种情况下“磨”出来的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;flatpak&#34;&gt;&#xA;  Flatpak&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#flatpak&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://upload-images.jianshu.io/upload_images/2171923-3cf310020cfcbca2.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&#34; alt=&#34;Flatpak&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Flatpak其实原名叫“xdg-app”，可能后来觉得不够高端大气，配不上“The future of application distribution”的名头，遂改名Flatpak。&lt;/p&gt;&#xA;&lt;p&gt;按照官网的说法：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Flatpak is the next-generation technology for building and installing desktop applications.&#xA;It has the power to revolutionize the Linux desktop ecosystem.&lt;/p&gt;</description>
			</item>
			<item>
				<title>给小崔的基础管理课</title>
				<link>https://www.hualet.org/posts/gei-xiao-cui-de-ji-chu-guan-li-ke/</link>
				<pubDate>Sun, 05 Nov 2017 21:26:48 +0800</pubDate>
				<guid>https://www.hualet.org/posts/gei-xiao-cui-de-ji-chu-guan-li-ke/</guid>
				<description>&lt;p&gt;最近小崔的日子好像不太好过，负责一个项目的同事发了farewell letter，于是她被莫名其妙地选中来担任整个项目的负责人。&#xA;这突如其来的变动，打了小崔一个措手不及：因为给同事分配任务不顺利气哭、因为担心第二天的工作是否能很好完成而失眠……就跟我刚开始担任深度桌面组组长的时候一摸一样。看着实在心疼啊，于是趁着今天天气好出去晃悠的时候顺便跟她传授了一点小小的经验，这里顺便记录一下，希望对有需要的朋友有所帮助。&lt;/p&gt;&#xA;&lt;p&gt;在说初级管理的经验之前，我想强调一下“自信”，因为这是我觉得一个人能做成一件事情最基础的基础。如果连自信都做不到，那就不要妄谈管理了，你甚至连自己都做不好。小时候我妈一直说谦虚使人进步、骄傲使人落后，让我平时谦虚一点。我当时想不通，现在依然想不通，我甚至觉得自负要比自卑强得多，这是因为自信心实在是太难培养了。比如我虽然一直对自己的学习能力和技术比较（盲目）自信，但是我刚做管理的时候，其实也不自信能把所有人捏到一起、团结起来，但是因为心里面有执念觉得不能把做不到跟自己扯上关系，所以还是努力地去尝试，很清楚地记得有一次我当着所有人的面把自己的完整解决方案说出来那一刻，我的自信心才完全建立起来，之后的管理就相对容易了很多。说到小崔，我大概是不担心的，她只要把自己在镜子前臭美的状态转化一下，自信心应当是爆棚的 😄&lt;/p&gt;&#xA;&lt;p&gt;自信做好了，用来做什么呢？这就是管理的内容了，管理不再是扎头自己的事情，而是掌握大局，在掌握大局以后在处理非自己处理不可的事情。什么是掌控大局？我觉得分两个部分：承上和启下，承上就是了解清楚上级的需求和工作内容；启下就是把需要做的事情分配给自己的组员，让他们清楚自己工作的内容，这个部分其实是管理的核心，后面会提到我的秘诀！什么又是非自己处理不可的事情？这绝不是自己什么都不做，所有事情一股脑塞给下属同事，而是在了解清楚工作内容以后，把那些能提升团队工作效率的事情或者实在是只有自己才能做的事做了，自身做则才能做到服人。&lt;/p&gt;&#xA;&lt;p&gt;因为初级管理承上启下的特点，所以这种工作其实有时候特别难做。我从朋友那里学到了十个字，感觉对我的管理工作有着非常关键的指导作用：对上要有胆，对下要有心。仔细揣摩一下，其实不难发现这其实是在约束一个管理者的行为：面对上级领导的时候，不要老感觉自己是个小兵，要大胆跟对方进行沟通，因为你代表的不仅仅是你自己，还有自己的下属同事；面对下属同事的时候，不要感觉自己官大一级压死他们，其实你跟他们是与荣俱荣与损具损的共生体；这对初级管理尤其重要，因为初级管理更像是战场前线的班长，你连面对自己上级的胆量都没有，何谈面对敌人的炮火？你不把自己的班子成员当兄弟，谁会给你当炮灰？&lt;/p&gt;&#xA;&lt;p&gt;当然，就算你做好这些了，做得非常好了，也不一定能让团队里面所有的人都服你，你一样会遭受挫折、遇到不顺利；这里首先要想到的就是：“如果这件事情简单，哪还需要老子上？” 在这种心态/格局下，再去看待问题可能会更容易接受一些；做管理，容忍度一定是要有的，因为林子大了什么样的鸟都有，在一时半会改变不了别人的情况下，只能让自己学会接受现实，伺机而动。情绪控制也是要有的，下属情商不够，也不能让自己失控，有情绪很正常，不然变成一个冷血的混蛋，没有人会跟你真诚，这样的管理就像是古代的暴政，总会被推翻的。有情绪代表你是一个有血有肉的人，但是也不要让情绪化过多干扰自己的理智，最最基础的也是要做到不要让情绪影响到工作。&lt;/p&gt;&#xA;&lt;p&gt;这看起来很难，但是只要转换心态就可以让自己好过很多，比如你给对方分配任务，对方无理由拒绝或者态度恶劣，你可以想：“对方拒绝做或者做不好的事公司的事情，又不是自己的事情，犯不着跟对方闹情绪”。对，管理就是要这么灵活，该把公司的事当成自己的事的时候，拼死了干；该把不相干的事情甩出去的事情，就要爽快的甩出去。至少这个时候你无能为力了，这样安慰安慰自己，让自己平复情绪还是很有用的。不要怕沟通，尤其是跟刺头的沟通！那天做到了“今天就算是吵翻了天，明天还是要像一个没事人一样去跟对方相处”，基本上在这方面算是合格了。&lt;/p&gt;&#xA;&lt;p&gt;还有一部分没有跟小崔聊的，大概涉及到项目管理的事情，还比较重要，所以提一下。分出去的任务，要定期做检查，毕竟公司有管理是为了管人，但是最终的目的是把事情做好。分出去的任务，反馈回来的至少需要有完成的时间和安排，拿到安排后按照自己的经验核算一下是否合理，如果不合理就需要跟对方再进行沟通，合理的话还要提前检查，不检查的时间相当于没有定！其实项目管理的精髓就是这个：计划、检查和沟通，其他的方法论都是技巧性的表皮罢了。&lt;/p&gt;&#xA;&lt;p&gt;根据我这几年的工作和生活经验，说一下我的“困难观”。面对困难一般有两条路可选，第一是消极面对，相信这个事情总会能熬过去的，等熬过去了，又是春光明媚。这种一般在面对自己完全非自愿但又不得不去抗的事情时用来安慰自己，让自己不至于分裂、崩溃；另一个是积极面对，相信自己的聪明，找到问题的关键，搞定它，解决这个困难，你自己也会有所提升；这种情况我一般都把困难拆分成一个一个的难题（拆解问题的能力也很关键，因为暂时不需要，等以后再聊），像福尔摩斯一样运用自己的智慧去解开每个难题的答案，这样的面对困难重重的生活才不会觉得枯燥无味。&lt;/p&gt;&#xA;&lt;p&gt;最后，不管使用哪种方式处理现在项目上的问题，我觉得都是对自己的一种磨砺吧，希望小崔可以顺利度过难关 :3&lt;/p&gt;</description>
			</item>
			<item>
				<title>神奇的isatty</title>
				<link>https://www.hualet.org/posts/shen-qi-de-isatty/</link>
				<pubDate>Tue, 29 Aug 2017 21:26:48 +0800</pubDate>
				<guid>https://www.hualet.org/posts/shen-qi-de-isatty/</guid>
				<description>&lt;p&gt;前些日子才从apt-get命令系列换成更为时尚的apt系列，作为一个debian系发行版——deepin的开发者，我表示很汗颜……新的apt命令除了在功能上将apt-get、apt-cache等几个命令统一到了一个命令上外，更是有了不错的TUI，如文档所说：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;The `apt` command is meant to be pleasant for end users and does not need to be backward compatible like apt-get(8).&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;毕竟，还多了进度条呢…… 😂&lt;/p&gt;&#xA;&lt;p&gt;不过这不是今天要说的重点，换到apt以后，把apt操作的一些结果跟管道结合一起用，经常会收到警告，例如：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;(ssh) hualet@hualet-PC : ~&#xA;[0] % apt search deepin | grep -i superstar&#xA;&#xA;WARNING: apt does not have a stable CLI interface. Use with caution in scripts.&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;CLI的输出也算是API要保持stable么？汗颜again……dtk作为一个系统级的开发库都还没有到stable的状态、某in公司的CTO写得命令行工具，第二天接口就全变了😂……敬畏之余，困惑我的倒不是这个警告的内容，毕竟新的东西都不保证稳定么，但是apt是怎么知道它的输出被连到管道了呢？&lt;/p&gt;&#xA;&lt;p&gt;一直没空处理，直到昨天，又一次遇到了，遂记下，晚上思来想去没什么想法，遂请教前文提到的不靠谱CTO，丫直接甩过来一句：&lt;/p&gt;&#xA;&lt;p&gt;“istty检测output啊，很多命令行程序都会根据这个做不同的反应”&lt;/p&gt;&#xA;&lt;p&gt;我：“man istty没有结果啊“&lt;/p&gt;&#xA;&lt;p&gt;他：”你man page没装全吧？“&lt;/p&gt;&#xA;&lt;p&gt;我默默敲下sudo apt install manpages-dev，显示已经安装了……&lt;/p&gt;&#xA;&lt;p&gt;我：“装全了啊，我Google一下吧”&lt;/p&gt;&#xA;&lt;p&gt;他：“肯定没装全，应该是在libbsd或者termios里的吧……“ 信誓旦旦。&lt;/p&gt;&#xA;&lt;p&gt;我默默Google了一圈，发现那个函数其实叫isatty，在unistd.h里面定义&lt;/p&gt;&#xA;&lt;p&gt;我：“你是不是记错了，有isatty，unistd.h里面的……”&lt;/p&gt;&#xA;&lt;p&gt;他：“恩额”&lt;/p&gt;</description>
			</item>
			<item>
				<title>输入法消失之谜</title>
				<link>https://www.hualet.org/posts/shu-ru-fa-xiao-shi-zhi-mi/</link>
				<pubDate>Sat, 05 Aug 2017 21:26:48 +0800</pubDate>
				<guid>https://www.hualet.org/posts/shu-ru-fa-xiao-shi-zhi-mi/</guid>
				<description>&lt;p&gt;最近不少用户在deepin论坛上报告说搜狗输入法的图标不见了，收到反馈我就心想坏了，我的输入法图标很早前就消失不见了，之前发现这个问题但是没有去跟踪是因为没有看到其他同事出现类似情况，我的电脑平常为了调试用户反馈的bug又经常XJB装软件，觉得是个例。现在收到多人反馈，大概又是什么“更新事故”？&lt;/p&gt;&#xA;&lt;p&gt;带着沉重的心情，首先要确定的是这个问题影响的范围：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;15.4.1的ISO是不存在这个问题的；&lt;/li&gt;&#xA;&lt;li&gt;不用输入法的老外是没有受到影响的；&lt;/li&gt;&#xA;&lt;li&gt;只有少量论坛用户报告了这个问题，大部分人表示更新到最新也没有这个问题；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;还好影响范围还比较小，那么下一步就是找解决办法了：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;想办法绕过？对于这个问题来说好像不太好使；&lt;/li&gt;&#xA;&lt;li&gt;debug找到问题的根本原因；&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;（注：其实用户反馈是集中在这两周的时间甚至更短，如果是其他人的话可能会去排查最近更新了什么包，但是我刚好很早以前遇到了这个问题，受其干扰，所以走了一条冤枉路……）&lt;/p&gt;&#xA;&lt;p&gt;下面进入本文主题，怎么去debug？以前压根儿没有调过输入法的问题啊，遂去请教公司大神，大神表示：”我也不知道啊 （无奈脸 ”～ 那么我们只能瞎猜了：&lt;/p&gt;&#xA;&lt;p&gt;第一步：卸载掉搜狗，排除是否是搜狗输入法（问题多多，值得怀疑）导致的。&lt;/p&gt;&#xA;&lt;p&gt;结果显示卸载掉搜狗输入法以后，小企鹅的图标可以正常显示，看来果然是搜狗输入法导致的？&lt;/p&gt;&#xA;&lt;p&gt;第二步：下载官方搜狗搜狗输入法，重新安装，排除搜狗输入法版本的问题。&lt;/p&gt;&#xA;&lt;p&gt;重新安装后没卵用。但是突然想起来搜狗在家目录下的.config/sogou-qimpanel/skin 里面有皮肤缓存，据Google说是皮肤有可能导致输入法图标不见的问题……我们在做2D极速版适配的时候，玩了点黑魔法，替换了一些资源文件，可能是改坏了什么东西？&lt;/p&gt;&#xA;&lt;p&gt;第三步：删除皮肤缓存，排除修改皮肤的问题。&lt;/p&gt;&#xA;&lt;p&gt;没卵用…… 陷入僵局，但是发现如果将sogou-qimpanel这个进程杀掉，输入法的图标就会显示出来了……那么估计是这个进程负责读取sogou的皮肤文件然后更改输入法图标，中间可能出现了什么岔子？&lt;/p&gt;&#xA;&lt;p&gt;第四步：使用strace跟踪sogou-qimpanel，感觉胜利在望。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ killall sogou-qimpanel &amp;amp;&amp;amp; strace -e open sogou-qimpanel &#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;打印着打印着，吭哧，sogou-qimpanel尼玛居然退出了……什么鬼，再次尝试，还是退出了。看来是daemonize了？那么strace attach到子进程呢？貌似关键的信息已经丢了……陷入僵局……&lt;/p&gt;&#xA;&lt;p&gt;如何在系统级别追踪呢？？？&lt;/p&gt;&#xA;&lt;p&gt;第五步： 看来要祭出大杀器systemtap了，随手写（抄）了一个stp：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;probe syscall.open.return {&#xA;  printf(&amp;quot;%s %s&amp;quot;, filename, execname())&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;运行失败……&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;WARNING: never-assigned local variable &#39;filename&#39; (similar: name, __nr, retstr): identifier &#39;filename&#39; at sogou_qimpanel_open.stp:2:20&#xA; source:   printf(&amp;quot;%s, %s&amp;quot;, filename, execname())&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;请教公司另外一大神，大神表示“你装一下kernel的debug包就行了……” 结果，还是不行……坑……&lt;/p&gt;&#xA;&lt;p&gt;这时候考虑sysdig（翻了好长时间bearychat的聊天记录无果，又去请教公司另另外一个大神才找到这个工具），本来准备晚上再跟踪一下，这时候中间又闹了一个 xscreensaver 在deepin上使用无法解锁的问题，引出使用capabilities替换setuid设定的问题，进而引出如果检测二进制需要的capabilities的方法（跳得有点快，略过细节），进而发现bcc里面的opensnoop工具，而且这个工具集在deepin仓库里面有打包：bpfcc-tools。&lt;/p&gt;</description>
			</item>
			<item>
				<title>2016年终总结</title>
				<link>https://www.hualet.org/posts/2016-summary/</link>
				<pubDate>Mon, 02 Jan 2017 21:26:48 +0800</pubDate>
				<guid>https://www.hualet.org/posts/2016-summary/</guid>
				<description>&lt;p&gt;自从开始上班，每年年终总结都少不了，因为都是给老板看的，内容无非是今年我做了什么事情、多牛逼、对公司贡献多大云云，万一老板看到一件他不记得但是你写下来的工作贡献一高兴，说不定给你升职加薪，一年也就不算白干了。但是，写给自己的年终总结哪能这么应付，梳理整理自己一年的得失，做好权衡，最重要的是吸取经验做来年的规划。&lt;/p&gt;&#xA;&lt;h1 id=&#34;2016关键词累读书和成长&#34;&gt;&#xA;  2016关键词：累、读书和成长&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2016%e5%85%b3%e9%94%ae%e8%af%8d%e7%b4%af%e8%af%bb%e4%b9%a6%e5%92%8c%e6%88%90%e9%95%bf&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;2016年是挺累的一年，不知道是不是整个前半年和2015年的后半年都在加班的缘故还是什么，即便是后半年没怎么加班的时候，也没感觉怎么轻松。其间必然有些成绩，但也带来了很多严重的问题，例如我长期状态不佳、思维不清楚等，总是感觉有点得不偿失。最后的两个来月，我都在认真思考这些现象产生的原因，总结下来问题可能出在两个地方：&lt;/p&gt;&#xA;&lt;p&gt;一、工作方式不佳，最主要的问题是贪多和多任务并行；&lt;/p&gt;&#xA;&lt;p&gt;从年初接下来整个社区版的发布和维护工作以后，整个人进入了一种所有事情都想帮着处理的状态，写代码、管理、调试问题、支持售前、支持工程、社区反馈等等，一天到晚地干，似乎没有什么尽头；以至后面养成了多任务并行的坏习惯，做什么事情都集中不了精神，长此以往，不要说提高工作效率了，整个人都快废了。&lt;/p&gt;&#xA;&lt;p&gt;二、生活方式不佳，最主要的问题是不够自律；&lt;/p&gt;&#xA;&lt;p&gt;深度一天的工作时间如果不算加班其实到不了8小时，但是这个不到8个小时中我几乎有7.5个小时都在写代码（大部分工作日，有些需要讨论产品需求、开会等略去），中间几乎没有任何break，这几乎回到了14年中的工作生活状态——我几乎丧失了良好的口头交流的能力；这样的一天下来，晚上能干嘛呢？吃饭、游戏和睡觉呗……但是，问题是有些时候还要加班，加班完了回到住的地方连玩儿会儿电脑都不能就睡觉也太“亏”了吧？于是控制不住自己的玩儿过了睡觉时间，长期睡眠不够，这也直接导致了我思维变得特别慢。&lt;/p&gt;&#xA;&lt;p&gt;确定了问题根源，肯定要治病根儿啊，针对工作方式的问题，我开始强制自己使用番茄钟，并尽量将自己的任务分摊开来；针对生活方式的问题，除了尝试早睡早起外，我也开始尝试跟别人闲聊（主要在微信上），让自己的大脑变得活跃；顺便逼迫自己抽出时间来读书，读书这件事情既能涨知识，还能磨练耐性、让自己的注意力集中起来。&lt;/p&gt;&#xA;&lt;p&gt;说起读书，16年后半年读的一本非常火的书《软技能——代码之外的生存技能》，它之所以火，我想主要是因为它似乎给程序员打开了一扇门，这些平常只会钻研技术、敲代码的人突然发现，卧槽原来这不是生活啊！一直觉得程序员们是一群很神奇的物种，他们自认为是世界的主宰，但是真相是他们简直是生活不能自理……同时，这群脑子很聪明的人，比其他人更容易接受改变和思想上的冲击。至少这本书让我开始反思自己对待生活的态度、对待薪资的态度、对待投资理财以及社交的态度；书与其说始给程序员写的，到不如说始给所有人写的人生规划课程：学习新技能、找到新工作、营销自己、自由职业、理财和投资等等，我觉得工作的人都应该看一下。&lt;/p&gt;&#xA;&lt;p&gt;另一本值得一提的书《梁启超教子家书》，这本书我觉得我要么评0分，要么评100分，它好是好在书里面梁启超的家书原文，至于作者整理的一些结论，个人觉得没什么可以吸收的东西。从那么多的家书中，除了可以窥探一番我比较神往的民国生活，从中理解出来的梁启超让我对这个历史人物有了翻天覆地般的认知改变。梁的爱子、博学、社交和投资，这跟前面的《软技能——代码之外的生存技能》这本书似乎遥相呼应，就是在告诉我，你需要改变了！&lt;/p&gt;&#xA;&lt;p&gt;当作故事读的书例如《红顶商人胡雪岩》和《老残游记》等，其实给我的启发也是蛮大的，胡雪岩的冷静、睿智和大方，老残的淡泊、生活观和使命感（包括作者刘鹗的经历），都让我在生活中处理一些事情的时候有了些个参考；带着功力目的去读的《旅行与读书》、《逻辑思维——成大事者不纠结》等，也能按照预期给我涨涨见识；不期而遇的《解忧杂货铺》，读起来酣畅淋漓，故事也够精彩；2016年（后半年），在微信读书上花费时间116个小时，完整读完的有8本书，还有些零散着读一些丢一些的，这一年也算是个好的收场了。&lt;/p&gt;&#xA;&lt;p&gt;说起成长，首当其冲的就是经历了一次分手和复合，其中酸甜苦辣，旁人绝不能理解，对我也是一次比较大的考验，让我对待生活、对待另一半有了跟之前完全不一样的转变，我很庆幸这些事的发生在25岁，而不是更晚；2016年我也开始感受到了生活的压力、结婚买房的压力，这些压力促使我去做一些改变，去践行我在书中、在生活中学到的一些生活方式，去担负起责任；这一年通过工作，我更加了解自己的成熟范围和做事风格，我愈加能够掌握做事的分寸。&lt;/p&gt;&#xA;&lt;p&gt;2016，这是非常精彩的一年。&lt;/p&gt;&#xA;&lt;h1 id=&#34;2017目标关键词高效读书旅行&#34;&gt;&#xA;  2017目标关键词：高效、读书、旅行&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#2017%e7%9b%ae%e6%a0%87%e5%85%b3%e9%94%ae%e8%af%8d%e9%ab%98%e6%95%88%e8%af%bb%e4%b9%a6%e6%97%85%e8%a1%8c&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;高效分两个，一个是专注于一两件关键的事情，做好；一个是调整自己的工作状态；读书不消说，这是个会上瘾的东西，好书推荐好书，好书推荐好人，好人又推荐好书，无穷尽也；旅行业分两块儿说，一是出去走走，二是组织一些线下聚会；做到这些2017年也将是非常精彩的一年！&lt;/p&gt;&#xA;&lt;p&gt;另外，2017年准备把份子钱都收回来，哈哈哈！&lt;/p&gt;</description>
			</item>
			<item>
				<title>12月10日回洛阳记</title>
				<link>https://www.hualet.org/posts/hui-luo-yang-ji/</link>
				<pubDate>Wed, 14 Dec 2016 21:26:48 +0800</pubDate>
				<guid>https://www.hualet.org/posts/hui-luo-yang-ji/</guid>
				<description>&lt;p&gt;2016年12月10日，我们宿舍老五结婚的答谢宴，刚好又在我们大学所在的城市洛阳举行，哥们儿几个商量着都回去一趟，互相见见自己几位久未蒙面的兄弟，到场的有深圳来的老大、洛阳本地的老三、新乡来的老四、东道主老五、上海来的老六、北京来的老七和武汉来的我。能够成行着实不易，简单记录一下，留作纪念。&lt;/p&gt;&#xA;&lt;p&gt;9号晚上从武汉出发，卧铺10号早上到的洛阳。下车发了一个朋友圈：&#xA;“毕业后就没有来过的城市&#xA;洛阳，你有点冷啊😢”&#xA;相比江城武汉，洛阳显得要冷得多，去的时候觉得“绝对没问题”的羽绒服已经显得不太够用了。火车站旁边的公交车站，虽然大早上已经开始忙碌起来，但还是那么井然有序；又冷又困，我给五哥打了个电话，问清楚酒店地点，上了熟悉而又陌生的68路。&lt;/p&gt;&#xA;&lt;p&gt;时间过得总是飞快，上面一幕幕清晰的画面，在现在我码字的时刻，已经是两三天前的场景。这次回洛阳，除了兄弟们一块儿给老五庆祝了婚礼，一块儿吃吃喝喝，还顺带逛了我们的新、老校区，觥筹交错的瞬间，总是感觉回忆满满：&lt;/p&gt;&#xA;&lt;p&gt;想起了新生报道，先来的瓜分五个下铺；想起了新生拍照，霸气的女生周培一怒之下甩了照相老师一脸；想起了第一次在大学过自己的生日，整个宿舍一块儿出去吃饭，喝了四年最多的一次啤酒（12箱？）；想起了用别人的mp4，每天窝在宿舍，一年看了比前18年看得电影总数还多的电影；想起了因为被班长逼着去参加脑残活动，甩了班长一脸；想起了跟宿舍人一块儿打篮球，80后vs90后，打中锋，单手抓篮球；想起了09年大雪，排长队走雪中的一条小径去食堂吃饭，重庆来的老八因为没见过下大雪，翘课出去看雪；想起了唯一一次看世界杯，跟着球迷舍友在4号教学楼一块儿嘶吼；想起了第一次参加文艺晚会比赛，唱王力宏的《龙的传人》；想起了用老九的手机，看电视直播《武林风》；想起了从老大哪里看到的《藏地密码》，他没有看，反而一口气被我看完；想起了一个夏天晚上跟着看了《午夜凶铃》，一个星期没有睡好觉；想起了那个夏天睡宿舍楼顶，早上的大太阳晒的皮肤瘙痒……&lt;/p&gt;&#xA;&lt;p&gt;想起了联盟公寓，我买了不到一周的自行车丢了；想起了联盟食堂的面条；想起了洛阳公交车，能随时为了老弱病残停车；想起了人生中第一次去电影院看电影《加勒比海盗4》，也是我看的第一部3D电影；想起了小崔来洛阳找我，跟做梦一样；想起了跟舍友一块儿去做兼职，促销九阳豆浆机，一连站了七天；想起了有虫子的宿舍，宿舍的人不得不三番两次把床板拿到下面用热水烫；想起了我独自上自习，陪过看了所有计算机专业课本的自习室；想起了同样的自习室，小崔因为放了个响屁，非要让我去领她；想起了差点挂掉的机械设计和机械原理，那课压根儿没人愿意上；想起了偶然发现的一个评四大名著的选修课，晚上冒雨也要去听；想起了龙潭峡、天池山，那些洛阳周边的风景区和无忧无虑的大二时光；想起了大家一起看《那些年我们一起追的女孩》，一起听《让青春继续》……&lt;/p&gt;&#xA;&lt;p&gt;那天晚上一直玩儿到2点，在KTV唱歌从流行歌曲一直唱到《猴哥》、《葫芦娃》……回酒店又聊天到四点，好像恨不得以后的话就在那天晚上能说完；但是该来的还是回来，老七要去郑州买房子、老大要赶飞机，天下没有不散的筵席，喝碗牛肉汤，各自上路。&lt;/p&gt;</description>
			</item>
			<item>
				<title>楼兰餐厅</title>
				<link>https://www.hualet.org/posts/lou-lan-can-ting/</link>
				<pubDate>Mon, 05 Dec 2016 21:26:48 +0800</pubDate>
				<guid>https://www.hualet.org/posts/lou-lan-can-ting/</guid>
				<description>&lt;p&gt;这个星期有点浪过头了，周六出去打了羽毛球，周日又出去觅食，文章呢？代码呢？sigh……不过周日的觅食还颇为成功，倒是可以叙叙，补补文章的缺。&lt;/p&gt;&#xA;&lt;p&gt;楼兰餐厅，一个以新疆地域美食为主题的餐厅，是一个大口吃肉大口吃馕的地方，第一次听说还是上周偶然看到表姐的朋友圈，配图中的烤羊排看着烤得焦黄，卖相相当好，仅这一点便深深地吸引了我，遂决定这周即使浪过头也要去尝一尝。中午十二点到世界城五楼，果然要排长队等候，越加坚定了我这个餐厅不错的信念。&lt;/p&gt;&#xA;&lt;p&gt;半小时后，终于可以进店享用美食，我俩食量不大，所以只点了四份菜（好像也不完全叫菜，不好称呼），&#xA;因为是第一次来，所以菜都是根据感觉来点的，但是我感觉确实刚好凑出了一个比较好的搭配：&#xA;&lt;img src=&#34;https://www.hualet.org/img/2016/12/IMG_1871-225x300.jpg&#34; alt=&#34;img_1871&#34; width=&#34;225&#34; height=&#34;300&#34; class=&#34;aligncenter size-medium wp-image-31&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;第一个上来的是酸奶哈密瓜：&#xA;&lt;img src=&#34;https://www.hualet.org/img/2016/12/IMG_1865-225x300.jpg&#34; alt=&#34;img_1865&#34; width=&#34;225&#34; height=&#34;300&#34; class=&#34;aligncenter size-medium wp-image-32&#34; /&gt;&#xA;可能是因为用餐环境比较热或者其他的缘故，酸爽的酸奶搭配香甜的哈密瓜，让人的味觉神经突然就活跃起来，人也精神多了；喝了两口小崔急忙制止：“烤羊排肥，吃了肉再喝酸奶，就不会觉得腻”。果然美食家呀，我心悦诚服，放下勺子。&lt;/p&gt;&#xA;&lt;p&gt;很快，便等到今天的主角大漠烤羊排：&#xA;&lt;img src=&#34;https://www.hualet.org/img/2016/12/IMG_1867-225x300.jpg&#34; alt=&#34;img_1867&#34; width=&#34;225&#34; height=&#34;300&#34; class=&#34;aligncenter size-medium wp-image-33&#34; /&gt;&#xA;名字听了只让人联想到楼兰古国覆灭后的一片大漠，自古多少英雄战死的地方，想着略悲情，只能吃口烤羊排排解。话说这羊排真不错，外焦里嫩，不管是配酱汁还是佐料，都能让人食欲大开（跟着小崔吃了不少韩国烤肉，完全是两种风格）。吃了两块，大呼过瘾但是也略觉肥腻，这时候吃两口酸奶……写得我现在口水直流……&lt;/p&gt;&#xA;&lt;p&gt;楼兰肉囊和牛肉汤揪面差不多是同时上的：&#xA;&lt;img src=&#34;https://www.hualet.org/img/2016/12/IMG_1868-225x300.jpg&#34; alt=&#34;img_1868&#34; width=&#34;225&#34; height=&#34;300&#34; class=&#34;aligncenter size-medium wp-image-34&#34; /&gt;&lt;/p&gt;&#xA;&lt;img src=&#34;https://www.hualet.org/img/2016/12/IMG_1869-225x300.jpg&#34; alt=&#34;img_1869&#34; width=&#34;225&#34; height=&#34;300&#34; class=&#34;aligncenter size-medium wp-image-35&#34; /&gt;&#xA;可能是本能上觉得饼和汤搭配吧，就像羊肉泡馍的汤和饼搭配一样，我们点这两样的时候相当默契。事实证明，小崔非常具有美食家的风范，饼是牛肉馅的，配有洋葱，虽然一点都不腻，但是搭配酸爽的牛肉汤，有更上一层楼的美感，肉馕和汤在嘴里相遇的那一刻，真有一种一辈子就这样罢的感觉。实话说，汤的配图有点失败，其实里面有面片一样的面和牛肉片，配有各种蔬菜丁，如果单卖的话我估计可以喝两碗 。&#xA;&lt;p&gt;中间小崔也是乐的不得了，原来除了韩国烤肉，还有这么好吃的东西叻，我就顺势盗了她的一张“全餐图”：&#xA;&lt;img src=&#34;https://www.hualet.org/img/2016/12/IMG_1875-300x300.jpg&#34; alt=&#34;img_1875&#34; width=&#34;300&#34; height=&#34;300&#34; class=&#34;aligncenter size-medium wp-image-36&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;食毕，买单走人！&lt;/p&gt;</description>
			</item>
			<item>
				<title>Things about kernel updates on deepin</title>
				<link>https://www.hualet.org/posts/things-about-kernel-updates-on-deepin/</link>
				<pubDate>Sun, 30 Oct 2016 21:26:48 +0800</pubDate>
				<guid>https://www.hualet.org/posts/things-about-kernel-updates-on-deepin/</guid>
				<description>&lt;p&gt;There were discussions about kernel updates on both deepin forum and deepin telegram group. Users are curious about why security updates are always being lag on deepin, and why there&amp;rsquo;s no newer version kernel for so long. I explained it in telegram group, here I&amp;rsquo;ll do it again in case someone&amp;rsquo;s interested:&lt;/p&gt;&#xA;&lt;p&gt;As we all know, deepin&amp;rsquo;s maintaining kernel by ourselves now, based on version 4.4 LTS, our kernel gets patches by our kernel team, from Debian and also from Ubuntu (Yes, we do!). Basically it guarantees the kernel can work well on most deepin users&amp;rsquo; machines. After going through all these basics here&amp;rsquo;re my explanations about why there&amp;rsquo;re no newer versions:&lt;/p&gt;</description>
			</item>
			<item>
				<title>工作效率杀手-多任务并行</title>
				<link>https://www.hualet.org/posts/gongzuoxiaolvshashou-duogongzuobingxing/</link>
				<pubDate>Thu, 27 Oct 2016 21:26:48 +0800</pubDate>
				<guid>https://www.hualet.org/posts/gongzuoxiaolvshashou-duogongzuobingxing/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;//upload-images.jianshu.io/upload_images/2171923-bc7f016c5a537e58.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&#34; alt=&#34;高效能人士&#34;&gt;&#xA;日常工作中，我们经常会遇到手头有多项工作，而deadline在即的情况，这时候我们不得不变成三头六臂，多项工作同时进行：先找A商定一下协作前各自需要先完成的工作，再找B确定一下xxx，当要C工作进展到一半的时候，突然发现D工作更紧急一点，正要切换到D工作上，一个同事慢慢向你走过来，“忘记昨天我们说好今天开会的么”……&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;//upload-images.jianshu.io/upload_images/2171923-f8b65f425b43578e.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&#34; alt=&#34;心塞&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;还好，如果最后你能撑过这段时间，你可能会赢得“高效能人士”的称号，你可能会被公司领导当众表扬，你也可能从此走上人生巅峰……但是请相信我，这些都是假象，当你在这种假象中高兴过几次以后，你突然发现自己效率急剧降低，精力集中不起来，脑子越来越不好使，浑浑噩噩，最后一发不可收拾。&lt;/p&gt;&#xA;&lt;p&gt;为什么多任务并行最后会导致这么严重的后果呢？我认真思考了一下，感觉主要问题还是我们普通人的精力有限，压根儿承受不了两个以上任务同时进行。计算机专业有一个术语叫做“系统颠簸”，它通俗来讲是这样子的：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;就是当系统内存不够，而又有多个程序同时运行的时候，不活跃的程序会被放置到内存之外，当它再次变成活跃程序的时候，再将它换回到内存中，将另外的程序换出，当系统持续处于这种情况时，整个系统处于机器不稳定、不流畅的状态，就叫系统颠簸；&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;而我们人类也有系统颠簸的情况，就像上面我说的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;//upload-images.jianshu.io/upload_images/2171923-e5965fd0077a14b0.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&#34; alt=&#34;精神崩溃&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;自从我从一名普通的程序员变成管项目的程序员之后，多任务并行在我身上上演了无数次：同时担任项目经理、技术主管、程序员、四分之一个产品经理和十分之一个客服这几个角色；最开始还忙得乐此不疲，但是中国的一句老话说得好，“出来混迟早要还的”……一年多下来，我从一个精神饱满的小青年，眼睁睁就变成了现在目光呆滞、思维缓慢、精力极度不集中的小青年，饱受痛苦。&lt;/p&gt;&#xA;&lt;p&gt;所以，我也一直在思考着如果才能从根本上杜绝这种多任务并行（被同事打扰也算）的发生，但是也请不要理解错误，并不是什么所有的任务都不能同时进行，比如《这样工作最高效》里面就介绍说，检查邮件和开会、编译代码和阅读文章 这样的例子是适合多任务并行的，只要不会让同事感到尴尬就行。那么如何很好地保护自己的工作效率不要被多任务并行给“杀”掉呢？&lt;/p&gt;&#xA;&lt;p&gt;我想到的大概有两种方式：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;把时间分成小段&#xA;这种方式比较类似于番茄工作法，比如我们把一天的工作定为10个番茄中，每个番茄钟半小时，这半个小时中我们集中精力在一件事情上面，专注于这件工作直至它完成，每两个番茄钟之前有15分钟的休息时间，这段时间可以用来休息，也可以用来解决同事临时过来需要处理的紧急事情。这样一天下来，我们只要保证每个番茄钟内是非常高效的，这一天就能保证是高效。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;把时间分成大段&#xA;这种方式更简单，直接把上午定义为“杂碎期”，下午定义为“专注期”，“杂碎期”用于处理各种计划安排、闲聊、和同事沟通、开会等；“专注期”则专注于自己需要独立完成的工作，这段时间内不要受到任务打扰，保证工作的高效。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;总而言之，要让我们的大脑保持专注，而不是在不同的任务间切来切去；跟同事沟通好自己的时间安排，避免过多被打扰；做一个高效率的人。&lt;/p&gt;&#xA;&lt;p&gt;差点忘了说，我目前正在践行第二种方式，目前感觉良好，希望也能帮到跟我有同样问题的人。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
