<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>晨露微凉</title>
  
  <subtitle>人丑需要多读书</subtitle>
  <link href="https://jokechat.cn/atom.xml" rel="self"/>
  
  <link href="https://jokechat.cn/"/>
  <updated>2023-11-16T04:56:11.462Z</updated>
  <id>https://jokechat.cn/</id>
  
  <author>
    <name>jokechat</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>雪花算法</title>
    <link href="https://jokechat.cn/2023/11/16/snowflake/"/>
    <id>https://jokechat.cn/2023/11/16/snowflake/</id>
    <published>2023-11-16T02:27:41.000Z</published>
    <updated>2023-11-16T04:56:11.462Z</updated>
    
    <content type="html"><![CDATA[<h2 id="来源"><a href="#来源" class="headerlink" title="来源"></a>来源</h2><blockquote><p>雪花算法（Snowflake）是一种生成分布式全局唯一ID的算法，生成的ID称为Snowflake IDs或snowflakes。这种算法由Twitter创建，并用于推文的ID。Discord和Instagram等其他公司采用了修改后的版本。</p></blockquote><h2 id="格式"><a href="#格式" class="headerlink" title="格式"></a>格式</h2><p>一个Snowflake ID有64位。前41位是时间戳，表示了自选定的时期以来的毫秒数。 接下来的10位代表计算机ID，防止冲突。 其余12位代表每台机器上生成ID的序列号，这允许在同一毫秒内创建多个Snowflake ID。最后以十进制将数字序列化。</p><p>SnowflakeID基于时间生成，故可以按时间排序。 此外，一个ID的生成时间可以由其自身推断出来，反之亦然。该特性可以用于按时间筛选ID，以及与之联系的对象。</p><p><img src="/images/snowflake.jpg" alt="64位"></p><h2 id="范例"><a href="#范例" class="headerlink" title="范例"></a>范例</h2><p>2022年六月由@Wikipedia所发的一条推文的雪花ID是1541815603606036480。这个数字被转换成二进制就是0 0101 0101 1001 0110 1000 0100 0111 1101 1000 1000|01 0111 1010|0000 0000 0000，其中以竖线分隔成三个部分。</p><p>64位的二进制所示</p><ul><li>最高位表示符号位</li><li>后面的41bit是产生该ID的unix毫秒时间戳</li><li>10bit是机器编号,最多可以部署在 2^8 = 1024 机器上</li><li>12bit 序列号,同一毫秒最多可以产生 2^12 = 4096 个序列号</li></ul><h2 id="算法实现思路"><a href="#算法实现思路" class="headerlink" title="算法实现思路"></a>算法实现思路</h2><p>时间戳左移22位,机器编号左移12位,序列号不动,三者按位或运算,得到一个64位二进制,再转成10进制,就是雪花ID</p><p>反之,根据雪花ID可以反推导出机器ID,时间戳,序列号</p><p>41位时间戳2^41/(1000<em>3600</em>24*365) ≈ 69.73057年,引入 epoch基准时间,是为了能是雪花ID能使用的时间更长一点,41位时间戳按照unix时间,最多只能到2039-09-07 23:47:35</p><p><img src="/images/%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%BD%8D%E8%BF%90%E7%AE%97.webp" alt="位运算"></p><h2 id="省流不看系列"><a href="#省流不看系列" class="headerlink" title="省流不看系列"></a>省流不看系列</h2><p><a href="https://github.com/jokechat/guid" target="_blank" rel="noopener">github jokechat/guid</a><br><figure class="highlight go"><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">docker run --rm -p <span class="number">8080</span>:<span class="number">80</span> jokechat/guid:v1<span class="number">.0</span><span class="number">.3</span> </span><br><span class="line">curl <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8080</span></span><br></pre></td></tr></table></figure></p><figure class="highlight json"><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></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"code"</span>: <span class="number">0</span>,</span><br><span class="line">  <span class="attr">"msg"</span>: <span class="string">"success"</span>,</span><br><span class="line">  <span class="attr">"data"</span>: &#123;</span><br><span class="line">    <span class="attr">"id"</span>: <span class="number">645124828453408800</span>,</span><br><span class="line">    <span class="attr">"workId"</span>: <span class="number">0</span>,</span><br><span class="line">    <span class="attr">"base32"</span>: <span class="string">"13pv378bo0800"</span>,</span><br><span class="line">    <span class="attr">"time"</span>: <span class="string">"2023-11-16T04:55:44.943Z"</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h2><h3 id="type-go"><a href="#type-go" class="headerlink" title="type.go"></a>type.go</h3><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> snowflake</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">"time"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Option <span class="keyword">interface</span> &#123;</span><br><span class="line">apply(*Worker)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> OptionFunc <span class="function"><span class="keyword">func</span><span class="params">(*Worker)</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(o OptionFunc)</span> <span class="title">apply</span><span class="params">(worker *Worker)</span></span> &#123;</span><br><span class="line">o(worker)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">WithEpoch</span><span class="params">(epoch time.Time)</span> <span class="title">OptionFunc</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="function"><span class="keyword">func</span><span class="params">(worker *Worker)</span></span> &#123;</span><br><span class="line">worker.epoch = epoch</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">WithWorkerId</span><span class="params">(workerId <span class="keyword">int64</span>)</span> <span class="title">OptionFunc</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="function"><span class="keyword">func</span><span class="params">(worker *Worker)</span></span> &#123;</span><br><span class="line">worker.workerId = workerId</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="snowflake-go"><a href="#snowflake-go" class="headerlink" title="snowflake.go"></a>snowflake.go</h3><figure class="highlight go"><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><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> snowflake</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"errors"</span></span><br><span class="line"><span class="string">"fmt"</span></span><br><span class="line"><span class="string">"sync"</span></span><br><span class="line"><span class="string">"time"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> (</span><br><span class="line">workerBits <span class="keyword">uint8</span> = <span class="number">10</span></span><br><span class="line">workerMax  <span class="keyword">int64</span> = <span class="number">-1</span> ^ (<span class="number">-1</span> &lt;&lt; workerBits)</span><br><span class="line"></span><br><span class="line">stepBits <span class="keyword">uint8</span> = <span class="number">12</span></span><br><span class="line">stepMax  <span class="keyword">int64</span> = <span class="number">-1</span> ^ (<span class="number">-1</span> &lt;&lt; stepBits)</span><br><span class="line"></span><br><span class="line">workerShift <span class="keyword">uint8</span> = stepBits</span><br><span class="line">timeShift   <span class="keyword">uint8</span> = workerBits + stepBits</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Worker <span class="keyword">struct</span> &#123;</span><br><span class="line">mu sync.Mutex</span><br><span class="line"></span><br><span class="line">timestamp <span class="keyword">int64</span>     <span class="comment">// 记录时间戳</span></span><br><span class="line">workerId  <span class="keyword">int64</span>     <span class="comment">// 当前工作节点ID</span></span><br><span class="line">step      <span class="keyword">int64</span>     <span class="comment">// 当前毫秒已经生成的id序列号(从0开始累加) 1毫秒内最多生成4096个ID</span></span><br><span class="line">epoch     time.Time <span class="comment">// 开始运行时间</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">NewWorkerWithOpts</span><span class="params">(opts ...Option)</span> <span class="params">(*Worker, error)</span></span> &#123;</span><br><span class="line">w := &amp;Worker&#123;&#125;</span><br><span class="line"><span class="keyword">for</span> _, opt := <span class="keyword">range</span> opts &#123;</span><br><span class="line">opt.apply(w)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> w.epoch.IsZero() &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, errors.New(<span class="string">"epoch is required"</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> w.workerId &lt; <span class="number">0</span> || w.workerId &gt; workerMax &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, errors.New(fmt.Sprintf(<span class="string">"worker ID must be in [0,%d]"</span>, workerMax))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> w, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(w *Worker)</span> <span class="title">Next</span><span class="params">()</span> <span class="title">ID</span></span> &#123;</span><br><span class="line">w.mu.Lock()</span><br><span class="line"><span class="keyword">defer</span> w.mu.Unlock()</span><br><span class="line">now := time.Now().UnixMilli()</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理时钟回拨问题或处于同一毫秒 ntp 时间变化</span></span><br><span class="line"><span class="keyword">if</span> now &lt; w.timestamp &#123;</span><br><span class="line">now = w.timestamp + <span class="number">1</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> now == w.timestamp &#123;</span><br><span class="line">w.step = (w.step + <span class="number">1</span>) &amp; stepMax</span><br><span class="line"><span class="keyword">if</span> w.step == <span class="number">0</span> &#123; <span class="comment">// 当前毫秒生成的ID已超上限,等待下一毫秒</span></span><br><span class="line"><span class="keyword">for</span> now &lt;= w.timestamp &#123;</span><br><span class="line">now = time.Now().UnixMilli()</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">w.step = <span class="number">0</span></span><br><span class="line"><span class="comment">// todo 持久化存储当前时间,文件或者redis</span></span><br><span class="line">&#125;</span><br><span class="line">w.timestamp = now</span><br><span class="line">id := (now-w.epoch.UnixMilli())&lt;&lt;timeShift | (w.workerId &lt;&lt; workerShift) | w.step</span><br><span class="line"><span class="keyword">return</span> ID(id)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="id-go"><a href="#id-go" class="headerlink" title="id.go"></a>id.go</h3><figure class="highlight go"><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><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> snowflake</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"bytes"</span></span><br><span class="line"><span class="string">"encoding/base32"</span></span><br><span class="line"><span class="string">"encoding/binary"</span></span><br><span class="line"><span class="string">"strconv"</span></span><br><span class="line"><span class="string">"strings"</span></span><br><span class="line"><span class="string">"time"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> ID <span class="keyword">uint64</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(i ID)</span> <span class="title">Uint64</span><span class="params">()</span> <span class="title">uint64</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">uint64</span>(i)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(i ID)</span> <span class="title">String</span><span class="params">()</span> <span class="title">string</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> strconv.FormatUint(<span class="keyword">uint64</span>(i), <span class="number">10</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(i ID)</span> <span class="title">Base32</span><span class="params">()</span> <span class="title">string</span></span> &#123;</span><br><span class="line">bytesBuffer := bytes.NewBuffer([]<span class="keyword">byte</span>&#123;&#125;)</span><br><span class="line">binary.Write(bytesBuffer, binary.BigEndian, i)</span><br><span class="line"><span class="keyword">return</span> base32.HexEncoding.WithPadding(base32.NoPadding).EncodeToString(bytesBuffer.Bytes())</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(i ID)</span> <span class="title">Base32Lower</span><span class="params">()</span> <span class="title">string</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> strings.ToLower(i.Base32())</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(i ID)</span> <span class="title">UnixMilli</span><span class="params">(epoch time.Time)</span> <span class="title">int64</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> epoch.UnixMilli() + <span class="keyword">int64</span>(i.Uint64()&gt;&gt;timeShift)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(i ID)</span> <span class="title">WorkId</span><span class="params">()</span> <span class="title">uint64</span></span> &#123;</span><br><span class="line">d := i.Uint64() &gt;&gt; workerShift &amp; <span class="keyword">uint64</span>(workerMax)</span><br><span class="line"><span class="keyword">return</span> d</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(i ID)</span> <span class="title">Step</span><span class="params">()</span> <span class="title">uint64</span></span> &#123;</span><br><span class="line">d := i.Uint64() &amp; <span class="keyword">uint64</span>(stepMax)</span><br><span class="line"><span class="keyword">return</span> d</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(i ID)</span> <span class="title">Time</span><span class="params">(epoch time.Time)</span> <span class="title">time</span>.<span class="title">Time</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> time.UnixMilli(i.UnixMilli(epoch))</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    epoch := time.Date(<span class="number">2019</span>, time.January, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, time.Local)</span><br><span class="line">    w, _ := NewWorkerWithOpts(</span><br><span class="line">        WithEpoch(epoch),</span><br><span class="line">        WithWorkerId(<span class="number">1</span>),</span><br><span class="line">    )</span><br><span class="line">    id := w.Next()</span><br><span class="line">    spew.Dump(id.Uint64())</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><p><a href="https://zh.wikipedia.org/zh-hans/%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95#cite_ref-7" target="_blank" rel="noopener">维基百科  雪花算法</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;来源&quot;&gt;&lt;a href=&quot;#来源&quot; class=&quot;headerlink&quot; title=&quot;来源&quot;&gt;&lt;/a&gt;来源&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;雪花算法（Snowflake）是一种生成分布式全局唯一ID的算法，生成的ID称为Snowflake IDs或sno</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>一起来学vim 😂</title>
    <link href="https://jokechat.cn/2018/03/13/vim-tutorial/"/>
    <id>https://jokechat.cn/2018/03/13/vim-tutorial/</id>
    <published>2018-03-13T09:06:31.000Z</published>
    <updated>2023-11-16T08:16:48.491Z</updated>
    
    <content type="html"><![CDATA[<h1 id="vim-tutorial"><a href="#vim-tutorial" class="headerlink" title="vim-tutorial"></a>vim-tutorial</h1><p>vim tutorial</p><h2 id="整理资料来源"><a href="#整理资料来源" class="headerlink" title="整理资料来源"></a>整理资料来源</h2><blockquote><p>本资料来自 <a href="https://github.com/jaywcjlove/vim-web">vim-web</a>     <a href="http://www.jianshu.com/p/a361ce8c97bc">一起来说vim语</a><br>整理学习 jokechat<br>理解此部分需要你已经理解vim的几种常用工作模式(正常模式,插入模式,命令模式等)</p></blockquote><h3 id="动词"><a href="#动词" class="headerlink" title="动词"></a>动词</h3><p>  动词代表了我们打算对文本进行什么样的操作.例如:<br>  <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">d # 表示delete</span><br><span class="line">r # 表示替换replace</span><br><span class="line">c # 表示表示change</span><br><span class="line">y # 表示复制yank</span><br><span class="line">v # 表示选取visual select</span><br></pre></td></tr></table></figure></p><h3 id="名词"><a href="#名词" class="headerlink" title="名词"></a>名词</h3><p>  名词代表了我们即将处理的文本.vim中有一个术语对象叫做 text object (文本对象) ,示例如下:<br>  <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">w # 表示一个单词word</span><br><span class="line">s # 表示一个句子sentence</span><br><span class="line">p # 表示一个段落paragraph</span><br><span class="line">t # 表示一个html标签tag</span><br><span class="line">引号或者各种括号所包含文本称为一个文本块</span><br></pre></td></tr></table></figure></p><h3 id="介词"><a href="#介词" class="headerlink" title="介词"></a>介词</h3><p>  介词界定了待编辑文本的范围或者位置<br>  <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></pre></td><td class="code"><pre><span class="line">i # 表示在...之内 inside</span><br><span class="line">a # 表示环绕...around</span><br><span class="line">t # 表示到...位置钱 to</span><br><span class="line">f # 表示到...位置上 forward</span><br></pre></td></tr></table></figure></p><h3 id="数词"><a href="#数词" class="headerlink" title="数词"></a>数词</h3><p>  数字指定了待编辑文本对象的数量,从这个角度而言,数词也可以看做一种介词.引入介词之后,文本编辑命令的语法就升级成了下面样子:<br>  <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">动词 介词/数词 名词</span><br></pre></td></tr></table></figure></p><p>  下面是几个例子:<br>  <figure class="highlight plaintext"><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">c3w # 修改三个单词 change three words</span><br><span class="line">d2w # 删除两个单词 delete two words</span><br></pre></td></tr></table></figure></p>  <span id="more"></span><p>  另外,数词也可以修饰动词,表示将执行n次.于是,我们又有了下面的语法<br>  <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">数词 动词 名词</span><br></pre></td></tr></table></figure></p><p>  请看示例:<br>  <figure class="highlight plaintext"><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">2dw # 两次删除单词(等价于删除两个单词) twice delete word</span><br><span class="line">3x  # 三次删除字符(等价于删除三个字符) three delete character</span><br></pre></td></tr></table></figure></p><h3 id="组词为句"><a href="#组词为句" class="headerlink" title="组词为句"></a>组词为句</h3><p>  有了这些基本的语言元素,我们就可以着手构造一些简单的命令了.文本编辑命令的基本语法如下<br>  <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">动词 介词 名词</span><br></pre></td></tr></table></figure></p><p>  下面是一些例子🌰(如果熟悉了上面的概念,你将会看到这些例子非常容易理解),可以自己亲自尝试一番<br>  <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></pre></td><td class="code"><pre><span class="line">dip # 删除一个段落 delete inside paragraph</span><br><span class="line">di&#123; # 删除&#123;&#125;中的所有代码</span><br><span class="line">di( # 删除()中的所有代码</span><br><span class="line">di[ # 删除[] 中的所有代码</span><br><span class="line">vis # 选取一个句子 visula select inside sentence</span><br><span class="line">ciw # 修改一个单词 change inside word</span><br><span class="line">caw # 修改一个单词 change around word</span><br><span class="line">dtx # 删除一个文本直至字符&quot;x&quot;(不包括字符&quot;x&quot;) delete to x</span><br><span class="line">dfx # 删除文本直至字符&quot;x&quot; (包括字符&quot;x&quot;) delete forward x</span><br></pre></td></tr></table></figure></p><h3 id="常用快捷键"><a href="#常用快捷键" class="headerlink" title="常用快捷键"></a>常用快捷键</h3><p>  这里的vim快捷键是已经配置好的,回头留意查快捷怎么配置</p><ul><li>研究vim快捷键配置  <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><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><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br></pre></td><td class="code"><pre><span class="line">;fl     # 唤出当前目录文件菜单列表 file list</span><br><span class="line">nw      # 窗口切换</span><br><span class="line">;lw     # 跳转至右方的窗口</span><br><span class="line">;hw     # 跳转到左方的窗口</span><br><span class="line">;kw     # 跳转到上方的子窗口</span><br><span class="line">;jw     # 跳转到下方的子窗口</span><br><span class="line"></span><br><span class="line"># 可以直接在tab之间切换</span><br><span class="line">gt      # 后一个tab标签</span><br><span class="line">gT      # 前一个tab标签</span><br><span class="line">;q      # 关闭一个标签</span><br><span class="line"></span><br><span class="line">;bn     # 正向遍历 buffer</span><br><span class="line">;bp     # 逆向遍历 (光标必须在buffer列表子窗口外)</span><br><span class="line">;bd     # 关闭当前buffer</span><br><span class="line">;bb     # 你之前所在的前一个buffer</span><br><span class="line"></span><br><span class="line">ctrl+y  # 向上一行</span><br><span class="line">ctrl+e  # 向下一行</span><br><span class="line">ctrl+u  # 向上半屏</span><br><span class="line">ctrl+d  # 向下半屏</span><br><span class="line">ctrl+f  # 向上一页 f 就是&#x27;forward&#x27;</span><br><span class="line">ctrl+b  # 向下一页 b 就是&#x27;backward&#x27;</span><br><span class="line"></span><br><span class="line">ctrl+o  # 上一个光标的位置</span><br><span class="line">ctrl+i  # 下一个光标的位置</span><br><span class="line"></span><br><span class="line"># 书签设定,标记并跳转</span><br><span class="line">ma      # 设定/取消当前行名为 a  的标签</span><br><span class="line">m,      # 自动设定下一个可用标签名</span><br><span class="line">mda     # 删除当前文件中所有所有独立标签</span><br><span class="line">m?      # 列出当前文件中所有书签,选中后回车可直接跳转</span><br><span class="line">mn      # 按照行号的前后顺序,跳转至下一个独立书签</span><br><span class="line">mp      # 按照行号的前后顺序,跳转至前一个独立书签</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#x27;a      # 调到书签a</span><br><span class="line">&#x27;.      # 最后一次编辑的地方</span><br><span class="line"></span><br><span class="line">;t      # 通过搜索文件打开文件</span><br><span class="line"></span><br><span class="line">0       # 跳转到当前行首</span><br><span class="line">$       # 跳转到当前行尾</span><br><span class="line"></span><br><span class="line">!CLL    # CLL 表示要执行的shell命令</span><br><span class="line">!date   # 查看时间</span><br><span class="line">:r !date        # 当前系统时间写入到光标所在行</span><br><span class="line">:r ./hello.txt  # 表示将当前路径下hello.txt文件中的内容 导入到光标所在行</span><br><span class="line"></span><br><span class="line"># visual select模式选中状态下</span><br><span class="line">U       # 选中 - 小写变大写</span><br><span class="line">u       # 选中 - 大写变小写</span><br><span class="line">~       # 选中 - 小写大写相互转换</span><br><span class="line">J       # 选中 - 选中的多行合并为一行</span><br><span class="line">:sp     # 选中搜索 - 搜索当前目录所有文件</span><br><span class="line">;sl     # 选中搜索 - 当前目录结果列表</span><br><span class="line"></span><br><span class="line"># 列选中编辑</span><br><span class="line">ctrl+v  # 进入块选中模式(visual block) &#x27;hjkl&#x27;方向键控制选中区</span><br><span class="line">shift+i # 进入列选择批  ;c$     # 光标开始位置量编辑</span><br><span class="line">;cc     # 代码注释 (根据语言选择注释形式  &quot;//&quot;  or &quot;&lt;!- comment --&gt;&gt;&quot; )</span><br><span class="line">;cm     # 代码段落注释 &quot;/**/&quot;</span><br><span class="line">;ci     # 注释相反,没注释的添加注释,注释额取消注释</span><br><span class="line">;cs     # 段落注释,注释每行前面加&quot;*&quot;</span><br><span class="line">;c$     # 光标开始位置到行结束位置添加注释</span><br><span class="line">;cA     # 在行尾部添加注释 &quot;//&quot;</span><br><span class="line">;cu     # 取消代码注释</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">:132,135 join # 合并132~135行</span><br><span class="line">xp      # 左右交换光标处两字符的位置</span><br><span class="line">;y      # 复制到系统剪贴板</span><br><span class="line">y       # 复制</span><br><span class="line">yy      # 复制光标所在行</span><br><span class="line">yw      # 从光标处复制一个字符/单词额末尾,包括空格</span><br><span class="line">ye      # 从光标出复制一个字符/单词的末尾,不包括空格</span><br><span class="line">y$      # 从当前光标处复制到行末</span><br><span class="line">y0      # 从当前光标位置复制到行首(不包括光标位置)</span><br><span class="line">y5l     # 从光标位置(包含光标位置)向右复制5字符</span><br><span class="line">y3B     # 从光标位置(不包含光标)反向复制3个单词</span><br><span class="line">.       # 粘贴</span><br><span class="line">p       # 粘贴</span><br><span class="line"></span><br><span class="line"># 多光标编辑</span><br><span class="line">shift+n # 选中下一个相同字符</span><br><span class="line">shift+k # 跳过当前选中的字符</span><br><span class="line"></span><br><span class="line">za      # 单个代码折叠</span><br><span class="line">zM      # 折叠左右代码</span><br><span class="line">zR      # 所有代码折叠取消</span><br><span class="line">;i      # 开/关缩进可视化 - 代码缩进关联线条</span><br><span class="line"></span><br><span class="line">&gt;       # 代码缩进 -</span><br><span class="line">&lt;       # 代码缩进</span><br><span class="line"></span><br><span class="line">:1,20/header/www/g # 1~20行将header替换成www</span><br><span class="line"></span><br><span class="line">ctrl+z  # vim 扔进后台jobs</span><br></pre></td></tr></table></figure></li></ul><h2 id="基础使用"><a href="#基础使用" class="headerlink" title="基础使用"></a>基础使用</h2><h3 id="快捷键通配符"><a href="#快捷键通配符" class="headerlink" title="快捷键通配符"></a>快捷键通配符</h3><p>  快捷键通配符 <code>&lt;leader&gt;</code> 相当于一个通用的命令符</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">let mapleader=&quot;;&quot;</span><br></pre></td></tr></table></figure><h3 id="插入命令"><a href="#插入命令" class="headerlink" title="插入命令"></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></pre></td><td class="code"><pre><span class="line">a # 在光标所在字符后插入</span><br><span class="line">A # 在光标所在字符尾插入</span><br><span class="line">i # 在光标所在字符前插入</span><br><span class="line">I # 在光标所在字符行行首插入</span><br><span class="line">o # 在光标下插入新行</span><br><span class="line">O # 在光标上插入新行</span><br></pre></td></tr></table></figure><h3 id="删除命令"><a href="#删除命令" class="headerlink" title="删除命令"></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></pre></td><td class="code"><pre><span class="line">x   # 删除光标所在字符</span><br><span class="line">nx  # 删除光标所在n个字符</span><br><span class="line">dd  # 剪贴光标所在行</span><br><span class="line">ndd # 剪贴n行</span><br><span class="line">dG  # 删除光标所在行到文件末尾</span><br><span class="line">D   # 删除光标所处位置到行尾内容</span><br><span class="line">:10,21d   # 删除10至21行</span><br></pre></td></tr></table></figure><h3 id="定位命令"><a href="#定位命令" class="headerlink" title="定位命令"></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><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></pre></td><td class="code"><pre><span class="line">:set number   # 设置行号  简写 set nu</span><br><span class="line">:set nonumber # 取消行号  简写set nonu</span><br><span class="line">gg            # 到第一行</span><br><span class="line">G             # 到最后一行</span><br><span class="line">nG            # 到第n行</span><br><span class="line">:n            # 到第n行</span><br><span class="line">$             # 到行末</span><br><span class="line">0             # 到行首</span><br><span class="line">hjkl          # 左下上右</span><br><span class="line">w             # 到下一个单词的开头</span><br><span class="line">b             # 与w相反</span><br><span class="line">e             # 到下一个单词的结尾</span><br><span class="line">ge            # 与e相反</span><br><span class="line">^             # 到本行第一个非blank(空白)字符</span><br><span class="line">g_            # 到本行最后一个不是blank字符的位置</span><br><span class="line">fa            # 到下一个为a的字符处,也可以fs到下一个为s的字符</span><br><span class="line">t,            # 到本行逗号前的第一个字符,逗号可以使其他字符</span><br><span class="line">3fa           # 在当前行查找第三次出现的a</span><br><span class="line">Fa            # 到当前行上一个为a的字符处,与f的查找方向相反</span><br><span class="line">T,            # 到本行上一个逗号字符处</span><br><span class="line"></span><br><span class="line">zz            # 将当前行置于屏幕中间</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="简单排版"><a href="#简单排版" class="headerlink" title="简单排版"></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></pre></td><td class="code"><pre><span class="line">:ce(center)   # 居中显示光标所在行</span><br><span class="line">:ri(right)    # 靠右显示光标所在行</span><br><span class="line">:le(left)     # 靠左显示光标所在行</span><br><span class="line">J             # 将光标所在下一行合并到当前行</span><br><span class="line">&gt;&gt;            # 光标所在行增加缩进(一个tab)</span><br><span class="line">&lt;&lt;            # 光标所在行减少缩进(一个tab)</span><br><span class="line">n&gt;&gt;           # 光标所在行开始的n行增加缩进</span><br><span class="line">n&lt;&lt;           # 光标所在行开始的n行减少缩进</span><br></pre></td></tr></table></figure><h3 id="刷新重载打开的文件"><a href="#刷新重载打开的文件" class="headerlink" title="刷新重载打开的文件"></a>刷新重载打开的文件</h3>  <figure class="highlight plaintext"><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">:e  # 刷新当前文件</span><br><span class="line">:e! # 强制刷新当前文件</span><br></pre></td></tr></table></figure><h3 id="保存退出"><a href="#保存退出" class="headerlink" title="保存退出"></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></pre></td><td class="code"><pre><span class="line">:w filename   # 保存修改</span><br><span class="line">:w            # 保修修改</span><br><span class="line">:wq           # 保存修改并退出</span><br><span class="line">ZZ            # 快捷键 保存修改并退出</span><br><span class="line">:q!           # 退出不保存</span><br><span class="line">:wq!          # 强制保存并退出</span><br></pre></td></tr></table></figure><h3 id="整页翻页"><a href="#整页翻页" class="headerlink" title="整页翻页"></a>整页翻页</h3>  <figure class="highlight plaintext"><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">ctrl+f        # 下一页  f 就是 &#x27;forward&#x27;</span><br><span class="line">ctrl+b        # 上一页  b 就是 &#x27;backward&#x27;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;vim-tutorial&quot;&gt;&lt;a href=&quot;#vim-tutorial&quot; class=&quot;headerlink&quot; title=&quot;vim-tutorial&quot;&gt;&lt;/a&gt;vim-tutorial&lt;/h1&gt;&lt;p&gt;vim tutorial&lt;/p&gt;
&lt;h2 id=&quot;整理资料来源&quot;&gt;&lt;a href=&quot;#整理资料来源&quot; class=&quot;headerlink&quot; title=&quot;整理资料来源&quot;&gt;&lt;/a&gt;整理资料来源&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;本资料来自 &lt;a href=&quot;https://github.com/jaywcjlove/vim-web&quot;&gt;vim-web&lt;/a&gt;     &lt;a href=&quot;http://www.jianshu.com/p/a361ce8c97bc&quot;&gt;一起来说vim语&lt;/a&gt;&lt;br&gt;整理学习 jokechat&lt;br&gt;理解此部分需要你已经理解vim的几种常用工作模式(正常模式,插入模式,命令模式等)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;动词&quot;&gt;&lt;a href=&quot;#动词&quot; class=&quot;headerlink&quot; title=&quot;动词&quot;&gt;&lt;/a&gt;动词&lt;/h3&gt;&lt;p&gt;  动词代表了我们打算对文本进行什么样的操作.例如:&lt;br&gt;  &lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;d # 表示delete&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;r # 表示替换replace&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;c # 表示表示change&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;y # 表示复制yank&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;v # 表示选取visual select&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id=&quot;名词&quot;&gt;&lt;a href=&quot;#名词&quot; class=&quot;headerlink&quot; title=&quot;名词&quot;&gt;&lt;/a&gt;名词&lt;/h3&gt;&lt;p&gt;  名词代表了我们即将处理的文本.vim中有一个术语对象叫做 text object (文本对象) ,示例如下:&lt;br&gt;  &lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;w # 表示一个单词word&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;s # 表示一个句子sentence&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;p # 表示一个段落paragraph&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;t # 表示一个html标签tag&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;引号或者各种括号所包含文本称为一个文本块&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id=&quot;介词&quot;&gt;&lt;a href=&quot;#介词&quot; class=&quot;headerlink&quot; title=&quot;介词&quot;&gt;&lt;/a&gt;介词&lt;/h3&gt;&lt;p&gt;  介词界定了待编辑文本的范围或者位置&lt;br&gt;  &lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;i # 表示在...之内 inside&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;a # 表示环绕...around&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;t # 表示到...位置钱 to&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;f # 表示到...位置上 forward&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id=&quot;数词&quot;&gt;&lt;a href=&quot;#数词&quot; class=&quot;headerlink&quot; title=&quot;数词&quot;&gt;&lt;/a&gt;数词&lt;/h3&gt;&lt;p&gt;  数字指定了待编辑文本对象的数量,从这个角度而言,数词也可以看做一种介词.引入介词之后,文本编辑命令的语法就升级成了下面样子:&lt;br&gt;  &lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;动词 介词/数词 名词&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;  下面是几个例子:&lt;br&gt;  &lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;c3w # 修改三个单词 change three words&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;d2w # 删除两个单词 delete two words&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>dynamic-nginx-block-ip-with-lua-and-redis</title>
    <link href="https://jokechat.cn/2018/03/05/dynamic-nginx-block-ip-with-lua-and-redis/"/>
    <id>https://jokechat.cn/2018/03/05/dynamic-nginx-block-ip-with-lua-and-redis/</id>
    <published>2018-03-05T06:09:41.000Z</published>
    <updated>2021-11-13T15:22:26.971Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>占坑  TODO </p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;占坑  TODO &lt;/p&gt;
&lt;/blockquote&gt;
</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>轻量级消息队列php-resque使用</title>
    <link href="https://jokechat.cn/2018/03/05/run-background-task-by-php-resque/"/>
    <id>https://jokechat.cn/2018/03/05/run-background-task-by-php-resque/</id>
    <published>2018-03-05T06:04:40.000Z</published>
    <updated>2021-11-13T15:22:26.971Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>因实际项目需求,需要一些在后台长时间运行一些比较耗时的任务,e.g:邮件,app推送消息,报表生成..,寻了几种方案<a href="https://www.swoole.com/" target="_blank" rel="noopener">swoole</a>,<a href="https://github.com/chrisboulton/php-resque" target="_blank" rel="noopener">php-resque</a>,<a href="http://www.workerman.net/" target="_blank" rel="noopener">workman</a>,最终选择了<code>php-resque</code>,比较喜欢Ta的设计简洁清晰,足够轻量,能满足目前的大部分需求</p></blockquote><h1 id="设计思想"><a href="#设计思想" class="headerlink" title="设计思想"></a>设计思想</h1><h2 id="导读"><a href="#导读" class="headerlink" title="导读"></a>导读</h2><p>  <code>php-resque</code> 的设计思想来源于 <code>Ruby</code> 的项目 <a href="https://github.com/resque/resque" target="_blank" rel="noopener">resque</a>,<a href="https://github.com/resque/resque/wiki/Alternate-Implementations" target="_blank" rel="noopener">这是各种语言实现版本</a>,更多文档请查阅官方文档</p><h2 id="设计思路-amp-角色划分"><a href="#设计思路-amp-角色划分" class="headerlink" title="设计思路&amp;角色划分"></a>设计思路&amp;角色划分</h2><h3 id="Worker-执行者"><a href="#Worker-执行者" class="headerlink" title="Worker 执行者"></a><code>Worker</code> 执行者</h3><p>  负责将<code>redis</code> 队列中的 <code>Job</code>取出,并调用执行指定的 <code>Job(Class)</code>,同时负责维护 <code>Job</code> 状态;<br>  一个<code>Worker</code>可以处理多个队列,可以开启多个<code>worker</code>加快处理速度</p><h3 id="Queue-队列"><a href="#Queue-队列" class="headerlink" title="Queue 队列"></a><code>Queue</code> 队列</h3><p>  队列通过 <code>redis</code> 队列实现,</p><h3 id="Job-任务"><a href="#Job-任务" class="headerlink" title="Job 任务"></a><code>Job</code> 任务</h3><p>  一个<code>Job</code>就是一个需要在后台需要执行的任务,在<code>php-resque</code>的实现中,一个<code>Class</code>就是一个<code>Job</code></p><h2 id="使用基本流程"><a href="#使用基本流程" class="headerlink" title="使用基本流程"></a><code>使用基本流程</code></h2><h3 id="0x00-将一个后台任务编写为一个独立的Class，这个Class就是一个Job。"><a href="#0x00-将一个后台任务编写为一个独立的Class，这个Class就是一个Job。" class="headerlink" title="0x00  将一个后台任务编写为一个独立的Class，这个Class就是一个Job。"></a><code>0x00</code>  将一个后台任务编写为一个独立的<code>Class</code>，这个Class就是一个<code>Job</code>。</h3><h3 id="0x01-在需要使用后台程序的地方，系统将Job-Class的名称以及所需参数放入队列。"><a href="#0x01-在需要使用后台程序的地方，系统将Job-Class的名称以及所需参数放入队列。" class="headerlink" title="0x01  在需要使用后台程序的地方，系统将Job Class的名称以及所需参数放入队列。"></a><code>0x01</code>  在需要使用后台程序的地方，系统将<code>Job Class</code>的名称以及所需参数放入队列。</h3><h3 id="0x02-以命令行方式开启一个Worker，并通过参数指定Worker所需要处理的队列。"><a href="#0x02-以命令行方式开启一个Worker，并通过参数指定Worker所需要处理的队列。" class="headerlink" title="0x02  以命令行方式开启一个Worker，并通过参数指定Worker所需要处理的队列。"></a><code>0x02</code>  以命令行方式开启一个<code>Worker</code>，并通过参数指定Worker所需要处理的队列。</h3><h3 id="0x03-Worker作为守护进程运行，并且定时检查队列。"><a href="#0x03-Worker作为守护进程运行，并且定时检查队列。" class="headerlink" title="0x03  Worker作为守护进程运行，并且定时检查队列。"></a><code>0x03</code>  Worker作为守护进程运行，并且定时检查队列。</h3><h3 id="0x04-当队列中有Job时，Worker取出Job并运行，即实例化Job-Class并执行Class中的方法。"><a href="#0x04-当队列中有Job时，Worker取出Job并运行，即实例化Job-Class并执行Class中的方法。" class="headerlink" title="0x04  当队列中有Job时，Worker取出Job并运行，即实例化Job Class并执行Class中的方法。"></a><code>0x04</code>  当队列中有<code>Job</code>时，<code>Worker</code>取出<code>Job</code>并运行，即实例化<code>Job Class</code>并执行<code>Class</code>中的方法。</h3><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><h2 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h2><h3 id="redis"><a href="#redis" class="headerlink" title="redis"></a>redis</h3><h3 id="php"><a href="#php" class="headerlink" title="php"></a>php</h3><h1 id="使用-TODO"><a href="#使用-TODO" class="headerlink" title="使用 TODO"></a>使用 <code>TODO</code></h1><h2 id="Job相关"><a href="#Job相关" class="headerlink" title="Job相关"></a>Job相关</h2><h3 id="编写Job"><a href="#编写Job" class="headerlink" title="编写Job"></a>编写Job</h3><h3 id="将Job插入队列"><a href="#将Job插入队列" class="headerlink" title="将Job插入队列"></a>将Job插入队列</h3><h3 id="Job状态查看"><a href="#Job状态查看" class="headerlink" title="Job状态查看"></a>Job状态查看</h3><h2 id="Worker相关"><a href="#Worker相关" class="headerlink" title="Worker相关"></a>Worker相关</h2><h3 id="启动-重启-停止"><a href="#启动-重启-停止" class="headerlink" title="启动,重启,停止"></a>启动,重启,停止</h3><h3 id="日志收集"><a href="#日志收集" class="headerlink" title="日志收集"></a>日志收集</h3>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;因实际项目需求,需要一些在后台长时间运行一些比较耗时的任务,e.g:邮件,app推送消息,报表生成..,寻了几种方案&lt;a href=&quot;https://www.swoole.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;s</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>自用的一些命令行工具</title>
    <link href="https://jokechat.cn/2018/02/20/some-cli-tools/"/>
    <id>https://jokechat.cn/2018/02/20/some-cli-tools/</id>
    <published>2018-02-20T01:51:58.000Z</published>
    <updated>2021-11-13T15:22:26.971Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>工欲善其事必先利其器</p></blockquote><h1 id="brew"><a href="#brew" class="headerlink" title="brew"></a><a href="https://brew.sh/" target="_blank" rel="noopener">brew</a></h1><p>brew 又叫Homebrew，是Mac OSX上的软件包管理工具，能在Mac中方便的安装软件或者卸载软件， 只需要一个命令， 非常方便</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><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"># 安装命令</span></span><br><span class="line">/usr/bin/ruby -e <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span></span><br></pre></td></tr></table></figure><h2 id="搜索"><a href="#搜索" class="headerlink" title="搜索"></a>搜索</h2><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 search xx</span><br></pre></td></tr></table></figure><h2 id="安装列表"><a href="#安装列表" class="headerlink" title="安装列表"></a>安装列表</h2><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 list</span><br></pre></td></tr></table></figure><h2 id="服务"><a href="#服务" class="headerlink" title="服务"></a>服务</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew services [-v|--verbose] [list | run | start | stop | restart | cleanup] [...]</span><br></pre></td></tr></table></figure><h2 id="卸载"><a href="#卸载" class="headerlink" title="卸载"></a>卸载</h2><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 uninstall, rm, remove [--force] [--ignore-dependencies] formula:</span><br></pre></td></tr></table></figure><h1 id="oh-my-zsh"><a href="#oh-my-zsh" class="headerlink" title="oh my zsh"></a><a href="https://github.com/robbyrussell/oh-my-zsh" target="_blank" rel="noopener">oh my zsh</a></h1><p>是最为流行的 zsh 配置文件，提供了大量的主题和插件，极大的拓展了 zsh 的功能<br><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Mac</span></span><br><span class="line">brew install zsh</span><br><span class="line"></span><br><span class="line"><span class="comment"># centos</span></span><br><span class="line">yum install zsh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改为zsh</span></span><br><span class="line">chsh -s `<span class="built_in">which</span> zsh`</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 oh my zsh</span></span><br><span class="line">sh -c <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)</span>"</span></span><br></pre></td></tr></table></figure></p><a id="more"></a><blockquote><p>安装<code>oh my zsh</code> 后,开箱即用,基本不用做太多改变</p></blockquote><h2 id="6的飞起的命令补全功能-补齐命令-补齐参数-补齐路径-实在不满足需求-自己写一个补齐插件也是可以的"><a href="#6的飞起的命令补全功能-补齐命令-补齐参数-补齐路径-实在不满足需求-自己写一个补齐插件也是可以的" class="headerlink" title="6的飞起的命令补全功能:补齐命令,补齐参数,补齐路径,实在不满足需求,自己写一个补齐插件也是可以的"></a>6的飞起的命令补全功能:补齐命令,补齐参数,补齐路径,实在不满足需求,自己写一个补齐插件也是可以的</h2><p><img src="http://img.jokechat.cn/2018/02/20/cli-complete.png" alt="命令补全"></p><h2 id="智能跳转功能-d-dirs-v-head-10"><a href="#智能跳转功能-d-dirs-v-head-10" class="headerlink" title="智能跳转功能 d (dirs -v | head -10)"></a>智能跳转功能 <code>d</code> (<code>dirs -v | head -10</code>)</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><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">➜  /Users/jokechat/Desktop <span class="built_in">cd</span> /usr/<span class="built_in">local</span></span><br><span class="line">➜  /usr/<span class="built_in">local</span> d</span><br><span class="line">0/usr/<span class="built_in">local</span></span><br><span class="line">1~/Desktop</span><br><span class="line">➜  /usr/<span class="built_in">local</span> 1</span><br><span class="line">~/Desktop</span><br><span class="line">➜  /Users/jokechat/Desktop</span><br></pre></td></tr></table></figure><h2 id="历史记录-输入git-按向上箭头-会显示之前用过的命令"><a href="#历史记录-输入git-按向上箭头-会显示之前用过的命令" class="headerlink" title="历史记录,输入git,按向上箭头,会显示之前用过的命令"></a>历史记录,输入<code>git</code>,按向上箭头,会显示之前用过的命令</h2><p><img src="http://img.jokechat.cn/2018/02/20/clichoose.gif" alt="历史记录"></p><h2 id="主题-theme"><a href="#主题-theme" class="headerlink" title="主题 (theme)"></a>主题 (<code>theme</code>)</h2><figure class="highlight apache"><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="attribute">ZSH_THEME</span>= <span class="string">"robbyrussell"</span>   // 默认主题</span><br><span class="line"><span class="comment"># ZSH_THEME= "random"   // 随机主题,每次启动随机选择一个主题</span></span><br></pre></td></tr></table></figure><h2 id="插件-plugins-更多"><a href="#插件-plugins-更多" class="headerlink" title="插件(plugins) 更多"></a>插件(<code>plugins</code>) <a href="https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins" target="_blank" rel="noopener">更多</a></h2><figure class="highlight apache"><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"># git插件 精简 git 命令，减少输入字符数</span></span><br><span class="line"><span class="comment"># autojump 插件 按照你的使用频率记录路径，使得目录的跳转更为方便;安装 </span></span><br><span class="line"><span class="comment">#   brew install autojump</span></span><br><span class="line"><span class="comment"># z 插件,匹配跳转最常使用目录 e.g: z web</span></span><br><span class="line"><span class="attribute">plugins</span>=(git osx autojump z)</span><br></pre></td></tr></table></figure><h2 id="别名-alias"><a href="#别名-alias" class="headerlink" title="别名(alias)"></a>别名(<code>alias</code>)</h2><figure class="highlight apache"><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"># 普通别名</span></span><br><span class="line"><span class="attribute">alias</span> hello='echo hello'  </span><br><span class="line"><span class="comment"># 文件别名  zsh下直接输入 xxx.md,将直接使用vim打开</span></span><br><span class="line"><span class="attribute">alias</span> -s md=vim</span><br></pre></td></tr></table></figure><h1 id="htop"><a href="#htop" class="headerlink" title="htop"></a><a href="http://hisham.hm/htop/" target="_blank" rel="noopener">htop</a></h1><blockquote><p><a href="https://zh.wikipedia.org/wiki/Htop" target="_blank" rel="noopener">Htop</a>是一款运行于Linux系统监控与进程管理软件，用于取代Unix下传统的top。与top只提供最消耗资源的进程列表不同，htop提供所有进程的列表，并且使用彩色标识出处理器、swap和内存状态。</p></blockquote><h2 id="安装-1"><a href="#安装-1" class="headerlink" title="安装"></a>安装</h2><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 htop</span><br></pre></td></tr></table></figure><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><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">htop</span><br></pre></td></tr></table></figure><p><img src="http://img.jokechat.cn/2018/02/20/htop.png" alt="htop"></p><h1 id="ag"><a href="#ag" class="headerlink" title="ag"></a><a href="https://github.com/ggreer/the_silver_searcher" target="_blank" rel="noopener">ag</a></h1><h2 id="安装-2"><a href="#安装-2" class="headerlink" title="安装"></a>安装</h2><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 the_silver_searcher</span><br></pre></td></tr></table></figure><h2 id="使用-1"><a href="#使用-1" class="headerlink" title="使用"></a>使用</h2><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"># 搜索 hello</span></span><br><span class="line">ag <span class="string">'hello'</span></span><br></pre></td></tr></table></figure><h1 id="ccat"><a href="#ccat" class="headerlink" title="ccat"></a><a href="https://github.com/jingweno/ccat" target="_blank" rel="noopener">ccat</a></h1><h2 id="安装-3"><a href="#安装-3" class="headerlink" title="安装"></a>安装</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></pre></td><td class="code"><pre><span class="line">brew install ccat</span><br><span class="line"><span class="comment"># 在.zshrc中添加别名会更加酸爽</span></span><br><span class="line"><span class="built_in">alias</span> cat=ccat</span><br></pre></td></tr></table></figure><h2 id="使用-2"><a href="#使用-2" class="headerlink" title="使用"></a>使用</h2><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">cat hello.json</span><br></pre></td></tr></table></figure><p><img src="http://img.jokechat.cn/2018/02/20/cat.png" alt="cat"></p><h1 id="jq"><a href="#jq" class="headerlink" title="jq"></a><a href="https://stedolan.github.io/jq/" target="_blank" rel="noopener">jq</a></h1><blockquote><p>linux 下处理JSON的神器</p><h2 id="安装-4"><a href="#安装-4" class="headerlink" title="安装"></a>安装</h2><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 jq</span><br></pre></td></tr></table></figure></blockquote><h2 id="使用-3"><a href="#使用-3" class="headerlink" title="使用"></a>使用</h2><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">cat hello.json | jq .url</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;工欲善其事必先利其器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;brew&quot;&gt;&lt;a href=&quot;#brew&quot; class=&quot;headerlink&quot; title=&quot;brew&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;brew&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;brew 又叫Homebrew，是Mac OSX上的软件包管理工具，能在Mac中方便的安装软件或者卸载软件， 只需要一个命令， 非常方便&lt;/p&gt;
&lt;h2 id=&quot;安装&quot;&gt;&lt;a href=&quot;#安装&quot; class=&quot;headerlink&quot; title=&quot;安装&quot;&gt;&lt;/a&gt;安装&lt;/h2&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# 安装命令&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/usr/bin/ruby -e &lt;span class=&quot;string&quot;&gt;&quot;&lt;span class=&quot;variable&quot;&gt;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&lt;/span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h2 id=&quot;搜索&quot;&gt;&lt;a href=&quot;#搜索&quot; class=&quot;headerlink&quot; title=&quot;搜索&quot;&gt;&lt;/a&gt;搜索&lt;/h2&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;brew search xx&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h2 id=&quot;安装列表&quot;&gt;&lt;a href=&quot;#安装列表&quot; class=&quot;headerlink&quot; title=&quot;安装列表&quot;&gt;&lt;/a&gt;安装列表&lt;/h2&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;brew list&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h2 id=&quot;服务&quot;&gt;&lt;a href=&quot;#服务&quot; class=&quot;headerlink&quot; title=&quot;服务&quot;&gt;&lt;/a&gt;服务&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;brew services [-v|--verbose] [list | run | start | stop | restart | cleanup] [...]&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h2 id=&quot;卸载&quot;&gt;&lt;a href=&quot;#卸载&quot; class=&quot;headerlink&quot; title=&quot;卸载&quot;&gt;&lt;/a&gt;卸载&lt;/h2&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;brew uninstall, rm, remove [--force] [--ignore-dependencies] formula:&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h1 id=&quot;oh-my-zsh&quot;&gt;&lt;a href=&quot;#oh-my-zsh&quot; class=&quot;headerlink&quot; title=&quot;oh my zsh&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/robbyrussell/oh-my-zsh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;oh my zsh&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;是最为流行的 zsh 配置文件，提供了大量的主题和插件，极大的拓展了 zsh 的功能&lt;br&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# Mac&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;brew install zsh&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# centos&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;yum install zsh&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# 修改为zsh&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;chsh -s `&lt;span class=&quot;built_in&quot;&gt;which&lt;/span&gt; zsh`&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# 安装 oh my zsh&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;sh -c &lt;span class=&quot;string&quot;&gt;&quot;&lt;span class=&quot;variable&quot;&gt;$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)&lt;/span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://jokechat.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="Linux" scheme="https://jokechat.cn/tags/Linux/"/>
    
    <category term="cli" scheme="https://jokechat.cn/tags/cli/"/>
    
  </entry>
  
  <entry>
    <title>一些常用的IDE</title>
    <link href="https://jokechat.cn/2018/02/19/favorite-ide-list/"/>
    <id>https://jokechat.cn/2018/02/19/favorite-ide-list/</id>
    <published>2018-02-19T01:33:47.000Z</published>
    <updated>2021-11-13T16:05:26.963Z</updated>
    
    <content type="html"><![CDATA[<hr><blockquote><p>术业有专攻,选择合适的工具做合适的事情,事半功倍<br>下面贴一贴自己常用的IDE</p></blockquote><hr><h1 id="Mac下最好用的终端工具-iTerm2"><a href="#Mac下最好用的终端工具-iTerm2" class="headerlink" title="Mac下最好用的终端工具-iTerm2"></a>Mac下最好用的终端工具-<a href="http://www.iterm2.com/" target="_blank" rel="noopener">iTerm2</a></h1><ul><li>分割窗口</li><li>快捷键</li><li>搜索</li><li>自动完成</li><li>选中复制</li><li>粘贴历史</li><li>即时重放</li><li>配置型强</li><li><a href="http://www.iterm2.com/features.html" target="_blank" rel="noopener">更多功能特性</a></li></ul><h1 id="效率神器-Alfred"><a href="#效率神器-Alfred" class="headerlink" title="效率神器 Alfred"></a>效率神器 <a href="https://www.alfredapp.com/" target="_blank" rel="noopener">Alfred</a></h1><ul><li>最爱剪贴板</li><li>史上最酸爽效率神器,用过都说好 ☺</li></ul><a id="more"></a><h1 id="离线文档神器-dash"><a href="#离线文档神器-dash" class="headerlink" title="离线文档神器 dash"></a>离线文档神器 <a href="https://kapeli.com/dash" target="_blank" rel="noopener">dash</a></h1><ul><li>coder 必备神器</li></ul><h1 id="MySQL-GUI-工具-sequel-pro"><a href="#MySQL-GUI-工具-sequel-pro" class="headerlink" title="MySQL GUI 工具 sequel pro"></a>MySQL GUI 工具 <a href="http://www.sequelpro.com/" target="_blank" rel="noopener">sequel pro</a></h1><ul><li>图形化数据库管理工具</li></ul><h1 id="redis-GUI-工具-medis"><a href="#redis-GUI-工具-medis" class="headerlink" title="redis GUI 工具 medis"></a>redis GUI 工具 <a href="https://github.com/luin/medis" target="_blank" rel="noopener">medis</a></h1><ul><li>redis 图形化管理工具</li></ul><h1 id="文本编辑器-Sublime-Text"><a href="#文本编辑器-Sublime-Text" class="headerlink" title="文本编辑器 Sublime Text"></a>文本编辑器 <a href="https://www.sublimetext.com/" target="_blank" rel="noopener">Sublime Text</a></h1><ul><li>比较好用的文本编辑工具</li></ul><h1 id="前端开发工具-vscode"><a href="#前端开发工具-vscode" class="headerlink" title="前端开发工具 vscode"></a>前端开发工具 <a href="https://code.visualstudio.com/" target="_blank" rel="noopener">vscode</a></h1><ul><li>微软开源IDE</li><li>前端开发利器</li><li>插件丰富</li></ul><h1 id="php-IDE-phpstorm"><a href="#php-IDE-phpstorm" class="headerlink" title="php IDE phpstorm"></a>php IDE <a href="http://www.jetbrains.com/phpstorm/" target="_blank" rel="noopener">phpstorm</a></h1><ul><li>phper 开发IDE</li></ul><h1 id="webvim"><a href="#webvim" class="headerlink" title="webvim"></a>webvim</h1><ul><li>Linux 编辑器,以下是参考资料</li><li><a href="https://github.com/jaywcjlove/vim-web" target="_blank" rel="noopener">vim-web</a></li><li><a href="http://webvim.org/" target="_blank" rel="noopener">webvim</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;术业有专攻,选择合适的工具做合适的事情,事半功倍&lt;br&gt;下面贴一贴自己常用的IDE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h1 id=&quot;Mac下最好用的终端工具-iTerm2&quot;&gt;&lt;a href=&quot;#Mac下最好用的终端工具-iTerm2&quot; class=&quot;headerlink&quot; title=&quot;Mac下最好用的终端工具-iTerm2&quot;&gt;&lt;/a&gt;Mac下最好用的终端工具-&lt;a href=&quot;http://www.iterm2.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;iTerm2&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;分割窗口&lt;/li&gt;
&lt;li&gt;快捷键&lt;/li&gt;
&lt;li&gt;搜索&lt;/li&gt;
&lt;li&gt;自动完成&lt;/li&gt;
&lt;li&gt;选中复制&lt;/li&gt;
&lt;li&gt;粘贴历史&lt;/li&gt;
&lt;li&gt;即时重放&lt;/li&gt;
&lt;li&gt;配置型强&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.iterm2.com/features.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;更多功能特性&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;效率神器-Alfred&quot;&gt;&lt;a href=&quot;#效率神器-Alfred&quot; class=&quot;headerlink&quot; title=&quot;效率神器 Alfred&quot;&gt;&lt;/a&gt;效率神器 &lt;a href=&quot;https://www.alfredapp.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Alfred&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;最爱剪贴板&lt;/li&gt;
&lt;li&gt;史上最酸爽效率神器,用过都说好 ☺&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    
    <category term="IDE" scheme="https://jokechat.cn/tags/IDE/"/>
    
  </entry>
  
  <entry>
    <title>如何提高自己的核心竞争力</title>
    <link href="https://jokechat.cn/2017/07/02/how-to-improve-yourself/"/>
    <id>https://jokechat.cn/2017/07/02/how-to-improve-yourself/</id>
    <published>2017-07-01T16:14:53.000Z</published>
    <updated>2021-11-13T15:22:26.971Z</updated>
    
    <content type="html"><![CDATA[<h1 id="资料整理来源知乎-如何提高自己的核心竞争力"><a href="#资料整理来源知乎-如何提高自己的核心竞争力" class="headerlink" title="资料整理来源知乎 如何提高自己的核心竞争力"></a>资料整理来源知乎 <a href="https://www.zhihu.com/question/56014101" target="_blank" rel="noopener">如何提高自己的核心竞争力</a></h1><ul><li>能力不行就靠努力,你的努力,你的想法让你的上司知道</li><li>能独立的表达自己的观点,却不能不合群,缺失团队精神的没人喜欢</li><li>对’公司规则’,’团队统一标准’要表示服从,却不能卑躬屈膝</li><li>要积极地参与公司的团建活动。AA制的活动不想去，也请把钱付了。也是为自己积赞人品</li><li>看到能力比自己强的同事少去苛责别人嫉妒别人。看到不如自己的同事要多多帮助。默默无闻弥补你上司的短板，不要在背后说你老板的坏话。</li><li>学会沟通，学会合作，学会学习。对于没有什么核心竞争力的员工来说，这三样技能比工作能力更重要！</li><li>不要玻璃心。</li><li>沟通是情绪的转移，信息的转移，感情的互动。喜悦心、包容心、同理心、赞美心、爱心。</li><li>任何合作都是利益的合作，缺乏利益驱动的合作基本都是废话，不值得做的事情， 谁就不会去做好；那么，对于一个“没有核心竞争力”的人来说，你看中的利益应该是什么？我认为应该是：你的团队认可你！用心和他人合作比你一天到晚想着法子证明自己更重要。和他人合作，不但能取长补短，还能让你默默无闻中永远安全。</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;资料整理来源知乎-如何提高自己的核心竞争力&quot;&gt;&lt;a href=&quot;#资料整理来源知乎-如何提高自己的核心竞争力&quot; class=&quot;headerlink&quot; title=&quot;资料整理来源知乎 如何提高自己的核心竞争力&quot;&gt;&lt;/a&gt;资料整理来源知乎 &lt;a href=&quot;https</summary>
      
    
    
    
    
    <category term="转载" scheme="https://jokechat.cn/tags/%E8%BD%AC%E8%BD%BD/"/>
    
  </entry>
  
  <entry>
    <title>svn钩子拦截空注释</title>
    <link href="https://jokechat.cn/2017/04/04/svn-intercept-empty-comments/"/>
    <id>https://jokechat.cn/2017/04/04/svn-intercept-empty-comments/</id>
    <published>2017-04-04T02:37:27.000Z</published>
    <updated>2018-04-04T02:37:27.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>别调皮,乖乖写注释去</p></blockquote><ul><li>总有一些小朋友不乖,总是忘了写注释,于是用<code>svn</code>钩子拦截一些空注释</li></ul><h1 id="0x01-切换到svn服务器目录"><a href="#0x01-切换到svn服务器目录" class="headerlink" title="0x01 切换到svn服务器目录"></a>0x01 <code>切换到svn服务器目录</code></h1><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"># 假定svn所在目录为 /var/svn/svnrepos</span></span><br><span class="line"><span class="built_in">cd</span> /var/svn/svnrepos/hooks</span><br></pre></td></tr></table></figure><h1 id="0x02-创建pre-commit"><a href="#0x02-创建pre-commit" class="headerlink" title="0x02 创建pre-commit"></a>0x02 <code>创建pre-commit</code></h1><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="comment"># 创建文件</span></span><br><span class="line">touch pre-commit</span><br><span class="line"><span class="comment"># 赋予执行权限</span></span><br><span class="line">chmod u+x pre-commit</span><br></pre></td></tr></table></figure><a id="more"></a><h1 id="0x03-编辑pre-commit-为以下内容"><a href="#0x03-编辑pre-commit-为以下内容" class="headerlink" title="0x03 编辑pre-commit 为以下内容"></a>0x03 <code>编辑pre-commit 为以下内容</code></h1><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash">! /bin/sh</span></span><br><span class="line">export LC_ALL=zh_CN.UTF-8</span><br><span class="line">export LANG=zh_CN.UTF-8</span><br><span class="line">export LANGUAGE=zh_CN.UTF-8</span><br><span class="line"></span><br><span class="line">REPOS="$1"</span><br><span class="line">TXN="$2"</span><br><span class="line"></span><br><span class="line">SVNLOOK=/usr/bin/svnlook</span><br><span class="line">LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | wc -c` </span><br><span class="line"></span><br><span class="line">echo $REPOS &gt;&gt; /var/log/svn.log</span><br><span class="line">echo $TXN &gt;&gt; /var/log/svn.log</span><br><span class="line"></span><br><span class="line">if [ "$LOGMSG" -lt 4 ];</span><br><span class="line">then </span><br><span class="line">    echo  -e "别调皮,乖乖写注释去" 1&gt;&amp;2</span><br><span class="line">exit 1</span><br><span class="line">fi</span><br><span class="line">exit 0</span><br></pre></td></tr></table></figure><h1 id="0x04-end"><a href="#0x04-end" class="headerlink" title="0x04 end"></a>0x04 <code>end</code></h1><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"># 在你的svn工作目录尝试以下</span></span><br><span class="line">svn commint;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;别调皮,乖乖写注释去&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;总有一些小朋友不乖,总是忘了写注释,于是用&lt;code&gt;svn&lt;/code&gt;钩子拦截一些空注释&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;0x01-切换到svn服务器目录&quot;&gt;&lt;a href=&quot;#0x01-切换到svn服务器目录&quot; class=&quot;headerlink&quot; title=&quot;0x01 切换到svn服务器目录&quot;&gt;&lt;/a&gt;0x01 &lt;code&gt;切换到svn服务器目录&lt;/code&gt;&lt;/h1&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# 假定svn所在目录为 /var/svn/svnrepos&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;built_in&quot;&gt;cd&lt;/span&gt; /var/svn/svnrepos/hooks&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h1 id=&quot;0x02-创建pre-commit&quot;&gt;&lt;a href=&quot;#0x02-创建pre-commit&quot; class=&quot;headerlink&quot; title=&quot;0x02 创建pre-commit&quot;&gt;&lt;/a&gt;0x02 &lt;code&gt;创建pre-commit&lt;/code&gt;&lt;/h1&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# 创建文件&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;touch pre-commit&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# 赋予执行权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;chmod u+x pre-commit&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="https://jokechat.cn/tags/Linux/"/>
    
    <category term="svn" scheme="https://jokechat.cn/tags/svn/"/>
    
  </entry>
  
  <entry>
    <title>ssh免密登录Linux服务器</title>
    <link href="https://jokechat.cn/2017/02/09/ssh-password-free-login/"/>
    <id>https://jokechat.cn/2017/02/09/ssh-password-free-login/</id>
    <published>2017-02-09T02:33:52.000Z</published>
    <updated>2021-11-13T15:22:26.971Z</updated>
    
    <content type="html"><![CDATA[<blockquote class="blockquote-center"><p>身为一个懒癌晚期患者,能敲一个单词,绝不敲两下</p></blockquote><ul><li>重复的次数多了就该想想办法偷偷懒了,例如这货:<code>ssh</code>免密免密登录服务器,再也不用翻笔记找密码了</li></ul><h1 id="0x01-客户端创建公私钥"><a href="#0x01-客户端创建公私钥" class="headerlink" title="0x01 客户端创建公私钥"></a>0x01 <code>客户端创建公私钥</code></h1><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">ssh-keygen</span><br><span class="line"><span class="comment"># 按照提示输入文件名称即可,例如:devServer</span></span><br></pre></td></tr></table></figure><h1 id="0x02-将公钥复制服务器"><a href="#0x02-将公钥复制服务器" class="headerlink" title="0x02 将公钥复制服务器"></a>0x02 <code>将公钥复制服务器</code></h1><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"><span class="comment"># ssh-copy-id 会将客户端公钥复制到服务器  `~/.ssh/authorized_keys`中</span></span><br><span class="line"><span class="comment"># 按照体术输入服务器用户名密码即可</span></span><br><span class="line">ssh-copy-id -i devServer.pub username@domain</span><br></pre></td></tr></table></figure><a id="more"></a><h1 id="0x03-修改客户端ssh配置"><a href="#0x03-修改客户端ssh配置" class="headerlink" title="0x03 修改客户端ssh配置"></a>0x03 <code>修改客户端ssh配置</code></h1><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"><span class="built_in">cd</span> ~/.ssh</span><br><span class="line">vim config</span><br><span class="line"><span class="comment"># 添加配置如下</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">Host you-like-name</span><br><span class="line">      HostName domain</span><br><span class="line">      User username</span><br><span class="line">      Port 22</span><br><span class="line">      PubkeyAuthentication yes </span><br><span class="line">      IdentityFile ~/.ssh/devServer</span><br></pre></td></tr></table></figure><h1 id="0x04-enjoy-it"><a href="#0x04-enjoy-it" class="headerlink" title="0x04 enjoy it"></a>0x04 <code>enjoy it</code></h1><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">ssh you-like-name</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;身为一个懒癌晚期患者,能敲一个单词,绝不敲两下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;重复的次数多了就该想想办法偷偷懒了,例如这货:&lt;code&gt;ssh&lt;/code&gt;免密免密登录服务器,再也不用翻笔记找密码了&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;0x01-客户端创建公私钥&quot;&gt;&lt;a href=&quot;#0x01-客户端创建公私钥&quot; class=&quot;headerlink&quot; title=&quot;0x01 客户端创建公私钥&quot;&gt;&lt;/a&gt;0x01 &lt;code&gt;客户端创建公私钥&lt;/code&gt;&lt;/h1&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;ssh-keygen&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# 按照提示输入文件名称即可,例如:devServer&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h1 id=&quot;0x02-将公钥复制服务器&quot;&gt;&lt;a href=&quot;#0x02-将公钥复制服务器&quot; class=&quot;headerlink&quot; title=&quot;0x02 将公钥复制服务器&quot;&gt;&lt;/a&gt;0x02 &lt;code&gt;将公钥复制服务器&lt;/code&gt;&lt;/h1&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# ssh-copy-id 会将客户端公钥复制到服务器  `~/.ssh/authorized_keys`中&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;# 按照体术输入服务器用户名密码即可&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;ssh-copy-id -i devServer.pub username@domain&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    
    <category term="ssh" scheme="https://jokechat.cn/tags/ssh/"/>
    
    <category term="linux" scheme="https://jokechat.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://jokechat.cn/2017/01/13/hello-world/"/>
    <id>https://jokechat.cn/2017/01/13/hello-world/</id>
    <published>2017-01-13T05:19:11.000Z</published>
    <updated>2021-11-13T15:22:26.971Z</updated>
    
    <content type="html"><![CDATA[<!-- 标签 方式，要求版本在0.4.5或以上 --><blockquote class="blockquote-center"><p>没有瘾的生活，总是过分平常，一直过下去，就好像自己都要消失在这个世界上了。 所以我们总需要一种类似执念、迷恋、热爱或沉溺的东西，才可以在这时常令人绝望的世界里，勇敢地活下去。 我们总要沉浸某个领域，才会知道这个自己是怎样的自己，才会明白自己要的究竟是什么，才会在这个自己重新浮上来之后， 如获得了新生般有了新的眼光、新的视野，而那种上瘾的感觉将变成一个秘密，一个充满爱的秘密，于是那些艰难险阻也就再也算不上什么了……</p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;!-- 标签 方式，要求版本在0.4.5或以上 --&gt;
&lt;blockquote class=&quot;blockquote-center&quot;&gt;&lt;p&gt;没有瘾的生活，总是过分平常，一直过下去，就好像自己都要消失在这个世界上了。 所以我们总需要一种类似执念、迷恋、热爱或沉溺的东西，才可以在这时</summary>
      
    
    
    
    
  </entry>
  
</feed>
