<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>知识碰撞</title>
  
  <subtitle>Knowledge Collision</subtitle>
  <link href="https://blog.zzhpro.com/atom.xml" rel="self"/>
  
  <link href="https://blog.zzhpro.com/"/>
  <updated>2026-04-24T16:17:28.788Z</updated>
  <id>https://blog.zzhpro.com/</id>
  
  <author>
    <name>Zhihao Zhang</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>小 Z 的绘图指南</title>
    <link href="https://blog.zzhpro.com/2024/03/16/%E5%B0%8F-Z-%E7%9A%84%E7%BB%98%E5%9B%BE%E6%8C%87%E5%8D%97/"/>
    <id>https://blog.zzhpro.com/2024/03/16/%E5%B0%8F-Z-%E7%9A%84%E7%BB%98%E5%9B%BE%E6%8C%87%E5%8D%97/</id>
    <published>2024-03-16T08:58:41.000Z</published>
    <updated>2026-04-24T16:17:28.788Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在这篇文章中，小 Z 将向大家分享一下自己掌握的一些绘图技巧。</p></blockquote><p><img src="https://pic.imgdb.cn/item/65f4604b9f345e8d03079579.png" alt="绘图软件，Excalidraw 绘制"></p><h2 id="1-需求分析">1. 需求分析</h2><p>小 Z 对画图的最主要的诉求是能够进行版本控制，这也是多年工作后养成的一个坏习惯吧😭，想要快速看看以前画的图是怎么样的，也能够随时回退到以前的某个版本。这个版本控制的需求让小 Z 开始走上了代码绘图的不归路。但是有时候光有代码绘图还是有非常大的局限性，这个时候还是会选择以拖拽的方式进行绘图，使用的我们所熟知的、免费开源 <a href="https://www.diagrams.net/" title="drawio">drawio</a> 、<a href="https://excalidraw.com/" title="Excalidraw">Excalidraw</a>绘图软件。小 Z 也会采用 git 的管理方式来管理 draw io、Excalidraw 所绘制的图，下面就开始讲述一下绘图的环境搭建吧。</p><h2 id="2-绘图环境搭建">2. 绘图环境搭建</h2><p>小 Z 的绘图环境是在 <a href="https://code.visualstudio.com/" title="Visual Studio Code">Visual Studio Code</a> 编辑器进行的，安装了以下这些扩展以支持不同类型的绘图。<br>使用 PlantUML 和 Mermaid 进行代码绘图，drawio 和 Excalidraw 来进行拖拽式绘图。</p><ul><li><a href="https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml" title="PlantUML 插件">PlantUML</a>：支持 <a href="https://plantuml.com/zh/" title="plantuml 语法">plantuml 语法</a>绘图</li><li><a href="https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid" title="Markdown Preview Mermaid Support 插件">Markdown Preview Mermaid Support</a>：最近几年 <a href="https://mermaid.js.org/config/Tutorials.html" title="Mermaid">Mermaid</a> 新增了多种新的图形种类，新种类值得使用。该插件支持的种类与官网编辑器支持的种类一致.</li><li><a href="https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio" title="Draw.io 插件">Draw.io</a>：能够在 VS Code 中使用 draw io，且文件本身为图片格式（导出其他格式还是需要桌面软件支持）</li><li><a href="https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor" title="Excalidraw 插件">Excalidraw</a>：白板，同样使用图片格式存储。手绘模式比起 Apple 自带的无边记还是差点，手绘模式更适合 iPad + Apple Pencil 一起使用。</li><li><a href="https://marketplace.visualstudio.com/items?itemName=marp-team.marp-vscode" title="Marp 插件">Marp</a>：Markdown Slide</li></ul><blockquote><p>plantuml 有些类型的图还需要安装 <a href="http://www.graphviz.org/" title="graphviz">graphviz</a>，下面也简单介绍一下，小 Z 使用 <a href="https://brew.sh/" title="brew">brew</a> 的安装方式。</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 没安装过 brew 的请执行</span></span><br><span class="line">/bin/bash -c <span class="string">&quot;<span class="subst">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 graphviz</span></span><br><span class="line">brew install graphviz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 小 Z 在安装 graphviz 的过程中多次遇到问题，采用一个个安装依赖的方式才安装成功。遇到问题的朋友可以选择一个个安装相关依赖。</span></span><br></pre></td></tr></table></figure><h2 id="3-开始绘图">3. 开始绘图</h2><h3 id="3-1-甘特图">3.1 甘特图</h3><p>下面这张甘特图就是采用 PlantUML 语法绘制的，是小 Z 安排的学习计划。</p><p><img src="https://pic.imgdb.cn/item/65f462099f345e8d0315b84b.png" alt="PlantUML 绘图甘特图"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">@startuml</span><br><span class="line">saturday are closed</span><br><span class="line">sunday are closed</span><br><span class="line"></span><br><span class="line">Project starts 2024-01-01</span><br><span class="line">-- 绘图 --</span><br><span class="line">[搭建绘图环境] as [env] starts 2024-01-01 and ends 2024-01-02</span><br><span class="line">[plantuml 语法学习] as [study] starts 2024-01-02 and lasts 1 week</span><br><span class="line">[尝试plantuml 绘图] starts 2024-01-08 and lasts 2 weeks</span><br><span class="line"></span><br><span class="line">[env] is colored in Lavender/LightBlue</span><br><span class="line">[study] is colored in salmon</span><br><span class="line">[env] -&gt; [study]</span><br><span class="line"></span><br><span class="line">@enduml</span><br></pre></td></tr></table></figure><h3 id="3-2-象限图">3.2 象限图</h3><blockquote><p>象限图采用 Mermaid 绘制，Mermaid 目前有一些比较独特的图片类型，值得在有需要的时候进行使用。</p></blockquote><p><img src="https://pic.imgdb.cn/item/65f462c99f345e8d031c4b6b.png" alt="四象限工作安排"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">%%&#123;init: &#123;&quot;themeVariables&quot;: &#123;&quot;quadrant1Fill&quot;: &quot;#ff0000&quot;&#125; &#125;&#125;%%</span><br><span class="line">quadrantChart</span><br><span class="line">    title 四象限工作安排</span><br><span class="line">    x-axis &quot;不紧急&quot; --&gt; &quot;紧急&quot;</span><br><span class="line">    y-axis &quot;不重要&quot; --&gt; &quot;重要&quot;</span><br><span class="line">    quadrant-1 &quot;紧急&amp;重要&quot;</span><br><span class="line">    quadrant-2 &quot;不紧急&amp;重要&quot;</span><br><span class="line">    quadrant-3 &quot;不紧急&amp;不重要&quot;</span><br><span class="line">    quadrant-4 &quot;紧急&amp;不重要&quot;</span><br><span class="line">    &quot;紧急&amp;重要的事&quot;: [0.75, 0.75]</span><br><span class="line">    &quot;紧急&amp;不重要的事&quot;: [0.75, 0.25]</span><br><span class="line">    &quot;不紧急&amp;不重要的事&quot;: [0.25, 0.25]</span><br><span class="line">    &quot;紧急&amp;不重要的事&quot;: [0.25, 0.75]</span><br></pre></td></tr></table></figure><h3 id="3-3-时间线">3.3 时间线</h3><blockquote><p>时间线图同样采用 Mermaid 绘制而成。</p></blockquote><p><img src="https://pic.imgdb.cn/item/65f462e69f345e8d031d2097.png" alt="2023 国外 LLM 大事件"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">timeline</span><br><span class="line">    title 2023 国外 LLM 大事件</span><br><span class="line">    2 月 : Bing Chat : Google Bard</span><br><span class="line">    3 月 : OpenAI GPT-4 : Meta LLaMA</span><br><span class="line">    7 月 : Meta LLaMA 2</span><br><span class="line">    9 月 : OpenAI DALL·E 3</span><br><span class="line">    11 月 : OpenAI GPT-4 Turbo, GPTs</span><br><span class="line">    12 月 : Google Gemini</span><br></pre></td></tr></table></figure><hr><p>其他的绘图类型，就由各位自己去探索了😄</p><h2 id="4-在线-离线使用">4 在线&amp;离线使用</h2><ul><li><a href="https://app.diagrams.net/" title="drawio 线上版">drawio 线上版</a></li><li><a href="https://mermaid.live/" title="Mermaid 线上版">Mermaid 线上版</a></li><li><a href="https://excalidraw.com/" title="Excalidraw 线上版">Excalidraw 线上版</a></li><li><a href="https://github.com/jgraph/drawio-desktop/releases" title="drawio 桌面软件下载">drawio 桌面软件下载</a></li></ul><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><div style="text-align: center;"><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></div>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在这篇文章中，小 Z 将向大家分享一下自己掌握的一些绘图技巧。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.imgdb.cn/item/65f4604b9f345e8d03079579.png&quot; alt=&quot;</summary>
      
    
    
    
    <category term="绘图" scheme="https://blog.zzhpro.com/categories/%E7%BB%98%E5%9B%BE/"/>
    
    
    <category term="绘图" scheme="https://blog.zzhpro.com/tags/%E7%BB%98%E5%9B%BE/"/>
    
  </entry>
  
  <entry>
    <title>小 Z 的 iPad Pro 使用指南</title>
    <link href="https://blog.zzhpro.com/2021/01/24/ipad/"/>
    <id>https://blog.zzhpro.com/2021/01/24/ipad/</id>
    <published>2021-01-24T15:49:12.000Z</published>
    <updated>2026-04-24T16:17:28.388Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>小 Z 的 iPad Pro 已经购买了有将近半年的时间了，大家是否非常好奇是否是买前生产力，买后爱奇艺呢？😄，小 Z 除了把平板当成一个观感极佳的影音设备外，主要将其应用到了读书和阅读方面。下面小 Z 就来讲讲如何发挥 iPad Pro 的生产力潜力。</p></blockquote><h2 id="应用程序">应用程序</h2><h3 id="Microsoft-Edge">Microsoft Edge</h3><blockquote><p>在 iPad 上，浏览器没有电脑上那么重要，可以直接使用自带的 Safari 浏览器，也可以使用第三方的浏览器，比如 Microsoft Edge 和 Alook 浏览器。</p></blockquote><p>有了浏览器，几乎就覆盖到了很多使用电脑的场景，小 Z 使用笔记本电脑的时候，大多也是在网上浏览各大网站的内容。</p><p>设置其为默认的浏览器，替代自带的 Safari</p><p><img src="/2021/01/24/ipad/111E852B-D778-4247-ABBE-4F0699A4C65D.jpeg" alt="默认浏览器设置"></p><h2 id="图书阅读">图书阅读</h2><blockquote><p>首先使用 Microsfot Edge 下载相应的电子书，然后将其导入到自带的图书应用程序中去。下次就可以使用图书应用进行阅读了。</p></blockquote><p>图书的阅读进度是可以在不同的苹果设备上面同步的</p><h2 id="截图">截图</h2><p>在使用 Apple Pencil 的过程中，可以使用笔从 iPad 的左下角往斜上角滑动，就可以截图了，然后再对截图进行相应的图片处理</p><h2 id="微信公众号">微信公众号</h2><blockquote><p>在 iPad 使用微信就可以阅读公众号文章了，不需要通过其他方式了。<br><s>关于微信公众号的阅读，小 Z使用的是轻芒杂志进行订阅和阅读，而不是使用微信应用进行阅读。轻芒杂志免费版最多可以订阅 30 个公众号，目前对于小 Z 来说已经足够了。同时轻芒杂志是跨平台的，看不完的内容，小 Z 可以继续在手机上继续阅读。</s></p></blockquote><h2 id="手写笔记">手写笔记</h2><p>手写笔记应用目前在用的是 Notability，但是还不怎么会用这个软件。苹果自带的备忘录也可以实现简单的手写功能。至于另一个畅销的软件 GoodNotes 5，<s>小 Z 并没有购买</s>，最后还是购买了。<br>但是目前两者全部都从买断制变成了订阅制，都可以疯狂收割了。</p><h2 id="其他">其他</h2><blockquote><p>比较奇怪的地方在于 iPadOS 里面没有计算器和天气应用</p></blockquote><p>在 iPadOS 14 中默认有天气的小组件，可以显示天气信息。</p><p><img src="/2021/01/24/ipad/926286B1-89F8-42EA-9D17-A84ABCA88319.jpeg" alt="天气小组件"></p><p>通过在屏幕下拉，可以弹出 spotlight 搜索，可以输入相应的计算公式得到计算结果。</p><p><img src="/2021/01/24/ipad/5D0B41DD-200C-415C-A368-3B7798C3C401.jpeg" alt="如何快速计算"></p><p>当然，也可以使用其他第三方的计算应用，比如手写的 calculator。</p><h2 id="配件">配件</h2><h3 id="Apple-Pencil">Apple Pencil</h3><blockquote><p>要说什么是买了 iPad Pro 后必须购买，小 Z 想毫不犹豫是苹果自家的 Apple Pencil。</p></blockquote><p><img src="/2021/01/24/ipad/Untitled%201.png" alt="Apple Pencil"></p><h2 id="保护壳">保护壳</h2><p>官网的保护壳和键盘套装价格太不友好了，可以去电商平台选择自己喜欢的保护壳。</p><h3 id="外接键盘">外接键盘</h3><blockquote><p>首选是使用蓝牙键盘，因为蓝牙键盘是不需要使用任何接口的。考虑到一些蓝牙键盘高昂的价格，次选可以使用有线键盘，只不过你需要一根 type c 转 usb 的转接线。成本来看，两者其实相差不大，从易用性来说，蓝牙键盘还是最好的选择。小 Z 的这篇文章就是使用下图的这样方式编写的。</p></blockquote><p><img src="/2021/01/24/ipad/Untitled%202.png" alt="外接有线键盘"></p><hr><p>目前已经入手雷柏的蓝牙无线键盘，摆脱了有线的束缚。键盘快捷键正在陆续梳理中，比较遗憾的是目前移动端的浏览器都还不能安装插件，不然就可以使用 vim 快捷键全权控制浏览器了。</p><p><img src="/2021/01/24/ipad/img_2579.jpg" alt="外接蓝牙无线键盘"></p><h4 id="键盘技巧">键盘技巧</h4><blockquote><p>在应用中，长按 Command 键会显示当前应用的快捷健。</p></blockquote><table><thead><tr><th>快捷键</th><th>功能</th></tr></thead><tbody><tr><td>Command + H</td><td>回到桌面</td></tr><tr><td>Command + Tab</td><td>切换应用</td></tr></tbody></table><h3 id="鼠标">鼠标</h3><blockquote><p>至于鼠标，目前来看，是不怎么需要的，可以使用键盘快捷键操控，实现不行可以用手或者笔进行移动和操作。</p></blockquote><h3 id="转接线">转接线</h3><blockquote><p>比起几年前的转接线，最近的转接线价格还是下探了不少的。</p></blockquote><p>目前小米官网在售的这款 89 元转接线，比小 Z  2017 年初购买的将近 200 元的绿联转接线价格友好了不少。利用 HDMI 接口可以扩展 iPad Pro；USB 接口则用来连接有线键盘或者鼠标。</p><p><img src="/2021/01/24/ipad/Untitled%203.png" alt="小米转接线"></p><p>为了兼容老式的 VGA 屏幕，小 Z 购买的是如下所示带 VGA 接口的转接线。各位可以根据自己的需求进行选择，也许你根本就不需要这样一条转接线，为此还能节省一笔开销。</p><p><img src="/2021/01/24/ipad/3E1A7627-D22A-4F8D-B24C-24A4FE257467.jpeg" alt="绿联转接线"></p><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;小 Z 的 iPad Pro 已经购买了有将近半年的时间了，大家是否非常好奇是否是买前生产力，买后爱奇艺呢？😄，小 Z 除了把平板当成一个观感极佳的影音设备外，主要将其应用到了读书和阅读方面。下面小 Z 就来讲讲如何发挥 iPad Pro 的生产</summary>
      
    
    
    
    <category term="iPad" scheme="https://blog.zzhpro.com/categories/iPad/"/>
    
    
    <category term="iPad" scheme="https://blog.zzhpro.com/tags/iPad/"/>
    
  </entry>
  
  <entry>
    <title>小 Z 的 MacBook Pro 系统之旅</title>
    <link href="https://blog.zzhpro.com/2020/12/29/macOS/"/>
    <id>https://blog.zzhpro.com/2020/12/29/macOS/</id>
    <published>2020-12-29T22:50:04.000Z</published>
    <updated>2026-04-24T16:17:28.648Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Sequoia">Sequoia</h2><p>目前还没有体验预览版，比较期待 iPhone 在电脑上的镜像(*❦ω❦)。<br>Apple Intelligence 估计在国内落地会比较受限😭。</p><h2 id="Sonoma">Sonoma</h2><p>小 Z 的 2016 年 MacBook Pro 只能升级到 Monterey 系统，Sonoma 是使用 2019 年的 16 寸 MackBook Pro 体验的。<br>慢镜屏幕保护程序确实很经验，可以静静地欣赏美景；用备忘录可以查阅 PDF 文件。其他的感知功能并不是很强烈。</p><h2 id="Ventura">Ventura</h2><p>这个系统被小 Z 给跳过了😄。主要是台前调度功能并不是很适合笔记本使用。</p><h2 id="Monterey">Monterey</h2><p>最新体验了 Monterey 系统，后续会持续更新使用体验。</p><p>Monterey 是 2021 年的最新系统，在去年 Big Sur 版本上进行了改进，引入了<em>通用控制</em>（目前还无法使用）、图片识别文字、控制面板、专注模式和捷径等特性。首次在电脑中引入低电量模式还是对老电脑比较友好的，毕竟现在老电脑在新系统上的续航会大不如前。</p><p>值得注意到是新版本很多新功能都是仅针对 M1 芯片的，对 Intel 电脑开始越来越不友好了😭。</p><hr><blockquote><p>不知不觉，我的笔记本电脑已经陪我走过了 5 个不同苹果系统了。下面主要介绍一下小 Z 的 2016 款 MacBook Pro 13 寸安装体验过的系统。</p></blockquote><h2 id="Big-Sur">Big Sur</h2><p>Big Sur 是 2020 年的系统，设计风格开始与移动端的应用对齐。整体界面还是比较好看的。个人感觉比较适合苹果处理器的机器，毕竟连默认壁纸都和 iOS 14 和 iPadOS 14 的默认壁纸保持了一致，而不再使用优美的风景图片了。</p><p>在使用的过程中，发现唯一的痛点可能就是电池的电量越来越不耐用了，感觉只能支持 4 个小时左右了。除了电池不太给力外，其他体验我觉得也还好，软件的适配也挺快的。</p><h2 id="Catalina">Catalina</h2><p>Catalina 是 2019 年的系统，从这个版本开始，变成只支持 64 位的应用程序，不再支持 32 位的应用程序了😭。本人也在这次升级过程中发现了原先安装的一些应用不能再使用了。这些老应用的开发者已经不再维护了，从此也就告别了一些虽然老旧但是很好用的一些应用程序了。</p><p>让我升级该系统的原因是该版本支持将 iPad 作为扩展屏幕，但是遗憾的是只支持可以使用 Apple Pencil 的 iPad，以前的 iPad，比如经典的 iPad Air 2 是不行的，直到我入手了最新的 iPad Pro 2020 才可以正常使用 sidecar 这个功能。</p><h2 id="Mojave">Mojave</h2><p>Mojave 是 2018 年推出的系统，也是第一次支持暗色模式的系统。本人在这台电脑没出问题之前是狂热的暗色主题爱好者，几乎所有应用程序都是使用的暗色模式，为此也忍受了暗色模式下糟糕的微信公众号阅读体验。但是目前，我已经全面转换回来了，除了编程相关的暗色模式，其他都回归白色模式了。</p><h2 id="High-Sierra">High Sierra</h2><p>High Sierra 是 2017 年推出的系统，由于这个版本吸引我的地方几乎没有，所以并没有升级到该版本。主要变化是更改文件存储格式，号称可以更加节省硬盘空间，对只有 128 GB 内存的电脑比较友好。</p><h2 id="Sierra">Sierra</h2><p>Sierra 是 2016 款电脑出产自带的系统的。也是本人使用时间最长，电池续航时间最给力的系统。如果说要降级版本的话，我会选择降级到该版本或者 Mojave。只是主流的软件没有抛弃该版本的话，我觉得还是非常适合日常使用的。毕竟一个系统非常稳定，也是非常吸引人的优点。</p><h2 id="降级指南">降级指南</h2><blockquote><p>为了防止新版本有什么问题，或者想回退到特定的制定版本，可以从官网下载旧的系统重新安装，然后通过时光机器恢复原来电脑上的文件。😯记得重装前先用时光机器备份文件哦。</p></blockquote><ul><li><a href="https://support.apple.com/zh-cn/HT211683">如何下载旧系统</a></li></ul><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;Sequoia&quot;&gt;Sequoia&lt;/h2&gt;
