<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>flytreeleft</name>
    <email>flytreeleft@crazydan.org</email>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <icon>https://www.gravatar.com/avatar/a7961defc40be0ce8c4366eb6424b980</icon>
  <id>https://flytreeleft.crazydan.org/</id>
  <link href="https://flytreeleft.crazydan.org/" rel="alternate"/>
  <link href="https://flytreeleft.crazydan.org/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, flytreeleft</rights>
  <subtitle>Keep it simple, stupid!</subtitle>
  <title>flytreeleft's Blog</title>
  <updated>2023-06-02T06:16:16.000Z</updated>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="家居家电" scheme="https://flytreeleft.crazydan.org/categories/%E5%AE%B6%E5%B1%85%E5%AE%B6%E7%94%B5/"/>
    <category term="图文教程" scheme="https://flytreeleft.crazydan.org/categories/%E5%AE%B6%E5%B1%85%E5%AE%B6%E7%94%B5/%E5%9B%BE%E6%96%87%E6%95%99%E7%A8%8B/"/>
    <category term="面包机" scheme="https://flytreeleft.crazydan.org/tags/%E9%9D%A2%E5%8C%85%E6%9C%BA/"/>
    <category term="柏翠" scheme="https://flytreeleft.crazydan.org/tags/%E6%9F%8F%E7%BF%A0/"/>
    <category term="柏翠 PE6600" scheme="https://flytreeleft.crazydan.org/tags/%E6%9F%8F%E7%BF%A0-PE6600/"/>
    <category term="PETRVS PE6600" scheme="https://flytreeleft.crazydan.org/tags/PETRVS-PE6600/"/>
    <id>https://flytreeleft.crazydan.org/the-usage-of-petrvs-pe6600/</id>
    <link href="https://flytreeleft.crazydan.org/the-usage-of-petrvs-pe6600/"/>
    <published>2023-06-02T03:23:14.000Z</published>
    <summary>
      <![CDATA[<p>柏翠面包机 PE6600 图文教程及其食谱。</p>
<p>食谱和教程应该适用于柏翠面包机系列的机器，其他型号也可以参考本教程。</p>
<p>注意，做面包的原料最好选用专门的<strong>面包粉</strong>（蛋白质含量大于 13%）和<strong>耐高糖酵母</strong>。</p>]]>
    </summary>
    <title>柏翠面包机 PE6600 图文教程</title>
    <updated>2023-06-02T06:16:16.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="JVM内存分析" scheme="https://flytreeleft.crazydan.org/categories/JVM%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/"/>
    <category term="线程死锁" scheme="https://flytreeleft.crazydan.org/tags/%E7%BA%BF%E7%A8%8B%E6%AD%BB%E9%94%81/"/>
    <id>https://flytreeleft.crazydan.org/the-jvm-dump-analyse-for-the-thread-dead-lock/</id>
    <link href="https://flytreeleft.crazydan.org/the-jvm-dump-analyse-for-the-thread-dead-lock/"/>
    <published>2019-10-07T14:50:34.000Z</published>
    <summary>
      <![CDATA[<h2 id="提要"><a href="#提要" class="headerlink" title="提要"></a>提要</h2><p>线程转储可用于分析Java应用在某一运行时刻的内部线程的运行情况，包括线程数、线程状态（死锁、运行、等待等），并且可得到线程的执行轨迹，对于分析线程死锁十分有益。</p>
<p>通过JDK内置的工具<code>jstack</code>可转储Java线程：<code>sudo -u tomcat jstack -l &lt;java_pid&gt; &gt; jstack.dump</code>，注意，<code>&lt;java_pid&gt;</code>为主进程ID，无法dump某个线程。</p>
<blockquote>
<p>获取Java线程ID：<code>ps aux | grep java</code>；<br>需确保转储用户与线程用户相同，否则，易出现<a href="https://stackoverflow.com/questions/26140182/running-jmap-getting-unable-to-open-socket-file#answer-35963059">Unable to open socket file: target process not responding or HotSpot VM not loaded</a>的问题；<br>当出现死锁时，dump操作可能失败，可以通过<code>kill -3 &lt;java_pid&gt;</code>终止死锁（其不会杀死进程或线程！）；</p>
</blockquote>
<p>得到转储文件后，可将其上传到<a href="http://fastthread.io/index.jsp">fastThread</a>进行在线分析，该服务可提供直观的分析图表和相关报告。</p>
<p>也可以下载IBM提供的工具<a href="ftp://public.dhe.ibm.com/software/websphere/appserv/support/tools/jca/jca447.jar">IBM Thread and Monitor Dump Analyze</a>，其同样提供图表分析功能，但整体上没有fastThread的直观。其启动命令为：<code>java -jar jca447.jar</code>。<br>]]>
    </summary>
    <title>JVM内存分析：线程死锁</title>
    <updated>2019-10-07T15:48:46.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="JVM内存分析" scheme="https://flytreeleft.crazydan.org/categories/JVM%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/"/>
    <category term="内存溢出" scheme="https://flytreeleft.crazydan.org/tags/%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA/"/>
    <id>https://flytreeleft.crazydan.org/the-jvm-dump-analyse-for-where-is-the-memory/</id>
    <link href="https://flytreeleft.crazydan.org/the-jvm-dump-analyse-for-where-is-the-memory/"/>
    <published>2019-10-05T13:41:47.000Z</published>
    <summary>
      <![CDATA[<h2 id="提要"><a href="#提要" class="headerlink" title="提要"></a>提要</h2><p>在开始分析之前先了解一下下面几个相关术语：</p>
<ul>
<li><strong>Shallow Heap</strong>：对象自身占用的内存大小（包含基本数据类型），不包括它引用对象的大小；</li>
<li><strong>Retained Heap</strong>：<strong>Shallow Heap</strong> + 所有直接或者间接引用对象占用的内存（即该对象被GC回收后，可以被回收的内存）；</li>
<li><strong>GC Root</strong>：被堆外对象引用的对象；</li>
<li><strong>Dominator Tree</strong>：以支配树方式描述的对象引用关系；</li>
</ul>
<blockquote>
<p>有关JVM内存转储方式的说明见<a href="/the-jvm-dump-analyse-for-tomcat-memory-leak/">JVM内存分析：Tomcat内存泄漏</a>。</p>
</blockquote>
<h2 id="案例分析"><a href="#案例分析" class="headerlink" title="案例分析"></a>案例分析</h2><p>最近服务器的内存又在狂飙了，网关响应缓慢，Jenkins完成构建需要长达2个多小时。到底疯狂到什么程度呢？用<code>htop</code>命令看看：</p>
<p><img src="/assets/images/jvm-dump/where-is-the-memory/jvm-no-gc-for-high-memory-usage-analysis-via-htop.png" alt=""><br>]]>
    </summary>
    <title>JVM内存分析：内存都去哪儿了</title>
    <updated>2019-10-09T09:13:28.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="JVM内存分析" scheme="https://flytreeleft.crazydan.org/categories/JVM%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/"/>
    <category term="连接池耗尽" scheme="https://flytreeleft.crazydan.org/tags/%E8%BF%9E%E6%8E%A5%E6%B1%A0%E8%80%97%E5%B0%BD/"/>
    <category term="Connection pool exhausted" scheme="https://flytreeleft.crazydan.org/tags/Connection-pool-exhausted/"/>
    <id>https://flytreeleft.crazydan.org/the-jvm-dump-analyse-for-connection-pool-exhausted/</id>
    <link href="https://flytreeleft.crazydan.org/the-jvm-dump-analyse-for-connection-pool-exhausted/"/>
    <published>2019-10-05T12:40:57.000Z</published>
    <summary>
      <![CDATA[<h2 id="提要"><a href="#提要" class="headerlink" title="提要"></a>提要</h2><p>由于数据库连接十分耗时，采取<strong>即需即连</strong>的方式会导致应用响应缓慢，因此，在Java应用中均采用<strong>数据库连接池</strong>统一维护一定数量的<code>Connection</code>对象，连接池中的<code>Connection</code>均保持与数据库的长连接，这样，该连接将随时可用，从而提高应用响应和处理速度。</p>
<p>但是，在普遍的使用不当的情形中，最多的问题便是没有及时<code>释放连接</code>，这里的释放是指将<code>Connection</code>对象归还连接池。若连接未被释放，则连接池将被很快耗尽（Exhausted），从而无法提供新的连接，最终导致应用不能进行数据库操作，并在尝试获取新的连接时出现以下异常：<br><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><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></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection</span><br><span class="line">    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:<span class="number">54</span>)</span><br><span class="line">    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:<span class="number">125</span>)</span><br><span class="line">    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:<span class="number">110</span>)</span><br><span class="line">    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:<span class="number">221</span>)</span><br><span class="line">    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:<span class="number">157</span>)</span><br><span class="line">    at org.hibernate.internal.SessionImpl.connection(SessionImpl.java:<span class="number">550</span>)</span><br><span class="line">    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:<span class="number">426</span>)</span><br><span class="line">    ... <span class="number">9</span> more</span><br><span class="line">Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting <span class="keyword">for</span> idle object</span><br><span class="line">    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:<span class="number">114</span>)</span><br><span class="line">    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:<span class="number">1044</span>)</span><br><span class="line">    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:<span class="number">141</span>)</span><br><span class="line">    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:<span class="number">292</span>)</span><br><span class="line">    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:<span class="number">214</span>)</span><br><span class="line">    ... <span class="number">12</span> more</span><br><span class="line">Caused by: java.util.NoSuchElementException: Timeout waiting <span class="keyword">for</span> idle object</span><br><span class="line">    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:<span class="number">1174</span>)</span><br><span class="line">    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:<span class="number">106</span>)</span><br><span class="line">    ... <span class="number">16</span> more</span><br></pre></td></tr></table></figure><br>]]>
    </summary>
    <title>JVM内存分析：数据库连接池耗尽</title>
    <updated>2019-10-09T09:13:28.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="JVM内存分析" scheme="https://flytreeleft.crazydan.org/categories/JVM%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/"/>
    <category term="内存泄漏" scheme="https://flytreeleft.crazydan.org/tags/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F/"/>
    <id>https://flytreeleft.crazydan.org/the-jvm-dump-analyse-for-tomcat-memory-leak/</id>
    <link href="https://flytreeleft.crazydan.org/the-jvm-dump-analyse-for-tomcat-memory-leak/"/>
    <published>2019-10-04T10:07:06.000Z</published>
    <summary>
      <![CDATA[<h2 id="提要"><a href="#提要" class="headerlink" title="提要"></a>提要</h2><p>通过内存转储可对Java应用内各对象的内存使用情况进行分析，从而找出过度消耗内存或无法及时释放的对象，进而为异常修复以及提升应用加载速度和运行性能提供帮助。</p>
<p>内存转储使用JDK自带的工具<code>jmap</code>（<code>sudo -u tomcat jmap -dump:format=b,file=heap-dump.bin &lt;java_pid&gt;</code>）将应用内存以二进制格式转储到<code>heap-dump.bin</code>中。</p>
<blockquote>
<p>需确保转储用户与线程用户相同，否则会出现<a href="https://stackoverflow.com/questions/26140182/running-jmap-getting-unable-to-open-socket-file#answer-35963059">Unable to open socket file: target process not responding or HotSpot VM not loaded</a>的问题；</p>
<p>转储文件可能会被放到临时目录中，该目录会在Tomcat重启时被删除，所以，一定要在重启前将转储文件转移到安全位置；</p>
<p>转储的文件一般为GB级，可通过命令<code>xz -k heap-dump.bin</code>进行高强度压缩，得到压缩文件<code>heap-dump.bin.xz</code>。解压使用命令<code>unxz -k heap-dump.bin.xz</code>，其中，<code>-k</code>选项均表示保留原文件，否则原文件将会被删除；<br>]]>
    </summary>
    <title>JVM内存分析：Tomcat内存泄漏</title>
    <updated>2019-10-06T03:32:53.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="算法分析" scheme="https://flytreeleft.crazydan.org/categories/%E7%AE%97%E6%B3%95%E5%88%86%E6%9E%90/"/>
    <category term="动态规划" scheme="https://flytreeleft.crazydan.org/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    <category term="最长公共子序列" scheme="https://flytreeleft.crazydan.org/tags/%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97/"/>
    <id>https://flytreeleft.crazydan.org/algorithm-finding-the-longest-common-sequence/</id>
    <link href="https://flytreeleft.crazydan.org/algorithm-finding-the-longest-common-sequence/"/>
    <published>2018-10-06T04:35:43.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>算法分析系列文章中的代码可被任何人无偿使用于任何场景且无需注明来源也不必在使用前征得本文作者同意。</p>
<p>算法分析系列文章旨在传播准确、完整、简洁、易懂、规范的代码实现，并传授基本的编程思想和良好的编码习惯与技巧。</p>
<p>若文章中的代码存在问题或逻辑错误，请通过邮件等形式（见文章结尾）告知于本文作者以便及时修正错误或改进代码。</p>
<p>算法系列文章不可避免地会参考和学习众多网友的成果，在行文风格、内容及求解思路上也会进行借鉴，如有侵权嫌疑，请联系本文作者。</p>
<p>PS：若为转载该文章，请务必注明来源，本站点欢迎大家转载。</p>
</blockquote>
<h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>如果序列 <script type="math/tex">S_1</script> 中的所有元素按照其在 <script type="math/tex">S_1</script> 中的出现顺序依次出现在另一个序列 <script type="math/tex">S_2</script> 中，则称 <script type="math/tex">S_1</script> 为 <script type="math/tex">S_2</script> 的<a href="https://zh.wikipedia.org/wiki/%E5%AD%90%E5%BA%8F%E5%88%97">子序列</a>。</p>
<blockquote>
<p>子序列不要求位置的连续性（即，元素相邻），只要相对顺序不变即可。</p>
</blockquote>
<p>若给定一个序列集合（数量大于或等于2，但通常为两个序列），则这些序列所共同拥有的子序列，称为<strong>公共子序列</strong>。而在这些公共子序列中长度最长的子序列则称为该序列集合的<a href="https://zh.wikipedia.org/wiki/%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97">最长公共子序列</a>（Longest Common Sequence, LCS）。</p>
<p>本例所要求的便是求解任意两个序列的最长公共子序列（可能存在多个不同的序列），并打印其长度及其其中的任意一个序列。<br>]]>
    </summary>
    <title>算法分析：求解最长公共子序列</title>
    <updated>2018-10-07T03:39:13.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="算法分析" scheme="https://flytreeleft.crazydan.org/categories/%E7%AE%97%E6%B3%95%E5%88%86%E6%9E%90/"/>
    <category term="动态规划" scheme="https://flytreeleft.crazydan.org/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    <category term="最大子段和" scheme="https://flytreeleft.crazydan.org/tags/%E6%9C%80%E5%A4%A7%E5%AD%90%E6%AE%B5%E5%92%8C/"/>
    <category term="分治法" scheme="https://flytreeleft.crazydan.org/tags/%E5%88%86%E6%B2%BB%E6%B3%95/"/>
    <category term="穷举法" scheme="https://flytreeleft.crazydan.org/tags/%E7%A9%B7%E4%B8%BE%E6%B3%95/"/>
    <id>https://flytreeleft.crazydan.org/algorithm-calculating-maximum-interval-sum/</id>
    <link href="https://flytreeleft.crazydan.org/algorithm-calculating-maximum-interval-sum/"/>
    <published>2018-10-05T03:19:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>算法分析系列文章中的代码可被任何人无偿使用于任何场景且无需注明来源也不必在使用前征得本文作者同意。</p>