&lt;p&gt;目前还没有体验预览版，比较期待 iPhone 在电脑上的镜像(*❦ω❦)。&lt;br&gt;
Apple Intelligence 估计在国内落地会比较受限😭。&lt;/p&gt;
&lt;h2 id=&quot;Sonoma&quot;&gt;Sonoma&lt;/h2</summary>
      
    
    
    
    <category term="macOS" scheme="https://blog.zzhpro.com/categories/macOS/"/>
    
    
    <category term="macOS" scheme="https://blog.zzhpro.com/tags/macOS/"/>
    
  </entry>
  
  <entry>
    <title>2020 笔记详谈</title>
    <link href="https://blog.zzhpro.com/2020/11/12/note-2020/"/>
    <id>https://blog.zzhpro.com/2020/11/12/note-2020/</id>
    <published>2020-11-12T20:08:53.000Z</published>
    <updated>2026-04-24T16:17:28.756Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>我在 2018 年<a href="https://blog.zzhpro.com/2018/07/29/note-skills">知识管理</a>这篇文章中介绍了当时的笔记服务体验情况。时隔两年后，笔记服务也发生了一些变化。下面就来谈谈这些变化与未来趋势。</p></blockquote><h2 id="为知笔记">为知笔记</h2><blockquote><p>熟悉我的人都知道，我是一直在使用为知笔记的，我从 2012 年开始一直使用到现在，算起来也有 8 年之久了。</p></blockquote><h3 id="WizNote-Lite-编辑器">WizNote Lite 编辑器</h3><p>为知笔记一直被我诟病的是 markdown 的书写体验不是很好，这也限制了我想在为知笔记上记录复杂笔记的想法。但是最近旗下新推出的 <a href="https://www.wiz.cn/zh-cn/wiznote-lite" title="WizNote Lite">WizNote Lite</a> 编辑器大大提升了 markdown 的编辑体验。快捷键的补充以及对图像和多种图形的绘画使其的用户体验开始接近桌面端的 typroa 编辑器了。</p><blockquote><p>WizNote Lite 的使用指南可以参考我的另一篇文章：<a href="https://blog.zzhpro.com/2020/10/18/wiznote-lite/">为知笔记 Lite 使用指南</a>。</p></blockquote><p><img src="/2020/11/12/note-2020/image-20201112140447118.png" alt="WizNote Lite 编辑器"></p><p>目前 WizNote Lite 已经支持跨平台了，正如其母应用为知笔记一样，这是一个非常好的传承。</p><p><img src="/2020/11/12/note-2020/image-20201112141055952.png" alt="WizNote Lite 平台支持"></p><h3 id="大纲模式">大纲模式</h3><p>为知笔记近些年另一个比较大的改变是<strong>支持大纲模式以及大纲转思维导图的功能</strong>。这样在你的手机或者电脑上就不需要额外的大纲类软件了。使用下来这个功能还是比较好用的。</p><blockquote><p>比较奇怪的是旧版本的 WizNote Lite 是支持大纲思维导图的，新版本就不支持了🤔。</p></blockquote><p><img src="/2020/11/12/note-2020/image-20201112142502188.png" alt="大纲模式"></p><p><img src="/2020/11/12/note-2020/image-20201112142549398.png" alt="大纲思维导图"></p><h2 id="飞书云文档">飞书云文档</h2><blockquote><p>飞书是字节跳动在 2019 年底左右发布的协同办公软件，云文档只是其中的一个功能。它更多的是替代我们日常使用的 Word，作为内部文档的分享。</p></blockquote><p>飞书云文档目前只支持导出为 Word 和 PDF 两种格式，暂时还不支持 Markdown 格式，这可能是让 Markdown 爱好者最不能接受的一点了。</p><p>飞书和为知笔记一样一开始就支持跨平台了，目前还缺少对 Linux 平台的支持。另外一点比较可惜的是在电脑客户端访问文档内容时，是会跳转到浏览器进行访问的，体验会有割裂感。</p><p><img src="/2020/11/12/note-2020/image-20201112143326498.png" alt="飞书支持平台"></p><p>飞书云文档的功能还是比较丰富的，不仅支持普通 Markdown 支持的类型，而且还支持额外的一些文件类型。但其本质还是为了团队间的协同编辑和交流，比较适合团队的使用。</p><p><img src="/2020/11/12/note-2020/image-20201112144444637.png" alt="飞书云文档介绍"></p><p><img src="/2020/11/12/note-2020/image-20201112144308905.png" alt="飞书云文档支持类型"></p><h2 id="语雀">语雀</h2><blockquote><p>语雀是阿里旗下的文档管理软件，我从内测阶段就开始使用了。这几年变化也非常大，包括从以前的纯网页端访问到现在的客户端支持以及添加了非常多的内容类型。</p></blockquote><p>虽然目前语雀有了客户端的支持，比较可惜的是手机端目前只有微信的小程序，还没有手机的原生应用。</p><p><img src="/2020/11/12/note-2020/image-20201112145204162.png" alt="语雀支持平台"></p><p>与飞书云文档类似，语雀也是一款用于协作的文档软件，比较适合团队使用。目前语雀在插入的类型上还是遥遥领先的，支持类型非常丰富。</p><p><img src="/2020/11/12/note-2020/image-20201112150918096.png" alt="语雀支持类型"></p><p><img src="/2020/11/12/note-2020/image-20201112151433829.png" alt="飞书（左） VS 语雀（右）引入类型比较"></p><p>从上图中可以看出，能够嵌入的类型主要包括以下几个类别</p><ul><li>视频</li><li>设计图</li><li>地图</li><li>其他</li></ul><h2 id="Notion">Notion</h2><blockquote><p>Notion 刚出来的时候是一款颠覆式的笔记软件，后续的笔记服务也从 Notion 中借鉴了很多。</p></blockquote><p>Notion 最大的变化是有了免费的使用计划了，不再是使用受限了。但是其在国内的速度还是堪忧的，尤其是在上传图片的时候，跟国内的其他笔记服务相比确实差距较多，另外一点就是登陆的方式不是很友好，每次都需要去邮箱拷贝一串字符才能够登录😭。</p><p>Notion 目前比起飞书云文档和语雀还是在插入类型的种类上多很多，这也是其首发的一个优势，但是面对国内笔记服务的这些优势在不断地减小。</p><h2 id="Obsidian">Obsidian</h2><p>最近发现了一款与 typora 十分相似的本地笔记应用，其拥有非常丰富的插件，可以做到与 typora 相似的用户体验的同时，支持一些其他的额外功能。<br>由于 Obsidian 的社区插件经常访问不了，这里放一下其他的下载地址： <a href="https://gitee.com/whghcyx/obsidian-plugin/blob/master/%E6%8F%92%E4%BB%B6.md">Obsidian 插件</a>。将下载的插件解压后拖放到笔记库文件夹 <code>.obsidian</code> 文件目录下的 <code>plugins</code> 目录，重启应用即可。</p><h2 id="总结">总结</h2><p>介绍了这么多笔记软件这两年的变化，我最后来总结一下未来的趋势。</p><ol><li>笔记服务整合第三方服务会不断加速，以达到更好的笔记体验</li><li>协同编辑的需求长期存在，使用体验也会不断进步</li></ol><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;我在 2018 年&lt;a href=&quot;https://blog.zzhpro.com/2018/07/29/note-skills&quot;&gt;知识管理&lt;/a&gt;这篇文章中介绍了当时的笔记服务体验情况。时隔两年后，笔记服务也发生了一些变化。下面就来谈谈这些变化与</summary>
      
    
    
    
    <category term="note" scheme="https://blog.zzhpro.com/categories/note/"/>
    
    
    <category term="note" scheme="https://blog.zzhpro.com/tags/note/"/>
    
  </entry>
  
  <entry>
    <title>小 Z 的 MacBook Pro 奇妙之旅</title>
    <link href="https://blog.zzhpro.com/2020/11/10/macbook-pro-issues/"/>
    <id>https://blog.zzhpro.com/2020/11/10/macbook-pro-issues/</id>
    <published>2020-11-10T15:17:08.000Z</published>
    <updated>2026-04-24T16:17:28.752Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>小 Z 在 2017年初第一次入手了苹果笔记本电脑， 那是一款在 2016 年底发布的带 Touch Bar 的 MacBook Pro 13 寸笔记本电脑。小 Z 也是从这个时候开始渐渐融入苹果的整个生态圈，又称苹果三件套（目前套件数量越来越多，已经远远不止三件了😭）。</p></blockquote><p>2020 年是一个多灾多难而且还很神奇的年份。马上就要到年底了，小 Z 的 MacBook 也快使用将近四年了。在这几年里，MacBook Pro 作为家里使用的主力机并没有发生特别大的问题。但是在十一以后，小 Z 的 MacBook Pro 开启了一段奇妙之旅（维修之旅😭）。</p><h2 id="屏幕舞台光">屏幕舞台光</h2><p>在十一假期中，小 Z 刚打开电脑，顿时一股寒意涌入心头。怎么小 Z 的屏幕底部有如此多的黑影区域，此时小 Z 的脑海里充斥着数不清的问号。当然该尝试的步骤都会一一实践，但是重启和升级系统并不能解决这个问题。</p><p>下图是屏幕舞台光的显示效果，在白色背景下尤为明显，已经影响正常的日常使用了。并且根据网友的描述，这种现象还会随着时间推移而不断加重升级，直到完全黑屏。</p><p><img src="/2020/11/10/macbook-pro-issues/image-20201107193131089.png" alt="屏幕舞台光"></p><p>那么遇到了以上这种情况，该怎么办呢？别慌，前人还是给小 Z 门留下了好多有价值的信息的。小 Z 们要做的就是提取有用的信息并付出实践。</p><ol><li>网上搜索一下这个问题是不是已经有解决方案了</li><li>去苹果官网查看一下是否有相应的<a href="https://support.apple.com/zh-cn/mac/macbook-pro">服务计划</a>。万一苹果公司已经意识到这个问题了，那就可以直接交给他们直接修复了。</li></ol><p>巧的是，这次屏幕舞台光的问题是苹果方面的设计问题，官网已经有相应的<a href="https://support.apple.com/zh-cn/13-inch-macbook-pro-display-backlight-service">屏幕背光服务计划</a>。小 Z 也是第一时间通过这个链接预约了上海的天才吧进行维修。由于是官方的服务计划，所以并不需要自己掏钱，这次的维修相当于为小 Z 省下了一块屏幕的钱，将近 3500 大洋。</p><p><strong>这次的体验也告诉小 Z ，碰到故障，先去官网和网上看看，实在不行可以预约到天才吧瞧瞧。毕竟苹果的售后服务在小 Z 体验过后还是很不错的。</strong></p><h2 id="电池不带小-Z-玩了">电池不带小 Z 玩了</h2><p>可惜好景不长，当小 Z 还沉浸在换了屏幕的快乐中时，小 Z 的电池开始不带小 Z 玩了。</p><p>在小 Z 换完屏幕不到一个月的时间，小 Z 的 MacBook 在前一个晚上还正常工作的前提下，第二天它的电量突然就变成了 1%（从满电到没电的质变😭）。相似的一幕再次上演，小 Z 一脸的懵逼。</p><p>小 Z 将网上提到的方案都试了个遍，<a href="https://support.apple.com/zh-cn/HT201295">重置 SCM</a> 来恢复电池的统计。但是非常可惜，所有的方案都没有起作用。看来小 Z 的电池已经到了不得不替换的地步了。</p><p>经过上次的维修体验，小 Z 在官网看到了小 Z 的笔记本电脑还有一个<a href="https://support.apple.com/zh-cn/keyboard-service-program-for-mac-notebooks">键盘服务计划</a>。根据网友的经验，苹果针对有问题的键盘是会更换整个 C 面，即键盘、触控板和电池。这样有问题的电池也会被一并替换掉，顺带解决小 Z 的电池问题。</p><p>由于小 Z 以前遇到过官网描述的键盘问题，小 Z 就去苹果天才吧去检测这个问题了。幸运的是小 Z 的键盘确实存在问题，会为小 Z 换掉有问题的键盘。至此，小 Z 的电脑像重生了一般，虽然小 Z 的外壳和主板还是旧的，但还是感觉像拥有了一台新电脑一样。</p><blockquote><p>关于这次的电池故障的根源，大概率是使用习惯不当。小 Z 一般是插电使用的，偶尔会直接使用。没有刻意去注意完全的充放电。但是小 Z 也不是十分肯定一直插着电使用就是对电池不好的。</p></blockquote><h2 id="总结">总结</h2><p>电脑出了问题，还是第一时间预约天才吧，让专业的人士评估一下故障问题。有一点是需要注意的，在非苹果授权和零售店拆解过的电脑是不被苹果接受的，他们会拒绝维修的。所以自行拆解需谨慎哦。</p><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;小 Z 在 2017年初第一次入手了苹果笔记本电脑， 那是一款在 2016 年底发布的带 Touch Bar 的 MacBook Pro 13 寸笔记本电脑。小 Z 也是从这个时候开始渐渐融入苹果的整个生态圈，又称苹果三件套（目前套件数量越来越多，</summary>
      
    
    
    
    <category term="life" scheme="https://blog.zzhpro.com/categories/life/"/>
    
    
    <category term="life" scheme="https://blog.zzhpro.com/tags/life/"/>
    
  </entry>
  
  <entry>
    <title>为知笔记 Lite 使用指南</title>
    <link href="https://blog.zzhpro.com/2020/10/18/wiznote-lite/"/>
    <id>https://blog.zzhpro.com/2020/10/18/wiznote-lite/</id>
    <published>2020-10-18T15:39:44.000Z</published>
    <updated>2026-04-24T16:17:28.788Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>这篇文章主要介绍一下最新的为知笔记 Lite 编辑器的使用指南。由于官方并没有详细的使用说明，本人在尝试后总结了一些使用经验。</p></blockquote><h2 id="标题">标题</h2><p>目前一共有 5 级标题，点击相应的标题可以进行标题级别的更改，同时也可以转化为普通段落或者引用。</p><p><img src="/2020/10/18/wiznote-lite/0157b201-be4f-4a11-8686-4e82c254c23c.png" alt="标题"></p><h2 id="使用-或者-快速插入">使用 + 或者 / 快速插入</h2><blockquote><p>输入 + 或者 / 可以快速插入相应的板块，包括链接，代办事项，表格，图片已经代码块。</p></blockquote><p><img src="/2020/10/18/wiznote-lite/d8ae9d25-9f45-407c-9f72-dd5967280558.png" alt="快速插入"></p><h2 id="代码块">代码块</h2><blockquote><p>代码的使用方式跟 Markdown 的语法是一模一样的，只需要选择合适的语言进行展示即可。</p></blockquote><p><code>hello world</code></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="mermaid"><a href="https://mermaid-js.github.io/mermaid/#/" title="mermaid">mermaid</a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">graph TD;</span><br><span class="line">A--&gt;B;</span><br><span class="line">A--&gt;C;</span><br><span class="line">B--&gt;D;</span><br><span class="line">C--&gt;D;</span><br></pre></td></tr></table></figure><p><img src="/2020/10/18/wiznote-lite/7f284a97-3565-438f-9012-37a4f5dbc930.png" alt="mermaid 图"></p><h2 id="公式">公式</h2><blockquote><p>使用公式以 <code>$$</code> 开始和结尾，中间就是常见的 Latex 的公式语法了。</p><p>其中单 <code>$</code> 是行间公式，而双 <code>$$</code> 为公式块表示。</p></blockquote><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">{x=y}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>x</mi><mn>2</mn></msup><mo>=</mo><mi>y</mi><mo>∗</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">{x^2=y * z}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0585em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span></span></span></p><h2 id="思维导图">思维导图</h2><blockquote><p>其实思维导图，其实就是为知笔记里面的大纲模式。</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">- spring</span><br><span class="line">    - spring ioc</span><br><span class="line">        - bean factory</span><br><span class="line">        - application context</span><br><span class="line">            - file system xml</span><br><span class="line">            - class path xml</span><br><span class="line">            - web xml</span><br><span class="line">    - bean life cycle</span><br><span class="line">        - initialize</span><br><span class="line">            - initializing bean</span><br><span class="line">        - destroy</span><br><span class="line">            - disposal bean</span><br></pre></td></tr></table></figure><p><img src="/2020/10/18/wiznote-lite/687fc5a6-f1b8-4c64-890c-23c4e98000e9.png" alt="思维导图"></p><h2 id="快捷键">快捷键</h2><h3 id="标题-2">标题</h3><p><code>command + option + [12345]</code>可以控制标题级别</p><h3 id="加粗">加粗</h3><p><code>command + B</code> 可以用来<strong>加粗</strong></p><h3 id="斜体">斜体</h3><p><code>command + I</code> 可以<em>倾斜字体</em></p><h3 id="有序列表">有序列表</h3><p><code>command + O</code> 可以编写有序的列表</p><ol><li>第一个</li><li>第二个</li></ol><h3 id="无序列表">无序列表</h3><p><code>command + L</code>可以编写无序的列表</p><ul><li>一个</li><li>两个</li></ul><h3 id="表格">表格</h3><p><code>command + M</code> 可以用来生成表格</p><table><thead><tr><th>col1</th><th>col2</th><th>col3</th></tr></thead><tbody><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table><h3 id="代码块-2">代码块</h3><p><code>command + U</code> 可以用来生成代码块</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;hello world&quot;</span></span><br></pre></td></tr></table></figure><h3 id="行间代码块">行间代码块</h3><p><code>command + G</code> 可以生成行间代码 <code>hello world</code></p><h3 id="代办事务">代办事务</h3><p><code>command + J</code> 可以生成代办事项</p><ul><li>[X] 探索为知笔记 Lite 的快捷键</li><li>[ ] 使用说明</li></ul><h2 id="最新快捷键">最新快捷键</h2><h3 id="引用">引用</h3><blockquote><p>可以使用 <code>option + command + Q</code> 来生成引用模块</p></blockquote><h3 id="不变的快捷键">不变的快捷键</h3><blockquote><p>标题、加粗、斜体的快捷键都没有改变</p></blockquote><h3 id="突然失效的快捷键">突然失效的快捷键</h3><ul><li>无序列表</li></ul><h3 id="有序列表-2">有序列表</h3><ol><li>使用 <code>option + command + O</code> 生成有序列表</li></ol><h3 id="表格-2">表格</h3><p>使用 <code>shift + command + T</code></p><table><thead><tr><th>c1</th><th>c2</th><th>c3</th></tr></thead></table><h3 id="行间代码块-2">行间代码块</h3><p>使用 <code>command + ~</code> 可以生成行间代码</p><p><code>hello world</code></p><h3 id="代码块-3">代码块</h3><p>使用 <code>option + command + C</code> 可以生成代码块</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="代办事项">代办事项</h3><p><code>option + command + X</code> 可以用来生成代办事项</p><ul><li>[x] 完善最新的快捷键说明</li></ul><h3 id="链接">链接</h3><p>使用 <code>command + L</code> 可以生成链接</p><p><a href="http://www.baidu.com">百度</a></p><h3 id="图像">图像</h3><p>使用 <code>shift + command + I</code> 可以插入图片</p><h3 id="公式-2">公式</h3><p>使用 <code>option + command + M</code> 生成公式</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><msup><mi>y</mi><mn>2</mn></msup><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x^2 + y^2 = z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0585em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span></span></p><h2 id="新版功能">新版功能</h2><h3 id="HTML-显示">HTML 显示</h3><div><b>hello world<b></div><h3 id="flowchart"><a href="https://github.com/adrai/flowchart.js">flowchart</a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">st=&gt;start: Start:&gt;http://www.google.com[blank]</span><br><span class="line">e=&gt;end:&gt;http://www.google.com</span><br><span class="line">op1=&gt;operation: My Operation</span><br><span class="line">sub1=&gt;subroutine: My Subroutine</span><br><span class="line">cond=&gt;condition: Yes</span><br><span class="line">or No?:&gt;http://www.google.com</span><br><span class="line">io=&gt;inputoutput: catch something...</span><br><span class="line">para=&gt;parallel: parallel tasks</span><br><span class="line"></span><br><span class="line">st-&gt;op1-&gt;cond</span><br><span class="line">cond(yes)-&gt;io-&gt;e</span><br><span class="line">cond(no)-&gt;para</span><br><span class="line">para(path1, bottom)-&gt;sub1(right)-&gt;op1</span><br><span class="line">para(path2, top)-&gt;op1</span><br></pre></td></tr></table></figure><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;这篇文章主要介绍一下最新的为知笔记 Lite 编辑器的使用指南。由于官方并没有详细的使用说明，本人在尝试后总结了一些使用经验。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;标题&quot;&gt;标题&lt;/h2&gt;