<p>算法分析系列文章旨在传播准确、完整、简洁、易懂、规范的代码实现，并传授基本的编程思想和良好的编码习惯与技巧。</p>
<p>若文章中的代码存在问题或逻辑错误，请通过邮件等形式（见文章结尾）告知于本文作者以便及时修正错误或改进代码。</p>
<p>算法系列文章不可避免地会参考和学习众多网友的成果，在行文风格、内容及求解思路上也会进行借鉴，如有侵权嫌疑，请联系本文作者。</p>
<p>PS：若为转载该文章，请务必注明来源，本站点欢迎大家转载。</p>
</blockquote>
<h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>给定一个<strong>整数</strong>（正负数不限）序列 $a_1, a_2, a_3, …, a_n$ ，从该序列中选取任意<strong>相邻</strong>的一段求和（简称为「子段和」），求解该序列的<strong>最大子段和</strong>。注：若整个序列的所有元素均为负数，则其最大子段和固定为0。</p>
<p>例如，序列<code>[64, -24, 88, -39, -54, 16]</code>的最大子段和为<code>128</code>（= <code>64 + (-24) + 88</code>）。<br>]]>
    </summary>
    <title>算法分析：求解最大子段和</title>
    <updated>2018-10-07T03:39:13.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="算法分析" scheme="https://flytreeleft.crazydan.org/categories/%E7%AE%97%E6%B3%95%E5%88%86%E6%9E%90/"/>
    <category term="动态规划" scheme="https://flytreeleft.crazydan.org/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    <category term="斐波那契" scheme="https://flytreeleft.crazydan.org/tags/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91/"/>
    <category term="Fibonacci" scheme="https://flytreeleft.crazydan.org/tags/Fibonacci/"/>
    <id>https://flytreeleft.crazydan.org/algorithm-calculating-fibonacci-numbers/</id>
    <link href="https://flytreeleft.crazydan.org/algorithm-calculating-fibonacci-numbers/"/>
    <published>2018-10-04T05:58:17.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>算法分析系列文章中的代码可被任何人无偿使用于任何场景且无需注明来源也不必在使用前征得本文作者同意。</p>
<p>算法分析系列文章旨在传播准确、完整、简洁、易懂、规范的代码实现，并传授基本的编程思想和良好的编码习惯与技巧。</p>
<p>若文章中的代码存在问题或逻辑错误，请通过邮件等形式（见文章结尾）告知于本文作者以便及时修正错误或改进代码。</p>
<p>算法系列文章不可避免地会参考和学习众多网友的成果，在行文风格、内容及求解思路上也会进行借鉴，如有侵权嫌疑，请联系本文作者。</p>
<p>PS：若为转载该文章，请务必注明来源，本站点欢迎大家转载。</p>
</blockquote>
<h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>从0和1开始，之后的每一个数均为前两个数的和，这样性质的数依次排列，便称为<a href="https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97">斐波那契数列</a>。即形成如下数列形式：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ...</span><br></pre></td></tr></table></figure>
<p>用数学公式表示该数列即为：</p>
<script type="math/tex; mode=display">
F(n) = \begin{cases}
0,                      & n = 0 \\
1,                      & n = 1 \\
F(n - 1) + F(n - 2),    & n >= 2
\end{cases}</script><p>本案例所要解决的就是：给定一个整数<code>n</code>，求解斐波那契数列中第<code>n</code>项的数值。注意，<code>0</code>表示第零项，而不是第一项。<br>]]>
    </summary>
    <title>算法分析：求解斐波那契数列</title>
    <updated>2018-10-07T02:33:29.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="算法分析" scheme="https://flytreeleft.crazydan.org/categories/%E7%AE%97%E6%B3%95%E5%88%86%E6%9E%90/"/>
    <category term="分治法" scheme="https://flytreeleft.crazydan.org/tags/%E5%88%86%E6%B2%BB%E6%B3%95/"/>
    <category term="众数" scheme="https://flytreeleft.crazydan.org/tags/%E4%BC%97%E6%95%B0/"/>
    <category term="重数" scheme="https://flytreeleft.crazydan.org/tags/%E9%87%8D%E6%95%B0/"/>
    <id>https://flytreeleft.crazydan.org/algorithm-using-divide-and-conquer-method-to-find-the-mode-in-a-set/</id>
    <link href="https://flytreeleft.crazydan.org/algorithm-using-divide-and-conquer-method-to-find-the-mode-in-a-set/"/>
    <published>2018-09-19T13:38:34.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>算法分析系列文章中的代码可被任何人无偿使用于任何场景且无需注明来源也不必在使用前征得本文作者同意。</p>