&lt;p&gt;目前一共有 5 级标题，点击相应的标题</summary>
      
    
    
    
    <category term="note" scheme="https://blog.zzhpro.com/categories/note/"/>
    
    
    <category term="note" scheme="https://blog.zzhpro.com/tags/note/"/>
    
  </entry>
  
  <entry>
    <title>完美 macOS，体验 💯</title>
    <link href="https://blog.zzhpro.com/2020/09/30/mac/"/>
    <id>https://blog.zzhpro.com/2020/09/30/mac/</id>
    <published>2020-09-30T22:07:34.000Z</published>
    <updated>2026-04-24T16:17:28.604Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>当你拥有一台崭新的 mac 电脑时，内心应该是十分激动的。怎样让你❤️的 mac 电脑发挥💯，请仔细观看下面的内容哦。</p></blockquote><h2 id="常规设置">常规设置</h2><blockquote><p>本人倾向将 Dock 栏放在左边。😄语言还是看个人喜好吧，我这台电脑选择了英语作为默认语言。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922203334734.png" alt="Dock 设置"></p><blockquote><p>另外，外观的选择因人而异了，<s>本人我一直使用的是暗黑模式</s>, 因为屏幕舞台灯问题, 本人已经回归传统的白色模式了😂。</p></blockquote><h2 id="浏览器">浏览器</h2><blockquote><p>不用多说，了解我的人都知道，我已经从 Google Chrome 完全转移到了 Microsoft Edge 了。目前我的 iPad 也将 Edge 设置成了默认浏览器了。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922203601720.png" alt="默认浏览器设置"></p><h3 id="插件">插件</h3><blockquote><p>除了我在 Windows 10 文章中推荐过的去广告插件 uBlock Origin 和脚本大大 Tampermonkey 之外，其他都是一些提升体验和专业领域的插件。比如用键盘快捷键去操作网页浏览的 Vimium C 和翻译插件 Translate Man 等等。</p><p>需要注意的是安装的插件越多，占用的内存也会越多，同时浏览器进程数也会增加。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922204032102.png" alt="Microsoft Edge 插件"></p><h2 id="解压">解压</h2><blockquote><p>不像 windows 10 使用的是 7zip，macOS 由于没有跨平台的解压软件（虽然自身已经有了一定的解压能力），选择的是<a href="https://ezip.awehunt.com/" title="eZip">eZip - Designed for macOS!</a>。有了它，就可以解锁几乎所有的压缩包格式了，同时也可以预览压缩包的内容。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922204551447.png" alt="eZip"></p><h2 id="下载">下载</h2><blockquote><p>同 windows 10 中介绍的一样，使用 <a href="https://motrix.app/" title="Motrix">Motrix</a> 和<a href="https://www.xunlei.com/" title="迅雷">迅雷</a>。</p></blockquote><h2 id="视频">视频</h2><blockquote><p>macOS 下推荐免费好用的 <a href="https://iina.io/" title="IINA">IINA - The modern media player for macOS</a>。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922205117131.png" alt="IINA"></p><p>除了视频播放器之外，还可以选择安装流媒体视频的电脑客户端，比如最新发布的<a href="https://app.bilibili.com">哔哩哔哩 Mac 版本</a>😄。</p><h2 id="通讯">通讯</h2><blockquote><p>目前国人还是最喜爱使用微信和 QQ 的，可以考虑在电脑上都安装。</p></blockquote><h2 id="截图">截图</h2><blockquote><p>截图软件我只认 <a href="https://zh.snipaste.com/" title="Snipaste">Snipaste - 截图 + 贴图</a>，妈妈再也不用担心我截图了。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922205435803.png" alt="Snipaste"></p><h2 id="RSS">RSS</h2><blockquote><p>本人在 <a href="https://www.reederapp.com/" title="Reeder">★ Reeder</a> 上次限免的时候入了，目前正在使用中。喜欢 RSS 订阅的观众可以考虑。除此之外，可以考虑使用</p></blockquote><p><img src="/2020/09/30/mac/image-20200922205558804.png" alt="Reeder"></p><p>由于 Reeder 目前只能在非国区才能下载，所以在此推荐另外一款在苹果生态都可以使用的 RSS 软件：<a href="https://netnewswire.com/">NetNewsWire</a>。</p><p><img src="/2020/09/30/mac/image-20211030000243385.png" alt="NetNewsWire"></p><h2 id="窗口管理">窗口管理</h2><blockquote><p>不曾想过，macOS 竟然有如此好用且免费的窗口管理软件：<a href="https://rectangleapp.com/" title="Rectangle">Rectangle</a>。在一个屏幕快速显示多个窗口就不在是梦，不过个人觉得还是加个显示屏更加地爽。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922210053947.png" alt="Rectangle"></p><p>除了快捷调整窗口的大小外，快速切换窗口也是一个非常重要的功能。在这个领域，<a href="https://alt-tab-macos.netlify.app">AltTab</a> 是一个非常不错的软件。对比系统原生的切换，可以显示出具体每个窗口的内容。</p><h2 id="效率">效率</h2><blockquote><p>macOS 自带的 spotlight 功能还是可以的，但是跟 <a href="https://www.alfredapp.com/" title="Alfred">Alfred - Productivity App for macOS</a> 相比还是逊色不少的。考虑其需要付费的特性，推荐有能力的人可以入手。想要白嫖的，可以考虑 <a href="https://u.tools/" title="uTools">uTools - 你的生产力工具集</a>。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922210450443.png" alt="Alfred"><br><img src="/2020/09/30/mac/image-20200922210549342.png" alt="uTools"></p><h2 id="快捷启动">快捷启动</h2><blockquote><p><a href="https://github.com/gbammc/Thor" title="Thor">Thor</a> 是一个比较方便的小应用，可以快速启动或切换应用。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922212737328.png" alt="Thor"></p><h2 id="键位设置">键位设置</h2><blockquote><p><a href="https://karabiner-elements.pqrs.org/index.html" title="Karabiner-Elements">Karabiner-Elements</a> 是一款免费的修改键位的软件。本人将右边的 option 键改成了 esc 键，来避免触摸 touchbar 上面的那个 esc 按钮😭。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922211107288.png" alt="Karabiner-Elements"><br><img src="/2020/09/30/mac/image-20200922211317692.png" alt="Karabiner-Elements 设置"></p><blockquote><p>想要实时显示按键输入情况的，可以考虑这款软件：<a href="https://github.com/keycastr/keycastr" title="KeyCastr">KeyCastr, an open-source keystroke visualizer</a>。</p></blockquote><h3 id="自带截图快捷键">自带截图快捷键</h3><ul><li>Command + Shift + 5: 自定义截图</li><li>Command + Shift + 4: 截取所选屏幕到桌面</li><li>Command + Shift + 3: 截取整个屏幕到桌面</li></ul><h2 id="终端">终端</h2><blockquote><p>毫无疑问，<a href="https://iterm2.com/" title="iTerm2">iTerm2 - macOS Terminal Replacement</a> 就是 macOS 最好的终端了。<br>目前我正在使用 <a href="https://hyper.is/">Hyper</a></p></blockquote><h2 id="PDF">PDF</h2><blockquote><p>虽然有苹果三件套 Page，Keynote 和 Number，但是却缺少一个好的 PDF 软件。Preview，Edge 和 <a href="https://www.wps.com/mac/" title="WPS">WPS Office for MAC</a> 作为阅读浏览其实是合格的，用来编辑等其他功能时会显得不太够用。</p></blockquote><p>有付费习惯的观众可以使用 <a href="https://acrobat.adobe.com/cn/zh-Hans/acrobat.html" title="Adobe Acrobat DC">Adobe Acrobat DC</a> 和 <a href="https://pdfexpert.com/" title="PDF Expert">PDF Expert</a>。</p><p><a href="https://sspai.com/post/73291">苹果电脑自带的预览</a> 功能也是非常的强大。</p><h2 id="Markdown">Markdown</h2><blockquote><p>Markdown 编辑器的话，我推荐使用 <a href="https://typora.io/" title="Typora">Typora — a markdown editor, markdown reader.</a>，本文都是通过该编辑器进行撰写的。<br>由于 typora 开始收费了，一种方式是继续使用 beta 的版本，该版本目前在 typora 官网一直下载不下来。<br>作为替代品，双链的 <a href="https://obsidian.md">Obsidian</a> 是一个非常好的替代者。</p></blockquote><p><img src="/2020/09/30/mac/image-20200922213415910.png" alt="Typora"></p><h2 id="笔记">笔记</h2><blockquote><p>笔记应用使用的比较多，在我的电脑里几乎有各种各样的笔记软件。除了付费使用的为知笔记外，还有飞书的云文档，语雀和 Notion。这块大家可以依据自身的使用喜好来选择。</p></blockquote><p>我在 2018 年的时候写过一篇文章 <a href="https://blog.zzhpro.com/2018/07/29/note-skills/">知识管理</a>。我在这里再总结一下近些年来的一个变化情况。</p><p>首先说说语雀，阿里的这款产品目前已经有了 Windows 和 macOS 下的客户端的软件了，手机端目前还只有微信小程序，比起之前已经有了很大的进步了。但是比起为知笔记一开始的跨平台支持还是有一些差距的。还有一点是在查看 Markdown 格式时，会出现很多的 <code>&lt;a&gt;</code> 标签，但是导出然后下载的时候可以选择没有。</p><p>另外一个值得一提的是飞书的云文档的出现，飞书的跨平台支持还不错，只是电脑端相对弱了一些，文档是跳转到浏览器进行访问的，这块有点可惜了。比起语雀丰富的导出功能，飞书的云文档只能导出为 PDF 和 Word 两种格式。这在一定程度上限制了一些应用场景，尤其是不能导出为 Markdown 格式。</p><p>为知笔记在近些年增加了大纲的功能以及大纲转思维导图的功能。为知笔记的一大问题还是长期存在，编写 markdwon 的体验一直都不是特别好，没有相关的 Markdown 的快捷键限制了让它更加优秀。可以考虑用富文本编辑，然后通过 <a href="http://euangoddard.github.io/clipboard2markdown/" title="Paste to Markdown">Paste to Markdown</a> 来转成 Markdown 格式。</p><p>最后来说说 Notion 吧，它终于有了可以免费使用的体验的。怎么说，Notion 登录方式实在是太麻烦了，我多少次是因为需要登录，从而就放弃登录使用了。</p><h2 id="思维导图">思维导图</h2><blockquote><p>思维导图虽然也有很多家可以选择，但是跨平台的 <a href="https://xmind.cn/" title="XMind">XMind</a> 个人是比较推荐的。也可以考虑以下两款：<a href="https://mindnode.com/" title="MindNode">MindNode</a> 和 <a href="https://www.mindmaster.io/" title="MindMaster">MindMaster</a>。<br>目前 Xmind 必须登录才能使用😭</p></blockquote><h2 id="NTFS">NTFS</h2><blockquote><p>在使用电脑的过程，难免会碰到需要往 U 盘拷贝东西的情况，那这是就需要一款可以写入 NTFS 磁盘的读写应用了。<a href="https://mounty.app/">Mounty</a> 就是这样一款免费的应用。</p></blockquote><h2 id="翻译">翻译</h2><blockquote><p>翻译软件如果付费的话，推荐选择 <a href="https://gikken.co/mate-translate/">mate translate</a>，免费的推荐使用 <a href="https://github.com/ripperhe/Bob">Bob</a>。</p></blockquote><h2 id="输入法">输入法</h2><blockquote><p>原生的输入法已经很不错了，为了追求极致的快速打字体验，可以使用<a href="https://pinyin.sogou.com/mac/">搜狗输入法</a>。<br>搜狗输入法目前支持双拼的👍🏻</p></blockquote><h2 id="小插件">小插件</h2><h3 id="AlDente"><a href="https://github.com/davidwernhart/AlDente">AlDente</a></h3><blockquote><p>除了了解自己电脑电池的情况，如何减少电池的反复充电，也是保养电池的一大利器。<br>小 Z 自己设置的充电阈值是 80%，一旦充电 80%，就不再充电了，所以不会一直充电到 100%。</p></blockquote><h3 id="coconutBattery-3"><a href="https://www.coconut-flavour.com/coconutbattery/">coconutBattery 3</a></h3><blockquote><p>到冬天了，电池出问题的可能性大幅提升，随时随地了解电池的状况变得开始重要起来了，而 coconutBattery 3 就是这样的小工具。</p></blockquote><h3 id="TouchSwitcher-app-switcher-for-Touch-Bar"><s><a href="https://hazeover.com/touchswitcher.html" title="TouchSwitcher">TouchSwitcher app switcher for Touch Bar</a></s></h3><blockquote><p>为了使 Touch bar 能发挥一定的作用，可谓是费劲了心思😭。<br>随着最新的 MacBook Pro 机型已经取消掉了 Touch Bar，未来这块也不会有太大的发展空间了。</p></blockquote><p><img src="/2020/09/30/mac/image-20200930111956966.png" alt="TouchSwitcher"></p><h3 id="Go2Shell"><s><a href="https://zipzapmac.com/Go2Shell" title="Go2Shell">Go2Shell</a></s></h3><blockquote><p>这款小插件可以让你在文件系统中快速启动终端程序，十分便捷。</p><p>😄，iterm2 目前也支持在文件夹目前直接打开终端了，这款小工具的历史使命也快完结了。</p></blockquote><p><img src="/2020/09/30/mac/image-20200930112158875.png" alt="Go2Shell"></p><h2 id="小技巧">小技巧</h2><h3 id="Finder-访达显示隐藏文件">Finder 访达显示隐藏文件</h3><p>使用 <code>shift+command+.</code> 快捷键，你将能看到隐藏的文件夹或者文件了👍🏻</p><h3 id="Hosts-文件修改">Hosts 文件修改</h3><blockquote><p>为了更加畅快地访问 GitHub 网站，可以从 <a href="https://raw.hellogithub.com/hosts">https://raw.hellogithub.com/hosts</a> 这个链接获取最新的 hosts 地址，再结合 <a href="https://swh.app/zh/">SwitchHosts</a> 应用修改即可。</p><p>另外一个访问是否流畅，跟所使用的网络运营商也有很大的关系。</p></blockquote><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;当你拥有一台崭新的 mac 电脑时，内心应该是十分激动的。怎样让你❤️的 mac 电脑发挥💯，请仔细观看下面的内容哦。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;常规设置&quot;&gt;常规设置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;本人倾向将</summary>
      
    
    
    
    <category term="mac" scheme="https://blog.zzhpro.com/categories/mac/"/>
    
    
    <category term="mac" scheme="https://blog.zzhpro.com/tags/mac/"/>
    
  </entry>
  
  <entry>
    <title>Intellij IDEA 完美配置，让你爱不释手</title>
    <link href="https://blog.zzhpro.com/2020/09/07/intellij-idea/"/>
    <id>https://blog.zzhpro.com/2020/09/07/intellij-idea/</id>
    <published>2020-09-07T21:16:32.000Z</published>
    <updated>2026-04-24T16:17:28.356Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>作为每天写代码的工具，配置一个称心如意的 Intellij IDEA 就显得尤为重要了。</p></blockquote><p>需要安装插件可以提升我们的工作效率，但是太多的插件也会拖慢 IDEA 的运行速度和流畅度，请酌情考虑安装插件的数量，以及关闭内置不常用到的一些插件以提升整体的运行速度。<br><strong>目前很多知名的插件已经开通增值服务，大家量力而行。</strong></p><h2 id="外观篇">外观篇</h2><blockquote><p>每天面对着自己的喜欢的风格编写代码是一件非常惬意的事情。</p></blockquote><h3 id="主题篇">主题篇</h3><blockquote><p>内置暗黑和白色主题，个人比较喜欢暗黑的主题，对眼睛会比较友好。<s>另外可以安装 <a href="https://plugins.jetbrains.com/plugin/8006-material-theme-ui" title="Material Theme UI">Material Theme UI</a> 主题插件，但是值得注意的是这款插件完整功能是需要付费的😭</s><br>目前本人正在使用的是 <code>Monokai</code> 主题。</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200901231238207.png" alt="外观设置"></p><h3 id="字体篇">字体篇</h3><blockquote><p>这里使用的是 Color Scheme Font，它覆盖了默认的 Font 字体，字体采用的是 <a href="https://github.com/tonsky/FiraCode" title="Fira Code">Fira Code</a>。由于我喜欢较大的字号，我选择了 16 号，字号大小还是因人而异的。<br>可用的字体选择很多，感兴趣的可以去 <a href="https://www.nerdfonts.com/">Nerd Fonts</a> 挑选喜欢的字体。</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200901232851701.png" alt="字体"></p><p><img src="/2020/09/07/intellij-idea/image-20200901233000009.png" alt="Color Schema Font"></p><h3 id="颜色篇">颜色篇</h3><ul><li>Rainbow Brackets：让你拥有五颜六色的括号（每一对括号的颜色都是不一样的），有增值服务</li><li>Rainbow variable：让变量也五颜六色</li></ul><h3 id="Markdown-篇">Markdown 篇</h3><blockquote><p><a href="https://www.jetbrains.com/help/idea/markdown.html#tips">https://www.jetbrains.com/help/idea/markdown.html#tips</a></p></blockquote><h3 id="日志篇">日志篇</h3><ul><li><a href="https://plugins.jetbrains.com/plugin/7125-grep-console">Grep Console</a>：清晰筛选出日记级别的日志</li></ul><h2 id="效率篇">效率篇</h2><h3 id="效率第一人-Lombok">效率第一人 <a href="https://projectlombok.org/features/all" title="Lombok">Lombok</a></h3><blockquote><p>目前在新版本的 Intellij IDEA 中已经自带该插件，不需要手动安装了😄<br>记得开启注解处理哦，不然在代码里会出现很多错误。</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200902083742331.png" alt="注解处理器"></p><h3 id="Postfix-Completion">Postfix Completion</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">java.util.List</span><br><span class="line">java.util.Set</span><br><span class="line"><span class="title function_">if</span> <span class="params">(org.apache.commons.collections4.CollectionUtils.isEmpty($EXPR$)</span>) &#123;</span><br><span class="line">    $END$        </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">java.lang.String</span><br><span class="line"><span class="title function_">if</span> <span class="params">(org.apache.commons.lang3.StringUtils.isBlank($EXPR$)</span>) &#123;</span><br><span class="line">    $END$        </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="Live-Template">Live Template</h3><blockquote><p>快速生成代码模版，这块如果使用得当的话是会极大地提升代码编写的速度😯</p></blockquote><h4 id="Java-篇">Java 篇</h4><p><img src="/2020/09/07/intellij-idea/image-20200901233824227.png" alt="Java 动态模版"></p><h3 id="字符处理篇">字符处理篇</h3><p>使用 String Manipulation 插件可以进行各种字符的变换。</p><blockquote><p>该插件的功能非常丰富，值得学习使用。</p><p>其实 IDEA 也有一些快速大小写的快捷键，可以结合使用，效率更高😯</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200901235112833.png" alt="String Manipulation"></p><h3 id="输入法篇">输入法篇</h3><p><a href="https://plugins.jetbrains.com/plugin/20575-smart-input">Smart Input</a></p><p>可以自动切换中英文输入法, 在中文的开发环境下比较方便</p><h3 id="重构篇">重构篇</h3><blockquote><p>学习如何使用重构相关的快捷键，可以进行快速重构</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200902081849176.png" alt="重构"></p><h3 id="代码提示篇">代码提示篇</h3><blockquote><p>随着 ChatGPT 的横空出世，代码领域的 AI 智能化得到飞速地发展。目前第一梯度为 GitHub Copilot，国内的也有不少可选选项。</p></blockquote><ul><li><a href="https://github.com/features/copilot">GitHub Copilot</a></li><li><a href="https://tongyi.aliyun.com/lingma">通义灵码</a></li></ul><h3 id="快捷键篇">快捷键篇</h3><ul><li>Key Promoter X：时刻提醒你可以用快捷键快速执行操作</li><li>AceJump：快捷键为 <code>control + ;</code></li></ul><p><img src="/2020/09/07/intellij-idea/image-20200906174450536.png" alt="快捷键 PDF"><br><img src="/2020/09/07/intellij-idea/image-20200906174532059.png" alt="快捷键设置"></p><h4 id="Override">Override</h4><blockquote><p>macOS 的快捷键为 <code>Control + O</code></p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200906174204077.png" alt="Override"></p><h4 id="Generate">Generate</h4><blockquote><p>macOS 的快捷键为 <code>Command + N</code></p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200906174632538.png" alt="Generate"></p><h4 id="Implement">Implement</h4><blockquote><p>macOS 的快捷键为 <code>Control + I</code></p></blockquote><h3 id="翻译篇">翻译篇</h3><blockquote><p>在取名和阅读源码的过程中，不可避免会碰到不认识的单词，那这个时候快速的翻译工具可以大大提高我们的编程效率。</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200906142004534.png" alt="翻译"></p><h3 id="Vim-全键盘操作"><a href="https://plugins.jetbrains.com/plugin/164-ideavim">Vim 全键盘操作</a></h3><blockquote><p>😄可以模拟在 IDEA 用 Vim 来写代码，效率杠杠的✌️</p><p>在使用的过程中发现在 vim 下原先一些 IDEA 的快捷方式将不在适用，这是比较让人烦恼的点。<br>附上快捷键参考：<a href="https://devhints.io/vim">https://devhints.io/vim</a></p></blockquote><h3 id="ORM">ORM</h3><ul><li><a href="https://plugins.jetbrains.com/plugin/15075-jpa-buddy">JPA Buddy</a></li></ul><h4 id="MyBatis">MyBatis</h4><ul><li><a href="https://plugins.jetbrains.com/plugin/10119-mybatisx">MyBatisX</a></li></ul><h2 id="代码规范篇">代码规范篇</h2><ul><li><a href="https://plugins.jetbrains.com/plugin/14109-alibaba-java-coding-guidelines-xenoamess-tpm-">Alibaba Java Coding Guidelines(XenoAmess TPM)</a>: 目前 IDEA 自带的代码问题扫描已经非常丰富, 可以不需要进行安装</li><li><a href="https://plugins.jetbrains.com/plugin/7499-gittoolbox">GitToolBox</a>：代码修改历史</li><li><a href="https://plugins.jetbrains.com/plugin/9861-git-commit-template/" title="Git Commit Template">Git Commit Template</a></li></ul><h2 id="字节码篇">字节码篇</h2><ul><li><a href="https://plugins.jetbrains.com/plugin/9248-jclasslib-bytecode-viewer" title="jclasslib Bytecode viewer">jclasslib Bytecode viewer</a></li></ul><blockquote><p>针对 class 文件，选择 <code>View</code> tab，可以看到查看字节码的选项</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200906175222869.png" alt="查看字节码"></p><h2 id="依赖管理篇">依赖管理篇</h2><blockquote><p>推荐使用 Maven Helper</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200902083358995.png" alt="Maven Helper"></p><h3 id="生成序列化版本号">生成序列化版本号</h3><ul><li>GenerateSerialVersionUID（可以在 <a href="#generate">Generate</a> 中找到）</li></ul><h3 id="JSON-Object-互换">JSON/Object 互换</h3><ul><li><a href="https://plugins.jetbrains.com/plugin/12066-pojo-to-json">POJO to Json</a></li><li><a href="https://plugins.jetbrains.com/plugin/7654-gsonformat">GsonFormat</a></li></ul><h2 id="图像篇">图像篇</h2><h3 id="PlantUML"><a href="https://plugins.jetbrains.com/plugin/7017-plantuml-integration">PlantUML</a></h3><blockquote><p>可以直接在 IDEA 中绘制各种 UML 图，并与代码放在一起。</p></blockquote><h3 id="Diagrams-net-Integration"><a href="https://plugins.jetbrains.com/plugin/15635-diagrams-net-integration">Diagrams.net Integration</a></h3><blockquote><p>可以直接在 IDEA 中绘制各种图，并与代码放在一起。</p></blockquote><h3 id="类-UML-图">类 UML 图</h3><blockquote><p>右键即可调出 Diagrams 功能</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200902081537759.png" alt="UML"></p><h3 id="方法调用时序图">方法调用时序图</h3><blockquote><p>安装 Sequence Diagram 后，选择一个方法名，右键即可</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20200906180056351.png" alt="方法调用时序图"></p><h3 id="思维导图"><a href="https://plugins.jetbrains.com/plugin/8045-idea-mind-map">思维导图</a></h3><h2 id="配置篇">配置篇</h2><h3 id="自动导入">自动导入</h3><p><img src="/2020/09/07/intellij-idea/image-20200906181925596.png" alt="自动导入"></p><h3 id="方法分割线">方法分割线</h3><p><img src="/2020/09/07/intellij-idea/image-20200906184157557.png" alt="方法分割线"></p><h3 id="自动提示不区分大小写">自动提示不区分大小写</h3><p><img src="/2020/09/07/intellij-idea/image-20200906184329122.png" alt="自动提示不区分大小写"></p><h3 id="演出模式">演出模式</h3><blockquote><p>使用 <code>Option + Shift + V</code> 进入演出模式可以拥有极佳的阅读代码的体验。可以使用 <code>command + e</code> 快速切换文件列表，查找已经打开的文件；使用 <code>shift + shift</code> 快速查找文件。</p></blockquote><p><img src="/2020/09/07/intellij-idea/image-20210124150533807.png" alt="配置演出模式快捷键"></p><h2 id="文档篇">文档篇</h2><h3 id="Easy-Javadoc"><a href="https://plugins.jetbrains.com/plugin/12977-easy-javadoc">Easy Javadoc</a></h3><blockquote><p>在面向中文的开发环境下, 有中文的注释还是比较方便的</p></blockquote><h3 id="JavaDoc"><a href="https://plugins.jetbrains.com/plugin/7157-javadoc">JavaDoc</a></h3><h2 id="技巧篇">技巧篇</h2><h3 id="行尾添加分号">行尾添加分号</h3><blockquote><p>使用 <code>shift + command + enter</code> 可以快速补全分号</p></blockquote><h2 id="测试篇">测试篇</h2><blockquote><p>本人一般直接使用自带的 HTTP 请求功能进行测试<br>👇🏻的两个插件本人使用不多</p></blockquote><ul><li><a href="https://plugins.jetbrains.com/plugin/16988-restful-fast-request">Restful Fast Request</a></li><li><a href="https://plugins.jetbrains.com/plugin/14280-restfultool">RestfulTool</a></li></ul><h3 id="如何无阻塞-debug">如何无阻塞 debug</h3><blockquote><p>在我们平时打断点的地方，点击更多展开，里面会有不阻塞断点、条件断点等高级 debug 功能，可以通过这些高级能力提升在 debug 的同时不影响其他人的正常调用。</p></blockquote><h3 id="arthas">arthas</h3><p>安装 arthas idea 插件可以方便生成 arthas 的命令语句, 从而可以查看很多运行时的信息, 方便排查问题</p><h2 id="彩蛋">彩蛋</h2><blockquote><p><a href="https://confluence.jetbrains.com/display/IDEADEV/Latest+builds" title="最新的 IDEA 版本">最新的 IDEA 版本</a>可以在这里看到哦，同时也可以下载一些老的版本。<br>正式发布的版本都可以在👇🏻的这个链接找到<br><a href="https://www.jetbrains.com/zh-cn/idea/download/other.html">https://www.jetbrains.com/zh-cn/idea/download/other.html</a></p></blockquote><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><div style="text-align: center;"><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></div>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;作为每天写代码的工具，配置一个称心如意的 Intellij IDEA 就显得尤为重要了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;需要安装插件可以提升我们的工作效率，但是太多的插件也会拖慢 IDEA 的运行速度和流畅度，请酌情考虑安装插件的数量，</summary>
      
    
    
    
    <category term="Java" scheme="https://blog.zzhpro.com/categories/Java/"/>
    
    
    <category term="Java" scheme="https://blog.zzhpro.com/tags/Java/"/>
    
  </entry>
  
  <entry>
    <title>2020 StackOverflow 开发者现状调研</title>
    <link href="https://blog.zzhpro.com/2020/08/29/2020-stackoverflow-survey/"/>
    <id>https://blog.zzhpro.com/2020/08/29/2020-stackoverflow-survey/</id>
    <published>2020-08-29T11:21:59.000Z</published>
    <updated>2026-04-24T16:17:28.348Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>最近 Stackoverflow 公布了 2020 年的调查问卷结果，让我们看看有什么有趣的发现吧。</p></blockquote><h2 id="最受欢迎的语言">最受欢迎的语言</h2><img src="image-20200829103835606.png" alt="最受欢迎的语言" style="zoom:50%;" /><p>跟上次我在博客<a href="https://blog.zzhpro.com/2020/07/26/2020-development-ecosystem/">2020 开发者生态系统现状</a>文章中<a href="https://blog.zzhpro.com/2020/07/26/2020-development-ecosystem/#toc-heading-1">最常使用的程序语言</a>章节里显示结果相似。</p><img src="image-20200829104119462.png" alt="2020 开发者生态系统现状-最常使用的程序语言" style="zoom:50%;" /><p>另外，在最受开发者热爱的语言中，Rust，TypeScript 和 Python 高居前三甲。</p><h2 id="Web-框架">Web 框架</h2><blockquote><p>比较奇怪的是这次调查是把前端和后端的框架放在一起统计了；而令人意外的还是 <code>jQuery</code> 竟然处于垄断地位😨。</p></blockquote><img src="image-20200829104338003.png" alt="Web 框架" style="zoom:50%;" /><h2 id="其他技术">其他技术</h2><blockquote><p>针对其他技术的使用，Node.js 广受欢迎，另外机器学习和数据分析相关的技术同样不可小觑。当然我们也看到了一些运维相关的技术，比如 Ansible 和 Teraform。</p></blockquote><img src="image-20200829104710506.png" alt="其他技术偏好" style="zoom:50%;" /><h2 id="数据库">数据库</h2><blockquote><p>数据库作为储存当今数据为王的珍贵数据，就显得尤为重要。而在关系型数据库领域，MySQL 依然是领先者，PostgreSQL 紧随其后。</p></blockquote><img src="image-20200829105024556.png" alt="数据库" style="zoom:50%;" /><p>跟上次我在博客<a href="https://blog.zzhpro.com/2020/07/26/2020-development-ecosystem/">2020 开发者生态系统现状</a>文章中<a href="https://blog.zzhpro.com/2020/07/26/2020-development-ecosystem/#toc-heading-13">数据库</a>章节相比，搜索引擎 Elasticsearch 上榜了。</p><img src="image-20200829105403372.png" alt="2020 开发者生态系统现状-数据库" style="zoom:50%;" /><h2 id="协作工具">协作工具</h2><blockquote><p>不出意料，GitHub 是最受欢迎的协作工具，果然名不虚传。另外上榜都是协作交流和项目管理方面的工具。</p></blockquote><img src="image-20200829110546084.png" alt="协作工具" style="zoom:50%;" /><h2 id="调研工具">调研工具</h2><blockquote><p>调研工具，最好的方法开始免费使用，或者像熟悉的开发者询问和在论坛上咨询。</p></blockquote><img src="image-20200829110909659.png" alt="调研工具方式" style="zoom:50%;" /><h2 id="彩蛋">彩蛋</h2><p>最后附上一张技术的关系图。</p><img src="image-20200829111322905.png" alt="技术关系图" style="zoom:50%;" /><hr><h2 id="附录">附录</h2><p>想要查看具体详细的调查分析报告，通过下面的网址进行查阅。</p><blockquote><p>2020 Developer Survey: <a href="https://insights.stackoverflow.com/survey/2020">https://insights.stackoverflow.com/survey/2020</a></p></blockquote><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;最近 Stackoverflow 公布了 2020 年的调查问卷结果，让我们看看有什么有趣的发现吧。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;最受欢迎的语言&quot;&gt;最受欢迎的语言&lt;/h2&gt;