<p>算法分析系列文章旨在传播准确、完整、简洁、易懂、规范的代码实现，并传授基本的编程思想和良好的编码习惯与技巧。</p>
<p>若文章中的代码存在问题或逻辑错误，请通过邮件等形式（见文章结尾）告知于本文作者以便及时修正错误或改进代码。</p>
<p>算法系列文章不可避免地会参考和学习众多网友的成果，在行文风格、内容及求解思路上也会进行借鉴，如有侵权嫌疑，请联系本文作者。</p>
<p>PS：若为转载该文章，请务必注明来源，本站点欢迎大家转载。</p>
</blockquote>
<h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>给定含有n个元素的多重集合<code>S</code>，每个元素在<code>S</code>中<u>出现的次数</u>称为该元素的<strong>重数</strong>。多重集<code>S</code>中<u>重数最大的元素</u>称为<a href="https://zh.wikipedia.org/wiki/%E4%BC%97%E6%95%B0_(%E6%95%B0%E5%AD%A6)">众数</a>（<strong>mode</strong>）。</p>
<p>例如，<code>S={1，2，2，2，3，5}</code>，则，多重集<code>S</code>的众数是<code>2</code>，其重数为<code>3</code>。</p>
<blockquote>
<p>注：众数可能存在多个。</p>
</blockquote>
<p>本案例要求采用<a href="https://zh.wikipedia.org/wiki/%E5%88%86%E6%B2%BB%E6%B3%95">分治法</a>求解给定集合中的众数及其重数，存在多个众数时选择第一个即可。</p>
<blockquote>
<p>分治法，即，把一个复杂的问题分成两个或更多的相同或相似的子问题，直到最后子问题可以简单的直接求解，原问题的解即子问题的解的合并。（引用自「维基百科」）<br>]]>
    </summary>
    <title>算法分析：分治法求解给定集合中的众数及其重数</title>
    <updated>2018-10-06T14:31:53.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="运维管理" scheme="https://flytreeleft.crazydan.org/categories/%E8%BF%90%E7%BB%B4%E7%AE%A1%E7%90%86/"/>
    <category term="CentOS" scheme="https://flytreeleft.crazydan.org/tags/CentOS/"/>
    <category term="系统升级" scheme="https://flytreeleft.crazydan.org/tags/%E7%B3%BB%E7%BB%9F%E5%8D%87%E7%BA%A7/"/>
    <id>https://flytreeleft.crazydan.org/a-horrible-os-upgrading-for-centos/</id>
    <link href="https://flytreeleft.crazydan.org/a-horrible-os-upgrading-for-centos/"/>
    <published>2018-02-15T01:47:42.000Z</published>
    <summary>
      <![CDATA[<h2 id="How-to-use-yum-history-to-roll-back-an-update"><a href="#How-to-use-yum-history-to-roll-back-an-update" class="headerlink" title="Ho]]>
    </summary>
    <title>记一次惊心动魄的CentOS系统升级经历</title>
    <updated>2018-02-26T12:56:09.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="运维管理" scheme="https://flytreeleft.crazydan.org/categories/%E8%BF%90%E7%BB%B4%E7%AE%A1%E7%90%86/"/>
    <category term="Nginx配置" scheme="https://flytreeleft.crazydan.org/tags/Nginx%E9%85%8D%E7%BD%AE/"/>
    <category term="Nginx over Squid" scheme="https://flytreeleft.crazydan.org/tags/Nginx-over-Squid/"/>
    <category term="Nginx防火墙穿透" scheme="https://flytreeleft.crazydan.org/tags/Nginx%E9%98%B2%E7%81%AB%E5%A2%99%E7%A9%BF%E9%80%8F/"/>
    <category term="HTTPS代理HTTP资源" scheme="https://flytreeleft.crazydan.org/tags/HTTPS%E4%BB%A3%E7%90%86HTTP%E8%B5%84%E6%BA%90/"/>
    <category term="Nginx自定义错误页面" scheme="https://flytreeleft.crazydan.org/tags/Nginx%E8%87%AA%E5%AE%9A%E4%B9%89%E9%94%99%E8%AF%AF%E9%A1%B5%E9%9D%A2/"/>
    <id>https://flytreeleft.crazydan.org/the-special-case-configuration-of-nginx/</id>
    <link href="https://flytreeleft.crazydan.org/the-special-case-configuration-of-nginx/"/>
    <published>2018-02-05T12:30:47.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>本文所使用的相关代码片段可从 <a href="https://github.com/flytreeleft/docker-nginx-gateway">https://github.com/flytreeleft/docker-nginx-gateway</a> 得到完整内容。</p>
</blockquote>
<h2 id="Nginx随机展示自定义错误页面"><a href="#Nginx随机展示自定义错误页面" class="headerlink" title="Nginx随机展示自定义错误页面"></a>Nginx随机展示自定义错误页面</h2><blockquote>
<p>Source code: <a href="https://github.com/flytreeleft/docker-nginx-gateway/tree/master/config/error-pages">https://github.com/flytreeleft/docker-nginx-gateway/tree/master/config/error-pages</a><br>Custom error pages: <a href="https://github.com/flytreeleft/docker-nginx-gateway/tree/master/examples/epage.d/all">https://github.com/flytreeleft/docker-nginx-gateway/tree/master/examples/epage.d/all</a></p>
</blockquote>
<p><strong>关键字</strong>：</p>
<ul>
<li>随机展示多个错误页面</li>
<li>Nginx自定义错误页面</li>
</ul>
<p>在访问HTTP站点时最容易出现的错误就是404，于是就有许多非常有个性的404错误页面。而为我们自己的站点放置一些简洁、清爽的错误页面，在资源再利用的前提下，也将为我们自身增加不少好感和亲和力。</p>
<p>这里将要介绍的便是如何为我们的站点配置自定义错误页面，并同时支持为相同错误随机展示不同的错误页面。</p>]]>
    </summary>
    <title>Nginx特例场景配置</title>
    <updated>2018-02-25T08:53:50.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="社会形态" scheme="https://flytreeleft.crazydan.org/categories/%E7%A4%BE%E4%BC%9A%E5%BD%A2%E6%80%81/"/>
    <category term="未来世界" scheme="https://flytreeleft.crazydan.org/categories/%E7%A4%BE%E4%BC%9A%E5%BD%A2%E6%80%81/%E6%9C%AA%E6%9D%A5%E4%B8%96%E7%95%8C/"/>
    <category term="无现金社会" scheme="https://flytreeleft.crazydan.org/tags/%E6%97%A0%E7%8E%B0%E9%87%91%E7%A4%BE%E4%BC%9A/"/>
    <category term="无中心化" scheme="https://flytreeleft.crazydan.org/tags/%E6%97%A0%E4%B8%AD%E5%BF%83%E5%8C%96/"/>
    <category term="万物互联" scheme="https://flytreeleft.crazydan.org/tags/%E4%B8%87%E7%89%A9%E4%BA%92%E8%81%94/"/>
    <id>https://flytreeleft.crazydan.org/the-future-social-formation/</id>
    <link href="https://flytreeleft.crazydan.org/the-future-social-formation/"/>
    <published>2017-12-10T05:49:57.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>The post isn’t finished yet, it will be updated anytime!</p>
</blockquote>
<h2 id="无现金社会"><a href="#无现金社会" class="headerlink" title="无现金社会"></a>无现金社会</h2><p>提要：</p>
<ul>
<li>比特币、比特交易网络</li>
<li><a href="https://www.ethereum.org/">以太坊</a></li>
<li><a href="http://www.iotachina.com/what-is-iota">IOTA</a><ul>
<li><a href="http://www.iotachina.com/ruhezhaohuiiotayue.html">如何找回IOTA余额</a>：可以从中了解转账机制与流程</li>
</ul>
</li>
</ul>]]>
    </summary>
    <title>未来社会形态畅想</title>
    <updated>2018-02-05T14:34:05.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="商业作恶" scheme="https://flytreeleft.crazydan.org/categories/%E5%95%86%E4%B8%9A%E4%BD%9C%E6%81%B6/"/>
    <category term="自由社会" scheme="https://flytreeleft.crazydan.org/tags/%E8%87%AA%E7%94%B1%E7%A4%BE%E4%BC%9A/"/>
    <category term="用户自由" scheme="https://flytreeleft.crazydan.org/tags/%E7%94%A8%E6%88%B7%E8%87%AA%E7%94%B1/"/>
    <category term="自由软件" scheme="https://flytreeleft.crazydan.org/tags/%E8%87%AA%E7%94%B1%E8%BD%AF%E4%BB%B6/"/>
    <id>https://flytreeleft.crazydan.org/the-evil-behaviors/</id>
    <link href="https://flytreeleft.crazydan.org/the-evil-behaviors/"/>
    <published>2017-12-04T13:50:19.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>列举日常和网络中所发现的软件、应用、服务等的「作恶」行为，将其永久钉在「耻辱柱」上。有条件的或有候选方案的，应主动弃用之！<br>坚持开放、坚持自由。点击下载<a href="http://mirror.lihnidos.org/GNU/savannah/blug/fsfs-zh/fsfs-zh.pdf">自由软件自由社会.pdf</a><br>就事论事，不针对个人、企业、平台，挖掘现象本质，努力尝试寻找更优方案</p>