&lt;img src=&quot;image-202008291</summary>
      
    
    
    
    <category term="Development" scheme="https://blog.zzhpro.com/categories/Development/"/>
    
    
    <category term="Development" scheme="https://blog.zzhpro.com/tags/Development/"/>
    
  </entry>
  
  <entry>
    <title>从头武装 win10，体验💯</title>
    <link href="https://blog.zzhpro.com/2020/07/27/win10/"/>
    <id>https://blog.zzhpro.com/2020/07/27/win10/</id>
    <published>2020-07-27T22:16:24.000Z</published>
    <updated>2026-04-24T16:17:28.780Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在拿到一台新的 Windows 10 电脑或者重装了系统后，我们需要安装一些软件，并配置一些选项来使得电脑可以处于最佳状态。</p></blockquote><p>那第一件事情，就是将系统更新到最新的状态，这里包括驱动的更新以及功能安全的更新。</p><h2 id="Windows-更新">Windows 更新</h2><p>点击开始菜单，选择设置，再点击更新和安全，进入到 Windows 更新页面。然后就可以愉快地点检查更新，再选择更新，就可以去喝一杯咖啡去了。</p><p><img src="/2020/07/27/win10/image-20200724093109895.png" alt="Windows 更新"></p><p>当已经更新到最新的状态时，是时候来安装一些软件，来使得我们的电脑蓬荜生辉。</p><p>想要下载软件，怎么也得有一个可以下载软件的工具。现在的时代也不是以前 U 盘拷贝软件安装的时代了。那我们一开始是得通过浏览器来下载软件的。</p><blockquote><p>在不断点击检查更新按钮之后，终于我如愿将电脑升级到了 Win10 20H2，也就是目前最新的版本。</p></blockquote><h2 id="浏览器">浏览器</h2><p>说到浏览器，这个我们使用电脑，80% 时间在使用的软件，真的是太重要了。选择一款真心如意的浏览器，绝对会提升你的使用体验。我这里推荐安装微软自家新的 <a href="https://www.microsoft.com/zh-cn/edge" title="Microsoft Edge 浏览器">Microsoft Edge 浏览器</a>，基于 Chromium，和 Chrome 比也毫不逊色。目前是我的主力浏览器。</p><blockquote><p>在 Win10 20H2 中基于 Chromium 的 Edge 已经完全替换了原来系统自带的 Edge 浏览器，成为了默认浏览器，不用重新下载安装。</p></blockquote><p><img src="/2020/07/27/win10/image-20200724094417612.png" alt="Microsoft Edge"></p><p>为了称心如意的网上冲浪，我们也必要过滤一下网页上无处不在的广告。推荐安装 <a href="https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak" title="uBlock Origin">uBlock Origin</a> 扩展。</p><p><img src="/2020/07/27/win10/image-20200724104237462.png" alt="uBlock Origin"></p><p>有了称心如意的浏览器后，需要一个解压工具来解压一些软件包，进而安装这些软件。</p><h2 id="解压">解压</h2><p>推荐使用轻便小巧的 <a href="https://www.7-zip.org/" title="7zip">7zip</a>，支持的格式是非常丰富的，软件也在不断更新中。有了浏览器的基本下载功能和解压软件，我们就可以下载我们想要的专门下载工具了。</p><h2 id="下载">下载</h2><blockquote><p>由于免不了需要下载一些文件，一款下载速度快的下载软件就显得非常重要了。如果浏览器下载速度还行的话，就不需要下载软件出动了。</p></blockquote><p>推荐使用 <a href="https://motrix.app/" title="Motrix">Motrix</a> 去下载一般的文件，尤其对于 GitHub 和托管在 Amazon S3 上的文件，下载速度非常可观。针对难以下载的资源，就只能求助于<a href="https://www.xunlei.com/" title="迅雷">迅雷</a>了。</p><p><img src="/2020/07/27/win10/image-20200724095040412.png" alt="Motrix"></p><blockquote><p>Windows 10 的迅雷真是一言难尽，满屏都是广告，不到万不得已不优先使用。</p></blockquote><p>有了这些工具，就可以下载任意的东西了。但是，情况并不都是这样的，有些文件下载下来，系统默认就把这些文件给删除了，怎么也不能保存下载。为此，这个时候需要替换系统默认的安全软件。</p><h2 id="安全">安全</h2><blockquote><p>由于自带的 Windows Defender 针对有些下载文件，如何你如何同意，它还是非常执着地将这些文件删掉。</p></blockquote><p>推荐安装轻量级的<a href="https://www.huorong.cn/person5.html" title="火绒安全软件">火绒安全软件</a>来替代默认的 Windows Defender。如果只是想要特殊情况下使用，可以在电脑启动，手动关闭该软件。</p><p><img src="/2020/07/27/win10/image-20200724102534364.png" alt="火绒安全软件"></p><p>有了这些准备后，理论上已经可以下载到任意想要的文件了。其实除了自己手动下载安装软件之外，其实可以通过自带的微软应用商城进行软件的安装。</p><p>那接下来就可以开始使用我们的电脑，等等，怎么显示的效果这么差呢？</p><h2 id="显示优化">显示优化</h2><blockquote><p>拥有高分辨率屏幕可以先跳出这节内容，以下内容比较适合使用 1400 * 768 分辨率屏幕的人群。</p></blockquote><p>Windows 10 的字体渲染已经是一个老问题了，尤其是低分屏的显示效果，那是一个惨不忍睹。所以得想些办法来改善一下显示的效果，对我们的眼睛好一点。这里推荐 <a href="https://www.mactype.net/" title="MacType">MacType</a>，安装后，可以改善大部分软件的使用效果，但是浏览器除外哦。因此浏览器通过 <a href="https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd?hl=zh-CN" title="Tampermonkey">Tampermonkey</a> 扩展改字体，加粗加阴影等方式来改善显示效果。</p><p><img src="/2020/07/27/win10/image-20200724103751890.png" alt="Tampermonkey"></p><h2 id="中文输入法">中文输入法</h2><p>由于系统已经自带中文输入法，不是非常推荐去下载安装一个第三方的输入法。这个看个人的喜好吧。为了追求快速的打字体验，可以考虑安装搜狗输入法等第三方输入法。</p><p>看到这里，我们已经做好准备开始工作娱乐学习生活了。那我们就先去安装个聊天工具聊聊天。</p><h2 id="即时通信">即时通信</h2><blockquote><p>现在很难做到时时的面对面交谈，但是即时通信软件的出现拉近了这种距离感，文字、语音和视频总有一种适合你。</p></blockquote><p>微信作为大众的通信软件，我想几乎每一个使用电脑的用户都会有一个微信号。那么在电脑上安装<a href="https://pc.weixin.qq.com/?t=win_weixin&amp;platform=wx&amp;lang=zh_CN" title="微信客户端">微信客户端</a>就成了非常自然且必要的事情了。</p><p><img src="/2020/07/27/win10/image-20200724104918096.png" alt="微信客户端"></p><p>其他通信软件客户端的安装与否，就看各位使用者的喜好了。如果使用 QQ 的话，推荐安装轻量级的 <a href="https://tim.qq.com/" title="Tim QQ">Tim QQ</a>。</p><h2 id="视频">视频</h2><blockquote><p>目前各大视频软件较网页端的一大优势可能是可以提供更高清晰度的播放选项。但是想要获得更高清晰度的画质，你首先需要登录😯。</p></blockquote><p>聊天聊累的话，可能就想放松一下，看点视频、电影什么的。网上视频的播放，我倾向于直接在网页端进行观看，除非是网页端不能观看的，或者是想要下载下来慢慢品味的情况。那样，我去下载相应的软件客户端进行观看。<s>比如说，我比较想要看英超的足球比赛，那我就会去下载一个 PPTV 客户端（没有英超版权了，转战腾讯体育了）。</s></p><p>针对下载下来的电影或者视频，如何播放。我会推荐使用非常轻量好用的 <a href="https://potplayer.org/" title="PotPlayer">PotPlayer</a> 进行播放，几乎可以播放所有的视频格式。</p><p>至于音乐方面，由于音乐资源分散在各个不同的音乐平台，还是推荐在网页端听歌，或者把音乐下载到本地，用你喜爱的音乐播放器播放。比较可惜的是网易云音乐已经不是以前的网易云音乐了。</p><p>娱乐的板块讲的差不多了，下面可以聊聊一些工作学习相关软件。</p><h2 id="文件处理">文件处理</h2><p>推荐使用 <a href="https://www.office.com/" title="Microsoft Office 365">Microsoft Office 365</a>。目前来看 office 的体验依然是最好的，付费使用也是非常值得的。</p><p>哈哈，最近发现了一款<a href="http://ncre.neea.edu.cn/html1/report/1507/861-1.htm">教育考试专用版 WPS</a>，可以方便地关闭掉广告，是替换 Microsoft Office 的一大候选。</p><p>文件多了，自然想能不能不用打开文件而能够直接预览内容呢？</p><p>当然可以了，<a href="https://www.microsoft.com/zh-cn/p/quicklook/9nv4bs3l1h4s?ocid=badge&amp;rtc=1&amp;activetab=pivot:overviewtab" title="QuickLook">QuickLook</a> 就可以让你实现这个需求。</p><p>那文件多了，怎样才能快速找到想要的文件呢？</p><p>哈哈，<a href="https://www.voidtools.com/" title="Everything">Everything</a> 是非常实用的文件查找利器，可以快速找到并定位文件的位置。</p><p>对于系统自带的一些文本，不想使用记事本打开，有什么好的选择呢？</p><p>这个选择有很多的，推荐使用轻量级的  <a href="https://code.visualstudio.com/" title="VS Code">VS Code</a>，玩法很多的，扩展也是非常丰富。</p><p>至于 PDF 的阅读，Microsoft Edge 的体验就非常好了，不是很有必要下载专门的 PDF 软件。除非你有编辑合并 PDF 的需求，但是这些满足这些需求的软件大多是付费的。</p><h2 id="学习主题">学习主题</h2><p>学习的时候，时常需要记录笔记，画个大纲整理知识体系，并撰写专门的文档记录下来。</p><p>笔记方面，个人使用的<a href="https://www.wiz.cn/zh-cn" title="为知笔记">为知笔记</a>，每个人可以选择自己喜爱的笔记工具。但是有一个要求，就是笔记软件最好是跨平台可以使用的。也是在近期，为知笔记推出了旗下的 Markdown 编辑器 <a href="https://www.microsoft.com/zh-cn/p/wiznote-lite/9p4z28708j11?activetab=pivot:overviewtab">Wiznote Lite</a>，非常类似于下面介绍的 typora。</p><p>思维脑图是整理知识点的一大杀器，推荐使用 <a href="https://www.xmind.cn/xmind2020/" title="XMind">XMind</a>。</p><p>我个人是是习惯使用 markdown 的格式来记录的，而不是使用 word 的形式。所以回去选择一款我喜爱的 markdown 编辑器：<a href="https://typora.io/" title="typora">typora</a>。</p><p>另外，我会去订阅一些 RSS 源，因此一款合适的 RSS 阅读器是非常关键的，我目前的选择是 <a href="https://github.com/yang991178/fluent-reader" title="Fluent Reader">Fluent Reader</a>。遗憾的是目前还没有一款跨平台可以同步数据的阅读器。</p><p>有时也会去看一些电子书，那这里就推荐一款电子书软件：<a href="https://www.microsoft.com/zh-cn/p/%e5%b9%b2%e5%87%80%e9%98%85%e8%af%bb/9mv65l2xfcsk?activetab=pivot:overviewtab" title="干净阅读">干净阅读</a>，可以一直试用下去。最近我发现了一款更加适合的电子书软件 <a href="https://www.microsoft.com/zh-cn/p/freda-epub-ebook-reader/9wzdncrfj43b?activetab=pivot:overviewtab" title="freda">freda</a>，它具备了干净阅读所不具有的高亮和标注功能。</p><h2 id="代码编程主题">代码编程主题</h2><p>如果你是一个程序员，或者想要成为一个程序员。那么你的电脑上一定需要一个版本管理工具。</p><h3 id="版本管理">版本管理</h3><p><a href="https://git-scm.com/" title="Git">Git</a> 作为目前最流行的版本管理工具是必不可少的。</p><p><img src="/2020/07/27/win10/image-20200724115858857.png" alt="Git"></p><p>当然 <a href="https://desktop.github.com/" title="GitHub 客户端">GitHub 客户端</a>也可以来一个，随时将你的创意开源贡献出去，让世界更加美好。</p><p><img src="/2020/07/27/win10/image-20200724120112214.png" alt="GitHub 客户端"></p><h3 id="命令行工具">命令行工具</h3><p>哈哈，最为一名程序员，一款合适的命令行工具是非常重要的，而系统自带的 CMD 工具和 PowerShell 都是差强人意。幸好微软痛定思痛，做出了一个全新的 <a href="https://www.microsoft.com/zh-cn/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab" title="Windows Terminal">Windows Terminal</a>，颜值和使用都是棒棒的。</p><h3 id="WSL2">WSL2</h3><p>Windows 10 跟原来系统比较大的区别是支持 Windows Subsystem for Linux，这也意味在 Windows 电脑上可以有 Linux 的运行环境。</p><p>那下面具体介绍怎么开启 WSL2，并安装最新的 Ubuntu 子系统。</p><p>首先打开刚刚安装的 Windows Terminal，然后输入下列命令</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dism.exe /online /<span class="built_in">enable-feature</span> /featurename:Microsoft<span class="literal">-Windows-Subsystem-Linux</span> /all /norestart</span><br><span class="line">dism.exe /online /<span class="built_in">enable-feature</span> /featurename:VirtualMachinePlatform /all /norestart</span><br></pre></td></tr></table></figure><p>然后重新启动计算机，以完成 WSL 安装并更新到 WSL 。</p><p>现在我们在微软应用商城安装 <a href="https://www.microsoft.com/zh-cn/p/ubuntu-2004-lts/9n6svws3rx71?activetab=pivot:overviewtab" title="Ubuntu 20.04 LTS">Ubuntu 20.04 LTS</a>，当然你也可以选择其他 Linux 发行版本。安装完成后，打开 Windows Terminal 运行以下命令，以将 WSL 2 设置为默认版本。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--set-default-version</span> <span class="number">2</span></span><br></pre></td></tr></table></figure><p>如果执行命令报错，可能需要下载安装 <a href="https://docs.microsoft.com/zh-cn/windows/wsl/wsl2-kernel#download-the-linux-kernel-update-package" title="Linux 内核更新包">Linux 内核更新包</a>，然后重新执行命令即可。至此，你已经拥有了一个 Linux 的运行环境。</p><p><img src="/2020/07/27/win10/image-20200724121730742.png" alt="Windows Terminal"></p><h3 id="Docker">Docker</h3><p>有了 WSL 的加持，docker 也如虎添翼，可以底层使用 Linux 作为后端。大部分的开发软件，我都是使用 docker 进行安装部署的，随用随起。</p><p><img src="/2020/07/27/win10/image-20200724124142366.png" alt="Docker"></p><h3 id="IDE">IDE</h3><p>安装什么 IDE，具体取决于你所使用的语言和使用场景。但是我还是比较推荐 <a href="https://www.jetbrains.com/zh-cn/" title="Jetbrains">Jetbrains</a> 家旗下的集成开发环境。</p><p><img src="/2020/07/27/win10/image-20200724123644944.png" alt="Jetbrains"></p><p>本人我主要使用 Java，所以选择的是 <a href="https://www.jetbrains.com/zh-cn/idea/" title="Intellij IDEA">Intellij IDEA</a>。那光有 IDE，没有运行环境怎么能行？赶紧去安装所需的运行环境吧。</p><p><img src="/2020/07/27/win10/image-20200724124308589.png" alt="Intellij IDEA"></p><p>这里可以参考<a href="https://blog.zzhpro.com/2019/11/02/java-version-management/" title="如何安装管理 Java 版本">如何安装管理 Java 版本</a>。</p><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在拿到一台新的 Windows 10 电脑或者重装了系统后，我们需要安装一些软件，并配置一些选项来使得电脑可以处于最佳状态。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;那第一件事情，就是将系统更新到最新的状态，这里包括驱动的更新以及功能安全的更新。</summary>
      
    
    
    
    <category term="Windows" scheme="https://blog.zzhpro.com/categories/Windows/"/>
    
    
    <category term="Windows" scheme="https://blog.zzhpro.com/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>2020 开发者生态系统现状</title>
    <link href="https://blog.zzhpro.com/2020/07/26/2020-development-ecosystem/"/>
    <id>https://blog.zzhpro.com/2020/07/26/2020-development-ecosystem/</id>
    <published>2020-07-26T20:27:44.000Z</published>
    <updated>2026-04-24T16:17:28.332Z</updated>
    
    <content type="html"><![CDATA[<h2 id="最常使用的程序语言">最常使用的程序语言</h2><blockquote><p>不出所料，前端相关的语言 JavaScript、HTML 以及 CSS 是最多人使用的语言，而对具体的开发而言，Python 和 Java 是比较受人喜爱的。另外 SQL 和 Shell 也是各自领域发挥着重要的作用。</p></blockquote><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726203200037.png" alt="最常使用的程序语言"></p><h2 id="开发对应平台及内容">开发对应平台及内容</h2><blockquote><p>大部分的开发者都是针对 Web 进行开发任务，而最常用于网站的开发。另外，工具、数据存储和框架的开发也是非常常见的开发内容。</p></blockquote><img src="image-20200726203740457.png" alt="开发目标平台" style="zoom:50%;" /><img src="image-20200726203818582.png" alt="开发内容" style="zoom:50%;" /><h2 id="获取信息的来源">获取信息的来源</h2><blockquote><p>开发者喜爱在 Stack Overflow 等社区论坛和社交媒体上获取信息。这是个非常有意思的调查结果。</p></blockquote><img src="image-20200726204320666.png" alt="获取信息来源" style="zoom:50%;" /><h2 id="敏捷软件开发框架">敏捷软件开发框架</h2><blockquote><p>大约 1/3 选择了 Scrum 进行敏捷开发，而也有不到 1/3 不使用任何敏捷开发。</p></blockquote><img src="image-20200726204729520.png" alt="敏捷软件开发框架" style="zoom:50%;" /><p><a href="https://www.scrum.org/">Scrum</a> 是迭代式增量软件开发过程，具体的流程如下图所示。</p><img src="https://media.surgeforward.com/wp-content/uploads/2018/01/scrum-workflow.png" alt="Scrum" style="zoom:60%;" /><h2 id="Java-主题">Java 主题</h2><h3 id="Java-版本">Java 版本</h3><blockquote><p>如我们所料，Java 8 是最受欢迎的，而最为另一个长期支持版本 Java 11 的热度排在第二位，目前 Java 14 已已经亮相，而且 Spring Boot 也是支持最新的 Java 14。因此这三个版本也是目前最推荐大家使用的三个 Java 大版本了。</p></blockquote><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726205629709.png" alt="Java 版本使用情况"></p><p>下图是最新的 Oracle Java 版本的支持情况，大家可以随时去<a href="https://www.oracle.com/java/technologies/java-se-support-roadmap.html">网站</a>了解最新的版本支持情况。</p><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726210020167.png" alt="Oracle Java SE Support Roadmap"></p><h3 id="应用程序服务器">应用程序服务器</h3><blockquote><p>毫无悬念，Tomcat 是最受欢迎的应用程序服务器，领先优势非常巨大。</p></blockquote><img src="image-20200726210356463.png" alt="应用程序服务器" style="zoom:50%;" /><h3 id="Web-框架">Web 框架</h3><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726210633345.png" alt="Web 框架"></p><h3 id="IDE">IDE</h3><blockquote><p>对于 Java IDE 的选择，其实也没有什么大的争议了。Intellij IDEA 是目前最好的 Java IDEA，即时付费也是非常值得的。</p></blockquote><img src="image-20200726210754775.png" alt="Java IDE" style="zoom:50%;" /><h2 id="JavaScript-主题">JavaScript 主题</h2><h3 id="框架">框架</h3><blockquote><p>前端 UI 框架首选 React，而在服务端首选位 Express。</p></blockquote><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726213915147.png" alt="框架使用情况"></p><blockquote><p>而在模块化打包方面，首选为 Webpack，而测试框架为 Jest。</p></blockquote><h3 id="样式表语言">样式表语言</h3><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726214236618.png" alt="样式表语言"></p><h2 id="数据库">数据库</h2><blockquote><p>对于数据库的选择，关系型数据库是最受关注，其主要有两大选择：MySQL 和 PostgreSQL。另外，文档型数据库 MongoDB 和内存型 KV 数据库 Redis 都是各自领域的领先者。</p><p>哈哈，开发者都是不怎么愿意去迁移到新数据库，其中的迁移过程是非常复杂的。</p></blockquote><img src="image-20200726211022973.png" alt="数据库" style="zoom:50%;" /><h2 id="DevOps">DevOps</h2><h3 id="配置管理工具">配置管理工具</h3><blockquote><p>这块还没有明显的巨头出现，日常我也是使用基于 Python 的 Ansible 为主。</p></blockquote><img src="image-20200726211543590.png" alt="配置管理工具" style="zoom:50%;" /><h3 id="基础结构配置工具">基础结构配置工具</h3><blockquote><p>目前我还没怎么使用过 Terraform，有计划会去尝试下。工作中基本是使用 AWS CloudFormation 进行 AWS 的基础配置的。</p></blockquote><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726211820101.png" alt="基础结构配置工具"></p><h3 id="容器编排">容器编排</h3><img src="image-20200726212016037.png" alt="容器编排" style="zoom:50%;" /><h3 id="云服务">云服务</h3><blockquote><p>这份调查是基于全球的，国内著名的阿里云和腾讯云可能只包含在其他里了。毫无疑问，这两者在国内是巨头的存在。</p></blockquote><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726212141544.png" alt="云服务"></p><h3 id="持续集成">持续集成</h3><blockquote><p>对于公司来说 Jenkins 是最常用的持续集成工具，而对于开源软件来说，开始使用 GitHub Actions 会是一个很不错的选择。</p></blockquote><img src="image-20200726213001001.png" alt="持续集成工具" style="zoom:50%;" /><h3 id="问题跟踪系统">问题跟踪系统</h3><blockquote><p>付费的可以选择 Jira 作为第一选择，开源的话可以选择 GitLab 或者 Redmine。</p></blockquote><img src="image-20200726213148034.png" alt="问题跟踪系统软件" style="zoom:50%;" /><h2 id="微服务">微服务</h2><h3 id="分布式通信方式">分布式通信方式</h3><blockquote><p>根据调查 REST 是最受欢迎的方式，这可能跟 Spring Cloud 的流行有很大的关系。</p></blockquote><img src="image-20200726212400167.png" alt="分布式通信方式" style="zoom:50%;" /><h3 id="API-规范">API 规范</h3><blockquote><p>在跨部分、跨团队的开发过程中，好的 API 规范是非常重要的。</p></blockquote><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726212734589.png" alt="API 规范"></p><h2 id="测试">测试</h2><img src="image-20200726213454382.png" alt="测试" style="zoom:50%;" /><h3 id="测试类型">测试类型</h3><img src="image-20200726213542338.png" alt="测试类型" style="zoom:50%;" /><h3 id="测试框架与工具">测试框架与工具</h3><p><img src="/2020/07/26/2020-development-ecosystem/image-20200726213731608.png" alt="测试框架与工具"></p><hr><h2 id="附录">附录</h2><p>想要查看具体详细的调查分析报告，通过下面的网址进行查阅。</p><blockquote><p>2020 开发人员生态系统现状: <a href="https://www.jetbrains.com/zh-cn/lp/devecosystem-2020/">https://www.jetbrains.com/zh-cn/lp/devecosystem-2020/</a></p></blockquote><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;最常使用的程序语言&quot;&gt;最常使用的程序语言&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;不出所料，前端相关的语言 JavaScript、HTML 以及 CSS 是最多人使用的语言，而对具体的开发而言，Python 和 Java 是比较受人喜爱的。另外 SQL 和 Sh</summary>
      
    
    
    
    <category term="Development" scheme="https://blog.zzhpro.com/categories/Development/"/>
    
    
    <category term="Development" scheme="https://blog.zzhpro.com/tags/Development/"/>
    
  </entry>
  
  <entry>
    <title>走进 PostgreSQL 世界第一篇章--内部结构</title>
    <link href="https://blog.zzhpro.com/2020/07/19/postgres-internal-first/"/>
    <id>https://blog.zzhpro.com/2020/07/19/postgres-internal-first/</id>
    <published>2020-07-19T20:21:43.000Z</published>
    <updated>2026-04-24T16:17:28.776Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在日常的应用程序开发过程中，都离不开数据库的使用。今天就带大家走进非常有名的关系型数据库管理系统：PostgreSQL。</p></blockquote><p><img src="https://i.loli.net/2020/07/19/57YrlKdCIbUeTVH.png" alt=""></p><h2 id="1-安装-PostgreSQL">1 安装 PostgreSQL</h2><p>在深入了解 PostgreSQL 前，先得在我们得主机上安装一下 PostgreSQL。</p><p>对于 macOS 用户非常简单，使用以下命令安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install postgresql</span><br></pre></td></tr></table></figure><p>一开始我也是这么安装的，它也可以支持升级新的 PostgreSQL，是非常方便的。但是这里我更加推荐一种安装方式，使用 Docker 来安装启动 PostgreSQL，因为它可以跨平台按需使用，更加方便且易于后期修改。<br>关于 Docker 的安装，可以在 <a href="https://www.docker.com/products/docker-desktop" title="Docker Desktop for Mac and Windows">Docker Desktop for Mac and Windows</a> 安装对应的客户端软件。</p><p><img src="https://i.loli.net/2020/07/19/RnBisdZXaSTM2NC.png" alt="Docker Desktop"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run --name postgres -p 5432:5432 -v ~/Documents/docker-volumn/postgres:/var/lib/postgresql/data -e POSTGRES_PASSWORD=postgres -d postgres:12-alpine</span><br></pre></td></tr></table></figure><p>另外可以去<a href="https://www.postgresql.org/docs/current/index.html" title="PostgreSQL 官方文档">PostgreSQL 官方文档</a>多多了解 PostgreSQL，丰富的知识点在等着你们学习，下图的黄色部分尤其是重点也是难点。</p><p><img src="https://i.loli.net/2020/07/19/rUovNVtfkM6qg89.png" alt="PostgreSQL Document"></p><h2 id="2-走进-PostgreSQL-内部">2 走进 PostgreSQL 内部</h2><h3 id="2-1-组织结构">2.1 组织结构</h3><p>假设我们是使用 macOS 的 brew 安装的 PostgreSQL。那么数据库的文件路径应该在 <code>/usr/local/var/postgres</code> 下。它的目录结构如下所示</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 文件</span></span><br><span class="line">├── PG_VERSION主版本号</span><br><span class="line">├── pg_hba.conf</span><br><span class="line">├── pg_ident.conf</span><br><span class="line">├── postgresql.auto.conf</span><br><span class="line">├── postgresql.conf配置参数</span><br><span class="line">├── postmaster.opts</span><br><span class="line">└── postmaster.pid</span><br><span class="line"></span><br><span class="line"><span class="comment"># 目录</span></span><br><span class="line">├── base数据库文件</span><br><span class="line">├── global</span><br><span class="line">├── pg_commit_ts</span><br><span class="line">├── pg_dynshmem</span><br><span class="line">├── pg_logical</span><br><span class="line">├── pg_multixact多事务状态数据</span><br><span class="line">├── pg_notify</span><br><span class="line">├── pg_replslot</span><br><span class="line">├── pg_serial</span><br><span class="line">├── pg_snapshots</span><br><span class="line">├── pg_stat</span><br><span class="line">├── pg_stat_tmp</span><br><span class="line">├── pg_subtrans子事务状态数据</span><br><span class="line">├── pg_tblspc</span><br><span class="line">├── pg_twophase两阶段事务的状态文件</span><br><span class="line">├── pg_walWAL 段文件</span><br><span class="line">└── pg_xact事务提交状态</span><br></pre></td></tr></table></figure><p>数据库中表和索引都是文件形式存储在磁盘上，文件名为 oid，大小最大为 1 GB，超过则会创建一个新的文件。而文件的内部被划分成一个个页，而页的大小默认为 8 KB。</p><p>那么怎样才能找到对应的文件在我们磁盘的哪个位置呢？可以利用 SQL 查询得到我们想要的结果。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 找到数据库的 oid</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> pg_database <span class="keyword">where</span> datname <span class="operator">=</span> <span class="string">&#x27;数据库名&#x27;</span>;</span><br><span class="line"><span class="comment">-- 找到表或者索引的 oid 或者 relfilenode</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> pg_class <span class="keyword">where</span> relname <span class="operator">=</span> <span class="string">&#x27;表或索引名&#x27;</span>;</span><br></pre></td></tr></table></figure><p>表相关的文件类型有三类，除了存储表数据的文件外，还有后缀为 <code>_fsm</code> 的是空闲空间映射文件，而 <code>_vm</code> 为可见性映射文件。值得注意的是索引文件是没有可见性映射文件的。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">➜  16401 <span class="built_in">pwd</span></span><br><span class="line">/usr/local/var/postgres/base/16401</span><br><span class="line">➜  16401 <span class="built_in">ls</span> -la 33657*</span><br><span class="line"><span class="comment"># 表相关的文件</span></span><br><span class="line">-rw-------  1 postgres  postgres  811008 Mar 28 13:02 33657</span><br><span class="line">-rw-------  1 postgres  postgres   24576 Mar 28 13:02 33657_fsm</span><br><span class="line">-rw-------  1 postgres  postgres    8192 Mar 28 13:02 33657_vm</span><br></pre></td></tr></table></figure><blockquote><p>这里跟 MySQL 不同的一点是 MySQL 的页大小为 16 KB，而操作系统默认的页大小也为 4 KB。</p></blockquote><h3 id="2-2-堆表文件">2.2 堆表文件</h3><blockquote><p>PostgreSQL 内部采用堆元组存储数据本身，因此一个页上将会有多个元组（heap tuple），并使用元组标识符（tuple identifier，tid）来表示，其结构为（页号，行指针偏移量）</p></blockquote><h4 id="页结构">页结构</h4><ul><li>头部数据<ul><li>p d_lsn: 最近应用到本页面 XLog 记录的 LSN</li><li>pd_lower: 指向行指针的末尾，空闲空间开始的位置</li><li>pd_upper: 指向最新元组的位置，空闲空间结束的位置</li></ul></li><li>行指针<ul><li>长度为 15 bit</li><li>有偏移量，长度和标志这三个属性</li></ul></li><li>堆元组数据<ul><li>HeapTupleHeaderData<ul><li>t_xmin：插入事务的 ID</li><li>t_xmax：删除或更新的事务的 ID</li><li>t_cid：命令 ID</li><li>t_ctid：当前元组或者更新元组的 TID</li><li>t_infomask2：属性和标志位</li><li>t_infomask：标志位</li><li>t_hoff：首部 + 位图 + 填充的长度</li></ul></li><li>空值位图</li><li>用户数据</li></ul></li></ul><h3 id="2-3-内存结构">2.3 内存结构</h3><ul><li>本地内存区域<ul><li>work_mem：工作内存，用于排序命令使用</li><li>maintenance_work_mem：维护工作内存，主要用于自动清理和重新索引</li><li>temp_buffers：临时缓冲，用于临时表的使用</li></ul></li><li>共享内存区域<ul><li>shared buffer pool：表和索引的数据会加载到这里</li><li>WAL buffer：存储事务日志</li><li>commit log：存储事务提交日志</li><li>其他共享区域</li></ul></li></ul><h4 id="缓冲区管理器">缓冲区管理器</h4><p>PostgreSQL 缓冲区管理器由缓冲表、缓冲区描述符和缓冲池组成，管理着共享内存和持久存储之间的数据传输。其维护缓冲区标签（数据库 oid，表 oid，文件类型分支号）到缓冲池页位置的关系，并采用时钟扫描算法（LFU 的一种变体）来进行页面置换，辅以后台的检查点进程和后台写入器进程来进行脏页刷盘。</p><ul><li>缓冲表层是一个散列表，存储着页面的缓冲区标签与缓冲区描述符的缓冲 ID（同时也是缓冲池位置） 之间的映射关系，提供共享模式和独占模式的分段式、轻量级锁</li><li>缓冲区描述符层是一个由缓冲描述符组成的数组，每个缓冲区描述符与下层的缓冲池槽一一对应，保存着相关页面的元数据。为了加快分配过程，维护了一个空闲列表，用于快速分配下一个可用的缓存区描述符。并提供用于内容读写的共享模式和独占模式的内容锁和独占的 I/O 锁。</li><li>缓冲池是一个每个槽为 8 KB，用来保存页面文件数据的一个数组。</li></ul><h3 id="2-4-多进程架构">2.4 多进程架构</h3><p>PostgreSQL 采用的多进程的架构，通过以下命令可以找出所有的 postgre 进程。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 先使用 ps 找到 postgres 的 ppid(上级父程序的 pid)</span></span><br><span class="line">ps -ef |grep postgres</span><br><span class="line"><span class="comment"># 再列出所有的 postgre 的相关进程</span></span><br><span class="line">➜  ~ pstree -p &lt;ppid&gt;</span><br><span class="line">-+= 00001 root /sbin/launchd</span><br><span class="line"> \-+= 76776 zhihaozhang /usr/local/opt/postgresql/bin/postgres -D /usr/local/va</span><br><span class="line">   |--= 44288 postgres postgres: postgres mydb 127.0.0.1(51293) idle</span><br><span class="line">   |--= 76779 postgres postgres: checkpointer</span><br><span class="line">   |--= 76780 postgres postgres: background writer</span><br><span class="line">   |--= 76781 postgres postgres: walwriter</span><br><span class="line">   |--= 76782 postgres postgres: autovacuum launcher</span><br><span class="line">   |--= 76784 postgres postgres: stats collector</span><br><span class="line">   \--= 76785 postgres postgres: logical replication launcher</span><br></pre></td></tr></table></figure><p>PostgreSQL 默认的最大客户端连接数为 100 个，由于多进程的缘故，与 MySQL 的线程连接模型相比，其内存压力更大。</p><h2 id="3-索引">3 索引</h2><blockquote><p>PostgreSQL 的索引有多种类型，其中比较常见的是 B 树，而 MySQL 则使用的是 B+ 树，这是两者的一大区别。</p></blockquote><p>未完待续…</p><hr><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在日常的应用程序开发过程中，都离不开数据库的使用。今天就带大家走进非常有名的关系型数据库管理系统：PostgreSQL。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2020/07/19/57</summary>
      
    
    
    
    <category term="Postgres" scheme="https://blog.zzhpro.com/categories/Postgres/"/>
    
    
    <category term="Postgre" scheme="https://blog.zzhpro.com/tags/Postgre/"/>
    
  </entry>
  
  <entry>
    <title>提升学习和生活的软件服务清单</title>
    <link href="https://blog.zzhpro.com/2020/05/23/study-life-software/"/>
    <id>https://blog.zzhpro.com/2020/05/23/study-life-software/</id>
    <published>2020-05-23T20:51:41.000Z</published>
    <updated>2026-04-24T16:17:28.780Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>最新，为了提升自己的学习效率和生活体验，我的工具库列表又多了一些新的选项。</p></blockquote><h2 id="1-浏览器">1. 浏览器</h2><blockquote><p>上次说到桌面浏览器的选择时，我已经开始使用 Microsoft Edge 代替 Google Chrome 的使用了t。目前移动端也不例外了，开始转向移动端的 Microsoft Edge。目前移动端的 Edge 目前功能并不齐全，比如并不支持中文朗读功能，我自己测试 Android 的版本在华为手机上英文朗读也有问题。</p></blockquote><p>为什么想要朗读功能呢？还是因为不想长时间盯着手机看，但是又想要了解文章内容。</p><p>如果目前非常想要在移动端想要中文朗读功能，Android 可以考虑 <a href="https://www.coolapk.com/apk/cn.uujian.browser" title="荟萃浏览器">荟萃浏览器</a>。当然也可以慢慢等 Edge 浏览器支持了。</p><p>iOS 端的浏览器除了 Edge，我以前使用较多的就是 <a href="https://apps.apple.com/cn/app/alook%E6%B5%8F%E8%A7%88%E5%99%A8-2%E5%80%8D%E9%80%9F/id1261944766#?platform=iphone" title="Alook 浏览器">Alook 浏览器</a>.</p><h2 id="2-管理文档类">2. 管理文档类</h2><blockquote><p>为了自己规划自己的学习计划，目前开始使用 Jira 进行学习任务的拆分和整体把控。另外其提供的时间报告可以让我清晰地观察到进度情况已经时间花费分布。</p></blockquote><p><img src="https://i.loli.net/2020/05/16/fGh4x2Cn3AFLTsw.png" alt="jira.png"></p><p>由于 <a href="https://www.microsoft.com/zh-cn/microsoft-365/mobile" title="Office">Office</a> 的三合一软件的发布，再也不需要单独安装 Word，Excel 和 PowerPoint 了。并且提供的一些小功能也还挺方便的。</p><p><img src="https://i.loli.net/2020/05/16/aYq6oO9ZFDnrRgU.jpg" alt="office.png"></p><p>近期 <a href="https://www.wiz.cn/" title="为知笔记">为知笔记</a> 开始支持大纲模式的笔记了，并并支持大纲思维导图化，所以就不需要使用其他的大纲软件，毕竟我已经付费了很多年了。</p><p><img src="https://i.loli.net/2020/05/16/EVNCGMLeUWBiOK1.jpg" alt="wiz.png"></p><p>上面提到的为知笔记还是比较适合记录小的灵感和笔记内容，如果是一个体系的很长的笔记内容就不太适合了。这个时候我会使用 <a href="https://www.feishu.cn/" title="飞书">飞书</a> 的云文档来记录。除此之外，我也使用飞书记录一些旅游相关的内容。</p><p>以上的这些服务都是支持跨平台的，既有移动端、桌面端软件，还有网页端服务可以使用，使用起来还是非常舒适方便的。</p><p>另外 <a href="https://www.microsoft.com/zh-cn/microsoft-365/microsoft-whiteboard/digital-whiteboard-app" title="微软白板">微软白板</a> 可以提供白板的功能，一定程度上能提供一块思考的空间以及讨论问题时的讲解空间。</p><p><img src="https://i.loli.net/2020/05/16/aUQfYm7bwyTFius.png" alt="whiteboard.png"></p><h2 id="3-资讯类">3. 资讯类</h2><p><a href="https://github.com/mobile/" title="GitHub Mobile">GitHub Mobile</a> 已经发布有一段时间，除了网络连接不稳定外，其实使用起来还过的去。</p><p><img src="https://i.loli.net/2020/05/16/I5DVPg3mSdHEMFJ.jpg" alt="github.png"></p><p>平时主要使用 RSS 订阅一些自己感兴趣的内容看看，除此之外，就会使用 <a href="https://tophub.today/app" title="今日热榜">今日热榜</a> 去看看今日和本周的热榜，让自己紧跟时代的潮流和风向标。</p><p><img src="https://i.loli.net/2020/05/16/7nlI2mTcSLK9MaG.jpg" alt="tophub.png"></p><hr><blockquote><p>看完这篇文章，有没有对你日常的学习和生活体验有所帮助呢？如果内容对你有所帮助，请点赞支持哦！</p></blockquote><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center>Knowledge Collision 激发思维碰撞，IDEA 丛生</center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;最新，为了提升自己的学习效率和生活体验，我的工具库列表又多了一些新的选项。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-浏览器&quot;&gt;1. 浏览器&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;上次说到桌面浏览器的选择时，我已经开始使用 Mic</summary>
      
    
    
    
    
    <category term="Software" scheme="https://blog.zzhpro.com/tags/Software/"/>
    
  </entry>
  
  <entry>
    <title>日常桌面软件第一弹</title>
    <link href="https://blog.zzhpro.com/2020/03/12/daily-software/"/>
    <id>https://blog.zzhpro.com/2020/03/12/daily-software/</id>
    <published>2020-03-12T21:20:33.000Z</published>
    <updated>2026-04-24T16:17:28.356Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在日常工作与休闲娱乐中，我们总是离不开电脑的使用，虽然智能手机和平板的横空出世，分流了一大部分的电脑使用场景，但是我们依然无法完全脱离电脑。那下面就带大家讲讲有哪些必需和好用的软件，提升工作效率和娱乐度。</p></blockquote><h2 id="1-浏览器">1. 浏览器</h2><blockquote><p>日常使用软件频率第一毫无疑问是浏览器了，挑选一款合适的浏览器就变得尤为重要，直接影响我们的使用体验。</p></blockquote><h3 id="Microsoft-Edge">Microsoft Edge</h3><p>没错，首推的就是改版后的 <a href="https://www.microsoft.com/en-us/edge" title="Microsoft Edge">Microsoft Edge</a> 浏览器，使用 Chromium 架构后，我已经没有理由再去使用 Google Chrome 浏览器了。</p><p>比较有特色的优点：</p><ul><li>朗读功能，亲测效果不错</li><li>比 chrome 要更省资源</li></ul><blockquote><p>Linux 系统的用户可能得等上一段时间了，好消息是 Microsoft 已经决定出 Linux 版本的 Edge 浏览器了，可以暂时使用其他浏览器。</p></blockquote><h2 id="2-视频播放器">2. 视频播放器</h2><blockquote><p>看电影怎么能少一个称心如意的播放器呢？Windows 首推 <a href="https://potplayer.org" title="PotPlayer">PotPlayer</a>，而 macOS 首推 <a href="https://www.iina.io" title="IINA">IINA</a></p></blockquote><h3 id="PotPlayer">PotPlayer</h3><ul><li>支持多种视频格式</li><li>支持倍速播放</li><li>简洁干净</li></ul><h2 id="3-下载器">3. 下载器</h2><blockquote><p>由于免不了需要下载一些文件，一款下载速度快的下载软件就显得非常重要了。如果浏览器下载速度还行的话，就不需要下载软件出动了。</p></blockquote><p>推荐使用 <a href="https://motrix.app" title="Motrix">Motrix</a> 去下载一般的文件，尤其对于 GitHub 和 托管在 Amazon 上的文件，下载速度非常可观。针对难以下载的资源，就只能求助于迅雷了。</p><h3 id="解压缩">解压缩</h3><blockquote><p>下载器下载的文件很有可能是压缩的文件，那这个时候，解压缩文件就出场了。</p></blockquote><p>Windows 下推荐使用轻便小巧的 <a href="https://www.7-zip.org" title="7zip">7zip</a>，macOS 下当系统自带的无法解压时，去应用商店下载一个合适的解压缩软件，我目前在用的 <a href="https://ezip.awehunt.com" title="ezip">ezip</a>。</p><h2 id="4-文件查阅处理">4. 文件查阅处理</h2><h3 id="文件查找">文件查找</h3><blockquote><p>电脑在使用一段时间后，文件数会极速增长，与此同时，我们也更加难以知道各个文件的具体所在位置了。那能否可以快速地找到想要的文件呢？</p></blockquote><p><a href="https://www.voidtools.com" title="Everything">Everything</a> 是一款在 Windows 下非常实用的文件查找利器，可以快速定位文件的位置。macOS 用户则可以 Spotlight，更推荐付费使用 Alfred。</p><h3 id="文件处理">文件处理</h3><p>免费的话，我是比较推荐使用 <a href="https://pc.wps.cn" title="WPS">WPS</a>，手机和客户端一应俱全，同步会非常方便。Windows 下存在广告的问题，可以付费去使用 Microsoft Office 365。</p><blockquote><p>由于 WPS 和浏览器都可以支持 PDF 文件的查阅，甚至可以修改，只有需要时再去下载特定的 PDF 软件。</p></blockquote><blockquote><p>如果想要一个便捷的简单文本编辑器，可以使用 <a href="https://code.visualstudio.com" title="VS Code">VS Code</a></p></blockquote><h2 id="5-各种客户端">5. 各种客户端</h2><blockquote><p>当我们拿到一台新电脑的时候，总是会下意识地安装一些客户端软件。这里只是列举一些必要的。</p></blockquote><h3 id="微信电脑客户端">微信电脑客户端</h3><blockquote><p>有了微信客户端，等于我们也有了一个截图工具，加上系统内置的截图工具，应该足够使用了。针对高级的截图需求，再去寻找像 <a href="https://zh.snipaste.com" title="Snipaste">Snipaste</a> 的工具。</p></blockquote><h3 id="网易云音乐客户端">网易云音乐客户端</h3><blockquote><p>为什么没有单独设立一块关于音乐播放器的章节呢？主要是我也找不到一款十分令我满意的一款音乐播放器。网易云音乐是不错，但是音乐版权的缺失是没有办法弥补的。只能通过导入本地音乐资源解决。</p></blockquote><h3 id="其他客户端">其他客户端</h3><blockquote><p>我不确定现在是否还需要 QQ 的电脑客户端。</p></blockquote><blockquote><p>至于邮件客户端，这个看个人喜好的，我一般都是使用网页版的。</p></blockquote><blockquote><p>喜欢看球赛的球友们，可能就需要安装一下 <a href="http://www.pptv.com" title="PPTV">PPTV</a> 客户端了，谁叫 PPTV 网页现在还是 Flash 的呢？</p></blockquote><h2 id="6-快捷启动">6. 快捷启动</h2><blockquote><p>能够快速启动应用程序等快捷操作可以极大得提高使用电脑的效率，节约花费在操作上的时间。</p></blockquote><p><a href="https://www.u.tools" title="uTools">uTools</a> 就是这样一款软件，在使用后，相信你们也会爱不释手的。</p><h2 id="7-其他（准则）">7. 其他（准则）</h2><ol><li>针对在哪里下载软件，一般我都是推荐直接在官网上下载安装，这样是能够保证你所安装的软件是没有经过他人篡改的，比较安全。</li><li>能够在网页端完成的，一般我不会特意去下载客户端进行完成，除非客户端能够完胜网页端的功能和体验（离线功能除外）。</li><li>功能够用的话，无须去下载高级的软件，只在需要时，再去使用更高级的软件。</li><li>少即是多，少才能让人专注，做到物尽其用。</li></ol><hr><blockquote><p>看完这篇文章，有没有让你有一种重新打造重整电脑工作环境的冲动呢？如果内容对你有所帮助，请点赞支持哦！</p></blockquote><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><div align="center">  <img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" width="300px" /></div><div align="center">Knowledge Collision 激发思维碰撞，IDEA 丛生</div>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在日常工作与休闲娱乐中，我们总是离不开电脑的使用，虽然智能手机和平板的横空出世，分流了一大部分的电脑使用场景，但是我们依然无法完全脱离电脑。那下面就带大家讲讲有哪些必需和好用的软件，提升工作效率和娱乐度。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2</summary>
      
    
    
    
    
    <category term="Software" scheme="https://blog.zzhpro.com/tags/Software/"/>
    
  </entry>
  
  <entry>
    <title>深入理解 JVM 内存结构</title>
    <link href="https://blog.zzhpro.com/2020/02/27/jvm/"/>
    <id>https://blog.zzhpro.com/2020/02/27/jvm/</id>
    <published>2020-02-27T23:31:28.000Z</published>
    <updated>2026-04-24T16:17:28.604Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在日常的编程活动中，我们经常使用 Java 编程语言编写代码，那么你们知道每天使用的 Java 语言中对象是分配在内存的何处呢，今天就带大家了解一下 JVM 的内存结构。</p></blockquote><blockquote><p>JVM 的内存区域主要可以分为线程隔离的数据区域和线程共享的数据区域，还有一块经常被我们忽略的直接内存区域。</p></blockquote><h3 id="JVM-运行时数据区域">JVM 运行时数据区域</h3><h4 id="线程隔离的数据区域">线程隔离的数据区域</h4><ul><li>程序计数器(PC)：占用内存空间较小，主要存储字节码的行号指示器，控制程序的执行</li><li>JVM 栈：默认一个线程的栈大小为 1 MB<ul><li>栈帧<ul><li>局部变量表：储存基本数据类型和对象引用（地址信息）<ul><li>方法参数</li><li>局部变量</li></ul></li><li>操作树栈（基于栈的指令集执行）</li><li>动态连接<ul><li>一个指向运行时常量池中该栈帧所属方法的引用</li></ul></li><li>方法出口<ul><li>方法返回地址：主调方法的 PC 计数器值或者发生异常时异常处理器表确定的返回地址</li></ul></li></ul></li></ul></li><li>本地方法栈：为本地方法服务，在 Hotspot 虚拟机中与 JVM 栈合而为一</li></ul><h4 id="线程共享的数据区域">线程共享的数据区域</h4><ul><li>Java 堆：存储对象的实例<ul><li>运行时常量池（Java 8+）<ul><li>字面量</li><li>符号引用<ul><li>类或接口</li><li>字段</li><li>类中方法</li><li>接口中方法</li></ul></li></ul></li></ul></li></ul><h5 id="对象的内存布局">对象的内存布局</h5><ul><li>对象头<ul><li>对象运行时数据（64 位虚拟机为 64 bit，32 位虚拟机则为 32 bit）<ul><li>对象哈希码</li><li>分代年龄</li><li>锁指针</li><li>线程 ID 和时间戳</li><li>锁偏向模式</li><li>锁标志</li></ul></li><li>类型元数据指针（4 byte，64 位虚拟机不开启指针压缩为 8 byte）</li></ul></li><li>实例数据</li><li>对齐填充</li></ul><h3 id="直接内存">直接内存</h3><ul><li>元空间(metaspace)：存储已加载类的元数据（Java 8 引入，代替以前的永久代）</li><li>代码缓存：存储即时编译（JIT）后的代码缓存</li><li>垃圾收集器占用</li><li>直接字节缓存：主要用于 NIO 拷贝数据</li></ul><h2 id="2-垃圾收集算法">2. 垃圾收集算法</h2><h3 id="a-分代收集">a. 分代收集</h3><ul><li>Partial GC：部分区域的垃圾收集<ul><li>Minor GC：新生代垃圾收集</li><li>Major GC：老年代垃圾收集</li><li>Mixed GC：整个新生代和部分老年代的垃圾收集</li></ul></li><li>Full GC：Java 堆和方法区的垃圾收集</li></ul><h3 id="b-垃圾收集算法">b. 垃圾收集算法</h3><ul><li>标记-清除（Mark-Sweep）</li><li>标记-复制（Mark-Copy）</li><li>标记-整理（Mark-Compact）</li></ul><h2 id="3-垃圾收集器">3. 垃圾收集器</h2><blockquote><p>迄今为止，所有的垃圾收集器在根节点枚举的过程中都必须暂停用户线程</p></blockquote><ul><li>Serial + Serial Old：客户端模式下的默认选择，标记-复制收集新生代，标记-整理收集老年代</li><li>ParNew + CMS</li><li>Parallel Scavenge + Parallel Old：Java 9 之前的服务端默认配置</li><li>G1：Java 9 后的服务端默认配置</li></ul><h3 id="三大性能指标">三大性能指标</h3><ul><li>内存占用</li><li>吞吐量</li><li>延迟</li></ul><h3 id="CMS-Concurrent-Mark-Sweep">CMS(Concurrent Mark Sweep)</h3><ul><li>初始标记</li><li>并发标记</li><li>重新标记：使用增量更新</li><li>并发清除</li></ul><blockquote><p>初始标记和重新标记都是需要暂停用户线程的</p></blockquote><h4 id="CMS-的几个缺陷">CMS 的几个缺陷</h4><ul><li>并发对处理器的资源比较敏感，比较适合处理器核数较多的情况（大于 4 核）</li><li>在并发阶段，用户线程可能会分配内存，进而造成老年代区域需要提前进行 GC 操作，一般又一个触发的阈值，太大或者太小都有性能问题</li><li>标记-清除存在内存碎片的问题</li></ul><h3 id="G1">G1</h3><ul><li>初始标记</li><li>并发标记</li><li>最终标记：使用原始快照</li><li>筛选回收</li></ul><blockquote><p>G1 为了维护不同 Region 之间的引用关系，至少需要花费大约相当于 Java 堆内存的 10% ~ 20% 的额外内存来维持收集器的正常工作，比较适合比较大的堆内存使用</p></blockquote><h3 id="低延迟垃圾收集器">低延迟垃圾收集器</h3><h4 id="Shenandoah-收集器">Shenandoah 收集器</h4><blockquote><p>只在 OpenJDK 12+ 的版本出现，使用读屏障和转发指针来实现并发整理</p></blockquote><ul><li>初始标记</li><li>并发标记</li><li>最终标记</li><li>并发清理</li><li>并发回收</li><li>初始引用更新</li><li>并发引用更新</li><li>最终引用更新</li><li>并发清理</li></ul><h4 id="ZGC-收集器">ZGC 收集器</h4><blockquote><p>堆内存布局分为：小，中和大三种 Region。</p><p>使用读屏障和染色指针实现并发整理，但不支持 32 位平台，且不能开启指针压缩</p><p>将垃圾收集的停顿时间限制在 10 ms 以内</p></blockquote><ul><li>初始标记</li><li>并发标记）</li><li>最终标记</li><li>并发预备重分配：扫描所有的 region 区域，确定重分配集</li><li>初始重分配：对重分配集中的 root 对象进行重分配，并更新引用地址信息</li><li>并发重分配：对重分配集中剩下的对象进行重分配（复制到新的 Region），并维护一张转发表，维护旧引用地址信息到新引用地址信息的映射</li><li>并发重映射：将对象引用地址信息进行更新，在并发标记过程中完成</li></ul><h5 id="染色指针">染色指针</h5><p><img src="/2020/02/27/jvm/image-20200913175126639.png" alt="染色指针"></p><ul><li>Finalizable：对象只能被 finalizer 访问</li><li>Remapped：对象引用地址是新的</li><li>Marked 0 和 Marked 1：标记对象是可访问的，同时用于对比前后两次 GC 的结果</li></ul><h5 id="读屏障">读屏障</h5><blockquote><p>从堆中读取对象的引用信息时，会加入读屏障</p></blockquote><ul><li>Remapped 为 1 时，直接返回引用地址</li><li>当对象引用不在重分配集中，将 Remapped 位置为1，并返回引用地址</li><li>当对象在重分配集中，并没有完成重分配，帮助其重分配，并在转发表中创建旧地址到新地址的记录</li><li>根据转发表更新对象的新引用地址，并将 Remapped 设为 1，返回新的引用地址</li></ul><h5 id="JVM-相关配置">JVM 相关配置</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 开启 ZGC</span></span><br><span class="line">-XX:+UnlockExperimentalVMOptions -XX:+UseZGC</span><br><span class="line"><span class="comment"># 并发回收垃圾的线程。默认是总核数的 1/8，调大后 GC 变快，但会占用程序运行时的CPU资源，吞吐会受到影响</span></span><br><span class="line">-XX:ConcGCThreads=2</span><br><span class="line"><span class="comment"># stop the world 时使用的线程数，默认为总核数的 3/5</span></span><br><span class="line">-XX:ParallelGCThreads=6</span><br><span class="line"><span class="comment"># ZGC 发生的最小时间间隔，单位秒。基于固定时间间隔进行触发 ZGC</span></span><br><span class="line">-XX:ZCollectionInterval=120</span><br><span class="line"><span class="comment"># ZGC 触发基于分配速率的自适应算法的修正系数，默认值为 2，数值越大，越早的触发 ZGC </span></span><br><span class="line">-XX:ZAllocationSpikeTolerance=5</span><br><span class="line"><span class="comment"># 不开启 ZGC 的主动回收</span></span><br><span class="line">-XX:+UnlockDiagnosticVMOptions -XX:-ZProactive</span><br></pre></td></tr></table></figure><h3 id="其他商业垃圾收集器">其他商业垃圾收集器</h3><ul><li>IBM J9</li><li>Azul C4</li><li>Azul Zing</li></ul><hr><blockquote><p>看完这篇文章，有没有让你对 JVM 的内存结构有更深的了解呢？如果内容对你有所帮助，请点赞支持哦！</p></blockquote><hr><h2 id="参考文献">参考文献</h2><ol><li><a href="https://www.baeldung.com/jvm-zgc-garbage-collector">An Introduction to ZGC: A Scalable and Experimental Low-Latency JVM Garbage Collector</a></li><li><a href="https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html">新一代垃圾回收器ZGC的探索与实践</a></li></ol><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><center><strong>Knowledge Collision 激发思维碰撞，IDEA 丛生</strong></center>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在日常的编程活动中，我们经常使用 Java 编程语言编写代码，那么你们知道每天使用的 Java 语言中对象是分配在内存的何处呢，今天就带大家了解一下 JVM 的内存结构。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;JVM </summary>
      
    
    
    
    <category term="JVM" scheme="https://blog.zzhpro.com/categories/JVM/"/>
    
    
    <category term="JVM" scheme="https://blog.zzhpro.com/tags/JVM/"/>
    
  </entry>
  
  <entry>
    <title>小而美的 Android 应用</title>
    <link href="https://blog.zzhpro.com/2020/01/19/android-app/"/>
    <id>https://blog.zzhpro.com/2020/01/19/android-app/</id>
    <published>2020-01-19T22:40:58.000Z</published>
    <updated>2026-04-24T16:17:28.356Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>以前一直使用的是 iPhone，最近一年开始使用 Android 手机，这也不可避免的在软件方面需要重新选择。下面就来介绍我觉得 Android 平台的一些好软件。</p></blockquote><h2 id="1-Android-独有的软件">1. Android 独有的软件</h2><h3 id="应用商场">应用商场</h3><blockquote><p>国内的应用软件一般我会在手机自带的应用商场和酷安这两个软件上进行下载安装；而在这两个应用商场没有软件，我会选择使用 APKPure 进行安装。如果你能在 Google Play 安装那自然是更好不过了。</p></blockquote><ul><li><a href="https://www.coolapk.com" title="酷安">酷安</a></li><li><a href="https://apkpure.com" title="APKPure">APKPure</a></li></ul><blockquote><p>酷安上又很多小众的软件，我个人非常喜欢。</p></blockquote><h3 id="新浪微博">新浪微博</h3><ul><li><a href="https://www.coolapk.com/apk/com.hengye.share" title="Share 微博客户端">Share 微博客户端</a></li></ul><blockquote><p>个人非常喜欢的第三方微博客户端，没有广告，体验是真的号。除了每次升级过后，残忍拒绝一下它的高级版诱惑。</p></blockquote><p><img src="https://i.loli.net/2020/01/19/efld8LzaSOZx6BD.jpg" alt="Share 微博客户端"></p><h3 id="浏览器">浏览器</h3><ul><li><a href="https://www.coolapk.com/apk/mark.via" title="Via 浏览器">Via 浏览器</a></li></ul><blockquote><p>不多说了，500 KB 的浏览器，你值得拥有。</p></blockquote><h3 id="网易新闻">网易新闻</h3><ul><li><a href="https://www.coolapk.com/apk/androidnews.kiloproject" title="Mere 新闻">Mere 新闻</a></li></ul><blockquote><p>没有广告，没有多余内容的新闻阅读体验，不要太舒服哦。</p></blockquote><p><img src="https://i.loli.net/2020/01/19/xb1kBcMVziyNGm5.jpg" alt="Mere 新闻"></p><h3 id="日记">日记</h3><ul><li><a href="https://coolapk.com/apk/com.candydiary.dawn" title="时间戳日记">时间戳日记</a></li></ul><blockquote><p>其实我主要是喜欢基于时间线的记录风格，如果能在桌面端操作就完美了。</p></blockquote><h3 id="倒计时">倒计时</h3><ul><li><a href="https://www.coolapk.com/apk/com.imzhiqiang.time" title="时光提醒">时光提醒</a></li></ul><blockquote><p>比倒数日更美观的 UI 页面，时钟式的显示方式很有感觉</p></blockquote><p><img src="https://i.loli.net/2020/01/19/p5KoJMtvATNUcz1.png" alt="时光提醒"></p><h3 id="RSS">RSS</h3><ul><li><a href="https://apkpure.com/flym-news-reader/net.frju.flym" title="Flym">Flym</a></li></ul><blockquote><p>个人比较后的选择，也可以选择国内的 Rolly（付费去广告）</p></blockquote><h3 id="地图">地图</h3><ul><li><a href="https://www.coolapk.com/apk/me.gfuil.bmap" title="Bmap 白马地图">Bmap 白马地图</a></li></ul><blockquote><p>没有广告的地图，用的不习惯的可以用回百度地图</p></blockquote><h3 id="阅读">阅读</h3><ul><li><a href="https://www.coolapk.com/apk/cn.deepink.reader" title="厚墨">厚墨</a></li></ul><blockquote><p>阅读电子书的体验较好，同时也支持一些 RSS 的订阅</p></blockquote><p><img src="https://i.loli.net/2020/01/19/AuNTErCMR4LfGao.jpg" alt="厚墨"></p><hr><blockquote><p>如果大家有更好的软件推荐，可以在留言区讨论哦</p></blockquote><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><p><code>Knowledge Collision 激发思维碰撞，IDEA 丛生</code></p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;以前一直使用的是 iPhone，最近一年开始使用 Android 手机，这也不可避免的在软件方面需要重新选择。下面就来介绍我觉得 Android 平台的一些好软件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-Android-独有的软件</summary>
      
    
    
    
    
    <category term="Android" scheme="https://blog.zzhpro.com/tags/Android/"/>
    
  </entry>
  
  <entry>
    <title>深入理解 Java Map</title>
    <link href="https://blog.zzhpro.com/2020/01/02/java-map/"/>
    <id>https://blog.zzhpro.com/2020/01/02/java-map/</id>
    <published>2020-01-02T14:05:51.000Z</published>
    <updated>2026-04-24T16:17:28.604Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在日常的编程活动中，使用 Map 类型是十分常见的，那么你们知道每天使用的 Map 底层是如何实现的呢？今天就带大家来深入了解一下内部的构造。</p></blockquote><h2 id="1-常见的-Map-类型">1. 常见的 Map 类型</h2><ul><li>HashMap</li><li>HashTable</li><li>ConcurrentHashMap</li></ul><h2 id="2-HashMap">2. HashMap</h2><h3 id="a-存储结构">a. 存储结构</h3><p>HashMap 的底层结构采用可扩容的动态数组，而数组中的每个格子里则存储着另一种结构，它有两种可能性：</p><ol><li>当元素个数较少时，存储的是一个链表结构</li><li>当元素个数大于等于一个阈值（默认是8）时，存储的是一个红黑树（Java 8 才引入的），而在扩容中会去判断是否需要转换成链表结构</li></ol><blockquote><p>引入红黑树的目的是减少链表查找的时间开销，从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">{O(n)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span></span> 减少到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>log</mi><mo>⁡</mo><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">{O(\log(n))}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">))</span></span></span></span></span></p></blockquote><h4 id="初始数组大小-capacity">初始数组大小(capacity)</h4><p>在 Java 8 中的 HashMap 的初始大小设置为 16，是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 的整数次方，之所以选择 16，其实更多的是一种经验值，其实只要是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 的大小都是合适的。</p><p>之所以选择 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 作为容量，当数组扩容则是在原来容量的基础上增大一倍，其容量变成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">{2^{n+1}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></span>，依然是 2 的整数次幂。而这样做的目的是为了减小取模运算的开销，因为对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 进行取模操作可以简化为位运算。</p><p>数组的下标位置从 0 ~ <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">{2^n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span></span></span>，而 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">{2^n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span></span></span> 的二进制表示为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mn>1111</mn></mrow><annotation encoding="application/x-tex">{....1111}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord"><span class="mord">....1111</span></span></span></span></span>，数组位置的计算从而可以变成如下的位运算：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>i</mi><mi>n</mi><mi>d</mi><mi>e</mi><mi>x</mi><mo>=</mo><mi>h</mi><mi>a</mi><mi>s</mi><mi>h</mi><mi mathvariant="normal">&amp;</mi><mo stretchy="false">(</mo><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">{index = hash \&amp; (2^n-1)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">in</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">ha</span><span class="mord mathnormal">s</span><span class="mord mathnormal">h</span><span class="mord">&amp;</span><span class="mopen">(</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></span></span></p><p>而当扩容时，重新计算数组新位置的时候，相当于多了一个最新高一位的与运算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>h</mi><mi>a</mi><mi>s</mi><mi>h</mi><mi mathvariant="normal">&amp;</mi><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{result = hash \&amp; 2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord mathnormal">res</span><span class="mord mathnormal">u</span><span class="mord mathnormal">lt</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">ha</span><span class="mord mathnormal">s</span><span class="mord mathnormal">h</span><span class="mord">&amp;</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span>，其结果不是 0 就是 1，因此重新的计算的数组位置就只有以下两种可能，大大减小了 rehash 的开销：</p><ol><li>原来存储的数组位置</li><li>原来位置向后移动 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 的新位置</li></ol><p>那大家可能会问，HashMap 不是支持自定义的初始大小吗，那就不符合上面的简化运算的要求了。而现实是的确考虑到了这一点，所以在初始化时，会计算得到一个比传入数据大的最近的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 值，然后赋值为初始容量。</p><p>计算最近的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 值的代码如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> -<span class="number">1</span> &gt;&gt;&gt; Integer.numberOfLeadingZeros(cap - <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">numberOfLeadingZeros</span><span class="params">(<span class="type">int</span> i)</span> &#123;</span><br><span class="line"><span class="comment">// HD, Count leading 0&#x27;s</span></span><br><span class="line"><span class="keyword">if</span> (i &lt;= <span class="number">0</span>)</span><br><span class="line"><span class="keyword">return</span> i == <span class="number">0</span> ? <span class="number">32</span> : <span class="number">0</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> <span class="number">31</span>;</span><br><span class="line"><span class="keyword">if</span> (i &gt;= <span class="number">1</span> &lt;&lt; <span class="number">16</span>) &#123; n -= <span class="number">16</span>; i &gt;&gt;&gt;= <span class="number">16</span>; &#125;</span><br><span class="line"><span class="keyword">if</span> (i &gt;= <span class="number">1</span> &lt;&lt;  <span class="number">8</span>) &#123; n -=  <span class="number">8</span>; i &gt;&gt;&gt;=  <span class="number">8</span>; &#125;</span><br><span class="line"><span class="keyword">if</span> (i &gt;= <span class="number">1</span> &lt;&lt;  <span class="number">4</span>) &#123; n -=  <span class="number">4</span>; i &gt;&gt;&gt;=  <span class="number">4</span>; &#125;</span><br><span class="line"><span class="keyword">if</span> (i &gt;= <span class="number">1</span> &lt;&lt;  <span class="number">2</span>) &#123; n -=  <span class="number">2</span>; i &gt;&gt;&gt;=  <span class="number">2</span>; &#125;</span><br><span class="line"><span class="keyword">return</span> n - (i &gt;&gt;&gt; <span class="number">1</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="负载因子-loadFactor-和扩容阈值-threshold">负载因子(loadFactor)和扩容阈值(threshold)</h4><p>这里简单介绍一下负载因子和扩容阈值的概念。这两个值有着如下的关系：</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mi>h</mi><mi>r</mi><mi>e</mi><mi>s</mi><mi>h</mi><mi>o</mi><mi>l</mi><mi>d</mi><mo>=</mo><mi>c</mi><mi>a</mi><mi>p</mi><mi>a</mi><mi>c</mi><mi>i</mi><mi>t</mi><mi>y</mi><mo>∗</mo><mi>l</mi><mi>o</mi><mi>a</mi><mi>d</mi><mi>F</mi><mi>a</mi><mi>c</mi><mi>t</mi><mi>o</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">{threshold = capacity * loadFactor}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">t</span><span class="mord mathnormal">h</span><span class="mord mathnormal">res</span><span class="mord mathnormal">h</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">c</span><span class="mord mathnormal">a</span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">c</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">o</span><span class="mord mathnormal">a</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mord mathnormal">a</span><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">or</span></span></span></span></span></p><p>默认的负载因子是 0.75，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn>3</mn><mn>4</mn></mfrac></mrow><annotation encoding="application/x-tex">{\frac{3}{4}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span>，当元素实际个数大于容量的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn>3</mn><mn>4</mn></mfrac></mrow><annotation encoding="application/x-tex">{\frac{3}{4}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">4</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span> 时则进行扩容操作。</p><blockquote><p>从这个公式可以看出当容量为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 时，threashold 是一个整数，不需要进行向下取整操作。</p></blockquote><h4 id="特别">特别</h4><p>hashmap 是可以存储 key 值为 null 的，其 hashcode 为 0，即会存储在数组位置为 0 的地方。</p><h3 id="b-数组元素结构-Node">b. 数组元素结构(Node)</h3><h4 id="链表结构">链表结构</h4><ul><li>hash：该位置的 hash 值</li><li>key：该位置的键值</li><li>value：该位置的数值</li><li>next：指向下一个 Node 节点</li></ul><h4 id="树结构">树结构</h4><blockquote><p>继承上述的链表结构，多了一些属性。这里不详细介绍红黑树，下次有机会单独讲解红黑树的知识。</p></blockquote><p>树节点是根据 key 的 hashcode 进行组织的，通常而言，树节点占据的空间要比普通节点大一倍。</p><ul><li>parent：父亲节点</li><li>left：左儿子节点</li><li>right：右儿子节点</li><li>prev：前面的节点，主要用于删除操作</li><li>red：判断节点是红色还是黑色</li></ul><h3 id="c-写入操作">c. 写入操作</h3><blockquote><p>在初始化的过程中，并不会进行动态数组的创建，相反是在第一个写入操作时才去创建数组，这样可以减少内存的开销。</p></blockquote><ol><li>判断数组是否已经创建，没有则创建</li><li>计算插入数据的 hash 值，根据 hash 值计算得到数组的位置</li><li>将数据插入到计算得到的数组位置<ul><li>数组位置没有任何元素<ul><li>直接插入</li></ul></li><li>数组位置上已经有元素，判断存储元素的类型<ul><li>红黑树节点，插入在树中的某个位置</li><li>链表，先进行插入操作，然后判断是否需要转换成红黑树，<strong>当底层数组小于 64 时，不会转化成红黑树而是直接扩容</strong></li></ul></li></ul></li><li>插入完成后，判断是否需要进行扩容，如需要则进行扩容操作</li></ol><h3 id="d-读取操作">d. 读取操作</h3><ol><li>根据 key 值计算得到 hash 值，进而得到数组的位置</li><li>取出数组位置的元素，判断是否为空，进而判断是否是想找的元素</li><li>判断节点类型<ul><li>树节点，在树中进行查找</li><li>链表节点：在链表中进行查找</li></ul></li><li>没有找到，则返回空</li></ol><h4 id="e-删除操作">e. 删除操作</h4><blockquote><p>删除操作和查找操作非常类似，只是在最后需要进行删除操作（元素存在的情况下），不过需要注意删除根节点的情况，即删除数组位置里的第一个元素</p></blockquote><h2 id="2-HashTable">2. HashTable</h2><p>HashTable 可以认为是 HashMap 的线程安全版，很多方面都是类似的。这里主要分析以下两者的差异</p><h3 id="初始容量的不同">初始容量的不同</h3><p>HashTable 的初始容量为 11，扩容的大小为原来的两倍加一，而 HashMap 的初始容量为 16，扩容为原来的两倍。这里可以看出 HashTable 的容量并不是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span>，因此它在计算数组位置的时候采用的是取模操作，因此在效率上要差一些的。</p><p>另一点不同则是 HashTable 在初始化的时候就已经分配了数组的空间。</p><h3 id="所有操作都加了-synchronized-关键字">所有操作都加了 synchronized 关键字</h3><p>由于在方法上加了同步锁，HashTable 的并发性能并不是很好。而利用 modcount 进行类似版本的管理（悲观锁）导致性能更差。</p><h3 id="是否允许插入-Null-值">是否允许插入 Null 值</h3><p>HashMap 允许插入 Null 值的 Key 和 Value 的，而 HashTable 则不允许。主要是无法在并发操作中无法区分是元素是否存在还是为空。</p><h3 id="迭代机制">迭代机制</h3><p>HashMap 是 fail-fast，而 HashTable fail-safe 的。</p><blockquote><p>fail-safe：安全失败机制，此次读到的值不一定是最新的，允许并发修改</p></blockquote><blockquote><p>fail-fast：快速失败机制，是集合的一种机制，在迭代过程中对元素的修改会立刻报错</p></blockquote><h2 id="3-ConcurrentHashMap">3. ConcurrentHashMap</h2><blockquote><p>HashMap 不支持并发，而 HashTable 性能又这么差，那并发的需求我们到底应该使用什么呢？哈哈，其实 Java 还有 ConcurrentHashMap。</p></blockquote><h3 id="线程安全的实现">线程安全的实现</h3><p>Java 8 采用 CAS + synchronized 的方式来实现并发，抛弃了 Java 7 采用的 Segment 分段锁的方式。并用 volatile 关键字去保证 Map 中数值的可见行。</p><p>其中 CAS 主要用于数组元素为空，即第一次插入到该数组位置中；而 synchronized 则用于数组位置已经存在元素的情况，在进行操作时，锁住该位置上的节点。</p><blockquote><p>CAS(Compare And Swap)：是一种乐观锁的实现，同时也是一种轻量级锁。其原理首先记录拿到的原来的值，然后操作数据，等到要真正更新数据时，再次那一次值，并跟记录的原来的值进行相等的判断，如果不相等，则重新进行该操作，如果相等则可以真正更新数据。为了更好地知道数值是否更改过，可以记录版本号、时间戳等信息。</p></blockquote><h4 id="synchronized-获取锁（锁升级）的过程">synchronized 获取锁（锁升级）的过程</h4><ol><li>偏向锁</li><li>CAS 轻量级锁，并有短暂的自旋</li><li>重量级锁</li></ol><h3 id="与-HashMap-操作的不同">与 HashMap 操作的不同</h3><ol><li><s>ConCurrentHashMap 在插入过程中是首先插入，进而再去判断是否需要将链表结构转换成红黑树结构，而 HashMap 则是先判断，再插入。</s></li></ol><h4 id="读取操作">读取操作</h4><p>通过使 Node 节点元素 val 和 next 指针设置为 volatile，使得可以不通过加锁的方式就能够读取相应的值。<br>值得注意的是在扩容状态下读取时，可能会去新的数组下进行查找。另外也有可能是红黑树结构，需要通过读写锁在红黑树下进行查找。</p><h4 id="扩容操作">扩容操作</h4><blockquote><p>数组用 volatile 修饰来保证在数组扩容的时候对各个扩容线程保证其可见性。</p></blockquote><hr><blockquote><p>看完这篇文章，有没有让你对 Java Map 有更深的了解呢？如果内容对你有所帮助，请点赞支持哦！</p></blockquote><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><p><code>Knowledge Collision 激发思维碰撞，IDEA 丛生</code></p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在日常的编程活动中，使用 Map 类型是十分常见的，那么你们知道每天使用的 Map 底层是如何实现的呢？今天就带大家来深入了解一下内部的构造。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-常见的-Map-类型&quot;&gt;1. 常见的 Map 类</summary>
      
    
    
    
    <category term="Java" scheme="https://blog.zzhpro.com/categories/Java/"/>
    
    
    <category term="Java" scheme="https://blog.zzhpro.com/tags/Java/"/>
    
  </entry>
  
  <entry>
    <title>写在 2020 年前的技术趋势分享</title>
    <link href="https://blog.zzhpro.com/2020/01/02/2020-tech-trend/"/>
    <id>https://blog.zzhpro.com/2020/01/02/2020-tech-trend/</id>
    <published>2020-01-02T13:59:17.000Z</published>
    <updated>2026-04-24T16:17:28.356Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>是不是每天都在面对繁杂无比的业务代码，是时候出来走走，舒缓一下心情，浏览一下外面最前沿的技术趋势。</p></blockquote><h2 id="1-容器安全">1. 容器安全</h2><p><strong>现在</strong>越来越多的应用是使用容器（Docker）进行部署在生产环境，容器由于比虚拟机更加轻量便捷，及其容易扩展的特点广受大家喜爱。于此同时，容器的安全问题也受到越来越多人的关注。</p><p>一种行之有效的做法就是在 CI/CD 的过程中对容器进行安全扫描。</p><h3 id="trivy：容器漏洞扫描程序">trivy：容器漏洞扫描程序</h3><p><a href="https://github.com/aquasecurity/trivy" title="trivy">trivy</a> 是一个容器漏洞扫描工具，它可以检测出容器的操作系统以及应用所用依赖的漏洞和瑕疵，提早在生产环境中发现潜在的安全问题。</p><p>安装方法可以参考文章底部的链接，在安装完成后，其检查容器的命令是非常简单明了的。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 推荐不要检查使用 latest 标签的容器</span></span><br><span class="line">trivy [YOUR_IMAGE_NAME]</span><br></pre></td></tr></table></figure><h3 id="容器的二进制鉴证">容器的二进制鉴证</h3><p>除了容器的漏洞需要提防，容器有没有被篡改过也是一件值得关注的安全问题。</p><p><a href="https://cloud.google.com/binary-authorization" title="GCP Binary Authorization">Google Cloud Binary Authorization</a> 提供了二进制授权，只允许签名被认可的容器被部署。但其与特定云厂商绑定，不太适合所有的场景。</p><p><a href="https://in-toto.io" title="in-toto">in-toto</a> 用来保证软件生产环节中的安全性；<a href="https://docs.docker.com/ee/dtr" title="Docker Notary">Docker Notary</a> 和 <a href="https://docs.docker.com/ee/dtr/" title="Docker Trusted Registry">Docker Trusted Registry</a> 是其他的选择。</p><h2 id="2-基础设施即代码的流水线">2. 基础设施即代码的流水线</h2><p>现在环境的生成（使用如 Terraform， CloudFormation 自动生成云环境），服务的配置使用脚本（如 Ansible playbook）进行生成。通过对上述基础即代码的项目 CI/CD 的成功简历，可以在每次修改配置时提早发现此次修改变更的错误以及可靠性。相信在未来的一段时间里会受到越来越多人的关注。</p><h2 id="3-JVM-框架">3. JVM 框架</h2><p>由于 Oracle GraalVM 的横空出世，其支持多种编程语言，启动速度更快以及更少的内存占用，也催化了一些优秀的 Java 框架。</p><h3 id="Micronaut">Micronaut</h3><p><a href="https://micronaut.io" title="Micronaut">Micronaut</a> 是一个 JVM 全栈框架，比较适合构建微服务和无服务应用。由于其使用 Netty，对响应式编程也提供了一流的支持。另外没有使用运行时反射来进行依赖注入，而是在编译是进行依赖注入，因此有了启动快，占用内存少的特点。</p><p>此外，<a href="https://quarkus.io" title="Quarkus">Quarkus</a> 是与 Micronaut 类似的 JVM 框架，感兴趣的小伙伴可以去了解一下。</p><h2 id="4-实用工具">4. 实用工具</h2><p>本人比较喜欢折腾工具，因为一直认为好的工具可以提高自己的效率，节省不必要的时间开销。下面我就介绍两个在日常使用中频率较高的工具。</p><h3 id="Draw-io：画图工具"><a href="http://Draw.io">Draw.io</a>：画图工具</h3><p>其实市面上很少有能在三大操作系统（Windows，Linux，macOS）都能运行的画图软件，免费，功能齐全，并提供客户端的画图软件更是少之又少。<a href="https://github.com/jgraph/drawio-desktop" title="Draw.io Desktop">Draw.io Desktop</a> 是对网页版的封装，完美支持三个操作系统，并支持流程图，UML 等多种图的类型。想要下载请参考 <a href="https://github.com/jgraph/drawio-desktop/releases" title="Draw.io Desktop 下载链接">Draw.io Desktop 下载链接</a>。</p><h3 id="Git-Commit-规范软件">Git Commit 规范软件</h3><p><a href="http://commitizen.github.io/cz-cli" title="Commitizen">Commitizen</a> 是一款对代码提交规范约束的软件。</p><h4 id="安装及配置">安装及配置</h4><p>安装是非常简单的，只要你的电脑有 Node，可以直接安装，不然可以先去安装 <a href="https://nodejs.org" title="Node.js">Node</a>。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">npm install -g commitizen</span><br><span class="line">npm install -g cz-conventional-changelog</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;&#123; &quot;path&quot;: &quot;cz-conventional-changelog&quot; &#125;&#x27;</span> &gt; ~/.czrc</span><br></pre></td></tr></table></figure><h4 id="使用">使用</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 提交代码，代替 git commit 的作用</span></span><br><span class="line">git cz</span><br></pre></td></tr></table></figure><h4 id="总结">总结</h4><p>本人觉得 Commitizen 是比较适合 Node 项目的，如果大家有更好的选择，可以留言告诉我哦。</p><hr><blockquote><p>看完这篇文章，有没有让你对新的技术趋势有所了解呢？如果内容对你有所帮助，请点赞支持哦！</p></blockquote><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><p><code>Knowledge Collision 激发思维碰撞，IDEA 丛生</code></p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;是不是每天都在面对繁杂无比的业务代码，是时候出来走走，舒缓一下心情，浏览一下外面最前沿的技术趋势。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-容器安全&quot;&gt;1. 容器安全&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;现在&lt;/strong&gt;越来越多的</summary>
      
    
    
    
    
    <category term="technology" scheme="https://blog.zzhpro.com/tags/technology/"/>
    
  </entry>
  
  <entry>
    <title>轻松管理不同的 Java 版本</title>
    <link href="https://blog.zzhpro.com/2019/11/02/java-version-management/"/>
    <id>https://blog.zzhpro.com/2019/11/02/java-version-management/</id>
    <published>2019-11-02T10:50:01.000Z</published>
    <updated>2026-04-24T16:17:28.604Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>是不是每次换新电脑或者安装了新系统，都要烦恼应该如何下载安装 Java 以及进行相应的配置？今天就来介绍一下如何从这种烦恼中解脱出来。</p></blockquote><h2 id="1-Java-版本控制工具">1. Java 版本控制工具</h2><p>普通常规的安装配置方式除了步骤繁琐以外，最大的缺陷就在于不能支持 Java 版本的快速切换，其必须通过更改环境变量的方式进行版本切换。</p><p>针对以上的问题，我们需要选择一款 Java 版本控制工具，将我们从烦恼中解脱出来。以下是我找的几款工具：</p><ul><li><a href="https://github.com/sdkman/sdkman-cli" title="sdkman">sdkman</a>: <code>https://github.com/sdkman/sdkman-cli</code></li><li><a href="https://github.com/shyiko/jabba" title="jabba">jabba</a>: <code>https://github.com/shyiko/jabba</code></li><li><a href="https://github.com/jenv/jenv" title="jenv">jenv</a>: <code>https://github.com/jenv/jenv</code></li></ul><h2 id="2-抉择">2. 抉择</h2><p>考虑到工具的维护情况，本人选择了 <strong>sdkman</strong> 作为目前 Java 版本控制的工具。如果需要安装 <code>Orcale JDK</code>，可以考虑使用 <strong>jabba</strong>（<strong>sdkman</strong> 不支持下载），个人推荐安装 <code>AdpotOpenJDK</code>。</p><h2 id="3-配置-sdkman">3. 配置 sdkman</h2><p>由于本人使用的是 <strong>macOS</strong> 和 <strong>Ubuntu</strong>，下面的步骤都是基于这些系统，<a href="https://sdkman.io/install" title="Windows 安装 sdkman">Windows 安装 sdkman</a> 详见彩蛋部分。</p><h3 id="3-1-安装-sdkman">3.1 安装 sdkman</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -s <span class="string">&quot;https://get.sdkman.io&quot;</span> | bash</span><br></pre></td></tr></table></figure><blockquote><p>提醒：安装成功后，关闭终端并重新打开一个新终端</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 验证 sdkman 是否安装成功</span></span><br><span class="line">sdk version</span><br></pre></td></tr></table></figure><h3 id="3-2-sdkman-升级">3.2 sdkman 升级</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sdk selfupdate</span><br></pre></td></tr></table></figure><h3 id="3-3-sdkman-版本库更新">3.3 sdkman 版本库更新</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sdk update</span><br></pre></td></tr></table></figure><h2 id="4-安装配置-Java">4. 安装配置 Java</h2><h3 id="4-1-列举可安装（已安装）的-Java-版本">4.1 列举可安装（已安装）的 Java 版本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sdk list java</span><br></pre></td></tr></table></figure><blockquote><p>建议：推荐安装 AdpotOpenJDK 和 Amazon 的 Java 版本</p></blockquote><h3 id="4-2-安装指定-Java-版本">4.2 安装指定 Java 版本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sdk install java 14.0.1.hs-adpt</span><br></pre></td></tr></table></figure><h3 id="4-3-查看当前-Java-版本">4.3 查看当前 Java 版本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sdk current java</span><br></pre></td></tr></table></figure><h3 id="4-4-指定默认-Java-版本">4.4 指定默认 Java 版本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 永久切换</span></span><br><span class="line">sdk default java 114.0.1.hs-adpt</span><br><span class="line"></span><br><span class="line"><span class="comment"># 临时切换，只在当前终端有效</span></span><br><span class="line">sdk use java 14.0.1.hs-adpt</span><br></pre></td></tr></table></figure><h3 id="4-5-删除指定的-Java-版本">4.5 删除指定的 Java 版本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sdk uninstall java 14.0.1.hs-adpt</span><br></pre></td></tr></table></figure><h2 id="5-查看-Java-安装路径">5 查看 Java 安装路径</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">where</span> java</span><br><span class="line"></span><br><span class="line"><span class="comment"># 默认路径</span></span><br><span class="line"><span class="comment"># ～/.sdkman/candidates/java/current/bin/java</span></span><br></pre></td></tr></table></figure><h3 id="5-1-配置-Intellij-IDEA-的-Java-路径">5.1 配置 Intellij IDEA 的 Java 路径</h3><hr><h2 id="彩蛋">彩蛋</h2><h3 id="Windows-怎样配置">Windows 怎样配置</h3><blockquote><p>根据 <a href="https://sdkman.io/install">https://sdkman.io/install</a> 的介绍，其有三种方式进行安装 sdkman</p></blockquote><p>这里只针对 Git Bash 这种情况，参考了 <a href="https://ranxing.wordpress.com/2016/12/13/add-zip-into-git-bash-on-windows">https://ranxing.wordpress.com/2016/12/13/add-zip-into-git-bash-on-windows</a></p><ol><li>Go to the following link <a href="https://sourceforge.net/projects/gnuwin32/files/">https://sourceforge.net/projects/gnuwin32/files/</a></li><li>Find out whatever command you are missing<br>Here I need zip and bzip2 for zip command. Because zip command relies on bzip2.dll to run. Otherwise you will get error “error while loading shared libraries: ?: cannot open shared object file: No such file or directory”.</li><li>Unzip the downloaded files<br>Here I am downloading “zip-3.0-bin.zip” for “zip.exe” and “bzip2-1.0.5-bin.zip” for “bzip2.dll” in the bin folder. <code>&lt;unzipped file&gt;/bin/&lt;command&gt;.exe</code></li><li>Copy the command exe file into git-bash folder Here I am copying “zip.exe” and “bzip2.dll” to <code>&lt;Program folder&gt;\Git\usr\bin</code>.</li></ol><blockquote><p>看完这篇文章，有没有让你从 Java 安装配置中解脱出来呢？</p></blockquote><blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p></blockquote><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><p><code>Knowledge Collision 激发思维碰撞，IDEA 丛生</code></p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;是不是每次换新电脑或者安装了新系统，都要烦恼应该如何下载安装 Java 以及进行相应的配置？今天就来介绍一下如何从这种烦恼中解脱出来。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-Java-版本控制工具&quot;&gt;1. Java 版本控制工具&lt;</summary>
      
    
    
    
    <category term="Java" scheme="https://blog.zzhpro.com/categories/Java/"/>
    
    
    <category term="Java" scheme="https://blog.zzhpro.com/tags/Java/"/>
    
  </entry>
  
  <entry>
    <title>2019 软件工程师现状</title>
    <link href="https://blog.zzhpro.com/2019/11/02/2019-software-engineer-situation/"/>
    <id>https://blog.zzhpro.com/2019/11/02/2019-software-engineer-situation/</id>
    <published>2019-11-02T10:32:43.000Z</published>
    <updated>2026-04-24T16:17:28.332Z</updated>
    
    <content type="html"><![CDATA[<h3 id="热门工作（需求增长率）">热门工作（需求增长率）</h3><ul><li>区块链工程师（517%）</li><li>安全工程师（132%）</li><li>数据工程师（38%）</li><li>后端工程师（33%）</li><li>机器学习工程师（27%）</li><li>全栈工程师（7%）</li></ul><h3 id="最受欢迎的编程语言">最受欢迎的编程语言</h3><ul><li>Go</li><li>Scale</li><li>Ruby</li><li>TypeScript</li><li>Kotlin</li></ul><h3 id="最常使用的编程语言">最常使用的编程语言</h3><ul><li><p>JavaScript（62%）</p></li><li><p>Java（42%）</p></li><li><p>Python（42%）</p></li><li><p>HTML（36%）</p></li><li><p>C++（14%）</p></li><li><p>TypeScript（12%）</p></li><li><p>Ruby（10%）</p></li><li><p>Go（7%）</p></li><li><p>Scale（3%）</p></li><li><p>Kotlin（2%）</p></li></ul><h3 id="编程习惯">编程习惯</h3><blockquote><p>56% 喜欢使用 Tabs，而 24% 喜欢 Spaces</p></blockquote><blockquote><p>37% 喜欢动态语言，而 23% 喜欢静态语言</p></blockquote><h3 id="面试">面试</h3><blockquote><p>经验为王</p></blockquote><blockquote><p>46% 有计算机科学教育文凭，而 21% 通过自学的方式获得计算机科学知识</p></blockquote><h4 id="最难的面试环节">最难的面试环节</h4><ul><li>编程测试</li><li>白板会议</li><li>行为面试</li></ul><h3 id="想学习的热门技术">想学习的热门技术</h3><ul><li>机器学习</li><li>用户体验</li><li>区块链</li></ul><h3 id="工作方式">工作方式</h3><blockquote><p>工程师最喜欢结对编程的工作方式</p></blockquote><blockquote><p>结对编程对初级工程师有好处，但对于有更多经验的人意义不大</p></blockquote><blockquote><p>工程师比较希望能够为开源项目进行贡献</p></blockquote><blockquote><p>63% 宁愿早睡早起，也不想晚上工作，而 38% 讨厌不切实际的最后期限</p></blockquote><h3 id="竞争力">竞争力</h3><ul><li>持续学习</li><li>了解最新科技需求</li></ul><p>[^note]</p><blockquote><p>2019 The State of Software Engineers</p></blockquote><blockquote><p><a href="https://hired.com/page/state-of-software-engineers/key-takeaways/">https://hired.com/page/state-of-software-engineers/key-takeaways/</a></p></blockquote><p>更多精彩内容请<ruby>关注<rt>扫码</rt></ruby>：</p><p><img src="https://i.loli.net/2019/05/18/5cdf686a103cf11418.jpg" alt="KnowledgeCollision 微信公众号"></p><p><code>Knowledge Collision 激发思维碰撞，IDEA 丛生</code></p>]]></content>
    
    
    <summary type="html">2019 软件工程师现状</summary>
    
    
    
    
    <category term="Development" scheme="https://blog.zzhpro.com/tags/Development/"/>
    
  </entry>
  
</feed>