</blockquote>
<h2 id="为逼迫用户使用客户端而阉割Web端的基本功能"><a href="#为逼迫用户使用客户端而阉割Web端的基本功能" class="headerlink" title="为逼迫用户使用客户端而阉割Web端的基本功能"></a>为逼迫用户使用客户端而阉割Web端的基本功能</h2><ul>
<li>案例： <a href="https://2.taobao.com/">闲鱼</a>Web端隐藏搜索框</li>
<li>来源： <a href="https://www.appinn.com/xianyu-search-box/">https://www.appinn.com/xianyu-search-box/</a></li>
<li>评语： 若欲达KPI，必先「中二自宫」]]>
    </summary>
    <title>作恶行为清单</title>
    <updated>2020-06-26T03:19:48.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="开发规范" scheme="https://flytreeleft.crazydan.org/categories/%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/"/>
    <id>https://flytreeleft.crazydan.org/the-better-software-development-practice/</id>
    <link href="https://flytreeleft.crazydan.org/the-better-software-development-practice/"/>
    <published>2017-12-04T07:32:07.000Z</published>
    <summary>
      <![CDATA[<ul>
<li>任何<strong>局部优化</strong>都是在浪费生命</li>
</ul>
<blockquote>
<p>不要仅凭感觉去做性能和代码优化或者是重构代码，一定要<u>以性能测试和监控分析结果为依据</u>，重点优化和改进关键代码和影响常用功能的代码。</p>
<p>需要认识到和牢记的是，局部的小改进对业务整体而言是毫无意义的，只有从全局角度所做的改进才是可感知且有价值的。</p>
</blockquote>
<ul>
<li><p>不要原地打转：开发工作不要阻塞在单一技术点上，以完成业务功能为首要目标，不影响整体架构的技术难点可利用空闲时间解决</p>
</li>
<li><p>出现任何问题都始终保持<strong>就事论事</strong>的态度，不要带有个人情绪，不要在未查明根本原因的情况下将问题归咎于个人能力、品行或态度，应优先考虑提升项目管理、工作分配、人员激励、运维管理等制度和服务</p>
</li>
</ul>]]>
    </summary>
    <title>软件开发最佳实践</title>
    <updated>2019-10-09T09:08:53.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="开发规范" scheme="https://flytreeleft.crazydan.org/categories/%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/"/>
    <category term="职业道德" scheme="https://flytreeleft.crazydan.org/categories/%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/%E8%81%8C%E4%B8%9A%E9%81%93%E5%BE%B7/"/>
    <category term="隐私" scheme="https://flytreeleft.crazydan.org/tags/%E9%9A%90%E7%A7%81/"/>
    <id>https://flytreeleft.crazydan.org/the-software-development-criterion/</id>
    <link href="https://flytreeleft.crazydan.org/the-software-development-criterion/"/>
    <published>2017-12-04T05:06:31.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>The post isn’t finished yet, it will be updated anytime!</p>
</blockquote>
<h2 id="谨慎对待用户隐私"><a href="#谨慎对待用户隐私" class="headerlink" title="谨慎对待用户隐私"></a>谨慎对待用户隐私</h2><p>提要：</p>
<ul>
<li>不是仅用户确认后的数据才算是「用户隐私」，任何与用户相关的数据都应该「默认」视为用户隐私，<u>不需要任何形式的确认</u>，<br>而只有经过用户确认和同意的数据方可用作其他用途，且前提必须是明确告知数据为何要做此用途，以及将被如何利用、涉及哪些风险等</li>
</ul>]]>
    </summary>
    <title>软件开发行为准则</title>
    <updated>2019-10-01T16:00:43.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="自我剖析" scheme="https://flytreeleft.crazydan.org/categories/%E8%87%AA%E6%88%91%E5%89%96%E6%9E%90/"/>
    <category term="人性探索" scheme="https://flytreeleft.crazydan.org/categories/%E8%87%AA%E6%88%91%E5%89%96%E6%9E%90/%E4%BA%BA%E6%80%A7%E6%8E%A2%E7%B4%A2/"/>
    <category term="自我" scheme="https://flytreeleft.crazydan.org/tags/%E8%87%AA%E6%88%91/"/>
    <category term="静心" scheme="https://flytreeleft.crazydan.org/tags/%E9%9D%99%E5%BF%83/"/>
    <category term="优越感" scheme="https://flytreeleft.crazydan.org/tags/%E4%BC%98%E8%B6%8A%E6%84%9F/"/>
    <id>https://flytreeleft.crazydan.org/how-to-break-out-of-your-limit/</id>
    <link href="https://flytreeleft.crazydan.org/how-to-break-out-of-your-limit/"/>
    <published>2017-12-03T03:13:03.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>The post isn’t finished yet, it will be updated anytime!</p>
</blockquote>
<h2 id="以旁观者角度审视自己"><a href="#以旁观者角度审视自己" class="headerlink" title="以旁观者角度审视自己"></a>以旁观者角度审视自己</h2><p>提要：</p>
<ul>
<li>勇敢面对自己，正视自己的缺点</li>
<li>客观分析自己的好的、坏的甚至是邪恶的想法，不好的想法切不可影响到他人，需要自我消化</li>
<li>人无完人，对于非理性情绪不要过分压抑，在不影响他人的情况下采取各种积极或消极的方式去释放这些情绪<ul>
<li>消极的释放方式所要达到的目的是推翻重建，进入全新的境界，从而从另一个视角看待原来的情绪和行为</li>
</ul>
</li>
</ul>]]>
    </summary>
    <title>如何突破自己的瓶颈？</title>
    <updated>2017-12-24T05:59:43.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <category term="开发工具" scheme="https://flytreeleft.crazydan.org/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    <category term="git" scheme="https://flytreeleft.crazydan.org/tags/git/"/>
    <id>https://flytreeleft.crazydan.org/git-usage-cases/</id>
    <link href="https://flytreeleft.crazydan.org/git-usage-cases/"/>
    <published>2017-05-28T14:24:15.000Z</published>
    <summary>
      <![CDATA[<h2 id="拆分子目录到新仓库"><a href="#拆分子目录到新仓库" class="headerlink" title="拆分子目录到新仓库"></a>拆分子目录到新仓库</h2><h3 id="场景"><a href="#场景" class="headerlink" title="场景"></a>场景</h3><p>通常为便于项目开发和调试，开发前期会将多个组件放在同一仓库中，而当各个组件的功能结构和代码逐渐区域稳定后，<br>便需要将其拆分出来进行独立开发和管理，以便于与其他项目共享组件。</p>
<p>此时，不仅需要将组件所在目录内的代码全部拆分到单独的仓库，同时，还需要确保历史记录能够完整保留。</p>]]>
    </summary>
    <title>Git使用案例</title>
    <updated>2020-06-07T07:42:26.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>flytreeleft</name>
      <email>flytreeleft@crazydan.org</email>
    </author>
    <id>https://flytreeleft.crazydan.org/hello-world/</id>
    <link href="https://flytreeleft.crazydan.org/hello-world/"/>
    <published>2017-05-14T10:44:19.000Z</published>
    <summary>
      <![CDATA[<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">System.out.println(<span class="string">&quot;Hello world!&quot;</span>);</span><br></pre></td></tr></table></figure>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">alert</span>(<span class="string">&#x27;Hello world!&#x27;</span>);</span><br></pre></td></tr></table></figure>]]>
    </summary>
    <title>Hello world!</title>
    <updated>2017-12-05T13:11:30.000Z</updated>
  </entry>
</feed>
