<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>编码即是修行</title>
        <link>https://blog.zenheart.site/</link>
        <description>Coding · Cultination · Contemplation</description>
        <lastBuildDate>Wed, 22 Apr 2026 05:07:26 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>Copyright (c) 2016-present, zenheart</copyright>
        <item>
            <title><![CDATA[关于]]></title>
            <link>https://blog.zenheart.site/about</link>
            <guid isPermaLink="false">https://blog.zenheart.site/about</guid>
            <pubDate>Tue, 21 Apr 2026 12:57:18 GMT</pubDate>
            <description><![CDATA[关于作者]]></description>
            <content:encoded><![CDATA[<!-- About page is rendered by the theme's Layout.vue -->
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[主页]]></title>
            <link>https://blog.zenheart.site/</link>
            <guid isPermaLink="false">https://blog.zenheart.site/</guid>
            <pubDate>Tue, 21 Apr 2026 12:57:18 GMT</pubDate>
            <description><![CDATA[编码即是修行 - Coding as Spiritual Practice]]></description>
            <content:encoded><![CDATA[<!-- Home page is rendered by the theme's Layout.vue -->
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[博客]]></title>
            <link>https://blog.zenheart.site/posts</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts</guid>
            <pubDate>Tue, 21 Apr 2026 12:57:18 GMT</pubDate>
            <description><![CDATA[所有文章列表]]></description>
            <content:encoded><![CDATA[<!-- Archive page is rendered by the theme's Layout.vue -->
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[正则表达式]]></title>
            <link>https://blog.zenheart.site/posts/2017-08-25-regexp</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-08-25-regexp</guid>
            <pubDate>Tue, 21 Apr 2026 12:57:18 GMT</pubDate>
            <description><![CDATA[
# 正则表达式

**正则表达式笔记**


## 正则表达式使用详解
使用正则表达式的作用
1. 实现复杂文本逻辑的替换
2. 查找文本模式
3. 提取文本模式


```html
    <!doctype html>
    <html ng-app="MyModule">
    	<head>
    		<meta charset="utf-8">
    		<link rel="stylesheet" href="css/bootstrap-3.0.0/css/bootstrap.css">
    	</head>
    	<body>
    		<div ng-controller="MyCtrl">
    			<greeting greet="sayHello(name)"></greeting>
    			<greeting greet="sayHello(name)"></greeting>
    			<greeting greet="sayHello(name)"></greeting>
    		</div>
    		<p>number:123-3456-7923</p> 
    		 <p>hello hello hello   hello   hello   </p>
    	</body>
    	<script src="framework/angular-1.3.0.14/angular.js"></script>
    	<script src="ScopeAnd.js"></script>
    </html>
```

### 匹配模式空行  
**注意:在使用正方向预查时，注意预查信息要保证唯一性，及预查模式不存在此时匹配的情况。**   
**也不能出现模式嵌套**

```regexp
(?<=\n)\s*\n  //匹配空行
^\s\s$        // 匹配规则同上  
```

涉及知识点

| 正则符号       | 作用                                                                            |
| :]]></description>
            <content:encoded><![CDATA[<h1 id="正则表达式" tabindex="-1">正则表达式 <a class="header-anchor" href="#正则表达式" aria-label="Permalink to &quot;正则表达式&quot;"></a></h1>
<p><strong>正则表达式笔记</strong></p>
<h2 id="正则表达式使用详解" tabindex="-1">正则表达式使用详解 <a class="header-anchor" href="#正则表达式使用详解" aria-label="Permalink to &quot;正则表达式使用详解&quot;"></a></h2>
<p>使用正则表达式的作用</p>
<ol>
<li>实现复杂文本逻辑的替换</li>
<li>查找文本模式</li>
<li>提取文本模式</li>
</ol>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">    &#x3C;!</span><span style="color:#85E89D">doctype</span><span style="color:#B392F0"> html</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">html</span><span style="color:#B392F0"> ng-app</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"MyModule"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    	&#x3C;</span><span style="color:#85E89D">head</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    		&#x3C;</span><span style="color:#85E89D">meta</span><span style="color:#B392F0"> charset</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"utf-8"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    		&#x3C;</span><span style="color:#85E89D">link</span><span style="color:#B392F0"> rel</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"stylesheet"</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"css/bootstrap-3.0.0/css/bootstrap.css"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    	&#x3C;/</span><span style="color:#85E89D">head</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    	&#x3C;</span><span style="color:#85E89D">body</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    		&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> ng-controller</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"MyCtrl"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    			&#x3C;</span><span style="color:#FDAEB7;font-style:italic">greeting</span><span style="color:#B392F0"> greet</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"sayHello(name)"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#FDAEB7;font-style:italic">greeting</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    			&#x3C;</span><span style="color:#FDAEB7;font-style:italic">greeting</span><span style="color:#B392F0"> greet</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"sayHello(name)"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#FDAEB7;font-style:italic">greeting</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    			&#x3C;</span><span style="color:#FDAEB7;font-style:italic">greeting</span><span style="color:#B392F0"> greet</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"sayHello(name)"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#FDAEB7;font-style:italic">greeting</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    		&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    		&#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">>number:123-3456-7923&#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">> </span></span>
<span class="line"><span style="color:#E1E4E8">    		 &#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">>hello hello hello   hello   hello   &#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    	&#x3C;/</span><span style="color:#85E89D">body</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    	&#x3C;</span><span style="color:#85E89D">script</span><span style="color:#B392F0"> src</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"framework/angular-1.3.0.14/angular.js"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">script</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    	&#x3C;</span><span style="color:#85E89D">script</span><span style="color:#B392F0"> src</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"ScopeAnd.js"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">script</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;/</span><span style="color:#85E89D">html</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><h3 id="匹配模式空行" tabindex="-1">匹配模式空行 <a class="header-anchor" href="#匹配模式空行" aria-label="Permalink to &quot;匹配模式空行&quot;"></a></h3>
<p><strong>注意:在使用正方向预查时，注意预查信息要保证唯一性，及预查模式不存在此时匹配的情况。</strong><br>
<strong>也不能出现模式嵌套</strong></p>
<div class="language-regexp"><button title="Copy Code" class="copy"></button><span class="lang">regexp</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">(?&#x3C;=</span><span style="color:#79B8FF">\n</span><span style="color:#F97583">)</span><span style="color:#79B8FF">\s</span><span style="color:#F97583">*</span><span style="color:#79B8FF">\n</span><span style="color:#DBEDFF">  //匹配空行</span></span>
<span class="line"><span style="color:#79B8FF">^\s\s$</span><span style="color:#DBEDFF">        // 匹配规则同上</span></span></code></pre>
</div><p>涉及知识点</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">正则符号</th>
<th style="text-align:left">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>(?&lt;=pattern)</code></td>
<td style="text-align:left">限定搜索字符串前的限制条件，比如范例中<code>(?&lt;=\n)\s</code>，只搜索前面是换行符的空白字符</td>
</tr>
<tr>
<td style="text-align:left"><code>*</code></td>
<td style="text-align:left">表示前面内容重复0到多次，类似<code>{0，}</code>，比如 <code>\s*</code> 匹配多个或没有空白</td>
</tr>
<tr>
<td style="text-align:left"><code>^</code></td>
<td style="text-align:left">表示一行输入字符串开始位置，<code>^\s</code>,搜索以空白符开始的行</td>
</tr>
<tr>
<td style="text-align:left"><code>$</code></td>
<td style="text-align:left">表示一行输入字符串结束位置，<code>\s$</code>，搜索以空白字符结束的行</td>
</tr>
<tr>
<td style="text-align:left"><code>\s</code></td>
<td style="text-align:left">单个空白字符，和<code>[\f\n\r\t\v]</code> 相同</td>
</tr>
</tbody>
</table>
<h3 id="匹配-5-个字母的单词" tabindex="-1">匹配 5 个字母的单词 <a class="header-anchor" href="#匹配-5-个字母的单词" aria-label="Permalink to &quot;匹配 5 个字母的单词&quot;"></a></h3>
<div class="language-regexp"><button title="Copy Code" class="copy"></button><span class="lang">regexp</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#79B8FF">\b[[:alpha:]</span><span style="color:#DBEDFF">]</span><span style="color:#F97583">{5}</span><span style="color:#79B8FF">\b</span></span></code></pre>
</div><table tabindex="0">
<thead>
<tr>
<th style="text-align:left">正则符号</th>
<th style="text-align:left">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>[[:alpha:]]</code></td>
<td style="text-align:left">表示一个字母</td>
</tr>
<tr>
<td style="text-align:left"><code>{n}</code></td>
<td style="text-align:left">表示前面的内容重复5次，<code>a{5}</code>,搜索5个相同字母a 的字符串</td>
</tr>
<tr>
<td style="text-align:left"><code>\b</code></td>
<td style="text-align:left">匹配单词的边界的位置</td>
</tr>
</tbody>
</table>
<h3 id="匹配一个尖括号内的内容" tabindex="-1">匹配一个尖括号内的内容 <a class="header-anchor" href="#匹配一个尖括号内的内容" aria-label="Permalink to &quot;匹配一个尖括号内的内容&quot;"></a></h3>
<div class="language-regexp"><button title="Copy Code" class="copy"></button><span class="lang">regexp</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">(?&#x3C;=</span><span style="color:#DBEDFF">&#x3C;</span><span style="color:#F97583">)</span><span style="color:#79B8FF">.</span><span style="color:#F97583">*?(?=</span><span style="color:#DBEDFF">></span><span style="color:#F97583">)</span></span></code></pre>
</div><table tabindex="0">
<thead>
<tr>
<th style="text-align:left">正则符号</th>
<th style="text-align:left">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>(?=&gt;)</code></td>
<td style="text-align:left">正向肯定预查，限定字符串后面的搜索条件，<code>(?=&gt;)</code>表示搜索字符内容后面必须有&gt;符号</td>
</tr>
<tr>
<td style="text-align:left"><code>?</code></td>
<td style="text-align:left">当 <code>?</code> 跟在<code>*，{n,m},+</code> 等次数符后面时，表示以最少字符串数量匹配限定条件,默认的是贪婪算法及尽可能多的匹配字符</td>
</tr>
<tr>
<td style="text-align:left"><code>.</code></td>
<td style="text-align:left">表示除<code>\n</code> 外所有字符</td>
</tr>
</tbody>
</table>
<h3 id="匹配电话号码" tabindex="-1">匹配电话号码 <a class="header-anchor" href="#匹配电话号码" aria-label="Permalink to &quot;匹配电话号码&quot;"></a></h3>
<div class="language-regexp"><button title="Copy Code" class="copy"></button><span class="lang">regexp</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#79B8FF">\d</span><span style="color:#F97583">{3}</span><span style="color:#79B8FF">(</span><span style="color:#DBEDFF">-</span><span style="color:#79B8FF">\d</span><span style="color:#F97583">{4}</span><span style="color:#79B8FF">)</span><span style="color:#F97583">{2}</span></span></code></pre>
</div><table tabindex="0">
<thead>
<tr>
<th style="text-align:left">正则符号</th>
<th style="text-align:left">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>\d</code></td>
<td style="text-align:left">表示 0-9 的数字，类似于<code>[0-9]</code></td>
</tr>
<tr>
<td style="text-align:left"><code>{n}</code></td>
<td style="text-align:left">重复前面的模式 n 次</td>
</tr>
</tbody>
</table>
<h2 id="后向引用" tabindex="-1">后向引用 <a class="header-anchor" href="#后向引用" aria-label="Permalink to &quot;后向引用&quot;"></a></h2>
<p>当我们利用括号进行字符匹配的时候存在两种情况</p>
<ol>
<li>只搜索匹配的模式，匹配的模式不会缓存</li>
<li>搜索到匹配模式后，将匹配模式的的字符串进行缓存</li>
</ol>
<p>对于模式以，一般是将就的内容整个覆盖为新内容，而模式二则是对旧的内容做部分更改，
及在保留部分原格式的基础上，插入信的格式，此时在替换时就需要利用缓存的内容来进行更新。</p>
<p>对于所有加括号内容，都会实现缓存。缓存的规则如下</p>
<ol>
<li>从左到右，以分组的左括号为标记，每出现一次左括号，分组序号加1</li>
<li>对于每个匹配的字符串模式，都包含这样一个分组数组，用于保存模式匹配内容</li>
<li>利用 <code>\n</code> 表示每个匹配字符串对应的，分组内容</li>
<li>在实现第二种替换时，利用 <code>$n</code> 来表示分组替换模式</li>
</ol>
<p>其中 <code>\n</code> 的模式匹配比较难与理解简单讲述一下</p>
<div class="language-regexp"><button title="Copy Code" class="copy"></button><span class="lang">regexp</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#DBEDFF">查找内容:</span><span style="color:#79B8FF">((\b</span><span style="color:#DBEDFF">hello</span><span style="color:#79B8FF">\b)\s</span><span style="color:#F97583">+</span><span style="color:#79B8FF">)</span><span style="color:#85E89D">\1</span></span>
<span class="line"><span style="color:#DBEDFF">替换内容:</span><span style="color:#79B8FF">$</span><span style="color:#DBEDFF">1</span></span></code></pre>
</div><ol>
<li>由于出现左括号变代表分组，所以每个匹配字符串会保存两个分组</li>
<li>分组1 -&gt; 最外面的大括号匹配的字符串内容，表示后面有空白的 hello 单词</li>
<li>分组2 -&gt; 内层括号匹配的字符串内容，表示hello单词</li>
<li>由于匹配模式后面带有\1，它表示重复步骤2中的分组结果，及后面带有空白的 hello 字符，</li>
<li>$2 替换第4步搜索到的字符串内容，为第1个分组中的内容</li>
</ol>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">正则符号</th>
<th style="text-align:left">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>(exp)</code></td>
<td style="text-align:left">搜索括号中模式，并保存到分组中</td>
</tr>
<tr>
<td style="text-align:left"><code>(?&lt;name&gt;exp)</code></td>
<td style="text-align:left">将匹配模式内容，保存到名字为name的分组中，也可以使用(?'name'exp)的模式</td>
</tr>
<tr>
<td style="text-align:left"><code>(?:exp)</code></td>
<td style="text-align:left">搜索括号中模式，不保存到分组内容</td>
</tr>
<tr>
<td style="text-align:left"><code>(?=exp)</code></td>
<td style="text-align:left">正向肯定预查，匹配 exp 后面的位置</td>
</tr>
<tr>
<td style="text-align:left"><code>(?&lt;=exp)</code></td>
<td style="text-align:left">反向肯定预查，匹配 exp 前面的位置</td>
</tr>
<tr>
<td style="text-align:left"><code>(?!exp)</code></td>
<td style="text-align:left">正向否定预查，匹配不是 exp 后面的位置</td>
</tr>
<tr>
<td style="text-align:left"><code>(?&lt;!exp)</code></td>
<td style="text-align:left">反向否定预查，匹配不是 exp 前面的位置</td>
</tr>
<tr>
<td style="text-align:left"><code>(?#comment)</code></td>
<td style="text-align:left">正则表达式中的注释来描述匹配规则，对匹配不产生影响</td>
</tr>
</tbody>
</table>
<h2 id="正则使用配置项" tabindex="-1">正则使用配置项 <a class="header-anchor" href="#正则使用配置项" aria-label="Permalink to &quot;正则使用配置项&quot;"></a></h2>
<table cellspacing="0">
<thead>
<tr>
<th scope="col">名称</th>
<th scope="col">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>IgnoreCase(忽略大小写)</td>
<td>匹配时不区分大小写。</td>
</tr>
<tr>
<td>Multiline(多行模式)</td>
<td>更改<span class="code">^</span>和<span class="code">$</span>的含义，使它们分别在任意一行的行首和行尾匹配，而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,<span class="code">$</span>的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) </td>
</tr>
<tr>
<td>Singleline(单行模式)</td>
<td>更改<span class="code">.</span>的含义，使它与每一个字符匹配（包括换行符\n）。 </td>
</tr>
<tr>
<td>IgnorePatternWhitespace(忽略空白)</td>
<td>忽略表达式中的非转义空白并启用由<span class="code">#</span>标记的注释。</td>
</tr>
<tr>
<td>ExplicitCapture(显式捕获)</td>
<td>仅捕获已被显式命名的组。</td>
</tr>
</tbody>
</table>
<h2 id="平衡组递归匹配" tabindex="-1">平衡组递归匹配 <a class="header-anchor" href="#平衡组递归匹配" aria-label="Permalink to &quot;平衡组递归匹配&quot;"></a></h2>
<p>替换模式
利用 \L或\l 实现对匹配组字符大小写的转换。</p>
<h2 id="正则的基本介绍" tabindex="-1">正则的基本介绍 <a class="header-anchor" href="#正则的基本介绍" aria-label="Permalink to &quot;正则的基本介绍&quot;"></a></h2>
<p>正则是用来对文本进行模式匹配的语法。</p>
<h2 id="正则回归陷阱" tabindex="-1">正则回归陷阱 <a class="header-anchor" href="#正则回归陷阱" aria-label="Permalink to &quot;正则回归陷阱&quot;"></a></h2>
<p><a href="http://mp.weixin.qq.com/s/OtVRL37CNt_d5yEJPzzBzg" target="_blank" rel="noreferrer">正则陷阱</a></p>
<h2 id="资料" tabindex="-1">资料 <a class="header-anchor" href="#资料" aria-label="Permalink to &quot;资料&quot;"></a></h2>
<p><a href="http://www.regexlab.com/zh/regref.htm" target="_blank" rel="noreferrer">regexp 学习</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[vscode snippets 插件]]></title>
            <link>https://blog.zenheart.site/posts/2020-08-08-vscode-snippets</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2020-08-08-vscode-snippets</guid>
            <pubDate>Tue, 21 Apr 2026 12:57:18 GMT</pubDate>
            <description><![CDATA[vscode snippets 插件

 snippet 
日常工作中经常会遇到重复的代码片段，IDE 提供了 snippet 来实现代码片段复用，参考 vscode snippet 文档  创建代码]]></description>
            <content:encoded><![CDATA[<h1 id="vscode-snippets-插件" tabindex="-1">vscode snippets 插件 <a class="header-anchor" href="#vscode-snippets-插件" aria-label="Permalink to &quot;vscode snippets 插件&quot;"></a></h1>
<blockquote>
<p>讲解如何创建一个 vscode snippets 插件</p>
</blockquote>
<h2 id="snippet" tabindex="-1">snippet <a class="header-anchor" href="#snippet" aria-label="Permalink to &quot;snippet&quot;"></a></h2>
<p>日常工作中经常会遇到重复的代码片段，IDE 提供了 snippet 来实现代码片段复用，参考 <a href="https://code.visualstudio.com/docs/editor/userdefinedsnippets" target="_blank" rel="noreferrer">vscode snippet 文档</a>  创建代码片段。核心结构为</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#6A737D">  // 片段的名称</span></span>
<span class="line"><span style="color:#79B8FF">  "For Loop"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#6A737D">    // 触发片段的简写名称  </span></span>
<span class="line"><span style="color:#79B8FF">    "prefix"</span><span style="color:#E1E4E8">: [</span><span style="color:#9ECBFF">"h"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"h1"</span><span style="color:#E1E4E8">],</span></span>
<span class="line"><span style="color:#6A737D">    // 片段内容，</span></span>
<span class="line"><span style="color:#79B8FF">    "body"</span><span style="color:#E1E4E8">: [</span><span style="color:#9ECBFF">"hello world"</span><span style="color:#E1E4E8">],</span></span>
<span class="line"><span style="color:#6A737D">    // 片段描述信息，可选</span></span>
<span class="line"><span style="color:#79B8FF">    "description"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"test snippets"</span></span>
<span class="line"><span style="color:#E1E4E8">  }</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span></code></pre>
</div><p><code>body</code> 字段常用语法模式为</p>
<ol>
<li>
<p><code>$1-n</code>  tab 占位 ,当输入片段后,利用 <code>tab</code> 键会切换光标到对应占位位置</p>
<blockquote>
<p>注意占位符变量只支持数字，<strong>$0</strong> 表示光标最终停留位置</p>
</blockquote>
</li>
<li>
<p><code>${n: default}</code> 占位默认值, 当对应占位符未输入内容时会被 default 替换</p>
</li>
<li>
<p><code>${n:|1,2,3|}</code> 占位选择，切换到对应占位会弹出选择框</p>
</li>
<li>
<p><code>${name:default}</code> 变量，未定义变量默认为 default</p>
<blockquote>
<p>注意由于变量未设置 default 时会默认为空，再使用片段时若想显示 $ 可采用 <code>$$</code> 的方式</p>
</blockquote>
</li>
<li>
<p>内置变量，例如期望占位内容的默认值为剪切板内容，可使用
<code>$CLIPBOARD</code> ,或者采用 <code>$TM_FILENAME_BASE</code> 来将组件名设置为去掉后缀的文件名，常量列表参见 <a href="https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables" target="_blank" rel="noreferrer">Variables</a></p>
</li>
<li>
<p>变量转换,例如想提取 <code>$TM_FILENAME</code> 的后缀名，可采用 <code>${TM_FILENAME/\(\\.\\w+)$/$1/}</code> 提取文件后缀名，</p>
</li>
</ol>
<p>其余更详细语法参见 <a href="https://code.visualstudio.com/docs/editor/userdefinedsnippets#_grammar" target="_blank" rel="noreferrer">grammar</a></p>
<h3 id="片段快捷键" tabindex="-1">片段快捷键 <a class="header-anchor" href="#片段快捷键" aria-label="Permalink to &quot;片段快捷键&quot;"></a></h3>
<p>对于反复使用的片段支持快捷键触发，配置格式为</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#6A737D">  // 配置对应快捷键</span></span>
<span class="line"><span style="color:#79B8FF">  "key"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"cmd+k 1"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">  "command"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"editor.action.insertSnippet"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">  "when"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"editorTextFocus"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">  "args"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#6A737D">     // 快捷键触发的片段 </span></span>
<span class="line"><span style="color:#79B8FF">    "snippet"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"console.log($1)$0"</span></span>
<span class="line"><span style="color:#E1E4E8">  }</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span></code></pre>
</div><p>也可将快捷键绑定到申明的代码片段上，修改 <code>args</code> 配置为</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#6A737D">  // ...</span></span>
<span class="line"><span style="color:#79B8FF">  "args"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#79B8FF">    "langId"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"csharp"</span><span style="color:#E1E4E8">, </span><span style="color:#6A737D">// 对应的语言</span></span>
<span class="line"><span style="color:#79B8FF">    "name"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"myFavSnippet"</span><span style="color:#6A737D"> // 片段的键名</span></span>
<span class="line"><span style="color:#E1E4E8">  }</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span></code></pre>
</div><p>详细的语言支持参见 <a href="https://code.visualstudio.com/docs/languages/identifiers" target="_blank" rel="noreferrer">language Identifiers</a></p>
<h3 id="项目共享片段" tabindex="-1">项目共享片段 <a class="header-anchor" href="#项目共享片段" aria-label="Permalink to &quot;项目共享片段&quot;"></a></h3>
<p>可在特定项目创建复用的片段</p>
<ol>
<li>
<p>在项目根目录创建 <code>.vscode</code> 文件夹</p>
</li>
<li>
<p>在 <code>.vscode</code> 文件夹, 添加后缀为 <code>.code-snippets</code> 的文件，例如 <code>test.code-snippets</code></p>
</li>
<li>
<p>在创建的 <code>test.code-snippets</code> 文件中添加片段</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#79B8FF">"test"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#79B8FF">   "prefix"</span><span style="color:#E1E4E8">: [</span><span style="color:#9ECBFF">"af"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"arrowf"</span><span style="color:#E1E4E8">],</span></span>
<span class="line"><span style="color:#79B8FF">   "body"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"const ${1:func} = () => { $0 }"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">   "description"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"arrow function"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#6A737D">   // 此处申明对应作用范围</span></span>
<span class="line"><span style="color:#79B8FF">   "scope"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"javascript,typescript"</span></span>
<span class="line"><span style="color:#E1E4E8">   }</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span></code></pre>
</div></li>
<li>
<p>项目中即可使用该片段</p>
</li>
</ol>
<p>该功能在版本 1.28 出现，详见 <a href="https://code.visualstudio.com/updates/v1_28#_project-level-snippets" target="_blank" rel="noreferrer">project snippets</a></p>
<h2 id="vscode-snippet-插件" tabindex="-1">vscode snippet 插件 <a class="header-anchor" href="#vscode-snippet-插件" aria-label="Permalink to &quot;vscode snippet 插件&quot;"></a></h2>
<p>除了本地和项目中配置 snippet,可将 snippet 制作为插件进行分享。
参考 <a href="https://code.visualstudio.com/api/language-extensions/snippet-guide" target="_blank" rel="noreferrer">snippet guide</a></p>
<ol>
<li>在 package.json 中申明插件路径</li>
</ol>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#79B8FF">   "contributes"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#79B8FF">     "snippets"</span><span style="color:#E1E4E8">: [</span></span>
<span class="line"><span style="color:#E1E4E8">       {</span></span>
<span class="line"><span style="color:#79B8FF">         "language"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"javascript"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#6A737D">         // 这里统一放在 snippets 目录方便组织</span></span>
<span class="line"><span style="color:#79B8FF">         "path"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./snippets/a.json"</span></span>
<span class="line"><span style="color:#E1E4E8">       }</span></span>
<span class="line"><span style="color:#E1E4E8">     ]</span></span>
<span class="line"><span style="color:#E1E4E8">   }</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span></code></pre>
</div><ol start="2">
<li>在 <code>snippets</code> 目录创建 <code>a.json</code> 的 snippet</li>
</ol>
<p>然后将整个项目拷贝到 <code>~/.vscode/extensions</code> ,重启 vscode 即可触发插件的 snippet</p>
<h3 id="本地打包和安装" tabindex="-1">本地打包和安装 <a class="header-anchor" href="#本地打包和安装" aria-label="Permalink to &quot;本地打包和安装&quot;"></a></h3>
<p>采用 vsce 将应用打包为 <code>.vsix</code> 文件，其他可采用 vscode 提供的 cli <code>code</code> 命令进行安装，开启 code 命令详见 <a href="http://blog.zenheart.site/posts/2018-08-28-vscode.html#%E9%85%8D%E7%BD%AE-code-%E5%91%BD%E4%BB%A4" target="_blank" rel="noreferrer">配置 code 命令</a></p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 1. 全局安装 vsce</span></span>
<span class="line"><span style="color:#B392F0">npm</span><span style="color:#9ECBFF"> install</span><span style="color:#79B8FF"> -g</span><span style="color:#9ECBFF"> vsce</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 2. 项目更目录打包插件</span></span>
<span class="line"><span style="color:#B392F0">vsce</span><span style="color:#9ECBFF"> package</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 3. 使用 code 安装 .vsix 文件</span></span>
<span class="line"><span style="color:#B392F0">code</span><span style="color:#79B8FF"> --install-extension</span><span style="color:#9ECBFF"> my-extension-0.0.1.vsix</span></span></code></pre>
</div><h3 id="发布" tabindex="-1">发布 <a class="header-anchor" href="#发布" aria-label="Permalink to &quot;发布&quot;"></a></h3>
<p>发布详见 <a href="https://code.visualstudio.com/api/working-with-extensions/publishing-extension" target="_blank" rel="noreferrer">Publishing Extensions</a> 流程类似 npm 包发布</p>
<h2 id="snippets-模板扩展" tabindex="-1">snippets 模板扩展 <a class="header-anchor" href="#snippets-模板扩展" aria-label="Permalink to &quot;snippets 模板扩展&quot;"></a></h2>
<p>由于 vscode snippets 不支持模板文件，单书写片段过于庞大时，
需要将模板内容转换为 snippet <code>body</code> 字段的数组模式。为了简化类似 snippet 的书写流程，可以在 <code>body</code> 中配置模板文件路径。然后利用
js 脚本读取路径中的文件内容转换为数组，重新保存即可简化包含大量内容的片段书写</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[项目]]></title>
            <link>https://blog.zenheart.site/projects</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects</guid>
            <pubDate>Tue, 21 Apr 2026 12:57:18 GMT</pubDate>
            <description><![CDATA[个人项目作品集]]></description>
            <content:encoded><![CDATA[<!-- Projects page is rendered by the theme's Layout.vue -->
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[标签]]></title>
            <link>https://blog.zenheart.site/tags</link>
            <guid isPermaLink="false">https://blog.zenheart.site/tags</guid>
            <pubDate>Tue, 21 Apr 2026 12:57:18 GMT</pubDate>
            <description><![CDATA[文章标签分类]]></description>
            <content:encoded><![CDATA[<!-- Tags page is rendered by the theme's Layout.vue -->
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[书签订阅 RSS]]></title>
            <link>https://blog.zenheart.site/posts/2020-03-24-rss-bookmark</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2020-03-24-rss-bookmark</guid>
            <pubDate>Fri, 21 Nov 2025 17:33:58 GMT</pubDate>
            <description><![CDATA[书签订阅 RSS
 引言
笔者使用 inoreader 订阅 RSS。
但是知乎专栏,微博等无法转换为 RSS。google 后发现利用 RSSHub 可将各种资源转换为 RSS 订阅。由于手动转换网]]></description>
            <content:encoded><![CDATA[<h1 id="书签订阅-rss" tabindex="-1">书签订阅 RSS <a class="header-anchor" href="#书签订阅-rss" aria-label="Permalink to &quot;书签订阅 RSS&quot;"></a></h1>
<h2 id="引言" tabindex="-1">引言 <a class="header-anchor" href="#引言" aria-label="Permalink to &quot;引言&quot;"></a></h2>
<p>笔者使用 <a href="https://www.inoreader.com/" target="_blank" rel="noreferrer">inoreader</a> 订阅 RSS。
但是知乎专栏,微博等无法转换为 RSS。google 后发现利用 <a href="https://docs.rsshub.app/" target="_blank" rel="noreferrer">RSSHub</a> 可将各种资源转换为 RSS 订阅。由于手动转换网址为 RSS 过于麻烦,研究后发现了如下解决方案。</p>
<h2 id="预备知识-url-scheme" tabindex="-1">预备知识 URL scheme <a class="header-anchor" href="#预备知识-url-scheme" aria-label="Permalink to &quot;预备知识 URL scheme&quot;"></a></h2>
<p>参考 <a href="https://tools.ietf.org/html/rfc1738#section-5" target="_blank" rel="noreferrer">URL rfc</a> 资源定位符的一般形式为 <code>scheme:schemepart</code>。其中 <code>scheme</code> 决定了资源的访问策略。
在浏览器中一般使用 <code>http,https</code> 访问资源,实际访问地址还可为其他形式</p>
<ul>
<li><code>mailto</code> 打开邮箱 <a href="mailto:zenheart_register@163.com" target="_blank" rel="noreferrer">mailto:zenheart_register@163.com</a></li>
<li><code>tel</code> 拨打电话 <a href="tel:1234" target="_blank" rel="noreferrer">tel:1234</a></li>
<li><code>file:</code>  打开本地文件</li>
</ul>
<div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>你甚至可以使用 <a href="vscode:" target="_blank" rel="noreferrer"><strong>vscode:</strong></a> 打开 VSCode 编辑器,只要相关应用设置了符合 <code>scheme</code> 策略,浏览器便会根据 <code>scheme</code> 打开应用</p>
</div>
<p>可查看 <a href="https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/a#%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAemail%E9%93%BE%E6%8E%A5" target="_blank" rel="noreferrer">mdn</a> 进一步理解各种 scheme 的使用。</p>
<p>基于上述原则实际上访问地址也可为一段 js 代码。采用 <code>javascript:</code> 即可。例如 <a href="javascript:alert('hello world')">javascript:alert('hello world')</a> 该链接会触发 <code>alert('hello world')</code> 执行。</p>
<p>基于此 scheme 我们可以将当前地址转换为 RSS 订阅的逻辑保存为 <code>javascript:</code> 的标签即可。</p>
<h2 id="url-转换为-rss-订阅" tabindex="-1">URL 转换为 RSS 订阅 <a class="header-anchor" href="#url-转换为-rss-订阅" aria-label="Permalink to &quot;URL 转换为 RSS 订阅&quot;"></a></h2>
<p>假设将 github issue 转换为 RSS 订阅。参考 <a href="https://docs.rsshub.app/programming.html#github" target="_blank" rel="noreferrer">RSSHub github issue</a> 可知需将 issues 链接转换为 <code>https://rsshub.app/github/issue/用户名/用户仓库</code> 订阅地址。</p>
<p>在访问 issue 时,我们需要把从当前地址提取 <code>/用户名/用户仓库</code> 转换为 <code>https://rsshub.app/github/issue/用户名/用户仓库</code> RSS 订阅地址</p>
<p>利用 <a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Location" target="_blank" rel="noreferrer">location</a> 对象可以很方便的从 URL 提取相应信息。</p>
<p>转换为 RSS 的地址如何触发 <a href="https://www.inoreader.com/" target="_blank" rel="noreferrer">inoreader</a> 订阅。利用 <code>https://www.inoreader.com/bookmarklet/subscribe/RSS地址</code> 触发订阅。</p>
<p>综合上述逻辑访问 <a href="https://gist.github.com/zenHeart/8aec3f90366829afba32858bb38e8daa" target="_blank" rel="noreferrer">RSS gist</a> 查看结果,拖动此标签到书签栏查看效果 <a style="display: inline-block;padding: 1px 6px;color: #fff;background: #32a0eb;border-radius: 4px;" href="javascript:(function()%7B(function()%20%7Blet%20rssData%20%3D%20%7Bzhihu%3A%20%7Bvalidator%3A%20%2Fzhuanlan.zhihu.com%2F%2CurlToRss%3A%20location%20%3D%3E%60https%3A%2F%2Frss.lilydjwg.me%2Fzhihuzhuanlan%2F%24%7Blocation.pathname.split('%2F')%5B1%5D%7D%60%7D%2CgithubIssue%3A%20%7Bvalidator%3A%20%2Fgithub%5C.com%5C.*issues%2F%2CurlToRss%3A%20location%20%3D%3E%60https%3A%2F%2Frsshub.app%2Fgithub%2Fissue%2F%24%7Blocation.pathname.split('%2F').slice(1%2C%203).join('%2F')%7D%60%7D%7D%3Blet%20validatorRss%20%3D%20(url%2C%20validator)%20%3D%3E%20validator.test(url)%3Blet%20addRss%20%3D%20url%20%3D%3E%20%60https%3A%2F%2Fwww.inoreader.com%2F%3Fadd_feed%3D%24%7Burl%7D%60%3Blet%20subscribe%20%3D%20(a%2C%20w%2C%20h)%20%3D%3E%20%7Bvar%20b%20%3D%20window.screenLeft%20!%3D%20undefined%20%3F%20window.screenLeft%20%3A%20screen.left%3Bvar%20c%20%3D%20window.screenTop%20!%3D%20undefined%20%3F%20window.screenTop%20%3A%20screen.top%3Bwidth%20%3D%20window.innerWidth%3F%20window.innerWidth%3A%20document.documentElement.clientWidth%3F%20document.documentElement.clientWidth%3A%20screen.width%3Bheight%20%3D%20window.innerHeight%3F%20window.innerHeight%3A%20document.documentElement.clientHeight%3F%20document.documentElement.clientHeight%3A%20screen.height%3Bvar%20d%20%3D%20width%20%2F%202%20-%20w%20%2F%202%20%2B%20b%3Bvar%20e%20%3D%20height%20%2F%202%20-%20h%20%2F%202%20%2B%20c%3Bvar%20f%20%3D%20window.open(a%2Cnew%20Date().getTime()%2C'width%3D'%20%2Bw%20%2B'%2C%20height%3D'%20%2Bh%20%2B'%2C%20top%3D'%20%2Be%20%2B'%2C%20left%3D'%20%2Bd%20%2B'location%3Dyes%2Cresizable%3Dyes%2Cstatus%3Dno%2Cscrollbars%3Dno%2Cpersonalbar%3Dno%2Ctoolbar%3Dno%2Cmenubar%3Dno')%3Bif%20(window.focus)%20%7Bf.focus()%3B%7D%7D%3Blet%20l%20%3D%20location%3Blet%20res%3Bfor%20(let%20k%20in%20rssData)%20%7Blet%20rss%20%3D%20rssData%5Bk%5D%3Bif%20(validatorRss(l.href%2C%20rss.validator))%20%7Bres%20%3Drss.urlToRss(l)%3B%7D%7Dif%20(res)%20%7Bsubscribe('https%3A%2F%2Fwww.inoreader.com%2Fbookmarklet%2Fsubscribe%2F'%20%2BencodeURIComponent(res)%2C640%2C400)%3B%7D%20else%20%7Bsubscribe('https%3A%2F%2Fwww.inoreader.com%2Fbookmarklet%2Fsubscribe%2F'%20%2BencodeURIComponent(location.href)%2C640%2C400)%3B%7D%7D)()%7D)()">rss</a></p>
<h2 id="代码片段保存为标签" tabindex="-1">代码片段保存为标签 <a class="header-anchor" href="#代码片段保存为标签" aria-label="Permalink to &quot;代码片段保存为标签&quot;"></a></h2>
<p>既然标签可以执行 javascript 代码,可以建立一个 <code>code</code> 书签,保存常用的脚本标签。此外结合 <a href="https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb" target="_blank" rel="noreferrer">Vimium</a> 实现快捷调用。</p>
<p>相比 <a href="https://developer.chrome.com/docs/devtools/javascript/snippets?hl=zh-cn" target="_blank" rel="noreferrer">Snippets</a> 需要打开控制台后触发,该方法更方便。</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[vimium ]]></title>
            <link>https://blog.zenheart.site/posts/2022-10-10-vimium</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2022-10-10-vimium</guid>
            <pubDate>Fri, 21 Nov 2025 17:33:58 GMT</pubDate>
            <description><![CDATA[
# vimium 

**脱离鼠标操作 chrome 利器**

## 快捷键
### 页面浏览类
| 按键 | 作用                     |
| :]]></description>
            <content:encoded><![CDATA[<h1 id="vimium" tabindex="-1">vimium <a class="header-anchor" href="#vimium" aria-label="Permalink to &quot;vimium&quot;"></a></h1>
<p><strong>脱离鼠标操作 chrome 利器</strong></p>
<h2 id="快捷键" tabindex="-1">快捷键 <a class="header-anchor" href="#快捷键" aria-label="Permalink to &quot;快捷键&quot;"></a></h2>
<h3 id="页面浏览类" tabindex="-1">页面浏览类 <a class="header-anchor" href="#页面浏览类" aria-label="Permalink to &quot;页面浏览类&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">按键</th>
<th style="text-align:left">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">？</td>
<td style="text-align:left">显示所有可用的快捷键</td>
</tr>
<tr>
<td style="text-align:left">h</td>
<td style="text-align:left">左移</td>
</tr>
<tr>
<td style="text-align:left">j</td>
<td style="text-align:left">下移</td>
</tr>
<tr>
<td style="text-align:left">k</td>
<td style="text-align:left">上移</td>
</tr>
<tr>
<td style="text-align:left">l</td>
<td style="text-align:left">右移</td>
</tr>
<tr>
<td style="text-align:left">gg</td>
<td style="text-align:left">回到页面开头</td>
</tr>
<tr>
<td style="text-align:left">G</td>
<td style="text-align:left">回到页面底部</td>
</tr>
<tr>
<td style="text-align:left">d</td>
<td style="text-align:left">向下滑动页面的一半</td>
</tr>
<tr>
<td style="text-align:left">u</td>
<td style="text-align:left">向上滑动页面的一半</td>
</tr>
<tr>
<td style="text-align:left">f</td>
<td style="text-align:left">在当前页面打开连接</td>
</tr>
<tr>
<td style="text-align:left">F</td>
<td style="text-align:left">在新的页面打开连接</td>
</tr>
<tr>
<td style="text-align:left">r</td>
<td style="text-align:left">重新加载页面</td>
</tr>
<tr>
<td style="text-align:left">yy</td>
<td style="text-align:left">复制当前网页链接到剪切板</td>
</tr>
<tr>
<td style="text-align:left">yf</td>
<td style="text-align:left">复制当前页面的链接</td>
</tr>
<tr>
<td style="text-align:left">v</td>
<td style="text-align:left">进入复制模式</td>
</tr>
<tr>
<td style="text-align:left">V</td>
<td style="text-align:left">进入行复制模式</td>
</tr>
<tr>
<td style="text-align:left">gi</td>
<td style="text-align:left">快速定位到搜索框</td>
</tr>
</tbody>
</table>
<h3 id="标签控制类" tabindex="-1">标签控制类 <a class="header-anchor" href="#标签控制类" aria-label="Permalink to &quot;标签控制类&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">按键</th>
<th style="text-align:left">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">o</td>
<td style="text-align:left">打开 URL、书签和历史导航</td>
</tr>
<tr>
<td style="text-align:left">O</td>
<td style="text-align:left">在新的标签打开 URL、书签和历史导航</td>
</tr>
<tr>
<td style="text-align:left">b</td>
<td style="text-align:left">打开书签</td>
</tr>
<tr>
<td style="text-align:left">B</td>
<td style="text-align:left">在新窗口打开书签</td>
</tr>
<tr>
<td style="text-align:left">J,gT</td>
<td style="text-align:left">向有移动标签</td>
</tr>
<tr>
<td style="text-align:left">K,gt</td>
<td style="text-align:left">向左移动标签</td>
</tr>
<tr>
<td style="text-align:left">g0</td>
<td style="text-align:left">移动到第一个标签</td>
</tr>
<tr>
<td style="text-align:left">g$</td>
<td style="text-align:left">移动到最后一个标签</td>
</tr>
<tr>
<td style="text-align:left">^</td>
<td style="text-align:left">回到前面的标签页，历史标签导航</td>
</tr>
<tr>
<td style="text-align:left">t</td>
<td style="text-align:left">创建新标签</td>
</tr>
<tr>
<td style="text-align:left">T</td>
<td style="text-align:left">搜寻你打开的标签页</td>
</tr>
<tr>
<td style="text-align:left">yt</td>
<td style="text-align:left">将当前打开标签进行复制</td>
</tr>
<tr>
<td style="text-align:left">x</td>
<td style="text-align:left">关闭当前标签页</td>
</tr>
<tr>
<td style="text-align:left">X</td>
<td style="text-align:left">恢复关闭标签页</td>
</tr>
<tr>
<td style="text-align:left">ctrl+p</td>
<td style="text-align:left">打印当前页面</td>
</tr>
<tr>
<td style="text-align:left">H</td>
<td style="text-align:left">历史倒退</td>
</tr>
<tr>
<td style="text-align:left">L</td>
<td style="text-align:left">历史前进</td>
</tr>
</tbody>
</table>
<h3 id="搜索" tabindex="-1">搜索 <a class="header-anchor" href="#搜索" aria-label="Permalink to &quot;搜索&quot;"></a></h3>
<p><code>/</code>|查找模式，利用 ESC 退出，按回车键查找
n|向下寻找
N|向上寻找
u|向上滑动页面的一半
f|在当前页面打开连接
F|在新的页面打开连接
r|重新加载页面</p>
<h2 id="使能正则查询" tabindex="-1">使能正则查询 <a class="header-anchor" href="#使能正则查询" aria-label="Permalink to &quot;使能正则查询&quot;"></a></h2>
<ol>
<li><code>⇧ + ？</code> 打开配置项</li>
<li>点击 <code>options</code></li>
<li>勾选 <code> Treat find queries as JavaScript regular expressions</code>
4。 保存配置即可</li>
</ol>
<blockquote>
<p>查询时使用 / 使能查询,例如 <code>/[a-z]</code> 及使能 js 正则查询</p>
</blockquote>
<h2 id="杂项" tabindex="-1">杂项 <a class="header-anchor" href="#杂项" aria-label="Permalink to &quot;杂项&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">不常用功能</th>
<th style="text-align:left">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">gs</td>
<td style="text-align:left">查看页面源码，会在新的页面打开页面源码</td>
</tr>
<tr>
<td style="text-align:left">i</td>
<td style="text-align:left">进入插入模式</td>
</tr>
<tr>
<td style="text-align:left">gf</td>
<td style="text-align:left">循环当前祯</td>
</tr>
<tr>
<td style="text-align:left">gF</td>
<td style="text-align:left">回到顶祯或底祯</td>
</tr>
<tr>
<td style="text-align:left">yf</td>
<td style="text-align:left">复制连接到剪切板</td>
</tr>
</tbody>
</table>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[vscode 使用指南]]></title>
            <link>https://blog.zenheart.site/posts/2018-08-28-vscode</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2018-08-28-vscode</guid>
            <pubDate>Fri, 07 Aug 2020 23:05:47 GMT</pubDate>
            <description><![CDATA[vscode 使用指南
vscode 编辑器使用经验
 概述
笔者讲解 mac 环境下 vscode 的使用配置。
 界面结构
使用 spotligh 开启 vscode.基本界面显示如下
包含如下几]]></description>
            <content:encoded><![CDATA[<h1 id="vscode-使用指南" tabindex="-1">vscode 使用指南 <a class="header-anchor" href="#vscode-使用指南" aria-label="Permalink to &quot;vscode 使用指南&quot;"></a></h1>
<p><strong>vscode 编辑器使用经验</strong></p>
<h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h2>
<p>笔者讲解 mac 环境下 vscode 的使用配置。</p>
<h2 id="界面结构" tabindex="-1">界面结构 <a class="header-anchor" href="#界面结构" aria-label="Permalink to &quot;界面结构&quot;"></a></h2>
<p>使用 spotligh 开启 vscode.基本界面显示如下</p>
<p><img src="https://code.visualstudio.com/assets/docs/getstarted/userinterface/hero.png" alt="" loading="lazy"></p>
<p>包含如下几块</p>
<ul>
<li><strong>Editor</strong> 编辑区,可以横向或纵向打开多个窗口</li>
<li><strong>Side Bar</strong> 工作时显示对应视图</li>
<li><strong>Status Bar</strong> 工作状态条</li>
<li><strong>Activity Bar</strong> 切换视图并显示当前工作文件状态</li>
<li><strong>Panels</strong> 额外的面板,显示调试,终端等信息</li>
</ul>
<h2 id="基础配置" tabindex="-1">基础配置 <a class="header-anchor" href="#基础配置" aria-label="Permalink to &quot;基础配置&quot;"></a></h2>
<h3 id="配置主题" tabindex="-1">配置主题 <a class="header-anchor" href="#配置主题" aria-label="Permalink to &quot;配置主题&quot;"></a></h3>
<p><code>⌘K ⌘T</code> 选择 <strong>Monokai Dimmed</strong> 主题</p>
<p>你可以下载如下插件美化主题:</p>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=Equinusocio.vsc-material-theme" target="_blank" rel="noreferrer">Material Theme</a> 设定主题
<blockquote>
<p>尤大使用的是 Palenight 主题</p>
</blockquote>
</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme" target="_blank" rel="noreferrer">Material Icon Theme</a> 主题对应的图标,你也可以选择 <a href="https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons" target="_blank" rel="noreferrer">vscode icon</a></li>
</ul>
<h3 id="配置-code-命令" tabindex="-1">配置 code 命令 <a class="header-anchor" href="#配置-code-命令" aria-label="Permalink to &quot;配置 code 命令&quot;"></a></h3>
<ol>
<li><code>⌘⇧p</code> 打开命令行面板</li>
<li>所有 <code>shell command install</code> 执行此命令</li>
<li>该命令会在环境变量创建 <code>code</code> 命令行工具</li>
</ol>
<p>示例如下:</p>
<div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 打开工程</span></span>
<span class="line"><span style="color:#B392F0">code</span><span style="color:#9ECBFF"> .</span></span>
<span class="line"><span style="color:#6A737D"># 在最近窗口打开工程</span></span>
<span class="line"><span style="color:#B392F0">code</span><span style="color:#79B8FF"> -r</span><span style="color:#9ECBFF"> .</span></span>
<span class="line"><span style="color:#6A737D"># 创建一个新窗口</span></span>
<span class="line"><span style="color:#B392F0">code</span><span style="color:#79B8FF"> -n</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#6A737D"># 更换本地语言</span></span>
<span class="line"><span style="color:#B392F0">code</span><span style="color:#79B8FF"> --local=es</span></span>
<span class="line"><span style="color:#6A737D"># 比较文件差异</span></span>
<span class="line"><span style="color:#B392F0">code</span><span style="color:#79B8FF"> -d</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">file</span><span style="color:#F97583">1></span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">file</span><span style="color:#F97583">2></span></span>
<span class="line"><span style="color:#6A737D"># 打开文件并定向到指定行</span></span>
<span class="line"><span style="color:#B392F0">code</span><span style="color:#79B8FF"> -g</span><span style="color:#9ECBFF"> package.json:10:5</span></span>
<span class="line"><span style="color:#6A737D"># 查看帮助信息</span></span>
<span class="line"><span style="color:#B392F0">code</span><span style="color:#79B8FF"> --help</span></span>
<span class="line"><span style="color:#6A737D"># 才 vscode 输出当前命令结果</span></span>
<span class="line"><span style="color:#B392F0">ls</span><span style="color:#F97583"> |</span><span style="color:#B392F0"> code</span><span style="color:#79B8FF"> -r</span><span style="color:#9ECBFF"> -</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 禁用所有插件,并打开当前目录</span></span>
<span class="line"><span style="color:#B392F0">code</span><span style="color:#79B8FF"> --disable-extensions</span><span style="color:#9ECBFF"> .</span></span></code></pre>
</div><p>更详细的使用参见 <a href="https://code.visualstudio.com/docs/setup/mac#_launching-from-the-command-line" target="_blank" rel="noreferrer">vscode</a></p>
<h3 id="终端设置" tabindex="-1">终端设置 <a class="header-anchor" href="#终端设置" aria-label="Permalink to &quot;终端设置&quot;"></a></h3>
<p>默认 mac 终端下,<code>alt</code> 键无法触发 shell 的多种快捷键,
而是会输出特殊字符.配置如下</p>
<ol>
<li><code>⌘,</code>  打开配置</li>
<li>搜索 <code>terminal.integrated.macOptionIsMeta</code> 设置为 <code>true</code> 即可</li>
</ol>
<p>出处参见: <a href="https://github.com/Microsoft/vscode/issues/11314#issuecomment-384067528" target="_blank" rel="noreferrer">https://github.com/Microsoft/vscode/issues/11314#issuecomment-384067528</a></p>
<h2 id="快捷键" tabindex="-1">快捷键 <a class="header-anchor" href="#快捷键" aria-label="Permalink to &quot;快捷键&quot;"></a></h2>
<h3 id="面板切换" tabindex="-1">面板切换 <a class="header-anchor" href="#面板切换" aria-label="Permalink to &quot;面板切换&quot;"></a></h3>
<ul>
<li><code>⌘⇧e</code> 文件夹窗口</li>
<li><code>⌘⇧f</code> 全局搜索</li>
<li><code>⌘⇧g</code> 版本控制界面</li>
<li><code>⌘⇧d</code> 调试界面</li>
<li><code>⌘⇧x</code> 插件界面</li>
</ul>
<h3 id="视窗控制" tabindex="-1">视窗控制 <a class="header-anchor" href="#视窗控制" aria-label="Permalink to &quot;视窗控制&quot;"></a></h3>
<ul>
<li><code>⌘b</code> 显示和隐藏 Side Bar</li>
<li><code>⌘\</code> 纵向分屏</li>
<li><code>⌘w</code> 切换窗口</li>
<li><code>⌘m</code> 开启 zen 模式编辑文档,详见 <a href="https://code.visualstudio.com/docs/getstarted/userinterface#_zen-mode" target="_blank" rel="noreferrer">zen mode</a>
<blockquote>
<p>默认快捷键为 <code>⌘k</code> 无法工作,请自行修改</p>
</blockquote>
</li>
<li><code>⌘p</code> 在已添加的目录中快速打开文件
<blockquote>
<p>结合 ? 获取 vscode 支持的相关命令帮助</p>
</blockquote>
</li>
<li><code>⌘p⇧</code> 利用方式运行 vscode 函数</li>
<li><code>⌃tab</code> 窗口切换,利用 shift 方向切换</li>
</ul>
<h3 id="导航控制" tabindex="-1">导航控制 <a class="header-anchor" href="#导航控制" aria-label="Permalink to &quot;导航控制&quot;"></a></h3>
<ul>
<li><code>⌘o</code> 打开文件对应的 finder</li>
<li><code>⌘⇧o</code> 打开文件符号链接列表</li>
<li><code>⌘t</code> 显示所有打开文件符号链接列表</li>
<li><code>⌘p</code> 打开文件列表</li>
<li><code>⌘g</code> 定向到特定行</li>
<li><code>f12</code>  显示引用的位置</li>
<li><code>⇧f12</code>  显示所有引用的位置</li>
</ul>
<h3 id="光标操作" tabindex="-1">光标操作 <a class="header-anchor" href="#光标操作" aria-label="Permalink to &quot;光标操作&quot;"></a></h3>
<ul>
<li><code>⌥→</code> 单词后</li>
<li><code>⌥←</code> 单词前</li>
<li><code>⌘→,⌃e</code> 行尾</li>
<li><code>⌘←,⌃a</code> 行头</li>
<li><code>⌘↑</code> 开头</li>
<li><code>⌘↓</code> 结尾</li>
<li><code>⌘⇧\</code> 代码块开头,结尾来回触发</li>
<li><code>⌘[</code> 向前缩进</li>
<li><code>⌘]</code> 向后缩进</li>
<li><code>⌘u</code> 向后跳转光标位置
<blockquote>
<p>注意该操作不能跨文件执行</p>
</blockquote>
</li>
<li><code>⌃-</code> 向前切换光标位置
<blockquote>
<p>该操作可以跨文件执行</p>
</blockquote>
</li>
<li><code>⌃⇧-</code> 向前移动光标位置</li>
</ul>
<h3 id="其他快捷键" tabindex="-1">其他快捷键 <a class="header-anchor" href="#其他快捷键" aria-label="Permalink to &quot;其他快捷键&quot;"></a></h3>
<ul>
<li><code>f2</code> 选择变量名或者函数名,按该快捷键会重构所有使用该函数或变量的命名</li>
<li><code>⌘⌥[</code> 折叠片段</li>
<li><code>⌘⌥]</code> 展开片段</li>
</ul>
<h2 id="配置" tabindex="-1">配置 <a class="header-anchor" href="#配置" aria-label="Permalink to &quot;配置&quot;"></a></h2>
<p>vscode 配置分为如下几种</p>
<ul>
<li><code>User Settings</code> 用户配置,全局作用范围</li>
<li><code>Workspace Settings</code> 作用于当前工程</li>
<li><code>Directory</code> Settings` 作用于当前目录
详细的配置参见 <a href="https://code.visualstudio.com/docs/getstarted/settings#_default-settings" target="_blank" rel="noreferrer">config</a></li>
<li><code>files.exclude</code>  配置 sidebar 忽略显示的文件和目录,参见 <a href="https://code.visualstudio.com/docs/getstarted/userinterface#_explorer" target="_blank" rel="noreferrer">Explorer tips</a></li>
<li><code>terminal.integrated.shell.osx</code> 设定 mac 使用的 shell 建议配置为 <code>zsh</code></li>
</ul>
<h2 id="调试" tabindex="-1">调试 <a class="header-anchor" href="#调试" aria-label="Permalink to &quot;调试&quot;"></a></h2>
<h3 id="node-调试" tabindex="-1"><a href="https://code.visualstudio.com/docs/nodejs/nodejs-tutorial" target="_blank" rel="noreferrer">node 调试</a> <a class="header-anchor" href="#node-调试" aria-label="Permalink to &quot;[node 调试](https://code.visualstudio.com/docs/nodejs/nodejs-tutorial)&quot;"></a></h3>
<h3 id="更改语言高亮" tabindex="-1">更改语言高亮 <a class="header-anchor" href="#更改语言高亮" aria-label="Permalink to &quot;更改语言高亮&quot;"></a></h3>
<ol>
<li>使用 <code>⌘K M</code> 打开语言面板,选择对应语言.</li>
</ol>
<h3 id="更换主题" tabindex="-1">更换主题 <a class="header-anchor" href="#更换主题" aria-label="Permalink to &quot;更换主题&quot;"></a></h3>
<ol>
<li>使用 <code>⌘K ⌘T</code> 打开主题面板</li>
<li>选择对应主题</li>
</ol>
<h3 id="安装扩展" tabindex="-1">安装扩展 <a class="header-anchor" href="#安装扩展" aria-label="Permalink to &quot;安装扩展&quot;"></a></h3>
<ol>
<li>使用 <code>⇧⌘X</code> 打开扩展</li>
<li>查找并安装扩展</li>
</ol>
<h3 id="开发自定义扩展ld" tabindex="-1">开发自定义扩展ld <a class="header-anchor" href="#开发自定义扩展ld" aria-label="Permalink to &quot;开发自定义扩展ld&quot;"></a></h3>
<p>详见 <a href="https://code.visualstudio.com/docs/getstarted/tips-and-tricks#_creating-my-own-extension" target="_blank" rel="noreferrer">扩展开发</a> </p>
<h3 id="代码片段" tabindex="-1">代码片段 <a class="header-anchor" href="#代码片段" aria-label="Permalink to &quot;代码片段&quot;"></a></h3>
<p><code>⌘⇧p</code> 搜索 <code>config snippets</code> 设置代码片段,使用详见 <a href="https://github.com/liwei0526vip/vscode/blob/master/10%20!%20%E6%8B%92%E7%BB%9D%E9%87%8D%E5%A4%8D%EF%BC%8C%E4%BD%A0%E7%9A%84%E4%BB%A3%E7%A0%81%E7%99%BE%E5%AE%9D%E7%AE%B1%EF%BC%9A%E5%A6%82%E4%BD%95%E4%B9%A6%E5%86%99code%20snippet%EF%BC%9F.md" target="_blank" rel="noreferrer">代码片段</a></p>
<h3 id="设置识别-npmrc-文件" tabindex="-1">设置识别 npmrc 文件 <a class="header-anchor" href="#设置识别-npmrc-文件" aria-label="Permalink to &quot;设置识别 npmrc 文件&quot;"></a></h3>
<p>由于 npmrc 格式和 ini 文件类似,采用如下方式识别 npmrc 文件</p>
<ol>
<li><code>⌘,</code> 打开配置</li>
<li>搜索 <code>associations</code></li>
<li>添加如下配置<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#9ECBFF">"files.associations"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#79B8FF">	".npmrc"</span><span style="color:#E1E4E8">:</span><span style="color:#9ECBFF">"ini"</span></span>
<span class="line"><span style="color:#E1E4E8">},</span></span></code></pre>
</div></li>
</ol>
<h2 id="插件" tabindex="-1">插件 <a class="header-anchor" href="#插件" aria-label="Permalink to &quot;插件&quot;"></a></h2>
<h3 id="live-server" tabindex="-1">live server <a class="header-anchor" href="#live-server" aria-label="Permalink to &quot;live server&quot;"></a></h3>
<p>使用 live server 实现修改实时同步到浏览器。</p>
<ul>
<li><code>⌘l⌘o</code> 在浏览器打开 live server</li>
</ul>
<h2 id="bugs" tabindex="-1">bugs <a class="header-anchor" href="#bugs" aria-label="Permalink to &quot;bugs&quot;"></a></h2>
<h3 id="在输入中英文时-有时会出现不显示的-0x08-非法字符" tabindex="-1">在输入中英文时,有时会出现不显示的 0x08 非法字符 <a class="header-anchor" href="#在输入中英文时-有时会出现不显示的-0x08-非法字符" aria-label="Permalink to &quot;在输入中英文时,有时会出现不显示的 0x08 非法字符&quot;"></a></h3>
<p>详见 <a href="https://segmentfault.com/a/1190000013357949?utm_source=tag-newest" target="_blank" rel="noreferrer">vscode控制字符引起的问题以及解决思路</a>.参考上述博文配置 <code>&quot;editor.renderControlCharacters&quot;: true</code>
配置后特殊字符会显示为<small style="font-weight:900">bs</small>.这样在编辑时即可手动删掉 0x08 等不显示字符</p>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<ul>
<li>[ ] <a href="https://www.npmjs.com/package/vscode-todo-plus" target="_blank" rel="noreferrer">todo 工具的学习</a></li>
<li><a href="https://code.visualstudio.com/docs" target="_blank" rel="noreferrer">vscode</a></li>
<li><a href="https://www.vscodecandothat.com/" target="_blank" rel="noreferrer">vscode can do</a></li>
<li><a href="https://github.com/liwei0526vip/vscode" target="_blank" rel="noreferrer">vscode 编辑器</a></li>
<li>[ ] 插件推荐 <a href="https://www.jonrcorbin.com/the-best-vs-code-extension-list-for-full-stack-developers/" target="_blank" rel="noreferrer">https://www.jonrcorbin.com/the-best-vs-code-extension-list-for-full-stack-developers/</a></li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://code.visualstudio.com/assets/docs/getstarted/userinterface/hero.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[mac 使用指南]]></title>
            <link>https://blog.zenheart.site/posts/2018-01-23-mac</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2018-01-23-mac</guid>
            <pubDate>Sun, 24 May 2020 01:21:37 GMT</pubDate>
            <description><![CDATA[mac 使用指南
web 工程师的 mac 使用和配置技巧
 概述
笔者将 mac 使用分为如下部分.
* `快捷键` 常用的系统快捷键
* `系统工具` 讲解系统工具的配置和使用
* `工具` ma]]></description>
            <content:encoded><![CDATA[<h1 id="mac-使用指南" tabindex="-1">mac 使用指南 <a class="header-anchor" href="#mac-使用指南" aria-label="Permalink to &quot;mac 使用指南&quot;"></a></h1>
<p><strong>web 工程师的 mac 使用和配置技巧</strong></p>
<h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h2>
<p>笔者将 mac 使用分为如下部分.</p>
<ul>
<li>
<p><code>快捷键</code> 常用的系统快捷键</p>
</li>
<li>
<p><code>系统工具</code> 讲解系统工具的配置和使用</p>
</li>
<li>
<p><code>工具</code> mac 生态下的常用工具</p>
</li>
<li>
<p><code>杂项</code> 笔者的使用经验和其他技巧</p>
</li>
</ul>
<h2 id="快捷键" tabindex="-1">快捷键 <a class="header-anchor" href="#快捷键" aria-label="Permalink to &quot;快捷键&quot;"></a></h2>
<h3 id="基本认识" tabindex="-1">基本认识 <a class="header-anchor" href="#基本认识" aria-label="Permalink to &quot;基本认识&quot;"></a></h3>
<p>mac 下的按键和 windows 对应关系</p>
<ul>
<li><code>⌘</code> Command, 类似 windows 键</li>
<li><code>⇧</code> 表示 Shift</li>
<li><code>⌥</code> Option,类似 windows alt,表示可选功能</li>
<li><code>⌃</code> Control 键</li>
</ul>
<p>详细快捷键使用参见,<a href="https://support.apple.com/en-ca/HT201236" target="_blank" rel="noreferrer">官方 mac 快捷键</a>
下面值着重讲解需要注意的问题.</p>
<h3 id="启动切换应用" tabindex="-1">启动切换应用 <a class="header-anchor" href="#启动切换应用" aria-label="Permalink to &quot;启动切换应用&quot;"></a></h3>
<p>对于 windows 用户在使用时可能存在如下障碍。</p>
<ol>
<li>关闭窗口不代表关闭程序。</li>
<li>对于缩小和关闭的窗口，使用 <code>⌘tab</code> 切换时无法像 windows 一样直接打开。</li>
</ol>
<p>常用的应用处理如下</p>
<ul>
<li><code>⌘空格键</code> 打开 Spotlight</li>
<li><code>⌘alt+ 空格键</code> 打开 finder 搜索</li>
<li><code>⌘w</code> 关闭窗口,应用还在后台</li>
<li><code>⌘q</code> 关闭窗口退出应用</li>
<li><code>⌘h</code> 隐藏窗口</li>
<li><code>⌘m</code> 最小化窗口</li>
<li><code>⌘tab</code> 切换应用可能存在如下三种情况
<ul>
<li>已关闭窗口的应用
<ol>
<li><code>⌘tab</code> 切换到该应用</li>
<li><code>⌘⌥（option）</code> 松开 tab 按住 option</li>
<li><code>⌥（option）</code> 松开 <code>⌘</code> 键即可打开新的应用窗口</li>
</ol>
</li>
<li>以最小化的窗口应用
<ol>
<li><code>⌘tab</code> 切换到该应用</li>
<li><code>⌘ + ↑ 或 ↓</code> 代开对应的窗口，利用左右键进行选择</li>
<li>按 enter 打开应用</li>
</ol>
</li>
<li>隐藏窗口的应用
切换到该应用后可以直接打开</li>
</ul>
</li>
<li>选中文件后按住空格键可以预览该文件</li>
<li><code>⌘ + ⌥ + esc</code> 选择需要强制退出的应用</li>
<li><code>⌘ + shift + 3</code> 全屏截图</li>
<li><code>⌘ + shift + 4</code> 部分截图</li>
</ul>
<h2 id="系统设置" tabindex="-1">系统设置 <a class="header-anchor" href="#系统设置" aria-label="Permalink to &quot;系统设置&quot;"></a></h2>
<h3 id="spotlight" tabindex="-1">Spotlight <a class="header-anchor" href="#spotlight" aria-label="Permalink to &quot;Spotlight&quot;"></a></h3>
<blockquote>
<p>学会利用 Spotlight 快速查找和打开应用,快捷键为 <strong>⌘空格</strong>.</p>
</blockquote>
<p>为了加快查找效率,打开 spotlight 后利用 <strong>⌘,</strong> 打开配置项.</p>
<ul>
<li>在搜索结果中,关闭对字体，文件，图片，其他的搜索。</li>
</ul>
<blockquote>
<p><code>⌘,</code> 会根据目前所在窗口,打开对应的应用配置,及其有用,后面不再赘述</p>
</blockquote>
<p>举例如下:</p>
<ul>
<li>搜索 <code>pref</code> 打开系统配置</li>
<li>搜索 <code>activi</code> 查看系统运行状态</li>
<li>搜索 <code>ab</code> 打开关于本机</li>
<li>搜索应用名,打开对应应用</li>
</ul>
<blockquote>
<p>支持中英文两种查找方式,按回车打开对应资源
下回再打开任何资源前,先尝试是否可以利用 spotlight 打开!</p>
</blockquote>
<h3 id="dock" tabindex="-1">dock <a class="header-anchor" href="#dock" aria-label="Permalink to &quot;dock&quot;"></a></h3>
<p>类似 windows 任务栏，但是苹果会将所有安装软件显示在底部 dock 区。</p>
<ul>
<li>关闭底部固定图标显示
利用 spotlight 搜索 <code>terminal</code> 输入第一句指令.</li>
</ul>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">    # dock 只显示运行的软件</span></span>
<span class="line"><span style="color:#B392F0">   defaults</span><span style="color:#9ECBFF"> write</span><span style="color:#9ECBFF"> com.apple.dock</span><span style="color:#9ECBFF"> static-only</span><span style="color:#79B8FF"> -boolean</span><span style="color:#79B8FF"> true</span><span style="color:#E1E4E8">; </span><span style="color:#B392F0">killall</span><span style="color:#9ECBFF"> Dock</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#6A737D">   # 利用该配置恢复所有显示</span></span>
<span class="line"><span style="color:#B392F0">   defaults</span><span style="color:#9ECBFF"> write</span><span style="color:#9ECBFF"> com.apple.dock</span><span style="color:#9ECBFF"> static-only</span><span style="color:#79B8FF"> -boolean</span><span style="color:#9ECBFF"> FALSE</span><span style="color:#E1E4E8">; </span><span style="color:#B392F0">killall</span><span style="color:#9ECBFF"> Dock</span></span></code></pre>
</div><ul>
<li>将 dock 变到左侧
在 dock 下,打开配置,选择置于屏幕左边,也可根据自己喜好进行调整.</li>
</ul>
<h3 id="finder" tabindex="-1">finder <a class="header-anchor" href="#finder" aria-label="Permalink to &quot;finder&quot;"></a></h3>
<p>类似 windows 计算机,显示磁盘文件.快捷键 <code>⌘⌥空格</code></p>
<p>打开 finder 配置,修改如下选项</p>
<ul>
<li>通用
设置开启新 finder 时，打开家目录</li>
<li>边栏
设置希望在 finder 中显示的文件夹，并关闭标记显示</li>
</ul>
<h3 id="用户与群组" tabindex="-1">用户与群组 <a class="header-anchor" href="#用户与群组" aria-label="Permalink to &quot;用户与群组&quot;"></a></h3>
<p>打开 <code>soptlight</code>,搜索用户与群组.进行如下配置</p>
<ul>
<li>登录选项 -&gt; 将快速用户切换菜单显示为图标</li>
<li>点击当前用户 -&gt; 登录项，设置自动启动的应用</li>
</ul>
<blockquote>
<p>你可以在登录项中配置执行脚本,这样在电脑重启时会自动执行,
例如重新挂载网络磁盘等</p>
</blockquote>
<h3 id="headoff" tabindex="-1">headoff <a class="header-anchor" href="#headoff" aria-label="Permalink to &quot;headoff&quot;"></a></h3>
<p>若拥有苹果手机,电脑和平板,该工具则可实现跨设备同步.
详情参看<a href="https://support.apple.com/zh-cn/HT204681" target="_blank" rel="noreferrer">利用 headoff 实现三方同步</a></p>
<h3 id="触摸板" tabindex="-1">触摸板 <a class="header-anchor" href="#触摸板" aria-label="Permalink to &quot;触摸板&quot;"></a></h3>
<p>搜索触控版,打开配置界面</p>
<ul>
<li>光标点按
<ul>
<li>设置轻点表示按</li>
<li>设置辅助点按为右下角</li>
</ul>
</li>
</ul>
<h3 id="键盘" tabindex="-1">键盘 <a class="header-anchor" href="#键盘" aria-label="Permalink to &quot;键盘&quot;"></a></h3>
<p>搜索键盘,配置如下</p>
<ul>
<li>键盘-&gt;修饰键将大写键改为控制键</li>
</ul>
<h3 id="accounts" tabindex="-1">accounts <a class="header-anchor" href="#accounts" aria-label="Permalink to &quot;accounts&quot;"></a></h3>
<p>添加一个 icloud 账号，同步日历，find mac，联系人等</p>
<h3 id="activity-monitor" tabindex="-1">activity monitor <a class="header-anchor" href="#activity-monitor" aria-label="Permalink to &quot;activity monitor&quot;"></a></h3>
<p>查看系统运行状态工具</p>
<p>详细说明参看 <a href="https://support.apple.com/en-us/HT201464" target="_blank" rel="noreferrer">mac activity monitor</a></p>
<h2 id="命令行工具" tabindex="-1">命令行工具 <a class="header-anchor" href="#命令行工具" aria-label="Permalink to &quot;命令行工具&quot;"></a></h2>
<p>mac 特有的命令行工具</p>
<h3 id="nettop" tabindex="-1">nettop <a class="header-anchor" href="#nettop" aria-label="Permalink to &quot;nettop&quot;"></a></h3>
<p>查看网络所有连接.</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 打开应用</span></span>
<span class="line"><span style="color:#B392F0">nettop</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#6A737D"># 只查看某个应用名</span></span>
<span class="line"><span style="color:#B392F0">nettop</span><span style="color:#79B8FF"> -p</span><span style="color:#9ECBFF"> mysqld</span></span></code></pre>
</div><p>具体使用参看 <code>nettop -h</code></p>
<p>会按照应用名显示所有的应用.</p>
<ul>
<li><code>d</code> 增量显示流入字节,还是总字节数</li>
<li><code>p</code> 控制显示的应用,通过空格选择开启或关闭</li>
<li><code>q</code> 退出应用</li>
<li><code>↑,↓</code> 控制显示的应用</li>
<li><code>←,→</code> 控制横向输出.</li>
</ul>
<p>各项含义.</p>
<h3 id="辅助功能" tabindex="-1">辅助功能 <a class="header-anchor" href="#辅助功能" aria-label="Permalink to &quot;辅助功能&quot;"></a></h3>
<p><strong>设置词典朗读</strong>
打开辅助功能 -&gt; 语音,打开按键时朗读所选文本,快捷键为<code>optionesc</code></p>
<ul>
<li><code>⌘ + ctrl + d</code> 即可显示单词含义</li>
</ul>
<p><a href="https://www.zhihu.com/question/30134586" target="_blank" rel="noreferrer">语音朗读设置</a></p>
<h2 id="工具" tabindex="-1">工具 <a class="header-anchor" href="#工具" aria-label="Permalink to &quot;工具&quot;"></a></h2>
<h3 id="mac-scripting" tabindex="-1">Mac Scripting <a class="header-anchor" href="#mac-scripting" aria-label="Permalink to &quot;Mac Scripting&quot;"></a></h3>
<p>利用脚本操作 Mac 应用,资料相见 <a href="https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/index.html#//apple_ref/doc/uid/TP40016239-CH56-SW1" target="_blank" rel="noreferrer">Mac Scripting</a></p>
<h3 id="imovie" tabindex="-1">iMovie <a class="header-anchor" href="#imovie" aria-label="Permalink to &quot;iMovie&quot;"></a></h3>
<p>用于视频剪切,查看 <a href="https://www.bilibili.com/video/av57182819/" target="_blank" rel="noreferrer">https://www.bilibili.com/video/av57182819/</a> 学习。</p>
<h3 id="quicktime-player" tabindex="-1">QuickTime Player <a class="header-anchor" href="#quicktime-player" aria-label="Permalink to &quot;QuickTime Player&quot;"></a></h3>
<h4 id="录制-iphone-镜像" tabindex="-1">录制 iPhone 镜像 <a class="header-anchor" href="#录制-iphone-镜像" aria-label="Permalink to &quot;录制 iPhone 镜像&quot;"></a></h4>
<p>苹果默认播放器,可以利用此播放器对 iPhone 或 iPad 进行录屏。</p>
<ol>
<li>iPhone 或 iPad 链接 mac</li>
<li>mac 使用 SpotLight 打开 QuickTime Player</li>
<li>点击新建 -&gt; 影片录制,快捷键为 <code>⌘⌥N</code></li>
<li>在打开的录屏界面中,点击屏幕中的 <img src="https://support.apple.com/library/content/dam/edam/applecare/images/en_US/il/osx-yosemite-quicktime-record_icon.png" width="16"/> 选择连接的 iPhone 或 iPad 即可开始录屏</li>
</ol>
<p>详细资料参见 <a href="https://support.apple.com/en-us/HT201066" target="_blank" rel="noreferrer">apple 帮助中心</a></p>
<h4 id="简单视频裁剪合并" tabindex="-1">简单视频裁剪合并 <a class="header-anchor" href="#简单视频裁剪合并" aria-label="Permalink to &quot;简单视频裁剪合并&quot;"></a></h4>
<ol>
<li>打开需要编辑的视频</li>
<li>点击编辑 -&gt; 修建,快捷键 <code>⌘T</code></li>
<li>拖动黄色的区块选择需要裁剪的内容</li>
<li>另存为裁剪内容即可</li>
</ol>
<p>除了裁剪也支持拼接多个视屏。</p>
<ol>
<li>打开视频文件</li>
<li>讲其他视频文件按顺序拖入打开的视频</li>
<li>另存为新视频即完成合并工作</li>
</ol>
<p>详见<a href="https://support.apple.com/en-my/guide/quicktime-player/qtpa2d90df3d/mac" target="_blank" rel="noreferrer">视频裁剪</a></p>
<h3 id="取色器" tabindex="-1">取色器 <a class="header-anchor" href="#取色器" aria-label="Permalink to &quot;取色器&quot;"></a></h3>
<p>前端开发经常需要提取颜色,采用mac自带取色器即可。</p>
<ol>
<li>spotlight 查找 <strong>数码测色剂</strong></li>
<li>选择需要提取的颜色</li>
<li><code>⌘ + ⇧ + c</code> 复制颜色即可</li>
</ol>
<blockquote>
<p>注意在提取颜色时不要点击,否则会切换到该应用此时 <code>⌘⇧c</code> 无效,<strong>为了获取 16 进制颜色选择显示原生值即可</strong></p>
</blockquote>
<h3 id="xcode" tabindex="-1"><a href="./URL=https://developer.apple.com/xcode/">Xcode</a> <a class="header-anchor" href="#xcode" aria-label="Permalink to &quot;[Xcode](URL=https://developer.apple.com/xcode/)&quot;"></a></h3>
<ul>
<li>去 app store 或苹果开发网站 安装 Xcode</li>
<li>安装 Xcode 命令行工具,打开终端,输入<code>xcode-select --install</code></li>
</ul>
<h3 id="homebrew" tabindex="-1"><a href="http://brew.sh/" target="_blank" rel="noreferrer">Homebrew</a> <a class="header-anchor" href="#homebrew" aria-label="Permalink to &quot;[Homebrew](http://brew.sh/)&quot;"></a></h3>
<p>mac 包管理工具，注意要先安装好 xcode,才可安装该软件。
后续大部分工具,均采用 <code>brew</code> 进行安装.</p>
<p>brew 默认将软件安装到了 <code>/usr/local/bin</code> 目录.
运行 <code>brew doctor</code> 检查安装.</p>
<p>对于 GUI 软件，需要使用 <a href="https://github.com/caskroom/homebrew-cask/blob/master/USAGE.md" target="_blank" rel="noreferrer"><code>brew cask</code></a> 插件安装
安装 brew cask 插件。</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> caskroom/cask/brew-cask</span></span></code></pre>
</div><p>例如安装 chrome 使用</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> google-chrome</span></span></code></pre>
</div><p>对于相关 GUI 软件去 <a href="https://caskroom.github.io/search" target="_blank" rel="noreferrer">Cask</a> 中查询是否有对应安装包。</p>
<blockquote>
<p>注意何时使用 brew 或 brew cast 进行安装。</p>
</blockquote>
<ul>
<li>brew
安装非 GUI 工具</li>
<li>brew cask
安装 GUI 应哟</li>
</ul>
<p>常用的命令如下</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">   # 安装软件 </span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> install</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">应用</span><span style="color:#E1E4E8">名</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#6A737D">   # 卸载软件</span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> uninstall</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">应用</span><span style="color:#E1E4E8">名</span><span style="color:#F97583">></span><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#E1E4E8">             </span></span>
<span class="line"><span style="color:#6A737D">   # 更新软件,不加包名，更新所有软件</span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> upgrade</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">应用</span><span style="color:#E1E4E8">名</span><span style="color:#F97583">></span><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#E1E4E8">              </span></span>
<span class="line"><span style="color:#6A737D">   # 更新 brew 自身</span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> update</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#E1E4E8">                     </span></span>
<span class="line"><span style="color:#6A737D">   # brew 支持断点续传，可以采用该语句清除未下载成功的缓存</span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> cleanup</span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#6A737D">   # 显示软件信息</span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> info</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">应用</span><span style="color:#E1E4E8">名</span><span style="color:#F97583">></span><span style="color:#E1E4E8">    </span></span>
<span class="line"><span style="color:#E1E4E8">                   </span></span>
<span class="line"><span style="color:#6A737D">   # 搜索 brew 支持的软件,支持模糊搜索</span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> search</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">应用</span><span style="color:#E1E4E8">名</span><span style="color:#F97583">></span><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#E1E4E8">             </span></span>
<span class="line"><span style="color:#6A737D">   # 显示本机 brew 安装包</span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> list</span><span style="color:#E1E4E8">    </span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#6A737D">   # 显示过时的安装包</span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> outdated</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#6A737D">   # 记载新的包仓库</span></span>
<span class="line"><span style="color:#B392F0">   brew</span><span style="color:#9ECBFF"> tap</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">仓库名或地</span><span style="color:#E1E4E8">址</span><span style="color:#F97583">></span></span></code></pre>
</div><blockquote>
<p>由于 <code>brew cask</code> 安装的为 GUI 软件包，部分命令会有区别,具体情况查看 <code>brew cask -h</code></p>
</blockquote>
<p>升级 brew 和所有工具的方法如下</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">  # 更新 brew 和 brew cast</span></span>
<span class="line"><span style="color:#B392F0">  brew</span><span style="color:#9ECBFF"> update</span><span style="color:#E1E4E8"> &#x26;&#x26; </span><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> upgrade</span><span style="color:#9ECBFF"> caskroom/cask/brew-cask</span><span style="color:#E1E4E8">  </span></span>
<span class="line"><span style="color:#E1E4E8">  </span></span>
<span class="line"><span style="color:#6A737D">  # 升级所有 GUI 软件</span></span>
<span class="line"><span style="color:#B392F0">  brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> reinstall</span><span style="color:#9ECBFF">  `</span><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask outdated`</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#6A737D"> # 升级所有非 GUI 工具</span></span>
<span class="line"><span style="color:#B392F0"> brew</span><span style="color:#9ECBFF"> upgrade</span></span></code></pre>
</div><p>笔者安装的开发工具如下</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 开发工具</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> git</span><span style="color:#6A737D">  # 版本控制软件</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> node</span><span style="color:#6A737D"> # 基于 js 的服务端引擎</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># gui 工具</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> phpstorm</span><span style="color:#6A737D">   # 编辑器</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> sublime-text</span><span style="color:#6A737D">   # 编辑器</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> google-chrome</span><span style="color:#6A737D"> # google 浏览器</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> p4merge</span><span style="color:#6A737D"> # git 冲突解决工具</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> the-unarchiver</span><span style="color:#6A737D"> # 解压工具</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> cheatsheet</span><span style="color:#6A737D"> # 显示 mac 下快捷键</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> ichm</span><span style="color:#6A737D"> # 阅读 chm 文件</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> iterm2</span><span style="color:#6A737D"> # 终端工具</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> Cyberduck</span><span style="color:#6A737D"> # 连接 sftp 工具</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> licecap</span><span style="color:#6A737D"> # gif 制作工具    </span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> spectacle</span><span style="color:#6A737D"> # 控制屏幕工具</span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> charles</span><span style="color:#6A737D"> # 代理工具</span></span></code></pre>
</div><h4 id="典型问题" tabindex="-1">典型问题 <a class="header-anchor" href="#典型问题" aria-label="Permalink to &quot;典型问题&quot;"></a></h4>
<p>**无法卸载软件出现  definition is invalid: invalid **</p>
<p>参看 <a href="https://github.com/Homebrew/homebrew-cask/issues/58046#issue-403953746" target="_blank" rel="noreferrer">Fix casks with <code>depends_on</code> that reference pre-Mavericks </a> 的回答</p>
<h3 id="dash" tabindex="-1">dash <a class="header-anchor" href="#dash" aria-label="Permalink to &quot;dash&quot;"></a></h3>
<p>用来查找 API 的工具。在 chrome 下可以使用的 devtool 插件.
具体使用查看<a href="https://kapeli.com/dash_guide" target="_blank" rel="noreferrer">dash 用户指南</a></p>
<h3 id="iterm2" tabindex="-1">iterm2 <a class="header-anchor" href="#iterm2" aria-label="Permalink to &quot;iterm2&quot;"></a></h3>
<p><a href="https://www.iterm2.com/documentation.html" target="_blank" rel="noreferrer">iterm2</a>是终端模拟器，用来加载终端。</p>
<p>打开 iterm 配置项,配置如下</p>
<ul>
<li>选择 <code>key-&gt;Hotkey</code> 设置显示和隐藏 iterm2 热键为 <code>⌘⌥.</code></li>
<li>选择 <code>profile-&gt;text</code> 取消用灰色绘制文本</li>
<li>选择<code>profile-&gt;color</code> 选择配色为 solarized dark</li>
</ul>
<p>iterm 常用快捷键</p>
<ul>
<li><code>⌘Click</code> 可以打开文件，文件夹和链接
<ul>
<li>若文件名为<code>filename:42</code>,使用默认编辑器会直接定位到该行</li>
</ul>
</li>
<li><code>⌘d</code> 垂直分屏</li>
<li><code>⌘shiftd</code> 水平分屏</li>
<li><code>⌘[,]</code> 切换各分屏</li>
<li><code>⌘;</code> 显示历史命令,自动补全命令</li>
<li><code>⌘alte</code> 全局查找所有终端</li>
<li><code>⌘/</code> 高亮查找光标位置</li>
<li><code>⌘t</code> 新建终端页</li>
<li><code>⌘方向键</code> 切换终端页</li>
<li><code>⌘数字键</code> 选择对应终端页</li>
<li><code>⌘alt方向键</code> 控制窗口位置</li>
<li><code>⌘+,-</code> 控制窗口和字体大小</li>
</ul>
<p>iterm 默认 <code>alt</code> 不会触发 bash 快捷键,
参见 <a href="https://stackoverflow.com/questions/18923765/bash-keyboard-shortcuts-in-iterm-like-altd-and-altf#18925650" target="_blank" rel="noreferrer">https://stackoverflow.com/questions/18923765/bash-keyboard-shortcuts-in-iterm-like-altd-and-altf#18925650</a></p>
<h3 id="zsh" tabindex="-1">zsh <a class="header-anchor" href="#zsh" aria-label="Permalink to &quot;zsh&quot;"></a></h3>
<p>zsh 是一个强大的 shell.结合 <code>iterm</code> 可以极大提高命令行使用效率.
强大之处参考如下:</p>
<ul>
<li>[使用 zsh](<a href="https://wiki.archlinux.org/index.php/Zsh_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)" target="_blank" rel="noreferrer">https://wiki.archlinux.org/index.php/Zsh_(简体中文)</a></li>
<li><a href="http://shanker.blog.51cto.com/1189689/1765036" target="_blank" rel="noreferrer">zsh优势</a></li>
</ul>
<p>下载 zsh 和 zsh-completions(命令补全工具)</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0"> brew</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> zsh</span><span style="color:#9ECBFF"> zsh-completions</span></span></code></pre>
</div><p>下载 oh-my-zsh 配置</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">   git</span><span style="color:#9ECBFF"> clone</span><span style="color:#79B8FF"> --recursive</span><span style="color:#9ECBFF"> https://github.com/sorin-ionescu/prezto.git</span><span style="color:#9ECBFF"> "${</span><span style="color:#E1E4E8">ZDOTDIR</span><span style="color:#F97583">:-</span><span style="color:#E1E4E8">$HOME</span><span style="color:#9ECBFF">}/.zprezto"</span></span></code></pre>
</div><p>修改 shell 解释器为 zsh.
编辑 <code>/etc/shells</code> 文件.
末尾添加<code>/usr/local/bin/zsh</code>,保存关闭。
在终端中执行以下命令：</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">   chsh</span><span style="color:#79B8FF"> -s</span><span style="color:#9ECBFF"> /usr/local/bin/zsh</span></span></code></pre>
</div><blockquote>
<p>你也可以直接修改 <code>/etc/passwd</code> 文件, 更改用户对应 shell 环境</p>
</blockquote>
<p>更改 zsh 的主题编辑<code>~/.zshrc</code> 文件。查找 <code>ZSH_THEME</code> 配置项修改如下</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>ZSH_THEME=pygmalion</span></span></code></pre>
</div><p>重启 zsh 即可看到效果。</p>
<p>更多关于 <a href="https://github.com/robbyrussell/oh-my-zsh/wiki" target="_blank" rel="noreferrer">oh-my-zsh</a></p>
<h3 id="libreoffice" tabindex="-1">libreoffice <a class="header-anchor" href="#libreoffice" aria-label="Permalink to &quot;libreoffice&quot;"></a></h3>
<p>mac 下类似 windows office 的开源软件.</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> libreoffice</span></span></code></pre>
</div><h3 id="private-eye" tabindex="-1"><a href="https://radiosilenceapp.com/private-eye" target="_blank" rel="noreferrer">private-eye</a> <a class="header-anchor" href="#private-eye" aria-label="Permalink to &quot;[private-eye](https://radiosilenceapp.com/private-eye)&quot;"></a></h3>
<p>监测网络连接.</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">breww</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> private-eye</span></span></code></pre>
</div><h3 id="packetsender" tabindex="-1"><a href="https://packetsender.com/download" target="_blank" rel="noreferrer">packetsender</a> <a class="header-anchor" href="#packetsender" aria-label="Permalink to &quot;[packetsender](https://packetsender.com/download)&quot;"></a></h3>
<p>tcp 网络监测工具.</p>
<h3 id="remindes" tabindex="-1">remindes <a class="header-anchor" href="#remindes" aria-label="Permalink to &quot;remindes&quot;"></a></h3>
<p>mac 自带的代办事项软件,方便记录代办内容</p>
<h3 id="mackup" tabindex="-1"><a href="https://github.com/lra/mackup" target="_blank" rel="noreferrer">mackup</a> <a class="header-anchor" href="#mackup" aria-label="Permalink to &quot;[mackup](https://github.com/lra/mackup)&quot;"></a></h3>
<p>mac 配置备份工具</p>
<blockquote>
<p>注意该工具会将原始文件移动到指定目录,删除而在源文件位置采用软链接形式。
<strong>不要随意删除 mackup 的备份资料,否则会造成原始文件的丢失</strong></p>
</blockquote>
<h2 id="杂项" tabindex="-1">杂项 <a class="header-anchor" href="#杂项" aria-label="Permalink to &quot;杂项&quot;"></a></h2>
<h3 id="文件挂载" tabindex="-1">文件挂载 <a class="header-anchor" href="#文件挂载" aria-label="Permalink to &quot;文件挂载&quot;"></a></h3>
<p>挂载远程 ssh 服务器工具.若是简单文件拷贝使用 <code>scp</code> 指令.</p>
<p>若希望交互更友好使用 <code>Cyberduck</code>.
若希望可以将远程连接挂载到 finder 文件系统.</p>
<ol>
<li>
<p>安装 <a href="https://osxfuse.github.io/" target="_blank" rel="noreferrer">osxfuse</a></p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> osxfuse</span></span></code></pre>
</div></li>
<li>
<p>安装 sshfs</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> sshfs</span></span></code></pre>
</div></li>
<li>
<p>使用 sshfs</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 挂载 sftp 到本地</span></span>
<span class="line"><span style="color:#B392F0">mkdir</span><span style="color:#9ECBFF"> ~/sshfs</span></span>
<span class="line"><span style="color:#B392F0">sshfs</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">use</span><span style="color:#E1E4E8">r</span><span style="color:#F97583">></span><span style="color:#9ECBFF">@</span><span style="color:#F97583">&#x3C;</span><span style="color:#9ECBFF">i</span><span style="color:#E1E4E8">p</span><span style="color:#F97583">></span><span style="color:#9ECBFF"> ~/sshfs</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 卸载 sshfs 文件</span></span>
<span class="line"><span style="color:#B392F0">umount</span><span style="color:#9ECBFF"> ~/sshfs</span></span></code></pre>
</div></li>
</ol>
<p>mac 本身也支持 <code>samba</code> 服务的挂载.步骤如下</p>
<ol>
<li><code>⌘k</code> 打开连接到服务器</li>
<li>samba 输入对应的服务器地址,<code>smb://&lt;ip&gt;/&lt;path&gt;</code> 点击连接即可</li>
</ol>
<h3 id="复制文件内容到剪切板" tabindex="-1">复制文件内容到剪切板 <a class="header-anchor" href="#复制文件内容到剪切板" aria-label="Permalink to &quot;复制文件内容到剪切板&quot;"></a></h3>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 复制文件内容到剪切板</span></span>
<span class="line"><span style="color:#B392F0">cat</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">filenam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span><span style="color:#F97583"> |</span><span style="color:#B392F0"> pbcopy</span><span style="color:#E1E4E8"> </span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 粘贴剪切板内容到终端</span></span>
<span class="line"><span style="color:#79B8FF">echo</span><span style="color:#9ECBFF"> `</span><span style="color:#B392F0">pbpaste</span><span style="color:#9ECBFF">`</span></span></code></pre>
</div><h3 id="命令打开文件" tabindex="-1">命令打开文件 <a class="header-anchor" href="#命令打开文件" aria-label="Permalink to &quot;命令打开文件&quot;"></a></h3>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 利用 google chrome 打开应用</span></span>
<span class="line"><span style="color:#B392F0">open</span><span style="color:#79B8FF"> -a</span><span style="color:#9ECBFF"> 'google chrome'</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">filenam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span></span></code></pre>
</div><h3 id="mac-共享文件" tabindex="-1">mac 共享文件 <a class="header-anchor" href="#mac-共享文件" aria-label="Permalink to &quot;mac 共享文件&quot;"></a></h3>
<ol>
<li>
<p>打开文件共享设置</p>
<p><code>系统偏好设置-&gt;文件共享</code></p>
</li>
<li>
<p>设置共享文件夹</p>
<ol>
<li>利用 共享文件夹框设置需要共享的目录</li>
<li>利用用户框设置共享对象及读写权限</li>
</ol>
</li>
<li>
<p>设置共享方式</p>
<ol>
<li>smb 用于 windows 用户共享</li>
<li>afp mac 用户共享</li>
</ol>
</li>
</ol>
<h3 id="icloud-文件丢失" tabindex="-1">icloud 文件丢失 <a class="header-anchor" href="#icloud-文件丢失" aria-label="Permalink to &quot;icloud 文件丢失&quot;"></a></h3>
<p>mac 桌面和文档默认使用 icloud 保存。
若取消 icloud 会删除本地文件。只在云端留有备份。
如若想要取消 icloud 对本地文档备份。在系统设置中取消对桌面和文档备份后。
将  icloud 的备份文件保存到对应位置即可</p>
<h3 id="存储空间管理" tabindex="-1">存储空间管理 <a class="header-anchor" href="#存储空间管理" aria-label="Permalink to &quot;存储空间管理&quot;"></a></h3>
<p><a href="https://support.apple.com/zh-cn/HT206996" target="_blank" rel="noreferrer">mac 存储空间管理</a></p>
<h3 id="蓝牙键盘" tabindex="-1">蓝牙键盘 <a class="header-anchor" href="#蓝牙键盘" aria-label="Permalink to &quot;蓝牙键盘&quot;"></a></h3>
<p>若购买 ipad 蓝牙键盘,相关快捷键如下 <a href="http://www.iphonehacks.com/2016/07/complete-guide-using-external-keyboard-ipad.html" target="_blank" rel="noreferrer">ipad 蓝牙键盘</a></p>
<h3 id="脚本" tabindex="-1">脚本 <a class="header-anchor" href="#脚本" aria-label="Permalink to &quot;脚本&quot;"></a></h3>
<p>mac 中命令和 linux 会有稍许区别.
若为了保证移植性可使用跨平台的脚本语言例如 <code>python</code> 等.</p>
<h3 id="关键按键失灵-例如-del-return-等" tabindex="-1">关键按键失灵，例如 del,return 等 <a class="header-anchor" href="#关键按键失灵-例如-del-return-等" aria-label="Permalink to &quot;关键按键失灵，例如 del,return 等&quot;"></a></h3>
<p>切换到其他用户登录.
若其他用户按键正常。说明是软件设置问题。
否则为硬件损坏。</p>
<h3 id="检测硬件是否有问题" tabindex="-1">检测硬件是否有问题 <a class="header-anchor" href="#检测硬件是否有问题" aria-label="Permalink to &quot;检测硬件是否有问题&quot;"></a></h3>
<p>关机后，在接上电源(拔掉所有外设)，同时按住 <code>shift+control+option+开/关机键</code> 大概 10 s。
观察电源指示若电源的不变色说明硬件正常。</p>
<h3 id="safri-开启调试模式" tabindex="-1">safri 开启调试模式 <a class="header-anchor" href="#safri-开启调试模式" aria-label="Permalink to &quot;safri 开启调试模式&quot;"></a></h3>
<ol>
<li><code>cmd,</code> 打开 safri 配置项</li>
<li>高级选项开启开发模式</li>
</ol>
<h3 id="远程连接-windows" tabindex="-1">远程连接 windows <a class="header-anchor" href="#远程连接-windows" aria-label="Permalink to &quot;远程连接 windows&quot;"></a></h3>
<p>参看 <a href="https://support.apple.com/kb/PH18707?locale=zh_CN" target="_blank" rel="noreferrer">mac 连接 windows</a>.
mac 配置好后 windows 连接参看 <a href="https://support.apple.com/kb/PH18708?locale=zh_CN&amp;viewlocale=zh_CN" target="_blank" rel="noreferrer">windows 连接 mac</a></p>
<p>可能出现的问题</p>
<ol>
<li>保证在一个局域网</li>
<li>windows 在网络中会自动显示 mac 共享的文件件.
记得刷新</li>
</ol>
<h3 id="命令行挂载移动硬盘" tabindex="-1">命令行挂载移动硬盘 <a class="header-anchor" href="#命令行挂载移动硬盘" aria-label="Permalink to &quot;命令行挂载移动硬盘&quot;"></a></h3>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 显示所有硬盘</span></span>
<span class="line"><span style="color:#6A737D"># 注意查看移动硬盘的名称</span></span>
<span class="line"><span style="color:#B392F0">ls</span><span style="color:#79B8FF"> -l</span><span style="color:#9ECBFF"> /Volumes</span><span style="color:#6A737D"> # 显示挂载的磁盘</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 显示移动硬盘信息 </span></span>
<span class="line"><span style="color:#6A737D"># 注意查看 Device Node 的值</span></span>
<span class="line"><span style="color:#6A737D"># 假设为 /dev/disk1s1</span></span>
<span class="line"><span style="color:#B392F0">diskutil</span><span style="color:#9ECBFF"> info</span><span style="color:#9ECBFF"> /Volumes/</span><span style="color:#F97583">&#x3C;</span><span style="color:#9ECBFF">盘符名</span><span style="color:#E1E4E8">称</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> </span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 退出移动硬盘</span></span>
<span class="line"><span style="color:#B392F0">hdiutil</span><span style="color:#9ECBFF"> eject</span><span style="color:#9ECBFF"> /Volumes/</span><span style="color:#F97583">&#x3C;</span><span style="color:#9ECBFF">盘符名</span><span style="color:#E1E4E8">称</span><span style="color:#F97583">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 创建挂载目录</span></span>
<span class="line"><span style="color:#B392F0">mdkir</span><span style="color:#9ECBFF"> ~/mount_hd</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 取消原来挂载点</span></span>
<span class="line"><span style="color:#B392F0">sudo</span><span style="color:#9ECBFF"> umount</span><span style="color:#9ECBFF"> /Volumes/</span><span style="color:#F97583">&#x3C;</span><span style="color:#9ECBFF">盘符名</span><span style="color:#E1E4E8">称</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> </span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 挂载移动硬盘</span></span>
<span class="line"><span style="color:#B392F0">sudo</span><span style="color:#9ECBFF"> mount_ntfs</span><span style="color:#79B8FF"> -o</span><span style="color:#9ECBFF"> rw,nobrowse</span><span style="color:#9ECBFF"> /dev/</span><span style="color:#F97583">&#x3C;</span><span style="color:#9ECBFF">device</span><span style="color:#9ECBFF"> node</span><span style="color:#9ECBFF"> 的</span><span style="color:#E1E4E8">值</span><span style="color:#F97583">></span><span style="color:#9ECBFF"> ~/mount_hd</span></span></code></pre>
</div><p>经过以上步骤挂载成功.</p>
<p>详见 <a href="http://www.crazyant.net/1961.html" target="_blank" rel="noreferrer">挂载硬盘</a>
若需永久挂载参考此链接 <a href="https://github.com/GcsSloop/MacDeveloper/blob/master/Skill/Support_Ntfs.md" target="_blank" rel="noreferrer">https://github.com/GcsSloop/MacDeveloper/blob/master/Skill/Support_Ntfs.md</a></p>
<h3 id="mac-预览图片" tabindex="-1">mac 预览图片 <a class="header-anchor" href="#mac-预览图片" aria-label="Permalink to &quot;mac 预览图片&quot;"></a></h3>
<ol>
<li>选中图片按空格打开</li>
<li>使用方向键切换</li>
</ol>
<h3 id="mac-修改用户名导致丢失管理员权限" tabindex="-1">mac 修改用户名导致丢失管理员权限 <a class="header-anchor" href="#mac-修改用户名导致丢失管理员权限" aria-label="Permalink to &quot;mac 修改用户名导致丢失管理员权限&quot;"></a></h3>
<ol>
<li>开机按住 'cmds' 直到系统运行在终端模式</li>
<li>执行如下命令</li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 挂载所有文件系统</span></span>
<span class="line"><span style="color:#B392F0">mount</span><span style="color:#79B8FF"> -uaw</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#6A737D"># 删除设置</span></span>
<span class="line"><span style="color:#B392F0">rm</span><span style="color:#9ECBFF"> var/db/.applesetupdone</span></span>
<span class="line"><span style="color:#6A737D"># 重启电脑</span></span>
<span class="line"><span style="color:#B392F0">reboot</span></span></code></pre>
</div><ol start="3">
<li>
<p>此时会要求添加一个新账号</p>
</li>
<li>
<p>添加新用户后即可对原账号内容进行修改,
原账号内容不会丢失!</p>
</li>
</ol>
<h3 id="mac-从睡眠状态恢复之后没有声音" tabindex="-1">Mac 从睡眠状态恢复之后没有声音 <a class="header-anchor" href="#mac-从睡眠状态恢复之后没有声音" aria-label="Permalink to &quot;Mac 从睡眠状态恢复之后没有声音&quot;"></a></h3>
<p>参考 <a href="https://www.zhihu.com/question/23498580" target="_blank" rel="noreferrer">MacBook Air突然没有声音？</a></p>
<p>执行 <code>sudo killall coreaudiod</code> 重启 audiod 进程即可</p>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<p><a href="http://sourabhbajaj.com/mac-setup/Homebrew/README.html" target="_blank" rel="noreferrer">mac os 设置手册</a></p>
<p><a href="https://github.com/macdao/ocds-guide-to-setting-up-mac" target="_blank" rel="noreferrer">强迫症的 Mac 设置指南</a></p>
<p><a href="https://www.zhihu.com/question/20873070/answer/43230384" target="_blank" rel="noreferrer">程序员如何优雅地使用 macOS</a></p>
<p><a href="https://support.apple.com/zh-tw/HT201236" target="_blank" rel="noreferrer">mac 快捷键</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[virtualbox]]></title>
            <link>https://blog.zenheart.site/posts/2020-05-10-virtualbox</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2020-05-10-virtualbox</guid>
            <pubDate>Sun, 10 May 2020 13:52:36 GMT</pubDate>
            <description><![CDATA[virtualbox
记录 virtualbox 的基本使用
因为需要 elctron windows 端的效果,所以安装虚拟机来测试应用。
 基本安装
mac 环境直接使用 `brew cask i]]></description>
            <content:encoded><![CDATA[<h1 id="virtualbox" tabindex="-1">virtualbox <a class="header-anchor" href="#virtualbox" aria-label="Permalink to &quot;virtualbox&quot;"></a></h1>
<p><strong>记录 virtualbox 的基本使用</strong></p>
<p>因为需要 elctron windows 端的效果,所以安装虚拟机来测试应用。</p>
<h2 id="基本安装" tabindex="-1">基本安装 <a class="header-anchor" href="#基本安装" aria-label="Permalink to &quot;基本安装&quot;"></a></h2>
<p>mac 环境直接使用 <code>brew cask install virtualbox</code> 安装即可。
<strong>注意安装过程中,确保<code>安全性与隐私-&gt;通用</code>中允许 virtualbox 相关权限</strong>。
也可以去 <a href="https://www.virtualbox.org/wiki/Downloads" target="_blank" rel="noreferrer">virtualbox download</a> 下载对应版本</p>
<h2 id="windows-镜像安装" tabindex="-1">windows 镜像安装 <a class="header-anchor" href="#windows-镜像安装" aria-label="Permalink to &quot;windows 镜像安装&quot;"></a></h2>
<ol>
<li>去 <a href="https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/" target="_blank" rel="noreferrer">microsoft</a> 下载 <code>VirtualBox</code> 虚拟机对应的镜像</li>
<li>在本地安装的 <code>VirtualBox</code> 中导入镜像即可</li>
<li>注意用登陆密码在上面下载地址中有写为 <strong>Passw0rd!</strong></li>
</ol>
<h3 id="共享文件" tabindex="-1">共享文件 <a class="header-anchor" href="#共享文件" aria-label="Permalink to &quot;共享文件&quot;"></a></h3>
<p>为了实现应用安装,可以将本地电脑上目录共享到虚拟机。步骤如下</p>
<ol>
<li>在对应虚拟机下点击右键选择设置进入设置面板</li>
<li>选择共享文件,点击加号添加对应文件夹即可</li>
</ol>
<blockquote>
<p>为了确保每次都加在,可勾选自动挂载选项</p>
</blockquote>
<p>动图如下</p>
<p><img src="https://wx2.sinaimg.cn/large/965bbb87gy1genotwdwjag20k20cr7wh.gif" alt="" loading="lazy"></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://wx2.sinaimg.cn/large/965bbb87gy1genotwdwjag20k20cr7wh.gif" length="0" type="image/gif"/>
        </item>
        <item>
            <title><![CDATA[iOS 快捷指令使用详解]]></title>
            <link>https://blog.zenheart.site/posts/2020-05-03-shortcuts</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2020-05-03-shortcuts</guid>
            <pubDate>Tue, 05 May 2020 03:09:36 GMT</pubDate>
            <description><![CDATA[iOS 快捷指令使用详解
 前言
rss 订阅中看到了 用 JS 玩轉 iOS shortcuts 的 blog,于是学习了此工具的使用。
 什么是快捷指令
参考 wiki, 快捷指令是由阿里·温斯坦]]></description>
            <content:encoded><![CDATA[<h1 id="ios-快捷指令使用详解" tabindex="-1">iOS 快捷指令使用详解 <a class="header-anchor" href="#ios-快捷指令使用详解" aria-label="Permalink to &quot;iOS 快捷指令使用详解&quot;"></a></h1>
<h2 id="前言" tabindex="-1">前言 <a class="header-anchor" href="#前言" aria-label="Permalink to &quot;前言&quot;"></a></h2>
<p>rss 订阅中看到了 <a href="https://blog.techbridge.cc/2020/04/26/ios-shortcuts-js/" target="_blank" rel="noreferrer">用 JS 玩轉 iOS shortcuts</a> 的 blog,于是学习了此工具的使用。</p>
<h2 id="什么是快捷指令" tabindex="-1">什么是快捷指令 <a class="header-anchor" href="#什么是快捷指令" aria-label="Permalink to &quot;什么是快捷指令&quot;"></a></h2>
<p>参考 <a href="https://zh.wikipedia.org/wiki/%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4" target="_blank" rel="noreferrer">wiki</a>, 快捷指令是由阿里·温斯坦等开发者于 2014 年开发的一款工作流应用。该应用于 2017 年被苹果收购,2018 作为 iOS 12 版本的内置应用推出。</p>
<p>快捷指令可以将 APP 中常用的操作组合起来映射为一个快捷命令,下次直接使用快捷命令便会触发者一系列操作。参考 <a href="https://support.apple.com/zh-cn/guide/shortcuts/welcome/ios" target="_blank" rel="noreferrer">快捷命令使用手册</a> 进一步理解。</p>
<h2 id="快速入门" tabindex="-1">快速入门 <a class="header-anchor" href="#快速入门" aria-label="Permalink to &quot;快速入门&quot;"></a></h2>
<blockquote>
<p>确保 iOS 版本 <code>≥ 12</code>,我使用 <code>13.4.1</code> 说明如何使用。</p>
</blockquote>
<p>该示例实现了,将访问的网页添加到备忘录特定页面的功能。</p>
<blockquote>
<p>开始之前确保在备忘录应用中创建了一个 <code>杂货铺的文件夹</code> 且包含 <code>收藏</code> 为开头的文件</p>
</blockquote>
<iframe  height="400" width="600"  src="//player.bilibili.com/player.html?aid=668008428&bvid=BV1Xa4y1v7LN&cid=186917494&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
<p>核心步骤</p>
<ol>
<li>在 iPhone 页面下拉唤起搜索,查找 <code>shortcuts</code> 打开快捷路径的应用</li>
<li>点击右上角创建快捷路径</li>
<li>将创建的快捷路径添加到共享按钮</li>
<li>safari 访问任意网页,点击共享按钮,触发快捷命令,会自动提取 url 并保存到备忘录收藏夹。</li>
</ol>
<p>你也可以手机端打开 <a href="https://www.icloud.com/shortcuts/276b71131ab743d6b5af6103458c8cac" target="_blank" rel="noreferrer">test 快捷路径</a></p>
<blockquote>
<p><strong>注意使用前确保 <a href="https://support.apple.com/zh-cn/guide/shortcuts/apdfeb05586f/3.5/ios/13.5#apdf9081945c" target="_blank" rel="noreferrer">允许不受信任的快捷指令</a></strong></p>
</blockquote>
<h2 id="核心概念" tabindex="-1">核心概念 <a class="header-anchor" href="#核心概念" aria-label="Permalink to &quot;核心概念&quot;"></a></h2>
<p>根据 <a href="#快速入门">快速入门</a> 的示例,指令是由一系列独立的操作串联起来的。
阅读 <a href="https://support.apple.com/zh-cn/guide/shortcuts/apdad3cbabfc/ios" target="_blank" rel="noreferrer">快捷指令操作原理</a> 进一步理解操作流程。</p>
<h3 id="操作" tabindex="-1">操作 <a class="header-anchor" href="#操作" aria-label="Permalink to &quot;操作&quot;"></a></h3>
<p>例如示例中的 <code>追加到备忘录</code>,<code>显示备忘录</code> 等一系列功能。
iOS 内置了一系列内置操作方便你处理日常工作。大致分为如下几类</p>
<ul>
<li><code>App</code> 暴露了 App 的内置功能,包括邮件,短信,safari 等</li>
<li><code>脚本</code> 提供了一系列的控制逻辑及硬件控制功能,例如 获取电池电量,在 safari 中执行脚本
甚至包括执行执行 api,连接远程 ssh 执行命令的功能</li>
<li><code>媒体</code> 包含了一系列音频,视频制作 gif 的能力</li>
<li><code>位置</code> 包含地理位置控制,天气等接口</li>
<li><code>文稿</code> 包含文本处理,markdown 等常用格式的相关操作</li>
<li><code>共享</code> 包含共享和邮件,短信等通知功能</li>
<li><code>网页</code> safari 的一系列操作能力</li>
</ul>
<p>你也可以在搜索框查询所需的操作。</p>
<h3 id="输入和输出" tabindex="-1">输入和输出 <a class="header-anchor" href="#输入和输出" aria-label="Permalink to &quot;输入和输出&quot;"></a></h3>
<p>一般的操作都会有输入,输出的概念,例如 <code>获取 url</code> 的操作会从输入中提取 url。
输出 <code>url</code> 的文本。每一个操作都包含自己的输入输出规则,通过点击操作旁边的感叹号,查询操作的帮助。其中包含一些典型的输入。</p>
<ul>
<li><code>快捷指令输入</code> 是根据当前执行快捷指令的环境提取输入,例如示例是从 safari 浏览器提取 url</li>
<li><code>剪切板</code> 是从剪切板提取输入</li>
<li><code>魔法变量</code> 是从变量中提取输入,后有详述</li>
</ul>
<h3 id="变量" tabindex="-1">变量 <a class="header-anchor" href="#变量" aria-label="Permalink to &quot;变量&quot;"></a></h3>
<p>通过变量你可以将不同的操作流程串联起来,通过将中间值保存到变量,来组合
不同的输入结果。</p>
<p>快捷指令的重点就是利用操作结合需要处理的内容,创建一系列的操作流。
处理基本的组合,快捷指令也提供了逻辑判断,重复等逻辑操作,查看 <a href="https://support.apple.com/zh-cn/guide/shortcuts/apdb5506f698/ios" target="_blank" rel="noreferrer">高级快捷指令</a> 理解。</p>
<h2 id="自动化" tabindex="-1">自动化 <a class="header-anchor" href="#自动化" aria-label="Permalink to &quot;自动化&quot;"></a></h2>
<p>除了创建快捷指令,你也可以采用自动化来设定自动执行的任务,概念类似 Unix 系统的定时任务。
但注意只有特定任务才会自动触发,某些任务需要手动确认后才可执行。</p>
<div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>若设定自动化任务的下方有 <code>运行时询问</code> 则该任务可以自动触发,否则需要手动确认后才会执行</p>
</div>
<p>可以自动触发的任务列表详见 <a href="https://support.apple.com/zh-cn/guide/shortcuts/apd602971e63/ios#apd27e876cf8" target="_blank" rel="noreferrer">自动化无需询问</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[记一次微信分享]]></title>
            <link>https://blog.zenheart.site/posts/2020-04-20-share-in-wechat</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2020-04-20-share-in-wechat</guid>
            <pubDate>Mon, 20 Apr 2020 16:38:26 GMT</pubDate>
            <description><![CDATA[记一次微信分享
这是一次微信分享的资料这里记录一下
 自我介绍
大家好我是 15  级一个普通二本毕业生。到今年 7 月就工作 5 年了。
 大学经历
我大学学的自动化, 从大一开始就在学校参加比赛,]]></description>
            <content:encoded><![CDATA[<h1 id="记一次微信分享" tabindex="-1">记一次微信分享 <a class="header-anchor" href="#记一次微信分享" aria-label="Permalink to &quot;记一次微信分享&quot;"></a></h1>
<p><strong>这是一次微信分享的资料这里记录一下</strong></p>
<h2 id="自我介绍" tabindex="-1">自我介绍 <a class="header-anchor" href="#自我介绍" aria-label="Permalink to &quot;自我介绍&quot;"></a></h2>
<p>大家好我是 15  级一个普通二本毕业生。到今年 7 月就工作 5 年了。</p>
<h3 id="大学经历" tabindex="-1">大学经历 <a class="header-anchor" href="#大学经历" aria-label="Permalink to &quot;大学经历&quot;"></a></h3>
<p>我大学学的自动化, 从大一开始就在学校参加比赛,大一暑假参加数学建模学会了 <code>matlab</code> 也有幸获得了全国一等奖。</p>
<p>大二由于是自动化专业接触到单片机知识, 所以加入了学校电子实验室学习 C 语言,同时开始学习单片机,主要用的是 <code>STC 51</code> 系列、<code>Atmel Mega</code>系列 和 <code>TI MSP430</code> 系列的 8 位、16 位单片机, 暑假参加了飞思卡尔智能车大赛还有全国电子设计大赛也获得了一些名次。</p>
<p>大三也参加了智能车和湖北省电子设计大赛成绩还行,大四在学校学习 FPGA 临近毕业找的 offer 是一家深圳做电子通路的公司。</p>
<h3 id="工作履历" tabindex="-1">工作履历 <a class="header-anchor" href="#工作履历" aria-label="Permalink to &quot;工作履历&quot;"></a></h3>
<p><code>1-3 年</code> 一直在这家公司,由于公司的培养体系很健全, 有师徒制, 所以在第一年学习了前端基础,php,nodejs 等知识, 主要的工作偏 IoT 方向,做了智能家居等方面的应用,由于公司本身是一个芯片代理商,RD 的价值主要依托于芯片做方案, 并不是纯正的互联网公司。所以我就跳槽了。</p>
<p><code>3-4年</code> 在一个还不错的公司做 WebAPP 相关的开发,主要的技术栈是 Vue。</p>
<p><code>19 年</code> 因为个人发展回到武汉,在一家公司做 CRM 系统,由于工作太累,2020 年又跳槽到了新的公司(其中由于疫情在家自学了两个月 😂 )。</p>
<h2 id="学习经验" tabindex="-1">学习经验 <a class="header-anchor" href="#学习经验" aria-label="Permalink to &quot;学习经验&quot;"></a></h2>
<p>说一下自己工作五年的一些学习经验吧, 我觉得主要是如下四点:</p>
<ol>
<li>去源头找答案</li>
<li>不要给自己设限</li>
<li>形成自己的做事模式</li>
<li>一切以解决问题为中心</li>
</ol>
<p>下面我会详细展开讲解</p>
<h3 id="去源头找答案" tabindex="-1">去源头找答案 <a class="header-anchor" href="#去源头找答案" aria-label="Permalink to &quot;去源头找答案&quot;"></a></h3>
<p>首先学会使用正确的搜索引擎,推荐使用 <a href="http://www.cnplugins.com/office/gugefangwenzhushou/" target="_blank" rel="noreferrer">google 助手</a> 利用 google。学会一些基本的搜索指令,详见 <a href="https://www.zhihu.com/question/20161362" target="_blank" rel="noreferrer">知乎</a>。</p>
<p>技术学习尝试去源头找答案,例如不理解 ECMAScript 特性的机制,去读 <a href="https://tc39.es/ecma262/" target="_blank" rel="noreferrer">规范</a>, 看不懂在向上去看 <a href="https://developer.mozilla.org/zh-CN/" target="_blank" rel="noreferrer">MDN</a> 的相关使用说明。 同样如果好奇规范的来历你也可以向下去看 <a href="https://github.com/tc39/test262" target="_blank" rel="noreferrer">tc39</a> 提案的演变规则,甚至去 <a href="https://esdiscuss.org/1" target="_blank" rel="noreferrer">邮件组</a> 查看一个特性的想法从开始到确定的全过程,通过知乎这个提问的回答: <a href="https://www.zhihu.com/question/366665675/answer/1127726009" target="_blank" rel="noreferrer">为什么Js中localStroage只能存string类型的value？</a> 来理解这种知识溯源的能力。</p>
<p>上面只列举了 JS, 实际上这个思想是可以推广到其他技术甚至是非技术学习的,例如网络协议去看 <a href="http://www.rfcreader.com/#rfc1001" target="_blank" rel="noreferrer">RFC</a>,IEEE 等各种规范, MVC 模式去读原始的论文, 当你能从源头完全消化并理解知识的时候,你已经强于那些通过二层或三层信息链路才能理解的人。这也是为什么在面试时喜欢问源码,应为从源头获取信息的能力可以很好体现出技术能力。</p>
<h3 id="不要给自己设限" tabindex="-1">不要给自己设限 <a class="header-anchor" href="#不要给自己设限" aria-label="Permalink to &quot;不要给自己设限&quot;"></a></h3>
<p>先是工程师,再是软件工程师,再是前端工程师。你的职业只决定了你的专精范为, 并没有限定你的知识边界。</p>
<p>想学硬件买一块 <a href="https://www.arduino.cc/" target="_blank" rel="noreferrer">Arduino</a> 或树莓派做个数码时钟,推荐 <a href="http://www.doyoung.net/" target="_blank" rel="noreferrer">杜洋电子工作室</a> DIY 自己的创意。</p>
<p>想学后端,在自己电脑上搭建 mysql,nginx 环境,用 nodejs,php 或其他语言,选一个框架搭建 CRUD 的系统。</p>
<p>想学运维, 从搭建一个简单的 ftp 服务开始,理解 FHS, 系统权限, 配置管理等知识, 掌握 shell , 进一步学习 docker 等容器技术。</p>
<p>当然还包括产品,设计等方方面面的知识,只要你感兴趣就去学,不要只局限在前端领域,因为技术的思想是相通的,你知道的越多你的思路越开阔。</p>
<h3 id="形成自己的做事模式" tabindex="-1">形成自己的做事模式 <a class="header-anchor" href="#形成自己的做事模式" aria-label="Permalink to &quot;形成自己的做事模式&quot;"></a></h3>
<p>为什么要学习设计模式, 因为它抽象了一些经典问题,总结了一套标准化的解决方案,提高了软件开发的效率和质量。同样在你的工作中你也应该形成应对不同事情的做事模式,提高效率。</p>
<p>例如我工作的任务管理上, 会采用 TODO 模式操作步骤如下。</p>
<ol>
<li>明确任务,采用 5W1H 原则</li>
<li>拆分任务,确定关键链路</li>
<li>采用任务优先级排序任务</li>
<li>细化任务拆分 TODO 列表</li>
<li>按照排序逐项完成</li>
</ol>
<p>例如做一个需求,先采用 5W1H 搞清楚需求的来龙去脉,对接人等等信息,清楚后再拆分你的任务,例如设计,编码,UI,联调 。假设到了编码环节再进一步将功能拆分为一系列 TODO 项,如果用 vscode 推荐<a href="https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-todo-plus" target="_blank" rel="noreferrer">todo+ 插件</a> ,你可以在项目中添加 <code>.todo</code>, 然后在 <a href="https://git-scm.com/docs/gitignore" target="_blank" rel="noreferrer">.git/info/exclude</a> 中添加 <code>.todo</code>保证只在自己工程忽略此文件, 通过此文件追踪你的代码代办清单。结合 <a href="https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree" target="_blank" rel="noreferrer">todo tree 插件</a> 精确到单行代码级别的控制。</p>
<p>当然还有很多的模式,你可以在反复的操作中优化这些应对模式从而形成自己对于不同事情的最优策略。如果你看过 JS 高级程序设计,你肯定知道 Nicholas C. Zakas, 这是他最近的博文 <a href="https://humanwhocodes.com/blog/2020/02/how-i-think-about-solving-problems/" target="_blank" rel="noreferrer">How I think about solving problems</a> 总结了他解决问题的模式, <a href="http://blog.zenheart.site/posts/2020-02-21-how-i-think-about-solving-problem.html" target="_blank" rel="noreferrer">我的拙译在此</a>。</p>
<h3 id="一切以解决问题为中心" tabindex="-1">一切以解决问题为中心 <a class="header-anchor" href="#一切以解决问题为中心" aria-label="Permalink to &quot;一切以解决问题为中心&quot;"></a></h3>
<p>一切已解决问题为中心, 在我工作的前几年我也痴迷对新技术的追逐, 但是我逐渐发现软件工程的本质是为了解决问题, 而不是这些技术本身。这些技术的目的是为了更好更快的解决问题, 所以在你学习之前先问自己你是要解决问题还是单纯的为了追逐技术。</p>
<p>同样除了解决问题你还需要保持好奇心, 如果熟悉 npm 你肯定知道 Tj, express, mocha 等一系列 npm 核心包的创建者, quora 上有个提问 <a href="https://www.quora.com/How-did-TJ-Holowaychuk-learn-to-program" target="_blank" rel="noreferrer">How did TJ Holowaychuk learn to program?</a>(需翻墙) Tj 的回答就是我总是好奇这是怎么工作的,保持好奇以解决问题为中心，再去学习技术你会有无限动力。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>最后希望大家真的能有所收获,如果感兴趣可以关注我的 <a href="http://blog.zenheart.site/" target="_blank" rel="noreferrer">blog</a> 或者 <a href="https://github.com/zenHeart" target="_blank" rel="noreferrer">github</a> 。</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[技术写作须知]]></title>
            <link>https://blog.zenheart.site/posts/2020-01-18-notes-on-technical-writing</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2020-01-18-notes-on-technical-writing</guid>
            <pubDate>Sun, 05 Apr 2020 04:24:57 GMT</pubDate>
            <description><![CDATA[技术写作须知

再过去的一年,我断断续续为 WordPress 文档工作。在冻结发布期间,我开始为开发者迁移到新平台做出贡献。我发现自己很享受写文档,同时写文档也有益于帮助和指导他人。虽然这不是我的主]]></description>
            <content:encoded><![CDATA[<h1 id="技术写作须知" tabindex="-1">技术写作须知 <a class="header-anchor" href="#技术写作须知" aria-label="Permalink to &quot;技术写作须知&quot;"></a></h1>
<blockquote>
<p>该译文对应原文: <a href="https://mkaz.blog/misc/notes-on-technical-writing/" target="_blank" rel="noreferrer">Notes on Technical Writing</a></p>
</blockquote>
<p>再过去的一年,我断断续续为 WordPress 文档工作。在冻结发布期间,我开始为开发者迁移到新平台做出贡献。我发现自己很享受写文档,同时写文档也有益于帮助和指导他人。虽然这不是我的主要工作,我还是会抽出时间保持贡献。</p>
<p>这段时间,我阅读了大量关于技术写作的资料。这是我的笔记,不仅帮助我后续记忆,也可作为我目前写作的参考工具。</p>
<h2 id="原则" tabindex="-1">原则 <a class="header-anchor" href="#原则" aria-label="Permalink to &quot;原则&quot;"></a></h2>
<p>以下原则是撰写文档时须谨记的</p>
<ul>
<li>技术写作的目的是更快更好的帮助用户完成任务</li>
<li>实践出真知,演示优于描述</li>
<li>让用户尽快获得成功
<blockquote>
<p>译者注: 技术写作必须尽早让用户获得反馈和价值</p>
</blockquote>
</li>
<li>文档类型不是只有一种
<blockquote>
<p>译者注: 要根据目的选择技术文档的类型</p>
</blockquote>
</li>
</ul>
<h2 id="建议" tabindex="-1">建议 <a class="header-anchor" href="#建议" aria-label="Permalink to &quot;建议&quot;"></a></h2>
<ul>
<li>明确你的受众和写作意图</li>
<li>重要的信息放在前面</li>
<li>善用列表
<blockquote>
<p>译者注:例如编写技术教程,采用有序列表编排示例步骤,便于读者操作和定位问题。</p>
</blockquote>
</li>
<li>一个段落,一个概念</li>
<li>勤于修改</li>
</ul>
<h2 id="避免元写作" tabindex="-1">避免元写作 <a class="header-anchor" href="#避免元写作" aria-label="Permalink to &quot;避免元写作&quot;"></a></h2>
<p>避免写描述写作的内容,文字本身没有思想,是笔者和读者赋予了文字灵魂。</p>
<p>你不需要告知读者接下来要说什么,直接说就好了。</p>
<ul>
<li><strong>反例:</strong> 本章节讨论影响名气起伏的因素</li>
<li><strong>范例:</strong> 名气起伏受什么影响?</li>
</ul>
<p>不要在写作中引用章节</p>
<ul>
<li><strong>反例:</strong> 总结上一章关于......</li>
<li><strong>范例:</strong> 综上所述.....</li>
</ul>
<p>不要描述极度复杂的概念,同样也不要讲显而易见的内容。读者会自行判断概念的难易。</p>
<h2 id="极简教学" tabindex="-1">极简教学 <a class="header-anchor" href="#极简教学" aria-label="Permalink to &quot;极简教学&quot;"></a></h2>
<p>John M. Carroll 和他在 IBM 的同事研究如何创建支持文档,分析使用户熟练掌握的最佳方案。在 1980 年代，他们开发了一种极简方法，并编写了一本极佳的<a href="https://www.utwente.nl/en/bms/ist/minimalism/displaywriter.pdf" target="_blank" rel="noreferrer">《IBM Displaywriter 操作员培训手册》</a>，提供给首次使用文本处理器的人。</p>
<blockquote>
<p>译者注: <a href="http://www.obsoletecomputermuseum.org/displayw/" target="_blank" rel="noreferrer">Displaywriter</a> 是 IBM 开发的电子文档编辑器</p>
</blockquote>
<p>极简教学的四条原则:</p>
<ul>
<li>选择面向行动的方法,用户总期望做点什么。这条原则反映了极简主义以用户为中心的本质。</li>
<li>明确任务域的工具。工具是达到目的的手段。该原则要求设计人员选择对用户有意义的培训任务。</li>
<li>提供错误识别和恢复,人非圣贤,孰能无过,提升用户处理错误的体验和能力。</li>
<li>明确准备,学习,定位。设计必须尽可能满足目标受众的不同需求和倾向。该原则也反映了极简主义的以用户为中心的本质。</li>
</ul>
<p><a href="https://www.utwente.nl/en/bms/ist/minimalism/" target="_blank" rel="noreferrer">深入阅读极简教学</a>出自荷兰特文特大学的教学技术系。</p>
<h2 id="建构主义" tabindex="-1">建构主义 <a class="header-anchor" href="#建构主义" aria-label="Permalink to &quot;建构主义&quot;"></a></h2>
<p>美国心理学家 Jerome Bruner 研究人类认知心理学。布鲁纳著作的一个主要议题是确认学习是一个主动的过程，学习者基于已有的知识构建新的概念。将建构主义原理应用于文档：</p>
<ul>
<li>鼓励读者去发现原理</li>
<li>将信息转换为读者当前可以接受的水平</li>
<li>以递进方式编排材料,在已掌握知识上构筑新的概念</li>
<li>融入活动对话框,鼓励用户去操作 “试一下”,&quot;看看发生了什么&quot;,&quot;自行验证&quot;</li>
</ul>
<p>进一步阅读 <a href="https://www.instructionaldesign.org/theories/constructivist/" target="_blank" rel="noreferrer">Bruner 构建理论</a></p>
<h2 id="文档类型" tabindex="-1">文档类型 <a class="header-anchor" href="#文档类型" aria-label="Permalink to &quot;文档类型&quot;"></a></h2>
<p>Daniele Procida 撰写了<a href="https://www.divio.com/blog/documentation/" target="_blank" rel="noreferrer">关于文档你不知道的</a> 不是所有的东西都叫文档，这里(至少) 有四种类型文档。</p>
<ol>
<li><strong>教程(Tutorials)</strong>    教程面向教学针对初学者,通过一系列指导课程,给用户提供基本的信心和技能。教程不应该预设知识或语言,但是任可帮助那些一无所知的初学者。</li>
<li><strong>使用指南</strong>  使用指南或者 FAQ 是面向目标的。由用户确定,使用指南可以假定用户具有预设知识和语言，但是需要知道如何解决特定问题。</li>
<li><strong>说明</strong> 说明或概述文档是面向理解的，提供背景或额外详细的上下文
<blockquote>
<p>译者注: 这类似文档概念建立和术语阐述章节,例如 <a href="https://webpack.js.org/concepts/" target="_blank" rel="noreferrer">webpack concept</a></p>
</blockquote>
</li>
<li><strong>参考指南</strong> 参考指南是面向信息的，它应该准确而完整的描述机理。API 文档是参考指南的典型事例。</li>
</ol>
<h2 id="延伸阅读" tabindex="-1">延伸阅读 <a class="header-anchor" href="#延伸阅读" aria-label="Permalink to &quot;延伸阅读&quot;"></a></h2>
<ul>
<li><a href="https://developers.google.com/tech-writing/one" target="_blank" rel="noreferrer">Google Technical Writing</a></li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[什么是 TypeScript 中的类型,两种观点]]></title>
            <link>https://blog.zenheart.site/posts/2020-02-29-understanding-types-typescript</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2020-02-29-understanding-types-typescript</guid>
            <pubDate>Sun, 05 Apr 2020 04:24:57 GMT</pubDate>
            <description><![CDATA[
# 什么是 TypeScript 中的类型,两种观点

> 该译文对应原文 [What is a type in TypeScript? Two perspectives](https://2ality.com/2020/02/understanding-types-typescript.html)


## 1 三个问题针对每种观点
以下三个问题对理解类型系统如何工作至关重要。每个问题都需要采用两种观点来解答。

1. `myVariable` 属于类型  `MyType` 意味着什么
  
    ```ts
    let myVariable: MyType
    ```

2. `SourceType` 赋给了 `TargetType` 么

    ```ts
    let source:SourceType = /*...*/
    let target:TargetType = source/*...*/
    ```

3. TypeUnion 如何从 Type1，Type2和 Type3 中派生的？

    ```ts
    type typeUnion = Type1 | Type2 | Type3;
    ```

## 2 观点一：类型是值的集合
在这种视角下,类型是值的的集合

1. 如果 `myVariable` 属于类型 `MyType`,表示所有可以赋给 `myVariable` 的值都必须是属于 `MyType` 集合的元素
2. `sourceType` 可以赋给 `TargetType` 是 `SourceType` 为 `TargetType` 的子集。
3. 联合类型(TypeUnion) 属于类型 `Type1`,`Type2` 和 `Type3` 是集合理论的并集

## 3 观点 2: 类型兼容关系

在这种视角下: 我们不关心值和在代码运行时如何变化。取而代之，我们更多采用静态视角。

* 源代码都有位置,每个位置都有一个静态类型。在有 TypeScript 识别的编辑器,我们可以看到静态类型的位置如果光标悬停在代码上。
* 源码位置通过赋值，函数调用等关联上目标位置时。源码位置对应的类型必须和目标位置的类型兼容。TypeScript 规范定义类型兼容称之为[类型关联](https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3.11)
* [类型关联赋值兼容性](https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3114-assignment-compatibility) 定义了何时源类型 S 可以赋值给目标类型 T
    * S 和 T 是相同的类型
    * S 和 T 是类型 any
    * 等等

让我们思考上述问题:

1. `myVariable` 属于类型 `MyType` 如果属于 `myVariable` 的静态类型可以赋给 `MyType`
2. `SourceType` 是可以赋给 `TargetType` 如果它们赋值兼容
3. 联合类型(type unions) 如何工作参考[类型关系的显示成员](https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3111-apparent-members)

TypeScript 类型系统一个非常有意思的特性是相同的变量可以在不同位置有不同的静态类型。

```ts
const arr = [];
// 推导类型: any[]
arr;

arr.push(123);
// 推导类型: number[]
arr;

arr.push('abc');
// 推导类型: (string | number)[]
arr;
```

## 4 标明类型系统(Nominal type systems) vs 结构类型系统(structural type systems )

静态类型系统的一个任务是判断两种静态类型是否兼容。
* 静态类型 `U` 是一个实际的参数(例如通过函数调用)
* 静态类型 `T` 是一个相关的格式化参数(指定为函数定义的一部分)

> 笔者注: 这里 `U` 是实参(真实传入的值), `T` 是形参(函数申明传入的变量)

这通常意味着检查 `U` 是否属于 `T` 的子类型。两种方法实现这种检查(粗略来看)
* 在标明类型系统, 两种静态类型是相等的如果他们拥有相同的标识符(名字),一个类型是另一个的子类型如果它们的子类型关系式显示申明的。
  * 表明类型语言例如 C++,Java,C,Swift 和 Rust
* 在结构化类型系统, 两种静态类型是相同的如果他们拥有相同的结构(如果它们的各部分名字和类型均相同)。类型 `U` 是另一种类型 `T` 的子类型如果 `U` 拥有类型 `T` 的所有部分(类型 U 可能还包含其他部分),而且类型 `U` 的每个部分属于类型 T 相关联部分的子类型.
  * 结构化类型语言 OCaml/ReasonML,Haskell 和 TypeScript

以下的代码在标明类型系统中会出错,但在 TypeScript 结构类型系统中是合法的。因为类 A 和 类 B 拥有相同的结构。

```ts
class A {
    name: 'A';
}
class B {
    name = 'B';
}

const somaVariable:A = new B(); 
```

TypeScript 接口同样是结构化的。不必为了匹配而实现该接口。

```js
interface Point {
    x: number;
    y: number;
}
const point: Point = {x:1, y:2};
```

## 进一步阅读
* [TypeScript 手册类型兼容](https://www.typescriptlang.org/docs/handbook/type-compatibility.html)
* [TypeScript 规范类型关系章节](https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3.11)

]]></description>
            <content:encoded><![CDATA[<h1 id="什么是-typescript-中的类型-两种观点" tabindex="-1">什么是 TypeScript 中的类型,两种观点 <a class="header-anchor" href="#什么是-typescript-中的类型-两种观点" aria-label="Permalink to &quot;什么是 TypeScript 中的类型,两种观点&quot;"></a></h1>
<blockquote>
<p>该译文对应原文 <a href="https://2ality.com/2020/02/understanding-types-typescript.html" target="_blank" rel="noreferrer">What is a type in TypeScript? Two perspectives</a></p>
</blockquote>
<h2 id="_1-三个问题针对每种观点" tabindex="-1">1 三个问题针对每种观点 <a class="header-anchor" href="#_1-三个问题针对每种观点" aria-label="Permalink to &quot;1 三个问题针对每种观点&quot;"></a></h2>
<p>以下三个问题对理解类型系统如何工作至关重要。每个问题都需要采用两种观点来解答。</p>
<ol>
<li>
<p><code>myVariable</code> 属于类型  <code>MyType</code> 意味着什么</p>
<div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">let</span><span style="color:#E1E4E8"> myVariable</span><span style="color:#F97583">:</span><span style="color:#B392F0"> MyType</span></span></code></pre>
</div></li>
<li>
<p><code>SourceType</code> 赋给了 <code>TargetType</code> 么</p>
<div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">let</span><span style="color:#E1E4E8"> source</span><span style="color:#F97583">:</span><span style="color:#B392F0">SourceType</span><span style="color:#F97583"> =</span><span style="color:#6A737D"> /*...*/</span></span>
<span class="line"><span style="color:#F97583">let</span><span style="color:#E1E4E8"> target</span><span style="color:#F97583">:</span><span style="color:#B392F0">TargetType</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> source</span><span style="color:#6A737D">/*...*/</span></span></code></pre>
</div></li>
<li>
<p>TypeUnion 如何从 Type1，Type2和 Type3 中派生的？</p>
<div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">type</span><span style="color:#B392F0"> typeUnion</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> Type1</span><span style="color:#F97583"> |</span><span style="color:#B392F0"> Type2</span><span style="color:#F97583"> |</span><span style="color:#B392F0"> Type3</span><span style="color:#E1E4E8">;</span></span></code></pre>
</div></li>
</ol>
<h2 id="_2-观点一-类型是值的集合" tabindex="-1">2 观点一：类型是值的集合 <a class="header-anchor" href="#_2-观点一-类型是值的集合" aria-label="Permalink to &quot;2 观点一：类型是值的集合&quot;"></a></h2>
<p>在这种视角下,类型是值的的集合</p>
<ol>
<li>如果 <code>myVariable</code> 属于类型 <code>MyType</code>,表示所有可以赋给 <code>myVariable</code> 的值都必须是属于 <code>MyType</code> 集合的元素</li>
<li><code>sourceType</code> 可以赋给 <code>TargetType</code> 是 <code>SourceType</code> 为 <code>TargetType</code> 的子集。</li>
<li>联合类型(TypeUnion) 属于类型 <code>Type1</code>,<code>Type2</code> 和 <code>Type3</code> 是集合理论的并集</li>
</ol>
<h2 id="_3-观点-2-类型兼容关系" tabindex="-1">3 观点 2: 类型兼容关系 <a class="header-anchor" href="#_3-观点-2-类型兼容关系" aria-label="Permalink to &quot;3 观点 2: 类型兼容关系&quot;"></a></h2>
<p>在这种视角下: 我们不关心值和在代码运行时如何变化。取而代之，我们更多采用静态视角。</p>
<ul>
<li>源代码都有位置,每个位置都有一个静态类型。在有 TypeScript 识别的编辑器,我们可以看到静态类型的位置如果光标悬停在代码上。</li>
<li>源码位置通过赋值，函数调用等关联上目标位置时。源码位置对应的类型必须和目标位置的类型兼容。TypeScript 规范定义类型兼容称之为<a href="https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3.11" target="_blank" rel="noreferrer">类型关联</a></li>
<li><a href="https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3114-assignment-compatibility" target="_blank" rel="noreferrer">类型关联赋值兼容性</a> 定义了何时源类型 S 可以赋值给目标类型 T
<ul>
<li>S 和 T 是相同的类型</li>
<li>S 和 T 是类型 any</li>
<li>等等</li>
</ul>
</li>
</ul>
<p>让我们思考上述问题:</p>
<ol>
<li><code>myVariable</code> 属于类型 <code>MyType</code> 如果属于 <code>myVariable</code> 的静态类型可以赋给 <code>MyType</code></li>
<li><code>SourceType</code> 是可以赋给 <code>TargetType</code> 如果它们赋值兼容</li>
<li>联合类型(type unions) 如何工作参考<a href="https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3111-apparent-members" target="_blank" rel="noreferrer">类型关系的显示成员</a></li>
</ol>
<p>TypeScript 类型系统一个非常有意思的特性是相同的变量可以在不同位置有不同的静态类型。</p>
<div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> arr</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> [];</span></span>
<span class="line"><span style="color:#6A737D">// 推导类型: any[]</span></span>
<span class="line"><span style="color:#E1E4E8">arr;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">arr.</span><span style="color:#B392F0">push</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">123</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#6A737D">// 推导类型: number[]</span></span>
<span class="line"><span style="color:#E1E4E8">arr;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">arr.</span><span style="color:#B392F0">push</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'abc'</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#6A737D">// 推导类型: (string | number)[]</span></span>
<span class="line"><span style="color:#E1E4E8">arr;</span></span></code></pre>
</div><h2 id="_4-标明类型系统-nominal-type-systems-vs-结构类型系统-structural-type-systems" tabindex="-1">4 标明类型系统(Nominal type systems) vs 结构类型系统(structural type systems ) <a class="header-anchor" href="#_4-标明类型系统-nominal-type-systems-vs-结构类型系统-structural-type-systems" aria-label="Permalink to &quot;4 标明类型系统(Nominal type systems) vs 结构类型系统(structural type systems )&quot;"></a></h2>
<p>静态类型系统的一个任务是判断两种静态类型是否兼容。</p>
<ul>
<li>静态类型 <code>U</code> 是一个实际的参数(例如通过函数调用)</li>
<li>静态类型 <code>T</code> 是一个相关的格式化参数(指定为函数定义的一部分)</li>
</ul>
<blockquote>
<p>笔者注: 这里 <code>U</code> 是实参(真实传入的值), <code>T</code> 是形参(函数申明传入的变量)</p>
</blockquote>
<p>这通常意味着检查 <code>U</code> 是否属于 <code>T</code> 的子类型。两种方法实现这种检查(粗略来看)</p>
<ul>
<li>在标明类型系统, 两种静态类型是相等的如果他们拥有相同的标识符(名字),一个类型是另一个的子类型如果它们的子类型关系式显示申明的。
<ul>
<li>表明类型语言例如 C++,Java,C,Swift 和 Rust</li>
</ul>
</li>
<li>在结构化类型系统, 两种静态类型是相同的如果他们拥有相同的结构(如果它们的各部分名字和类型均相同)。类型 <code>U</code> 是另一种类型 <code>T</code> 的子类型如果 <code>U</code> 拥有类型 <code>T</code> 的所有部分(类型 U 可能还包含其他部分),而且类型 <code>U</code> 的每个部分属于类型 T 相关联部分的子类型.
<ul>
<li>结构化类型语言 OCaml/ReasonML,Haskell 和 TypeScript</li>
</ul>
</li>
</ul>
<p>以下的代码在标明类型系统中会出错,但在 TypeScript 结构类型系统中是合法的。因为类 A 和 类 B 拥有相同的结构。</p>
<div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">class</span><span style="color:#B392F0"> A</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#FFAB70">    name</span><span style="color:#F97583">:</span><span style="color:#9ECBFF"> 'A'</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#F97583">class</span><span style="color:#B392F0"> B</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#FFAB70">    name</span><span style="color:#F97583"> =</span><span style="color:#9ECBFF"> 'B'</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> somaVariable</span><span style="color:#F97583">:</span><span style="color:#B392F0">A</span><span style="color:#F97583"> =</span><span style="color:#F97583"> new</span><span style="color:#B392F0"> B</span><span style="color:#E1E4E8">();</span></span></code></pre>
</div><p>TypeScript 接口同样是结构化的。不必为了匹配而实现该接口。</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">interface</span><span style="color:#B392F0"> Point</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#FFAB70">    x</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> number</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#FFAB70">    y</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> number</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> point</span><span style="color:#F97583">:</span><span style="color:#B392F0"> Point</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> {x:</span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">, y:</span><span style="color:#79B8FF">2</span><span style="color:#E1E4E8">};</span></span></code></pre>
</div><h2 id="进一步阅读" tabindex="-1">进一步阅读 <a class="header-anchor" href="#进一步阅读" aria-label="Permalink to &quot;进一步阅读&quot;"></a></h2>
<ul>
<li><a href="https://www.typescriptlang.org/docs/handbook/type-compatibility.html" target="_blank" rel="noreferrer">TypeScript 手册类型兼容</a></li>
<li><a href="https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3.11" target="_blank" rel="noreferrer">TypeScript 规范类型关系章节</a></li>
</ul>
<hr>
<h2 id="笔者注" tabindex="-1">笔者注 <a class="header-anchor" href="#笔者注" aria-label="Permalink to &quot;笔者注&quot;"></a></h2>
<p>理解 TypeScript 是结构化类型系统。可以帮助你更好的使用 TypeScript。</p>
<p>TypeScript 在设计之初定义了一系列准则，参考<a href="https://github.com/microsoft/TypeScript/wiki/TypeScript-Design-Goals" target="_blank" rel="noreferrer">TypeScript 设计目的</a> 翻译如下:</p>
<p><strong>目标:</strong></p>
<ol>
<li>静态识别可能出错的结构</li>
<li>提供一个结构机制用于组织大型代码</li>
<li>产出代码不要增加运行时负担</li>
<li>产出干净,惯用的,可识别的 js 代码</li>
<li>产出一种可组合且易于推理的语言</li>
<li>向当前和未来的 ECMAScript 规范靠拢</li>
<li>保留所有 JavaScript 代码运行时特性</li>
<li>避免添加表达式层面的语法</li>
<li>使用一致,完全可擦除的结构化类型系统</li>
<li>成为跨平台的工具</li>
<li>不要和 TypeScript 发生破坏性迭代</li>
</ol>
<p><strong>非目标:</strong></p>
<ol>
<li>完全模仿现有语言,使用当前 JavaScript 的特性和编程设计者的意图来开发一门更有价值的语言作为替代。</li>
<li>激进的优化程序运行时性能,产出在运行平台性能更良好的 JavaScript 代码</li>
<li>专注于完全或证明正确的类型系统,取代在正确性和高产性上进行平衡。</li>
<li>提供一个端到端的编译管道,取代创建一个可扩展的外部工具用于编译器或其他更复杂的构建流</li>
<li>在编码中添加或依赖与运行时的类型信息,或产出基于类型系统的不同代码。取代鼓励不依赖于运行时元数据的编程模式</li>
<li>提供额外的运行时函数或库。取代使用 TypeScript 描述已经存在的库</li>
<li>引入一些可能使用户惊讶的特性。取代其他语言经过考量而采用的通用模式。</li>
</ol>
<p>根据该设计主旨可以看到 TypeScript 的如下特性</p>
<ol>
<li>属于静态类型检查
<blockquote>
<p>这意味着不应该在运行时依赖 TypeScript 类型组织代码逻辑</p>
</blockquote>
</li>
<li>属于结构化类型
<blockquote>
<p>不要执着于类型的完全匹配只要结构相似就是相同类型</p>
</blockquote>
</li>
<li>类型检查为首要准则
<blockquote>
<p>TypeScript 准确的说并不是一门语言,它只是类型检查的工具,应该把<strong>学习重点放在更好的类型检查上,而非它所提供的语言特性</strong></p>
</blockquote>
</li>
</ol>
<p>工作是马拉松而非短跑
保持谦逊,而非愚蠢
和自己比较而非他人
尊重人,而非头衔
选择挑战,而非安逸
工作从白板开始,而非键盘
价值驱动,而非代码
热爱生活,而非工作</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[软件工程师新手给自己的一封信]]></title>
            <link>https://blog.zenheart.site/posts/2020-04-02-letter-to-myself</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2020-04-02-letter-to-myself</guid>
            <pubDate>Thu, 02 Apr 2020 09:29:48 GMT</pubDate>
            <description><![CDATA[软件工程师新手给自己的一封信

亲爱的自己:
你刚从大学毕业准备在 IT 领域开始你的事业。我无法向你透露任何内容,但我保证这将是一段有趣的旅程。我给你写这封信是想给你一些建议使你变得更加专业。在未来]]></description>
            <content:encoded><![CDATA[<h1 id="软件工程师新手给自己的一封信" tabindex="-1">软件工程师新手给自己的一封信 <a class="header-anchor" href="#软件工程师新手给自己的一封信" aria-label="Permalink to &quot;软件工程师新手给自己的一封信&quot;"></a></h1>
<blockquote>
<p>从<a href="https://www.weibo.com/1400854834/IBlq9AeRh?from=page_1005051400854834_profile&amp;wvr=6&amp;mod=weibotime" target="_blank" rel="noreferrer">阮一峰微博</a>读到此文,深有同感翻译如下,该译文对应原文<a href="https://www.florio.dev/20200328-letter-to-myself" target="_blank" rel="noreferrer">A letter to myself as a fresh software engineer</a></p>
</blockquote>
<p>亲爱的自己:</p>
<p>你刚从大学毕业准备在 IT 领域开始你的事业。我无法向你透露任何内容,但我保证这将是一段有趣的旅程。我给你写这封信是想给你一些建议使你变得更加专业。在未来几年没有什么事情是你无法学到的,但是有一些我希望在我事业开始前就有人告诉我。这些事情的排序不分先后,<strong>都很重要</strong>。</p>
<h2 id="工作是马拉松而非短跑" tabindex="-1">工作是马拉松而非短跑 <a class="header-anchor" href="#工作是马拉松而非短跑" aria-label="Permalink to &quot;工作是马拉松而非短跑&quot;"></a></h2>
<p>成为优秀软件工程师的路很漫长。不要因为没有快速获胜而轻言放弃。花时间学习,并在你感兴趣的领域变得优秀,记住这是马拉松而非短跑。</p>
<h2 id="保持谦逊-而非愚蠢" tabindex="-1">保持谦逊,而非愚蠢 <a class="header-anchor" href="#保持谦逊-而非愚蠢" aria-label="Permalink to &quot;保持谦逊,而非愚蠢&quot;"></a></h2>
<p>能做到很不错,但是保持谦逊是基础。尽管你经验丰富, <strong>三人行必有我师</strong>。但这并不意味着你不如别人，你必须尊重自己和你的技能。如果你不尊重自己那是愚蠢而非谦逊。</p>
<h2 id="和自己比较而非他人" tabindex="-1">和自己比较而非他人 <a class="header-anchor" href="#和自己比较而非他人" aria-label="Permalink to &quot;和自己比较而非他人&quot;"></a></h2>
<p>和他人比较没有意义。工作上总有人比你更优秀。同样也有人比那些优与你的人更优秀。依此类推......,你需要做的是尽力而为。如果你认为某些人比你优秀,向他学习。继续努力,最终你将成为其他人的参考。</p>
<h2 id="尊重人-而非头衔" tabindex="-1">尊重人,而非头衔 <a class="header-anchor" href="#尊重人-而非头衔" aria-label="Permalink to &quot;尊重人,而非头衔&quot;"></a></h2>
<p>在你的职涯中，你将会和杰出的业界专家共事。更为重要的是,你将遇到杰出的人。尊重他们自身而非他们所拥有的头衔。如果张三是首席架构师并不意味着他比初期开发工程师李四更值得尊敬。</p>
<h2 id="选择挑战-而非安逸" tabindex="-1">选择挑战,而非安逸 <a class="header-anchor" href="#选择挑战-而非安逸" aria-label="Permalink to &quot;选择挑战,而非安逸&quot;"></a></h2>
<p>职业生涯有很多的路口，你有多次选择，但总而言之是在舒适区和跳出舒适区之间选择。在你的生活中可能会有片刻想要停下来，因为你对目前所取得的成就感到满意。在那时尝试走出舒适区。这个决定将使你变得更加专业，你也会在事业上获得更大的满足。<strong>记住最好的事总是发生在舒适区外。</strong></p>
<h2 id="工作从白板开始-而非键盘" tabindex="-1">工作从白板开始,而非键盘 <a class="header-anchor" href="#工作从白板开始-而非键盘" aria-label="Permalink to &quot;工作从白板开始,而非键盘&quot;"></a></h2>
<p>当你开始设计新的特性或新系统时，不要直接在键盘上开始编码。作为工程师,你训练和使用的能力是你的大脑,而不是手指。<strong>三思而后行</strong>。因此先从白板开始而非键盘。思考你需要实现什么,如果有
合作伙伴质疑你的想法更好。白板意味着所有可以帮助你思考的事物，笔和纸，笔记本应用程序，<a href="https://app.diagrams.net/" target="_blank" rel="noreferrer">draw.io</a>等。</p>
<h2 id="价值驱动-而非代码" tabindex="-1">价值驱动,而非代码 <a class="header-anchor" href="#价值驱动-而非代码" aria-label="Permalink to &quot;价值驱动,而非代码&quot;"></a></h2>
<p>不要受 <a href="https://zh.wikipedia.org/wiki/%E9%9D%9E%E6%88%91%E6%89%80%E5%89%B5" target="_blank" rel="noreferrer">非我所创主义</a>的影响。重复发明轮子没有价值。避免浪费时间在已经存在的东西上。如果你可以通过组合不同工具轻松达成你的目标,就这么干。作为软件工程师你应该交付业务价值而非代码行数。</p>
<blockquote>
<p>笔者注,对于造轮子作者的本意是应该执着于创造价值,而非技术本身。<strong>技术只是手段而非目的</strong>,推荐阅读 <a href="https://zcfy.cc/article/3914?hmsr=toutiao.io&amp;utm_medium=toutiao.io&amp;utm_source=toutiao.io" target="_blank" rel="noreferrer">JavaScript 疲劳终极指南：我们行业的真相</a> 进一步理解此思想</p>
</blockquote>
<h2 id="热爱生活-而非工作" tabindex="-1">热爱生活,而非工作 <a class="header-anchor" href="#热爱生活-而非工作" aria-label="Permalink to &quot;热爱生活,而非工作&quot;"></a></h2>
<p>在 IT 领域,很容易过多专注与工作。毕竟，对于大多数人这不仅是工作还是理想。记住<strong>除了工作还有诗和远方</strong>。去活的充实而丰富。运动、读书、培养爱好，旅游去看我们美好的世界。和朋友叙旧，找到你的另一半，并尽可能去关怀、支持和爱她。您会惊讶地发现，拥有充实的生活会极大地提高您的专业水平。</p>
<p>这是我目前知道的全部,我还有许多需要学习。</p>
<p>最后一件事: <strong>享受过程</strong>!</p>
<p>来自(一个更有经验的)你。</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[解决问题的思路]]></title>
            <link>https://blog.zenheart.site/posts/2020-02-21-how-i-think-about-solving-problem</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2020-02-21-how-i-think-about-solving-problem</guid>
            <pubDate>Tue, 25 Feb 2020 12:23:16 GMT</pubDate>
            <description><![CDATA[
# 解决问题的思路

> 该译文对应原文: [How I think about solving problems](https://humanwhocodes.com/blog/2020/02/how-i-think-about-solving-problems/) (**该文出自 JS 高级程序设计作者 Nicholas C. Zakas**)

5 个疑问帮助我决定，排序和解决问题

在我软件开发的早期生涯中，我认为自己的主要贡献是编写代码。毕竟软件工程师被支付薪水的主要部分就是创造软件和编写代码。我花了好几年的时间才意识到有大量其他的贡献在创造软件时(如果不是，为什么会有主管，设计师，产品经理，销售人员等)。我自己逐渐从一个编码人员转为一个问题解决者。有些时候问题可以通过编码解决， 而其他时候解答并不总是和代码相关。

一旦我理解到自己是一个问题解决者，我决定采取一种高效的方式处理发生的问题。
当作为技术主管后，我每天都身处持续的问题之中。这迫使我不得不思考一种对策在尽可能解决更多问题的前提下，使决定更加果断，问题的排序更加高效。

最终，我定义了一个问题清单，当每个问题出现时，我发现按顺序回答这个清单的问题可以帮助我尽可能做出最佳的决定。

1. 这真的是一个问题么？
2. 该问题需要被解决么？
3. 该问题需要现在被解决么？
4. 该问题需要被你解决么？
5. 有更简单的问题我可以解决来取代此问题么?

每一个问题都被设计用来揭露问题的一个方面，这可以帮助你进入下一个步骤，
如果足够幸运，尽可能避免回答所有问题。(`笔者注:此处的含义是减少问题到第五步的数量`)。这些问题有细微的差别，我将会详细讲解。


## 这真的是一个问题么？

处理任何问题的第一阶段是识别它是否是一个真正的问题，这需要一个明确的定义。
基于这篇文章的目的， 我将定义**问题是如果不处理会导致客观条件下坏结果的任何事情**。这意味着假设下雨时你让窗户一整晚开着它就是一个问题，因为房间内部会变得潮湿，这可能损坏你的地板，家具或其他财产。避免这种坏结果的一个解决方案是在你上床之前关上窗户，这将避免你的财产遭受损害。

当作为一个领导者，收到一些听起来像是问题的抱怨，但只是一个建议的现象非常普遍。举个例子， 我同很多刚开始工作或加入一个新团队的工程师谈过，他们感觉团队做的很多事都是错误的:使用的框架很糟糕，代码风格差劲，文件组织方式错误，他们会怎样解决这些问题?这是一个巨大的工作量!

我会问软件工程师这个问题:**它是一个问题么或有哪些区别?** 很多时候**错误只是意味着不是我曾经的习惯或偏好**。如果你能够识别哪些报告问题并非真正的问题，你将不在花费资源在解答上。团队成员对做事的方式不满意并不是一个客观上的坏结果。团队的分歧本质上没有问题。如果你可以决定一个问题并非真正的问题你就可以处理其他的任务。

## 该问题需要被解决么?

当你确定这是一个问题后，下一步就是确定这个问题是否需要解决。一个问题可以不被解决只要坏结果可以容忍或者影响缓慢。举个例子，如果 web 应用的一部分只有系统管理员(典型的是只有 5 个人或者更少)用，它的加载慢于应用的其他部分， 你可以认为这一部分是可以接受的。这个问题范围过于狭隘而且只影响了几个人在不经常使用的情况下。当然能够解决这个问题也很好，虽然这不是必须的，因为他的负面影响足够小，即使不解决也不会导致更大的潜在问题。另一种提问方式是:**如果不解决这个问题会发生什么?**，如果答案是不多，可以考虑不解决这个问题。

## 该问题需要现在被解决么?
如果你有一个待解决的问题，下一个问题就是它需要现在被解决或者暂缓。有一些问题明显很急迫需要被立即处理: 网站被关闭，每当有人使用时应用发生崩溃， 等等。这些问题需要被解决是因为坏结果是直接的，连续，且持续增长的。网站关闭时间越长公司损失越多。应用崩溃次数越多，用户会更有可能选择竞品。

同等重要的问题是确定问题解决是否可以被推迟。有一系列意想不到的不紧急的问题会暴露给主管层。这些问题需要最终解决但不是立即解决。软件开发中符合此类的最常见问题就是技术栈。技术栈是你应用(或基础设施)中任何表现不如预期的部分。据我所知，技术栈很少被处理直到它变为一个紧急事件(这时已经晚了)。然而，技术栈并不是需要放下其他所有事情开始着手处理。它属于中间区域，现在不需完成，但必须被解决!

一个问题不需要现在解决，推迟它是一个不错的注意。推迟它， 意味着计划在未来处理， 而不是什么都不做。如果现在不是处理这个问题的最佳时机那么决定什么时候处理它: 在这一周，这个月，六个月?把它放入你的日历或任务管理系统以防你忘记追踪它。另一种询问此问题的方式是，**这个问题紧急么?**

## 该问题需要我解决么?

该问题非常适合管理层或者有许多任务需要完成的人。这个问题的某些方面是否需要特殊技能而只有你才能处理，或者其他人也可完成这个任务。

这个问题改编自我的导师给我的建议。我曾今抱怨自己一直在收集任务而不能持续跟进。他告诉我我必须问自己:这是 Nicholas 的问题么? 这里有一些事是只有我知道如何做， 而其他事情是我需要关注的。这些事我需要安排给其他人。导师给我的另一个重要的建议: **你可以比别人更快的完成某些事并不意味着必须自己来**。对于一些不紧急的任务，用一天或两天完成并无区别。

所以如果有些问题别人可以解决，如果你是一个管理者或已经有很多工作了，那就分配出去。

## 有更简单的问题我可以解决来取代此问题么?

最后一个步骤一旦你决定这个迫切的问题需要你亲自解决，就该判断是否有更简单的问题可以被解决。关键在于更简单的问题相对原始问题必须给你相同或相似的结果并且可以节约你的时间(或其他资源)。

当我在新版我的雅虎页面工作时，一个产品经理表示一些测试用户需要页面添加尺寸可变的列。这是一个相当复杂的问题因为在 2006 年 web 浏览器并不像如今这么强大。这个任务几乎不可能， 当时页面已经充满了 JavaScript，添加更多逻辑去管理复杂的鼠标移动而且需要保存着这些信息到后端是一个艰难并且极易出错的任务。

我要求来自用户反馈的原始数据， 试图弄清尺寸可变的列是用来解决什么问题。实时证明没有用户要求尺寸可变的列(产品经理从客户的抱怨中推导出了这个需求)。相反，他们抱怨无法使新版雅虎页面看起来和老版本一样。我们创建了和老版本几乎完全不匹配的新布局，但是事实显示用户更喜欢老版本布局。这允许我们关注一个跟简单的问题:重新创建老版本布局。

因此，我们花费了少量时间在新页面上重新创建老版本布局，并重新收集用户对话。
人们很乐意看到新页面和老版本基本相似。通过解决简化的问题，我们节约了大量的开发时间同时用户也感到开心。

并不总是有简单的问题可以解决，但是每当问题看起来特别巨大或者困难时值得花费时间去检查。

## 总结

这五个问题已经成为我解决问题的基本方法，不仅仅是在我的工作中也包括我的日常生活。无论问题何时出现，通过这些问题都使我成为更有效的问题解决者，并且对结果总体感觉满意。无法为你的服务员计算 15% 的小费?我以 20% 替代(或者 10% 如果我不满意他的服务)。我的高中校友机构总是向我发送通知说我并非验证的校友？这些并不是我需要解决的问题。我需要一个新的驾照如果我想要在美国旅游？这是我今年需要解决的问题，但不是现在。

有很多的方式解决问题，我并不确定我的方法对所有人都适用。但我确定有解决问题的方案强于没有任何方法。人生充满了问题，有大有小，你每天都会面对。有一个清晰定义和可重复的策略是解决问题更易接受的最简单方法。



]]></description>
            <content:encoded><![CDATA[<h1 id="解决问题的思路" tabindex="-1">解决问题的思路 <a class="header-anchor" href="#解决问题的思路" aria-label="Permalink to &quot;解决问题的思路&quot;"></a></h1>
<blockquote>
<p>该译文对应原文: <a href="https://humanwhocodes.com/blog/2020/02/how-i-think-about-solving-problems/" target="_blank" rel="noreferrer">How I think about solving problems</a> (<strong>该文出自 JS 高级程序设计作者 Nicholas C. Zakas</strong>)</p>
</blockquote>
<p>5 个疑问帮助我决定，排序和解决问题</p>
<p>在我软件开发的早期生涯中，我认为自己的主要贡献是编写代码。毕竟软件工程师被支付薪水的主要部分就是创造软件和编写代码。我花了好几年的时间才意识到有大量其他的贡献在创造软件时(如果不是，为什么会有主管，设计师，产品经理，销售人员等)。我自己逐渐从一个编码人员转为一个问题解决者。有些时候问题可以通过编码解决， 而其他时候解答并不总是和代码相关。</p>
<p>一旦我理解到自己是一个问题解决者，我决定采取一种高效的方式处理发生的问题。
当作为技术主管后，我每天都身处持续的问题之中。这迫使我不得不思考一种对策在尽可能解决更多问题的前提下，使决定更加果断，问题的排序更加高效。</p>
<p>最终，我定义了一个问题清单，当每个问题出现时，我发现按顺序回答这个清单的问题可以帮助我尽可能做出最佳的决定。</p>
<ol>
<li>这真的是一个问题么？</li>
<li>该问题需要被解决么？</li>
<li>该问题需要现在被解决么？</li>
<li>该问题需要被你解决么？</li>
<li>有更简单的问题我可以解决来取代此问题么?</li>
</ol>
<p>每一个问题都被设计用来揭露问题的一个方面，这可以帮助你进入下一个步骤，
如果足够幸运，尽可能避免回答所有问题。(<code>笔者注:此处的含义是减少问题到第五步的数量</code>)。这些问题有细微的差别，我将会详细讲解。</p>
<h2 id="这真的是一个问题么" tabindex="-1">这真的是一个问题么？ <a class="header-anchor" href="#这真的是一个问题么" aria-label="Permalink to &quot;这真的是一个问题么？&quot;"></a></h2>
<p>处理任何问题的第一阶段是识别它是否是一个真正的问题，这需要一个明确的定义。
基于这篇文章的目的， 我将定义<strong>问题是如果不处理会导致客观条件下坏结果的任何事情</strong>。这意味着假设下雨时你让窗户一整晚开着它就是一个问题，因为房间内部会变得潮湿，这可能损坏你的地板，家具或其他财产。避免这种坏结果的一个解决方案是在你上床之前关上窗户，这将避免你的财产遭受损害。</p>
<p>当作为一个领导者，收到一些听起来像是问题的抱怨，但只是一个建议的现象非常普遍。举个例子， 我同很多刚开始工作或加入一个新团队的工程师谈过，他们感觉团队做的很多事都是错误的:使用的框架很糟糕，代码风格差劲，文件组织方式错误，他们会怎样解决这些问题?这是一个巨大的工作量!</p>
<p>我会问软件工程师这个问题:<strong>它是一个问题么或有哪些区别?</strong> 很多时候<strong>错误只是意味着不是我曾经的习惯或偏好</strong>。如果你能够识别哪些报告问题并非真正的问题，你将不在花费资源在解答上。团队成员对做事的方式不满意并不是一个客观上的坏结果。团队的分歧本质上没有问题。如果你可以决定一个问题并非真正的问题你就可以处理其他的任务。</p>
<h2 id="该问题需要被解决么" tabindex="-1">该问题需要被解决么? <a class="header-anchor" href="#该问题需要被解决么" aria-label="Permalink to &quot;该问题需要被解决么?&quot;"></a></h2>
<p>当你确定这是一个问题后，下一步就是确定这个问题是否需要解决。一个问题可以不被解决只要坏结果可以容忍或者影响缓慢。举个例子，如果 web 应用的一部分只有系统管理员(典型的是只有 5 个人或者更少)用，它的加载慢于应用的其他部分， 你可以认为这一部分是可以接受的。这个问题范围过于狭隘而且只影响了几个人在不经常使用的情况下。当然能够解决这个问题也很好，虽然这不是必须的，因为他的负面影响足够小，即使不解决也不会导致更大的潜在问题。另一种提问方式是:<strong>如果不解决这个问题会发生什么?</strong>，如果答案是不多，可以考虑不解决这个问题。</p>
<h2 id="该问题需要现在被解决么" tabindex="-1">该问题需要现在被解决么? <a class="header-anchor" href="#该问题需要现在被解决么" aria-label="Permalink to &quot;该问题需要现在被解决么?&quot;"></a></h2>
<p>如果你有一个待解决的问题，下一个问题就是它需要现在被解决或者暂缓。有一些问题明显很急迫需要被立即处理: 网站被关闭，每当有人使用时应用发生崩溃， 等等。这些问题需要被解决是因为坏结果是直接的，连续，且持续增长的。网站关闭时间越长公司损失越多。应用崩溃次数越多，用户会更有可能选择竞品。</p>
<p>同等重要的问题是确定问题解决是否可以被推迟。有一系列意想不到的不紧急的问题会暴露给主管层。这些问题需要最终解决但不是立即解决。软件开发中符合此类的最常见问题就是技术栈。技术栈是你应用(或基础设施)中任何表现不如预期的部分。据我所知，技术栈很少被处理直到它变为一个紧急事件(这时已经晚了)。然而，技术栈并不是需要放下其他所有事情开始着手处理。它属于中间区域，现在不需完成，但必须被解决!</p>
<p>一个问题不需要现在解决，推迟它是一个不错的注意。推迟它， 意味着计划在未来处理， 而不是什么都不做。如果现在不是处理这个问题的最佳时机那么决定什么时候处理它: 在这一周，这个月，六个月?把它放入你的日历或任务管理系统以防你忘记追踪它。另一种询问此问题的方式是，<strong>这个问题紧急么?</strong></p>
<h2 id="该问题需要我解决么" tabindex="-1">该问题需要我解决么? <a class="header-anchor" href="#该问题需要我解决么" aria-label="Permalink to &quot;该问题需要我解决么?&quot;"></a></h2>
<p>该问题非常适合管理层或者有许多任务需要完成的人。这个问题的某些方面是否需要特殊技能而只有你才能处理，或者其他人也可完成这个任务。</p>
<p>这个问题改编自我的导师给我的建议。我曾今抱怨自己一直在收集任务而不能持续跟进。他告诉我我必须问自己:这是 Nicholas 的问题么? 这里有一些事是只有我知道如何做， 而其他事情是我需要关注的。这些事我需要安排给其他人。导师给我的另一个重要的建议: <strong>你可以比别人更快的完成某些事并不意味着必须自己来</strong>。对于一些不紧急的任务，用一天或两天完成并无区别。</p>
<p>所以如果有些问题别人可以解决，如果你是一个管理者或已经有很多工作了，那就分配出去。</p>
<h2 id="有更简单的问题我可以解决来取代此问题么" tabindex="-1">有更简单的问题我可以解决来取代此问题么? <a class="header-anchor" href="#有更简单的问题我可以解决来取代此问题么" aria-label="Permalink to &quot;有更简单的问题我可以解决来取代此问题么?&quot;"></a></h2>
<p>最后一个步骤一旦你决定这个迫切的问题需要你亲自解决，就该判断是否有更简单的问题可以被解决。关键在于更简单的问题相对原始问题必须给你相同或相似的结果并且可以节约你的时间(或其他资源)。</p>
<p>当我在新版我的雅虎页面工作时，一个产品经理表示一些测试用户需要页面添加尺寸可变的列。这是一个相当复杂的问题因为在 2006 年 web 浏览器并不像如今这么强大。这个任务几乎不可能， 当时页面已经充满了 JavaScript，添加更多逻辑去管理复杂的鼠标移动而且需要保存着这些信息到后端是一个艰难并且极易出错的任务。</p>
<p>我要求来自用户反馈的原始数据， 试图弄清尺寸可变的列是用来解决什么问题。实时证明没有用户要求尺寸可变的列(产品经理从客户的抱怨中推导出了这个需求)。相反，他们抱怨无法使新版雅虎页面看起来和老版本一样。我们创建了和老版本几乎完全不匹配的新布局，但是事实显示用户更喜欢老版本布局。这允许我们关注一个跟简单的问题:重新创建老版本布局。</p>
<p>因此，我们花费了少量时间在新页面上重新创建老版本布局，并重新收集用户对话。
人们很乐意看到新页面和老版本基本相似。通过解决简化的问题，我们节约了大量的开发时间同时用户也感到开心。</p>
<p>并不总是有简单的问题可以解决，但是每当问题看起来特别巨大或者困难时值得花费时间去检查。</p>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>这五个问题已经成为我解决问题的基本方法，不仅仅是在我的工作中也包括我的日常生活。无论问题何时出现，通过这些问题都使我成为更有效的问题解决者，并且对结果总体感觉满意。无法为你的服务员计算 15% 的小费?我以 20% 替代(或者 10% 如果我不满意他的服务)。我的高中校友机构总是向我发送通知说我并非验证的校友？这些并不是我需要解决的问题。我需要一个新的驾照如果我想要在美国旅游？这是我今年需要解决的问题，但不是现在。</p>
<p>有很多的方式解决问题，我并不确定我的方法对所有人都适用。但我确定有解决问题的方案强于没有任何方法。人生充满了问题，有大有小，你每天都会面对。有一个清晰定义和可重复的策略是解决问题更易接受的最简单方法。</p>
<hr>
<p>笔者总结。上述方法提炼为如下的检查清单</p>
<ul>
<li>[ ] 这是一个问题么？问题定义阶段
<blockquote>
<p>如果这个事情不解决会出现坏的结果,则考虑是一个问题，<strong>注意这里关注的是结果,这意味着一件事情即使中途产生了损失但只要不影响结果都是可以接受的!!!</strong></p>
</blockquote>
</li>
<li>[ ] 这个问题需要被解决么？问题的价值评估
<ul>
<li>[ ] 问题的影响点是否足够小？ 从结果评估</li>
<li>[ ] 问题解决是否需要大量资源？ 从成本评估</li>
</ul>
<blockquote>
<p>从经济学角度对高成本低回报的事情不要投入太多精力</p>
</blockquote>
</li>
<li>[ ] 这个问题需要现在被解决么？问题的优先级评估
<ul>
<li>[ ] 采用 <a href="https://wiki.mbalib.com/wiki/%E6%97%B6%E9%97%B4%E2%80%9C%E5%9B%9B%E8%B1%A1%E9%99%90%E2%80%9D%E6%B3%95" target="_blank" rel="noreferrer">时间“四象限”法</a> 评估问题优先级</li>
<li>[ ] 采用 ToDo List 管理问题</li>
</ul>
</li>
<li>[ ] 这个问题需要你解决么？问题的领域划分
<blockquote>
<p>善于利用外在环境合理优化资源调度</p>
</blockquote>
</li>
<li>[ ] 问题是否可简化为其他问题? 问题的解决策略
<blockquote>
<p>类似 <a href="https://zh.wikipedia.org/zh-hans/%E5%88%86%E6%B2%BB%E6%B3%95" target="_blank" rel="noreferrer">分治法</a></p>
</blockquote>
</li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[阅读清单]]></title>
            <link>https://blog.zenheart.site/projects/read-list/README</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/read-list/README</guid>
            <pubDate>Mon, 17 Feb 2020 03:28:37 GMT</pubDate>
            <description><![CDATA[汇总我读过的好的博文
 观点
* 什么是真正的程序员  也许你可以从这篇文章找到答案
 语言学习
 c
* TO BECOME A GOOD C PROGRAMMER 推荐了从开始到精通 c 语言需要]]></description>
            <content:encoded><![CDATA[<h1 id="阅读清单" tabindex="-1">阅读清单 <a class="header-anchor" href="#阅读清单" aria-label="Permalink to &quot;阅读清单&quot;"></a></h1>
<p><strong>汇总我读过的好的博文</strong></p>
<h2 id="观点" tabindex="-1">观点 <a class="header-anchor" href="#观点" aria-label="Permalink to &quot;观点&quot;"></a></h2>
<ul>
<li><a href="https://www.cnblogs.com/xueweihan/p/5220513.html" target="_blank" rel="noreferrer">什么是真正的程序员</a>  也许你可以从这篇文章找到答案</li>
</ul>
<h2 id="语言学习" tabindex="-1">语言学习 <a class="header-anchor" href="#语言学习" aria-label="Permalink to &quot;语言学习&quot;"></a></h2>
<h3 id="c" tabindex="-1">c <a class="header-anchor" href="#c" aria-label="Permalink to &quot;c&quot;"></a></h3>
<ul>
<li><a href="http://fabiensanglard.net/c/" target="_blank" rel="noreferrer">TO BECOME A GOOD C PROGRAMMER</a> 推荐了从开始到精通 c 语言需要阅读的书籍,深表赞同</li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <link>https://blog.zenheart.site/RESUME</link>
            <guid isPermaLink="false">https://blog.zenheart.site/RESUME</guid>
            <pubDate>Sun, 16 Feb 2020 03:42:35 GMT</pubDate>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[项目清单]]></title>
            <link>https://blog.zenheart.site/projects/README</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/README</guid>
            <pubDate>Sun, 16 Feb 2020 03:42:35 GMT</pubDate>
            <description><![CDATA[指南
面试手册 &lt;Badge text="进行中" type="error"/
汇总常见面试题
阅读清单 &lt;Badge text="待完善" type="warning"/&gt;
汇总读]]></description>
            <content:encoded><![CDATA[<h1 id="项目清单" tabindex="-1">项目清单 <a class="header-anchor" href="#项目清单" aria-label="Permalink to &quot;项目清单&quot;"></a></h1>
<h2 id="指南" tabindex="-1">指南 <a class="header-anchor" href="#指南" aria-label="Permalink to &quot;指南&quot;"></a></h2>
<p><strong><a href="https://github.com/zenHeart/web-interview" target="_blank" rel="noreferrer">面试手册</a></strong> <Badge text="进行中" type="error"/></p>
<p>汇总常见面试题</p>
<p><strong><a href="./read-list">阅读清单</a></strong> <Badge text="待完善" type="warning"/></p>
<p>汇总读过的有价值的资料</p>
<p><strong><a href="./chrome">chrome 手册</a></strong> <Badge text="待完善" type="warning"/></p>
<p>详细讲解 chrome 浏览器相关工具的使用。</p>
<p><strong><a href="http://blog.zenheart.site/make-npm/#/" target="_blank" rel="noreferrer">npm 包开发实践</a></strong> <Badge text="已完成"/></p>
<p>详细讲解 chrome 浏览器相关工具的使用。</p>
<p><strong><a href="https://github.com/zenHeart/frontend-test" target="_blank" rel="noreferrer">前端自动化测试实践</a></strong> <Badge text="已完成"/></p>
<p>详细讲解前端测试</p>
<h2 id="工具" tabindex="-1">工具 <a class="header-anchor" href="#工具" aria-label="Permalink to &quot;工具&quot;"></a></h2>
<p><strong><a href="https://github.com/zenHeart/zen-mock/tree/master/packages/zen-mock" target="_blank" rel="noreferrer">zen-mock</a></strong> <Badge text="已完成" /></p>
<p>API mock 及测试工具</p>
<p><strong><a href="https://github.com/zenHeart/sockets-server/tree/master" target="_blank" rel="noreferrer">sockets-server</a></strong> <Badge text="已完成" /></p>
<p>node sockets server 借鉴 express 中间件思想</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[cygwin]]></title>
            <link>https://blog.zenheart.site/posts/2016-09-09-cygwin</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-09-09-cygwin</guid>
            <pubDate>Sat, 08 Feb 2020 11:02:41 GMT</pubDate>
            <description><![CDATA[cygwin
windows 平台下实现 linux 终端环境的工具笔记
 简介
利用 cygwin 可以在 windows 下配置 linux 的工作环境。
 使用
在 cygwin 的标题栏点击右]]></description>
            <content:encoded><![CDATA[<h1 id="cygwin" tabindex="-1">cygwin <a class="header-anchor" href="#cygwin" aria-label="Permalink to &quot;cygwin&quot;"></a></h1>
<p><strong>windows 平台下实现 linux 终端环境的工具笔记</strong></p>
<h2 id="简介" tabindex="-1">简介 <a class="header-anchor" href="#简介" aria-label="Permalink to &quot;简介&quot;"></a></h2>
<p>利用 cygwin 可以在 windows 下配置 linux 的工作环境。</p>
<h2 id="使用" tabindex="-1">使用 <a class="header-anchor" href="#使用" aria-label="Permalink to &quot;使用&quot;"></a></h2>
<p>在 cygwin 的标题栏点击右键，选项，在鼠标和键盘这两个选项中可以设置，粘贴和复制的方式。
默认为利用鼠标中间进行粘贴。
由于 cygwin 的仿真界面过于低端。可以再安装 minttty 实现功能。</p>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<ul>
<li><a href="https://cygwin.com/faq/faq.html#faq.using.copy-and-paste" target="_blank" rel="noreferrer">cywin FAQ</a></li>
<li><a href="http://www.crifan.com/files/doc/docbook/cygwin_intro/release/htmls/index.html" target="_blank" rel="noreferrer">cygwin详解</a></li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[BNF 范式]]></title>
            <link>https://blog.zenheart.site/posts/2016-08-22-bnf</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-08-22-bnf</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[
# BNF 范式


## 什么是 BNF 范式
BNF(Backus-Naur Form) 巴克斯范式用来描述语法规则的语法。
使用场景如下:
1. [C 语言的 BNF 描述](https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%20C%20in%20Backus-Naur%20form.htm)
2. [CSS 语法规则描述](https://www.w3.org/TR/CSS21/grammar.html)
3. linux 指令使用的描述,使用 `man <command_name>` 查看指令时看到的 `SYNOPSIS` 
极为 bnf 的语法描述。


## 为什么需要学习 bnf
理解 bnf 除了能够更好的读懂各种类 bnf 的语法描述外。
**可以利用 `bnf` 的思想来抽象编程问题。**

## BNF 的规则描述

BNF 利用符号来进行规则定义，相关符号的含义如下表。
这里 bnf 不仅仅指基础的巴克斯范式还包括 [ABNF](ftp://ftp.rfc-editor.org/in-notes/rfc4234.txt) 规则。


| 符号  | 作用                                                 |
| :]]></description>
            <content:encoded><![CDATA[<h1 id="bnf-范式" tabindex="-1">BNF 范式 <a class="header-anchor" href="#bnf-范式" aria-label="Permalink to &quot;BNF 范式&quot;"></a></h1>
<h2 id="什么是-bnf-范式" tabindex="-1">什么是 BNF 范式 <a class="header-anchor" href="#什么是-bnf-范式" aria-label="Permalink to &quot;什么是 BNF 范式&quot;"></a></h2>
<p>BNF(Backus-Naur Form) 巴克斯范式用来描述语法规则的语法。
使用场景如下:</p>
<ol>
<li><a href="https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%20C%20in%20Backus-Naur%20form.htm" target="_blank" rel="noreferrer">C 语言的 BNF 描述</a></li>
<li><a href="https://www.w3.org/TR/CSS21/grammar.html" target="_blank" rel="noreferrer">CSS 语法规则描述</a></li>
<li>linux 指令使用的描述,使用 <code>man &lt;command_name&gt;</code> 查看指令时看到的 <code>SYNOPSIS</code>
极为 bnf 的语法描述。</li>
</ol>
<h2 id="为什么需要学习-bnf" tabindex="-1">为什么需要学习 bnf <a class="header-anchor" href="#为什么需要学习-bnf" aria-label="Permalink to &quot;为什么需要学习 bnf&quot;"></a></h2>
<p>理解 bnf 除了能够更好的读懂各种类 bnf 的语法描述外。
<strong>可以利用 <code>bnf</code> 的思想来抽象编程问题。</strong></p>
<h2 id="bnf-的规则描述" tabindex="-1">BNF 的规则描述 <a class="header-anchor" href="#bnf-的规则描述" aria-label="Permalink to &quot;BNF 的规则描述&quot;"></a></h2>
<p>BNF 利用符号来进行规则定义，相关符号的含义如下表。
这里 bnf 不仅仅指基础的巴克斯范式还包括 <a href="ftp://ftp.rfc-editor.org/in-notes/rfc4234.txt" target="_blank" rel="noreferrer">ABNF</a> 规则。</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">符号</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>::=</code></td>
<td>表示被定义为，有时也可用 <code>=</code></td>
</tr>
<tr>
<td style="text-align:left">`</td>
<td>`</td>
</tr>
<tr>
<td style="text-align:left"><code>/</code></td>
<td>表示选择</td>
</tr>
<tr>
<td style="text-align:left"><code>&lt;&gt;</code></td>
<td>表示一个属性或类型</td>
</tr>
<tr>
<td style="text-align:left"><code>；</code></td>
<td>结束符</td>
</tr>
<tr>
<td style="text-align:left"><code> </code></td>
<td>空格表示连接符</td>
</tr>
<tr>
<td style="text-align:left"><code>[]</code></td>
<td>括号中内容可选</td>
</tr>
<tr>
<td style="text-align:left"><code>{}</code></td>
<td>表示对前面内容的重复次数，其中可以填入数字，类似正则</td>
</tr>
<tr>
<td style="text-align:left"><code>()</code></td>
<td>括号中的内容为一组</td>
</tr>
</tbody>
</table>
<h2 id="规则举例" tabindex="-1">规则举例 <a class="header-anchor" href="#规则举例" aria-label="Permalink to &quot;规则举例&quot;"></a></h2>
<h3 id="用来包含规则名" tabindex="-1"><code>&lt;&gt;</code> 用来包含规则名 <a class="header-anchor" href="#用来包含规则名" aria-label="Permalink to &quot;`&lt;&gt;` 用来包含规则名&quot;"></a></h3>
<p>范例：</p>
<pre><code>name =  &lt;rulename&gt; | rulename
</code></pre>
<p>规则名不区分大小写,也可以不带尖括号</p>
<h3 id="空格对多个属性进行分隔" tabindex="-1">空格对多个属性进行分隔 <a class="header-anchor" href="#空格对多个属性进行分隔" aria-label="Permalink to &quot;空格对多个属性进行分隔&quot;"></a></h3>
<p>范例：</p>
<pre><code>foo         =  %x61           ; a
bar         =  %x62           ; b
mumble      =  foo bar foo
</code></pre>
<p>利用空格，分号给一个规则赋值时多个属性的方法</p>
<h3 id="选择" tabindex="-1">/ 选择 <a class="header-anchor" href="#选择" aria-label="Permalink to &quot;/ 选择&quot;"></a></h3>
<p>范例：</p>
<pre><code>  foo / bar
</code></pre>
<p>/ 表示从这 foo 或 bar 中选择一个</p>
<h3 id="序列组" tabindex="-1">() 序列组 <a class="header-anchor" href="#序列组" aria-label="Permalink to &quot;() 序列组&quot;"></a></h3>
<p>范例：
(elem foo) / (bar blat)</p>
<p>括号表示一个序列组</p>
<h3 id="不定循环" tabindex="-1">不定循环 <a class="header-anchor" href="#不定循环" aria-label="Permalink to &quot;不定循环&quot;"></a></h3>
<p>范例：</p>
<div class="language-md"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;a>*&#x3C;b>element  //元素 element 至少出现 a 此至多 b 次</span></span>
<span class="line"><span style="color:#E1E4E8">*&#x3C;element></span><span style="color:#E1E4E8">      //出现任意次数</span></span>
<span class="line"><span style="color:#E1E4E8">3*3&#x3C;element>    //只出现 3 次</span></span>
<span class="line"><span style="color:#E1E4E8">1*&#x3C;element>     //至少 1 次</span></span>
<span class="line"><span style="color:#E1E4E8">1*2&#x3C;element>    //这是1-2 次</span></span></code></pre>
</div><p>默认值 <code>0 * ∞ &lt;element&gt;</code></p>
<h3 id="指定循环" tabindex="-1">指定循环 <a class="header-anchor" href="#指定循环" aria-label="Permalink to &quot;指定循环&quot;"></a></h3>
<p>范例：</p>
<pre><code>&lt;n&gt;element
等同于
&lt;n&gt;*&lt;n&gt;element
</code></pre>
<p>相当于只使用 n 次某元素</p>
<h3 id="可选序列" tabindex="-1">可选序列 <a class="header-anchor" href="#可选序列" aria-label="Permalink to &quot;可选序列&quot;"></a></h3>
<p>范例：</p>
<pre><code>[foo bar]
等同于
*1(foo bar)
</code></pre>
<p>表明某一规则只出现 0 或 1 次</p>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<p><a href="http://cui.unige.ch/db-research/Enseignement/analyseinfo/AboutBNF.html#Marcotty86" target="_blank" rel="noreferrer">BNF 注释</a></p>
<p><a href="ftp://ftp.rfc-editor.org/in-notes/rfc4234.txt" target="_blank" rel="noreferrer">ABNF</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[Markdown]]></title>
            <link>https://blog.zenheart.site/posts/2016-08-22-markdown</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-08-22-markdown</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[
# Markdown

**使用 Markdown 的经验**

## Markdown 概述

markdown 是一种**轻量级的标记语言**，作用是为了更方便的书写网络文档。    
原理上文本标记会被 markdown 编辑器转换为 html 标签，例如在你想添加标题的文本前加入 `#` 内容就会被 `<h1>` 包含。     
对于 WEB 开发者，甚至可以在编写文本时嵌入 html 和 js 来增强文档表现。     

## 初学者入门
对于首次使用 Markdown 进行文档编写的人，首先你需要一个趁手的编辑器来解析 Markdown 文件(github 上的 .md 文件即为这种格式)。
目前大部分的博客网站都支持 Markdown 的编写，例如笔者所使用的 CSDN, 若你想在本地编写文档，可以使用 Notepad 等编辑器。具体选择可参见[知乎 Markdown讨论](http://www.zhihu.com/question/19637157)。

有了一款趁手的编辑器，可以开始码字了，那么如何最快掌握呢？
笔者的原则是实践出真知，参看[示例文档1](https://github.com/othree/markdown-syntax-zhtw/blob/master/syntax.md) 照着这边文章，查看它的 Markdown 文件，原样把文档打一遍，就像下面这样:

![im1](http://ww2.sinaimg.cn/mw690/965bbb87gw1f2yrnatsvkj211w0lc11c.jpg)

如果觉得一篇不够练手，这里有[示例文档2](https://github.com/younghz/Markdown)把这两篇文章都敲完了，笔者认为你应该已经掌握它的语法了。


## Makrdown 使用经验
### markdown 心得和技巧
笔者在未使用 Markdown 之前都是采用 word 来进行文档编辑，所以会很注重，文档的结构和排版方式。
在使用 Markdown 的初期，会纠结于为什么文档不能把标题居中等排版问题上，但是仔细思考后有了如下体会。

Mrakdown 强调的是**简单**。这个概念的核心意义就在于极简主义，所以重点在于如何有效的组织文章,心得如下:
   

**把文章拆分成块**

这个概念类似于编程的模块化思想，把有限的 Markdown 标签和你的文章块进行组合。
思考你的文章组件有哪些比如*文章标题*、*引言*、*目录*、*章节标题*、*内容*、*代码示例* 那么把这些文章部件和 Markdown 的语法标记逐一对应。

对应关系范例:
* **文章标题:** 用 `#` 来表示
* **前言:** 采用`**内容**`粗体，对文章主旨做一个概述
* **章节标题:** 采用 `##,###` 不要嵌套过深的层级.
* **内容:** 出现句号就换行。需要分段就空行。



markdown 的语法本身就包含了文章的布局层次在里面。
你需要做的就是巧妙的利用它的标记生成自己的模板格式。**笔者会将自己总结的模板保存方便以后使用**   
那么如何定义模块呢？目前我体会到的是保证语法和文本模块之间的内在契合性。
举例，比如说对于长文我们会存在目录，那么如何表示目录的层级呢？这里用 markdown 语法有以下几种办法。
1. 利用`#` 表示层级
2. 单纯的使用数字表示层级
3. 利用`>`来表示层级
4. 利用制表符或引号的层级缩颈表示层级
那么上面那种方法最好呢？我的原则是用最少的符号表示最强的效果。
所以首选方法1.因为只需用标题本身的功能就可以表示所有需要的目录关系。
包括目录的层级，等并且利用`#`号模式可以在变为html,利用 css 自动添加序号。所以该模式教合适。
下面是我编写markdown的一些文法规则。目的是为了保证所有文档的统一。

> 文章整体框架

文章框架布局结构:
 
    //1. 文章标识 编辑器自动生成，用来整理和归档文章  
     
    //2. 题头 = 标题 + 概要      
    //标题 言简意赅
    //概要 一句话描述本文中心思想
    //水平线 分隔题头和正文
    
    //3. 正文 = 子标题 + 块结构
    //一级标题 内容可以单独抽离时使用
    //# VI 语法 
    //# VI 插件  
    //上述两部分可以独立成章使用一级标题
    //二级标题 相对一级标题可以独立的内容
    //# vi 语法
    //## 输入模式
    //## 命令模式
    //上述两部分属于 VI 语法的子集，且具有一定的独立性拆分成二级标题
    //三级标题 划分方法同上
    //当在三级标题下还可能存在递归性时，利用块结构实现书写
    //只能有三层标题结构，超过三层利用块结构的层级关系体现
    //↓↓↓↓↓↓示例如下↓↓↓↓↓↓
    
    ]]></description>
            <content:encoded><![CDATA[<h1 id="markdown" tabindex="-1">Markdown <a class="header-anchor" href="#markdown" aria-label="Permalink to &quot;Markdown&quot;"></a></h1>
<p><strong>使用 Markdown 的经验</strong></p>
<h2 id="markdown-概述" tabindex="-1">Markdown 概述 <a class="header-anchor" href="#markdown-概述" aria-label="Permalink to &quot;Markdown 概述&quot;"></a></h2>
<p>markdown 是一种<strong>轻量级的标记语言</strong>，作用是为了更方便的书写网络文档。<br>
原理上文本标记会被 markdown 编辑器转换为 html 标签，例如在你想添加标题的文本前加入 <code>#</code> 内容就会被 <code>&lt;h1&gt;</code> 包含。<br>
对于 WEB 开发者，甚至可以在编写文本时嵌入 html 和 js 来增强文档表现。</p>
<h2 id="初学者入门" tabindex="-1">初学者入门 <a class="header-anchor" href="#初学者入门" aria-label="Permalink to &quot;初学者入门&quot;"></a></h2>
<p>对于首次使用 Markdown 进行文档编写的人，首先你需要一个趁手的编辑器来解析 Markdown 文件(github 上的 .md 文件即为这种格式)。
目前大部分的博客网站都支持 Markdown 的编写，例如笔者所使用的 CSDN, 若你想在本地编写文档，可以使用 Notepad 等编辑器。具体选择可参见<a href="http://www.zhihu.com/question/19637157" target="_blank" rel="noreferrer">知乎 Markdown讨论</a>。</p>
<p>有了一款趁手的编辑器，可以开始码字了，那么如何最快掌握呢？
笔者的原则是实践出真知，参看<a href="https://github.com/othree/markdown-syntax-zhtw/blob/master/syntax.md" target="_blank" rel="noreferrer">示例文档1</a> 照着这边文章，查看它的 Markdown 文件，原样把文档打一遍，就像下面这样:</p>
<p><img src="http://ww2.sinaimg.cn/mw690/965bbb87gw1f2yrnatsvkj211w0lc11c.jpg" alt="im1" loading="lazy"></p>
<p>如果觉得一篇不够练手，这里有<a href="https://github.com/younghz/Markdown" target="_blank" rel="noreferrer">示例文档2</a>把这两篇文章都敲完了，笔者认为你应该已经掌握它的语法了。</p>
<h2 id="makrdown-使用经验" tabindex="-1">Makrdown 使用经验 <a class="header-anchor" href="#makrdown-使用经验" aria-label="Permalink to &quot;Makrdown 使用经验&quot;"></a></h2>
<h3 id="markdown-心得和技巧" tabindex="-1">markdown 心得和技巧 <a class="header-anchor" href="#markdown-心得和技巧" aria-label="Permalink to &quot;markdown 心得和技巧&quot;"></a></h3>
<p>笔者在未使用 Markdown 之前都是采用 word 来进行文档编辑，所以会很注重，文档的结构和排版方式。
在使用 Markdown 的初期，会纠结于为什么文档不能把标题居中等排版问题上，但是仔细思考后有了如下体会。</p>
<p>Mrakdown 强调的是<strong>简单</strong>。这个概念的核心意义就在于极简主义，所以重点在于如何有效的组织文章,心得如下:</p>
<p><strong>把文章拆分成块</strong></p>
<p>这个概念类似于编程的模块化思想，把有限的 Markdown 标签和你的文章块进行组合。
思考你的文章组件有哪些比如<em>文章标题</em>、<em>引言</em>、<em>目录</em>、<em>章节标题</em>、<em>内容</em>、<em>代码示例</em> 那么把这些文章部件和 Markdown 的语法标记逐一对应。</p>
<p>对应关系范例:</p>
<ul>
<li><strong>文章标题:</strong> 用 <code>#</code> 来表示</li>
<li><strong>前言:</strong> 采用<code>**内容**</code>粗体，对文章主旨做一个概述</li>
<li><strong>章节标题:</strong> 采用 <code>##,###</code> 不要嵌套过深的层级.</li>
<li><strong>内容:</strong> 出现句号就换行。需要分段就空行。</li>
</ul>
<p>markdown 的语法本身就包含了文章的布局层次在里面。
你需要做的就是巧妙的利用它的标记生成自己的模板格式。<strong>笔者会将自己总结的模板保存方便以后使用</strong><br>
那么如何定义模块呢？目前我体会到的是保证语法和文本模块之间的内在契合性。
举例，比如说对于长文我们会存在目录，那么如何表示目录的层级呢？这里用 markdown 语法有以下几种办法。</p>
<ol>
<li>利用<code>#</code> 表示层级</li>
<li>单纯的使用数字表示层级</li>
<li>利用<code>&gt;</code>来表示层级</li>
<li>利用制表符或引号的层级缩颈表示层级
那么上面那种方法最好呢？我的原则是用最少的符号表示最强的效果。
所以首选方法1.因为只需用标题本身的功能就可以表示所有需要的目录关系。
包括目录的层级，等并且利用<code>#</code>号模式可以在变为html,利用 css 自动添加序号。所以该模式教合适。
下面是我编写markdown的一些文法规则。目的是为了保证所有文档的统一。</li>
</ol>
<blockquote>
<p>文章整体框架</p>
</blockquote>
<p>文章框架布局结构:</p>
<pre><code>//1. 文章标识 编辑器自动生成，用来整理和归档文章  
 
//2. 题头 = 标题 + 概要      
//标题 言简意赅
//概要 一句话描述本文中心思想
//水平线 分隔题头和正文

//3. 正文 = 子标题 + 块结构
//一级标题 内容可以单独抽离时使用
//# VI 语法 
//# VI 插件  
//上述两部分可以独立成章使用一级标题
//二级标题 相对一级标题可以独立的内容
//# vi 语法
//## 输入模式
//## 命令模式
//上述两部分属于 VI 语法的子集，且具有一定的独立性拆分成二级标题
//三级标题 划分方法同上
//当在三级标题下还可能存在递归性时，利用块结构实现书写
//只能有三层标题结构，超过三层利用块结构的层级关系体现
//↓↓↓↓↓↓示例如下↓↓↓↓↓↓

---
title: VIM 使用 
category: linux tool
date: 2016-9-12
modifiedOn: 2016-9-25
---                            
  
# VIM 使用

**前言:介绍 VIM 基本语法及相关工具**   

---   

## VIM 语法   
块结构...          
### 基本概念    
块结构...
### 模式切换    
块结构...  
</code></pre>
<blockquote>
<p>块结构</p>
</blockquote>
<p>块结构用在文章的各级标题内容中，为内容的组成单元
块结构 = 块标题 + 子内容</p>
<blockquote>
<blockquote>
<p>块标题</p>
</blockquote>
</blockquote>
<p>采用<code>&gt;</code>来实现块标题，块标题的也可以存在层级，只需利用多层
<code>&gt;</code> 即可。只建议使用两层块标题，不要让文档出现过深的嵌套。举例如下:</p>
<pre><code>&gt; 块结构
块结构 = 块标题 + 子内容
&gt;&gt; 块标题
...
&gt;&gt; 子内容
...
</code></pre>
<blockquote>
<blockquote>
<p>子内容</p>
</blockquote>
</blockquote>
<p>子内容是组成文章部件的最小单元，常用的子内容如下。</p>
<ul>
<li>
<p>无序子内容
利用<code>*，-，+</code>都可，利用制表符缩进子内容的递归性</p>
</li>
<li>
<p>有序子内容
利用<code>1.,2.</code>,实现，利用制表符实现递归性，和无序子内容可相互包含</p>
</li>
<li>
<p>代码块
所有编程语言范例使用</p>
<pre><code>  ```js
      var a = 1;
  ```
  
  ```bash
      $ ls      //注意 linux 命令前面必须加提示符
  ```
</code></pre>
</li>
<li>
<p>文本块 非编程语言,但是需要利用块引用进行说明的地方该文本块是利用
换行和制表符生成的。</p>
<pre><code> //利用 ASCII Art 来描述 http 通讯
  request chain ------------------------&gt;
  UA -------------------v------------------- O
  &lt;----------------------- response chain
</code></pre>
</li>
<li>
<p>其他</p>
<ul>
<li>
<p>段落 多行文本使用，每一行文本出现句号后换行</p>
</li>
<li>
<p>关键字，利用一些特殊字符来强调某些内容，灵感来源于<a href="http://www.gobloggingtips.com/bold-italics-and-underlines-in-blog-posts/" target="_blank" rel="noreferrer">如何使用下划线和黑体</a></p>
<pre><code>  `短命令`  --&gt; 所有较短命令或一些技术术语和特殊字符
  
  **强调**   --&gt; 文章中强调的观点或技术术语以及需要加强的概念
   
  _斜体_     --&gt; 只用在引用或非强调但需要突出的内容上
   
  ~~删除~~    --&gt; 用在删除和修改的内容  
</code></pre>
</li>
<li>
<p>链接和图像引用</p>
</li>
<li>
<p>表格，用在需要说明函数 API 或一些配置参数的场合</p>
</li>
</ul>
</li>
</ul>
<h3 id="markdown-语言技巧" tabindex="-1">markdown 语言技巧 <a class="header-anchor" href="#markdown-语言技巧" aria-label="Permalink to &quot;markdown 语言技巧&quot;"></a></h3>
<blockquote>
<p>连接引用</p>
</blockquote>
<p>有些编辑器是支持图片的相对路径引用的，若不支持相对路径可以采用微博或第三方服务器来引用图片。
对于相对独立的引用直接使用内嵌式写法，若涉及到大量的连接引用比如说文末的参考文章，则建议采用显示连接更好。
利用显示连接时不建议索引 id 都放在文章最后，最好在哪里引用就放在它的下面。方便文章修改。</p>
<blockquote>
<p>善用工具</p>
</blockquote>
<p>笔者在 <code>chroem</code> 浏览器上预装了 <code>stackedit</code> 编辑器，它支持利用文本标记编写流程图的功能。<br>
虽然这以不属于 markdown 语法。但是重点在于学会利用并扩展工具的使用。
我的建议是多使用几款找到自己中意的，然后精通它，这样你才能从随心所欲的操作中获得成就感。</p>
<h2 id="markdown-语法详解" tabindex="-1">MarkDown 语法详解 <a class="header-anchor" href="#markdown-语法详解" aria-label="Permalink to &quot;MarkDown 语法详解&quot;"></a></h2>
<p>建议看这篇<a href="http://xianbai.me/learn-md/article/about/readme.html" target="_blank" rel="noreferrer">markdown 语法讲解</a> 。</p>
<h3 id="标题的两种表示方法" tabindex="-1">标题的两种表示方法 <a class="header-anchor" href="#标题的两种表示方法" aria-label="Permalink to &quot;标题的两种表示方法&quot;"></a></h3>
<h4 id="表示标题" tabindex="-1"><code>#</code> 表示标题 <a class="header-anchor" href="#表示标题" aria-label="Permalink to &quot;`#` 表示标题&quot;"></a></h4>
<p>范例:</p>
<pre><code># 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
</code></pre>
<p>结果:</p>
<blockquote>
<h1 id="一级标题" tabindex="-1">一级标题 <a class="header-anchor" href="#一级标题" aria-label="Permalink to &quot;一级标题&quot;"></a></h1>
<h2 id="二级标题" tabindex="-1">二级标题 <a class="header-anchor" href="#二级标题" aria-label="Permalink to &quot;二级标题&quot;"></a></h2>
<h3 id="三级标题" tabindex="-1">三级标题 <a class="header-anchor" href="#三级标题" aria-label="Permalink to &quot;三级标题&quot;"></a></h3>
<h4 id="四级标题" tabindex="-1">四级标题 <a class="header-anchor" href="#四级标题" aria-label="Permalink to &quot;四级标题&quot;"></a></h4>
<h5 id="五级标题" tabindex="-1">五级标题 <a class="header-anchor" href="#五级标题" aria-label="Permalink to &quot;五级标题&quot;"></a></h5>
<h6 id="六级标题" tabindex="-1">六级标题 <a class="header-anchor" href="#六级标题" aria-label="Permalink to &quot;六级标题&quot;"></a></h6>
</blockquote>
<h3 id="表示一级标题-表示二级标题" tabindex="-1"><code>===</code> 表示一级标题 <code>---</code> 表示二级标题 <a class="header-anchor" href="#表示一级标题-表示二级标题" aria-label="Permalink to &quot;`===` 表示一级标题 `---` 表示二级标题&quot;"></a></h3>
<p>范例:</p>
<pre><code>一级标题
===
二级标题
---
</code></pre>
<p>结果:</p>
<blockquote>
<h1 id="一级标题-1" tabindex="-1">一级标题 <a class="header-anchor" href="#一级标题-1" aria-label="Permalink to &quot;一级标题&quot;"></a></h1>
<h2 id="二级标题-1" tabindex="-1">二级标题 <a class="header-anchor" href="#二级标题-1" aria-label="Permalink to &quot;二级标题&quot;"></a></h2>
</blockquote>
<h2 id="段落和换行" tabindex="-1">段落和换行 <a class="header-anchor" href="#段落和换行" aria-label="Permalink to &quot;段落和换行&quot;"></a></h2>
<h3 id="表示段落的块前后各空一行" tabindex="-1">表示段落的块前后各空一行 <a class="header-anchor" href="#表示段落的块前后各空一行" aria-label="Permalink to &quot;表示段落的块前后各空一行&quot;"></a></h3>
<p>范例:</p>
<pre><code>第一段

第二段
</code></pre>
<p>结果:</p>
<blockquote>
<p>第一段</p>
</blockquote>
<blockquote>
<p>第二段</p>
</blockquote>
<h3 id="在行末添加两个或以上空格实现换行" tabindex="-1">在行末添加两个或以上空格实现换行 <a class="header-anchor" href="#在行末添加两个或以上空格实现换行" aria-label="Permalink to &quot;在行末添加两个或以上空格实现换行&quot;"></a></h3>
<p>范例:</p>
<pre><code>第一行   
第二行   
</code></pre>
<p>结果:</p>
<blockquote>
<p>第一行<br>
第二行</p>
</blockquote>
<h2 id="文本块" tabindex="-1">文本块 <a class="header-anchor" href="#文本块" aria-label="Permalink to &quot;文本块&quot;"></a></h2>
<h3 id="代码块" tabindex="-1">代码块 <a class="header-anchor" href="#代码块" aria-label="Permalink to &quot;代码块&quot;"></a></h3>
<p>范例:</p>
<pre><code>```js
funciton test()
{

}
```
</code></pre>
<p>结果:</p>
<blockquote>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">function</span><span style="color:#B392F0"> test</span><span style="color:#E1E4E8">()</span></span>
<span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span></code></pre>
</div></blockquote>
<h3 id="文本块-1" tabindex="-1">文本块 <a class="header-anchor" href="#文本块-1" aria-label="Permalink to &quot;文本块&quot;"></a></h3>
<p>只需要在段落前产生3个空格的空格即可，注意若出现其他文本块，则需要再产生 3 个空格以此类推</p>
<p>范例:</p>
<pre><code>文本块举例
</code></pre>
<p>结果:</p>
<blockquote>
<pre><code>  文本块 
</code></pre>
</blockquote>
<h3 id="引用块" tabindex="-1">引用块 <a class="header-anchor" href="#引用块" aria-label="Permalink to &quot;引用块&quot;"></a></h3>
<p>使用 <code>&gt;</code> 符号支持嵌套,注意要断开应用块空一行即可。
若不空行,一般会继续按照上一行应用模式显示。</p>
<p>范例:</p>
<pre><code>&gt; 这是第一层
&gt;&gt; 这是第二层

&gt; 这是第一层
//空行后才有效
</code></pre>
<p>结果:</p>
<blockquote>
<p>这是第一层</p>
<blockquote>
<p>这是第二层
这是第二层</p>
</blockquote>
</blockquote>
<blockquote>
<p>这是第一层</p>
</blockquote>
<p>##　斜体，黑体</p>
<p>使用 <code>×　×</code>和<code>××　××</code>表示斜体和粗体，或者 <code>_ _</code>或<code>__ __</code></p>
<p>范例:</p>
<pre><code>*斜体*
**粗体**
_斜体_
__粗体__
</code></pre>
<p>结果:</p>
<blockquote>
<p><em>斜体</em></p>
</blockquote>
<blockquote>
<p><strong>粗体</strong></p>
</blockquote>
<blockquote>
<p><em>斜体</em></p>
</blockquote>
<blockquote>
<p><strong>粗体</strong></p>
</blockquote>
<h3 id="列表" tabindex="-1">列表 <a class="header-anchor" href="#列表" aria-label="Permalink to &quot;列表&quot;"></a></h3>
<h3 id="无序列表" tabindex="-1">无序列表 <a class="header-anchor" href="#无序列表" aria-label="Permalink to &quot;无序列表&quot;"></a></h3>
<p>使用 <code>-、*、+</code>  三个符号表示无序列表</p>
<p>范例:</p>
<pre><code>- 条目一
- 条目二

或
+ 条目一
+ 条目二

或
* 条目一
* 条目二
</code></pre>
<p>结果:</p>
<blockquote>
<ul>
<li>条目一</li>
<li>条目二</li>
</ul>
</blockquote>
<h3 id="有序列表" tabindex="-1">有序列表 <a class="header-anchor" href="#有序列表" aria-label="Permalink to &quot;有序列表&quot;"></a></h3>
<p>使用数字加标点表示有序列表,注意点号后要加空格</p>
<p>范例:</p>
<pre><code>  1. 条目1
  2. 条目2

  或
  7. 条目1
  3. 条目2

 以上两个显示结果相同，说明 markdown 在处理时只是依照格式来进行排序
 不过考虑到阅读性建议按照实际顺序排序
</code></pre>
<p>结果:</p>
<blockquote>
<ol>
<li>条目1</li>
<li>条目2</li>
</ol>
</blockquote>
<h2 id="分割线" tabindex="-1">分割线 <a class="header-anchor" href="#分割线" aria-label="Permalink to &quot;分割线&quot;"></a></h2>
<p>连写三个或以上的 *、-、_ 均会产生下划线</p>
<p>范例:</p>
<pre><code>---

或
___

或
***
也可以使用超过3个的字符
</code></pre>
<p>结果:</p>
<blockquote>
<hr>
</blockquote>
<h2 id="引用超链接和图片" tabindex="-1">引用超链接和图片 <a class="header-anchor" href="#引用超链接和图片" aria-label="Permalink to &quot;引用超链接和图片&quot;"></a></h2>
<h3 id="超链接" tabindex="-1">超链接 <a class="header-anchor" href="#超链接" aria-label="Permalink to &quot;超链接&quot;"></a></h3>
<p>超链接的表示方法分为内嵌、参考、自动连接</p>
<blockquote>
<p>内嵌式写法</p>
</blockquote>
<p>范例:</p>
<pre><code>[引用文本](链接地址)
如:[百度首页](http://www.baidu.com)

也可采用相对地址来表示前提是 markdown 文件和你的网页是在用一个主机之下
</code></pre>
<p>结果:</p>
<blockquote>
<p><a href="http://www.baidu,com" target="_blank" rel="noreferrer">百度首页</a></p>
</blockquote>
<blockquote>
<p>参考链接方式</p>
</blockquote>
<blockquote>
<blockquote>
<p>显示连接</p>
</blockquote>
</blockquote>
<p>范例:</p>
<pre><code>[引用文本][id]
[id]: URL &quot;可选择的标题&quot;
如:
[百度首页][h1]
</code></pre>
<p>结果:</p>
<blockquote>
<p><a href="http://www.baidu,com" title="百度连接" target="_blank" rel="noreferrer">百度</a></p>
</blockquote>
<blockquote></blockquote>
<blockquote>
<blockquote>
<p>隐式连接</p>
</blockquote>
</blockquote>
<p>范例:</p>
<pre><code>[引用文本][]
[引用文本]: URL &quot;可选择的标题&quot; ````
如:
[百度首页][]
</code></pre>
<p>结果:</p>
<blockquote>
<p><a href="http://www.baidu,com" title="百度首页" target="_blank" rel="noreferrer">百度首页</a></p>
</blockquote>
<blockquote></blockquote>
<h3 id="图片显示" tabindex="-1">图片显示 <a class="header-anchor" href="#图片显示" aria-label="Permalink to &quot;图片显示&quot;"></a></h3>
<p>图片显示类似超链接，引用时开头加！即可</p>
<blockquote>
<p>内嵌式写法</p>
</blockquote>
<p>范例:</p>
<pre><code>[引用文本](链接地址)
如:![MARKDOWN图标](http://www.newasp.net/attachment/soft/2015/0713/085610_78002493.png)

也可采用相对地址来表示前提是 markdown 文件和你的网页是在用一个主机之下
</code></pre>
<p>结果:</p>
<blockquote>
<p><img src="http://www.newasp.net/attachment/soft/2015/0713/085610_78002493.png" alt="MARKDOWN图标" loading="lazy"></p>
</blockquote>
<blockquote>
<p>参考链接方式</p>
</blockquote>
<blockquote>
<blockquote>
<p>显示连接</p>
</blockquote>
</blockquote>
<p>范例:</p>
<pre><code>![引用文本][id]
[id]: URL &quot;可选择的标题&quot;
如:
![MARKDOWN图标][i1]

[i1]:http://www.newasp.net/attachment/soft/2015/0713/085610_78002493.png &quot;图标&quot;
注意空行分开结果同上
</code></pre>
<blockquote>
<blockquote>
<p>隐式连接</p>
</blockquote>
</blockquote>
<p>范例:</p>
<pre><code>！[引用文本][]
[引用文本]: URL &quot;可选择的标题&quot;
如:
[MARKDOWN图标][]

[MARKDOWN图标]: http://www.newasp.net/attachment/soft/2015/0713/085610_78002493.png &quot;图标&quot;
结果同上
</code></pre>
<h3 id="自动链接" tabindex="-1">自动链接 <a class="header-anchor" href="#自动链接" aria-label="Permalink to &quot;自动链接&quot;"></a></h3>
<p>多用于邮箱或短的网址</p>
<p>范例:</p>
<pre><code>&lt;http://www.baidu.com&gt;
&lt;test@gmail.com&gt;   
</code></pre>
<p>结果:</p>
<blockquote>
<p><a href="http://www.baidu.com" target="_blank" rel="noreferrer">http://www.baidu.com</a></p>
</blockquote>
<blockquote>
<p><a href="mailto:123@email.com" target="_blank" rel="noreferrer">123@email.com</a></p>
</blockquote>
<p>##　表格　　　
markdown 表格只具有基本功能，复杂合并建议直接使用<code>html</code>。
表格分为标题头和内容块参看范例</p>
<p>范例:</p>
<pre><code>| 标题一 | 标题二   // 注意利用 | 来划分标题 |
| ------ | -------------------- |//利用 --- 来区分标题和内容，其中 :--- 左对齐、:---: 居中对齐、 ---: 右对齐
内容|内容|       // 利用 | 来划分内容
</code></pre>
<p>结果:</p>
<blockquote>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:right">Header</th>
<th style="text-align:center">Header 2</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right">Data 1</td>
<td style="text-align:center">Data 2</td>
</tr>
</tbody>
</table>
</blockquote>
<p>你也可以利用它实现列合并</p>
<p>范例:</p>
<pre><code>| 标题一 | 标题三   // 注意利用 | 来划分标题 |
| ------ | -------------------- | ---------- |//利用 --- 来区分标题和内容，其中 :--- 左对齐、:---: 居中对齐、 ---: 右对齐
内容|内容|       // 利用 | 来划分内容
</code></pre>
<p>结果:</p>
<blockquote>
<table tabindex="0">
<thead>
<tr>
<th>标题一</th>
<th></th>
<th>标题三</th>
</tr>
</thead>
<tbody>
<tr>
<td>内容</td>
<td>内容</td>
<td>fdf</td>
</tr>
</tbody>
</table>
</blockquote>
<h2 id="代办清单" tabindex="-1">代办清单 <a class="header-anchor" href="#代办清单" aria-label="Permalink to &quot;代办清单&quot;"></a></h2>
<blockquote>
<p>语法</p>
</blockquote>
<p><code>[ ]</code>表示没有完成。
<code>[x]</code> 表示完成。</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>- [ ] Mercury</span></span>
<span class="line"><span>- [x] Venus</span></span>
<span class="line"><span>- [x] Earth (Orbit/Moon)</span></span>
<span class="line"><span>- [x] Mars</span></span>
<span class="line"><span>- [ ] Jupiter</span></span>
<span class="line"><span>- [ ] Saturn</span></span>
<span class="line"><span>- [ ] Uranus</span></span>
<span class="line"><span>- [ ] Neptune</span></span>
<span class="line"><span>- [ ] Comet Haley</span></span></code></pre>
</div><blockquote>
<p>显示结果</p>
</blockquote>
<ul>
<li>[ ] Mercury</li>
<li>[x] Venus</li>
<li>[x] Earth (Orbit/Moon)</li>
<li>[x] Mars</li>
<li>[ ] Jupiter</li>
<li>[ ] Saturn</li>
<li>[ ] Uranus</li>
<li>[ ] Neptune</li>
<li>[ ] Comet Haley</li>
</ul>
<h2 id="其他符号讲解" tabindex="-1">其他符号讲解 <a class="header-anchor" href="#其他符号讲解" aria-label="Permalink to &quot;其他符号讲解&quot;"></a></h2>
<blockquote>
<p>\ 转译符号</p>
</blockquote>
<p>范例:</p>
<pre><code>\#
</code></pre>
<p>结果:</p>
<blockquote>
<p>#</p>
</blockquote>
<blockquote>
<p>`` 用来标记</p>
</blockquote>
<p>范例:</p>
<pre><code>`标记内容`
</code></pre>
<p>结果:</p>
<blockquote>
<p><code>标记内容</code></p>
</blockquote>
<blockquote>
<p>删除线</p>
</blockquote>
<p>范例:</p>
<pre><code>~~内容~~~
</code></pre>
<p>结果:</p>
<blockquote>
<p><s>内容</s></p>
</blockquote>
<h2 id="文章构成部件" tabindex="-1">文章构成部件 <a class="header-anchor" href="#文章构成部件" aria-label="Permalink to &quot;文章构成部件&quot;"></a></h2>
<blockquote>
<p>介绍 linux 命令</p>
</blockquote>
<pre><code>## &lt;command_name&gt;
**功能:** &lt;command_description&gt;

**参数:** 

| 参数名       | 作用          |
| :----------- | :------------ |
| &lt;parameter1&gt; | &lt;description&gt; |
| &lt;parameter2&gt; | &lt;description&gt; |
...

**范例:**

```bash
   # &lt;example_description&gt; 
   &lt;linux_command&gt;
   
   ...
```
</code></pre>
<h2 id="markdown-扩展" tabindex="-1">markdown 扩展 <a class="header-anchor" href="#markdown-扩展" aria-label="Permalink to &quot;markdown 扩展&quot;"></a></h2>
<p>github 的 mrakdown 语法称为.</p>
<p><a href="https://github.github.com/gfm/" target="_blank" rel="noreferrer">github flavored markdown</a>
简称 <strong>GFM</strong>.</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="http://ww2.sinaimg.cn/mw690/965bbb87gw1f2yrnatsvkj211w0lc11c.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[新浪云服务器配置]]></title>
            <link>https://blog.zenheart.site/posts/2016-08-22-sae</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-08-22-sae</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[
# 新浪云服务器配置


**SAE 服务器的使用笔记**

## 服务器环境
* CentOS-6.x
* Apache-2.2.x
* PHP-5.3.x / PHP-5.6.x

## sae 设置

支持的判断条件

| 比较符号               | 作用                                                                         |
| :]]></description>
            <content:encoded><![CDATA[<h1 id="新浪云服务器配置" tabindex="-1">新浪云服务器配置 <a class="header-anchor" href="#新浪云服务器配置" aria-label="Permalink to &quot;新浪云服务器配置&quot;"></a></h1>
<p><strong>SAE 服务器的使用笔记</strong></p>
<h2 id="服务器环境" tabindex="-1">服务器环境 <a class="header-anchor" href="#服务器环境" aria-label="Permalink to &quot;服务器环境&quot;"></a></h2>
<ul>
<li>CentOS-6.x</li>
<li>Apache-2.2.x</li>
<li>PHP-5.3.x / PHP-5.6.x</li>
</ul>
<h2 id="sae-设置" tabindex="-1">sae 设置 <a class="header-anchor" href="#sae-设置" aria-label="Permalink to &quot;sae 设置&quot;"></a></h2>
<p>支持的判断条件</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">比较符号</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">==</td>
<td>比较变量和字符串相等</td>
</tr>
<tr>
<td style="text-align:left">!=</td>
<td>比较变量和字符串不等</td>
</tr>
<tr>
<td style="text-align:left"><code>&gt;,&gt;=,&lt;,&lt;=</code></td>
<td>比较变量和数字</td>
</tr>
<tr>
<td style="text-align:left"><code>-f,！-f</code></td>
<td>检查文件是否存在</td>
</tr>
<tr>
<td style="text-align:left"><code>-d,!-d</code></td>
<td>检查目录是否存在</td>
</tr>
<tr>
<td style="text-align:left"><code>-e,!-e</code></td>
<td>运算符检查文件或目录是否存在</td>
</tr>
<tr>
<td style="text-align:left">~</td>
<td>大小写敏感</td>
</tr>
<tr>
<td style="text-align:left">~*</td>
<td>大小写不敏感，运算符匹配变量和正则表达式，支持匹配组，利用 <code>%[1-9]</code> 进行引用</td>
</tr>
<tr>
<td style="text-align:left"><code>%{REQ:HEADER_NAME} </code></td>
<td REQ:HTTP_HOST="">HTTP 请求头中的字段，如 %</td>
</tr>
<tr>
<td style="text-align:left"><code>%{RESP:HEADER_NAME} </code></td>
<td RESP:CONTENT_ENCODING="">HTTP 响应头中的字段，如 %</td>
</tr>
<tr>
<td style="text-align:left"><code>%{QUERY_STRING} </code></td>
<td>查询串，一般是 url 中问号后面的内容</td>
</tr>
<tr>
<td style="text-align:left"><code>%{REQUEST_URI} </code></td>
<td>请求路径，即用户请求的 url 去掉主机部分和查询串后剩下的部分</td>
</tr>
</tbody>
</table>
<ol>
<li>
<p>设置访问没有指定文件的返回文件
<code>-  directoryindex: aaa.php</code></p>
</li>
<li>
<p>定义错误返回文件名
<code>- errordoc: 404 /404.html</code></p>
</li>
</ol>
<h2 id="url-重写举例" tabindex="-1">url 重写举例 <a class="header-anchor" href="#url-重写举例" aria-label="Permalink to &quot;url 重写举例&quot;"></a></h2>
<p>修改 config.yaml 文件可以实现类似 .htaccess 文件格式的配置。
URL 配置语法:</p>
<div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">   -</span><span style="color:#9ECBFF"> rewrite:</span><span style="color:#9ECBFF"> if</span><span style="color:#9ECBFF"> （CONDTIONs）</span><span style="color:#9ECBFF"> goto</span><span style="color:#9ECBFF"> target_url</span></span></code></pre>
</div><p>使用举例：</p>
<ol>
<li>强制使用 https</li>
</ol>
<div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">   -</span><span style="color:#9ECBFF"> rewrite:</span><span style="color:#9ECBFF"> if</span><span style="color:#E1E4E8"> (%{</span><span style="color:#B392F0">REQ:X-Forwarded-Protol}</span><span style="color:#9ECBFF"> !=</span><span style="color:#9ECBFF"> "https"</span><span style="color:#E1E4E8">) goto </span><span style="color:#9ECBFF">"https://%{HTTP_HOST}%{REQUEST_URI}"</span></span></code></pre>
</div><h2 id="sae-cdn" tabindex="-1">sae cdn <a class="header-anchor" href="#sae-cdn" aria-label="Permalink to &quot;sae cdn&quot;"></a></h2>
<p><a href="https://lib.sinaapp.com/" target="_blank" rel="noreferrer">sae lib</a></p>
<h2 id="共享型数据库区别" tabindex="-1">共享型数据库区别 <a class="header-anchor" href="#共享型数据库区别" aria-label="Permalink to &quot;共享型数据库区别&quot;"></a></h2>
<p><a href="http://www.sinacloud.com/home/index/faq_detail/doc_id/97.html" target="_blank" rel="noreferrer">文档中心</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[虚拟内存]]></title>
            <link>https://blog.zenheart.site/posts/2016-08-22-virtual_memory</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-08-22-virtual_memory</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[虚拟内存概念
虚拟内存是指在实际设备上并不存在的虚拟 RAM 空间。
它的作用是当应用运行时，所需内存超出了设备实际拥有 RAM ，操作系统创造出的虚拟内存环境。
虚拟内存如何实现？假设一个操作系统需]]></description>
            <content:encoded><![CDATA[<h1 id="虚拟内存" tabindex="-1">虚拟内存 <a class="header-anchor" href="#虚拟内存" aria-label="Permalink to &quot;虚拟内存&quot;"></a></h1>
<p><strong>虚拟内存概念</strong></p>
<p>虚拟内存是指在实际设备上并不存在的虚拟 RAM 空间。</p>
<p>它的作用是当应用运行时，所需内存超出了设备实际拥有 RAM ，操作系统创造出的虚拟内存环境。</p>
<p>虚拟内存如何实现？假设一个操作系统需要 120 MB 的 RAM 来运行所有应用，但是实际内存只有 50 MB。
此时操作系统会调用，VMM(virtual memory menager) 去管理这 120 MB 内存空间，由于实际无内存不足，
VMM 会在硬盘上创建 70MB 的空间充当内存，这个空间山创造的对所需内存的映射我们称为<strong>页面文件</strong>。
也可以叫<strong>交换文件</strong>，页面文件和实际物理内存组合在一起，包含类应用所需的所有内存，当应用需要
内存超过实际范围时，VMM 会查找实际内存中目前未被使用的块，将内容复制到交换文件中，然后将交换文件
中对应的应用所需内存，放到实际的内存中。这个过程称为<strong>页面调度</strong>或<strong>交换</strong>。</p>
<p>因为有了虚拟内存，实现了多个任务的同步运行提供了存储保障，即使实际内存不足，也可以利用虚拟内存实现任务调度。</p>
<p>但是当应用大量依赖于虚拟内存时，由于 RAM 和实际内存之间读写速度存在差异，所以就会使系统具有卡顿。这种频繁的页面调度对系统的性能影响我们称为<strong>抖动</strong>。</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[SecureCrt ]]></title>
            <link>https://blog.zenheart.site/posts/2016-10-07-SecureCRT</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-10-07-SecureCRT</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[SecureCrt 
终端连接工具的使用技巧和方法
 全局环境配置
1. 点击选项-
 环境颜色配置
1. 点击 选项-&gt; 会话选项 弹出如下，再点击 终端-&gt;外观-&gt; 窗口，注意要]]></description>
            <content:encoded><![CDATA[<h1 id="securecrt" tabindex="-1">SecureCrt <a class="header-anchor" href="#securecrt" aria-label="Permalink to &quot;SecureCrt&quot;"></a></h1>
<p><strong>终端连接工具的使用技巧和方法</strong></p>
<h2 id="全局环境配置" tabindex="-1">全局环境配置 <a class="header-anchor" href="#全局环境配置" aria-label="Permalink to &quot;全局环境配置&quot;"></a></h2>
<ol>
<li>点击选项-&gt;全局选项</li>
</ol>
<h2 id="环境颜色配置" tabindex="-1">环境颜色配置 <a class="header-anchor" href="#环境颜色配置" aria-label="Permalink to &quot;环境颜色配置&quot;"></a></h2>
<ol>
<li>
<p>点击 选项-&gt; 会话选项 弹出如下，再点击 终端-&gt;外观-&gt; 窗口，注意<strong>要把字符编码选为， UTF-8</strong>,
记住，编码决定了处理数据的逻辑，字体只是决定了处理结果的显示方式，所以在使用软件时看到出现乱码，是
编码方式出错了，而不是字体有问题！</p>
<p><img src="https://blog.zenheart.site/assets/2016-10-07-tool_SecureCRT1.BTY5H7rv.jpg" alt="" loading="lazy"></p>
</li>
<li>
<p>点击 终端-&gt;仿真 这是我的配置</p>
<p><img src="https://blog.zenheart.site/assets/2016-10-07-tool_SecureCRT2.DVIGHOAT.jpg" alt="" loading="lazy"></p>
</li>
</ol>
<h2 id="连接配置" tabindex="-1">连接配置 <a class="header-anchor" href="#连接配置" aria-label="Permalink to &quot;连接配置&quot;"></a></h2>
<ol>
<li>点击 文件-&gt; 连接，再 sessions 上点击右键，新建会话</li>
</ol>
<p><img src="https://blog.zenheart.site/assets/2016-10-07-tool_SecureCRT3.CSLUFkcn.jpg" alt="" loading="lazy"></p>
<ol start="2">
<li>在新建会话上选择 会话类型，填入主机 IP 等信息。</li>
</ol>
<h2 id="分屏操作" tabindex="-1">分屏操作 <a class="header-anchor" href="#分屏操作" aria-label="Permalink to &quot;分屏操作&quot;"></a></h2>
<ol>
<li>点击选项-&gt; 全局选项，在打开对话框中选择 终端-&gt;标签页/平铺 这是我的配置</li>
</ol>
<p><img src="https://blog.zenheart.site/assets/2016-10-07-tool_SecureCRT4.TpHQrycH.jpg" alt="" loading="lazy"></p>
<ol start="2">
<li>
<p>点击窗口-&gt;垂直平铺</p>
<p><img src="https://blog.zenheart.site/assets/2016-10-07-tool_SecureCRT5.D5aDKRep.jpg" alt="" loading="lazy"></p>
</li>
<li>
<p>打开新的会话是注意勾选在层叠窗口打开，不然 SecureCRT 会新建窗口打开会话</p>
<p><img src="https://blog.zenheart.site/assets/2016-10-07-tool_SecureCRT6.B4dbqYa-.jpg" alt="" loading="lazy"></p>
</li>
</ol>
<h3 id="交互窗口" tabindex="-1">交互窗口 <a class="header-anchor" href="#交互窗口" aria-label="Permalink to &quot;交互窗口&quot;"></a></h3>
<p>选择查看-&gt;交互窗口可以实现批量的命令导入。
在使用 vi 复制文本时十分有效。举例如下:</p>
<p><img src="https://blog.zenheart.site/assets/2016-10-07-crt_view.DBbvMZWn.gif" alt="" loading="lazy"></p>
<h2 id="使用问题" tabindex="-1">使用问题 <a class="header-anchor" href="#使用问题" aria-label="Permalink to &quot;使用问题&quot;"></a></h2>
<ol>
<li>
<p>delete 变为 <code>^h</code>
选择选项 -&gt; 会话选项，按照图示勾选两项后，重启会话</p>
</li>
<li>
<p>方向键失灵</p>
</li>
</ol>
<div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">    # 查看用户是否设置 shell</span></span>
<span class="line"><span style="color:#B392F0">   grep</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">user_nam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span><span style="color:#9ECBFF"> /etc/passwd</span></span>
<span class="line"><span style="color:#E1E4E8">    </span></span>
<span class="line"><span style="color:#6A737D">    # 修改shell</span></span>
<span class="line"><span style="color:#B392F0">    chsh</span><span style="color:#79B8FF"> -s</span><span style="color:#9ECBFF"> /bin/bash</span></span></code></pre>
</div><p>重启会话及正常。</p>
<p><img src="https://blog.zenheart.site/assets/2016-10-07-crt_delete_error.DiauEsMR.jpg" alt="" loading="lazy"></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/2016-10-07-tool_SecureCRT1.BTY5H7rv.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[visio]]></title>
            <link>https://blog.zenheart.site/posts/2016-10-19-visio</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-10-19-visio</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[visio
visio 的使用总结
 箭头的设置技巧
1. 跨过线时不弯曲
选择跨过后弯曲的的线，按照如下设置
实际上也可以利用，行为中的放置设置线条的穿过行为。
 快捷键使用
 工具选择
* `ct]]></description>
            <content:encoded><![CDATA[<h1 id="visio" tabindex="-1">visio <a class="header-anchor" href="#visio" aria-label="Permalink to &quot;visio&quot;"></a></h1>
<p><strong>visio 的使用总结</strong></p>
<h2 id="箭头的设置技巧" tabindex="-1">箭头的设置技巧 <a class="header-anchor" href="#箭头的设置技巧" aria-label="Permalink to &quot;箭头的设置技巧&quot;"></a></h2>
<ol>
<li>跨过线时不弯曲
选择跨过后弯曲的的线，按照如下设置</li>
</ol>
<p><img src="https://blog.zenheart.site/assets/2016-10-19-visio.Bh0EL0kW.gif" alt="" loading="lazy">
实际上也可以利用，行为中的放置设置线条的穿过行为。</p>
<h2 id="快捷键使用" tabindex="-1">快捷键使用 <a class="header-anchor" href="#快捷键使用" aria-label="Permalink to &quot;快捷键使用&quot;"></a></h2>
<h3 id="工具选择" tabindex="-1">工具选择 <a class="header-anchor" href="#工具选择" aria-label="Permalink to &quot;工具选择&quot;"></a></h3>
<ul>
<li><code>ctrl + 1</code> 指针工具</li>
<li><code>ctrl + shift + .</code> 放大字体</li>
<li><code>ctrl + shift + ，</code> 缩小字体</li>
</ul>
<ol>
<li>插入超链接</li>
</ol>
<ul>
<li><code>ctrl + k</code> 选中需要插入快捷键图形，若插入错误选中取消即可</li>
</ul>
<p><a href="https://support.office.com/zh-cn/article/Visio-%E7%9A%84%E9%94%AE%E7%9B%98%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F-ee952f31-7e3e-4564-8116-f3ecbb733cc1" target="_blank" rel="noreferrer">visio 快捷键</a></p>
<h2 id="连接点" tabindex="-1">连接点 <a class="header-anchor" href="#连接点" aria-label="Permalink to &quot;连接点&quot;"></a></h2>
<p>连接点是指视图上的小差。如不想显示连接点</p>
<ul>
<li>视图-&gt;取消连接点勾选即可</li>
</ul>
<p><a href="https://support.office.com/zh-cn/article/%E6%B7%BB%E5%8A%A0%E3%80%81%E7%A7%BB%E5%8A%A8%E6%88%96%E5%88%A0%E9%99%A4%E8%BF%9E%E6%8E%A5%E7%82%B9-5669491f-9fce-4676-81f8-ef4553788416#bm4" target="_blank" rel="noreferrer">连接点说明</a></p>
<h2 id="创建子流程" tabindex="-1">创建子流程 <a class="header-anchor" href="#创建子流程" aria-label="Permalink to &quot;创建子流程&quot;"></a></h2>
<h3 id="根据部分内容创建子流程" tabindex="-1">根据部分内容创建子流程 <a class="header-anchor" href="#根据部分内容创建子流程" aria-label="Permalink to &quot;根据部分内容创建子流程&quot;"></a></h3>
<ol>
<li>选中部分流程</li>
<li>选择进程 -&gt; 根据所选内容创建</li>
</ol>
<h3 id="创建完整的子流程" tabindex="-1">创建完整的子流程 <a class="header-anchor" href="#创建完整的子流程" aria-label="Permalink to &quot;创建完整的子流程&quot;"></a></h3>
<ol>
<li>拖出子流程形状</li>
<li>选择进程 -&gt; 新建</li>
<li>在新建的图表中添加子流程</li>
</ol>
<p>可以利用 进程 -&gt; 链接到现有页面控制子流程的跳转位置
利用 <code>alt + 鼠标左键</code> 跳转到子流程。</p>
<h2 id="首字母大写改小写" tabindex="-1">首字母大写改小写 <a class="header-anchor" href="#首字母大写改小写" aria-label="Permalink to &quot;首字母大写改小写&quot;"></a></h2>
<p><code>工具</code> -&gt; <code>自动更正选项</code> 取消首字母大写功能</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/2016-10-19-visio.Bh0EL0kW.gif" length="0" type="image/gif"/>
        </item>
        <item>
            <title><![CDATA[json]]></title>
            <link>https://blog.zenheart.site/posts/2016-11-03-json</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-11-03-json</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[json
json 格式及使用
 为什么需要 json
讨论如下引用场景，家中的智能设备将状态上报给微信上的 webapp 显示。
设备端利用 socket 进行状态的上报，服务端采用  
a 是一个]]></description>
            <content:encoded><![CDATA[<h1 id="json" tabindex="-1">json <a class="header-anchor" href="#json" aria-label="Permalink to &quot;json&quot;"></a></h1>
<p><strong>json 格式及使用</strong></p>
<h2 id="为什么需要-json" tabindex="-1">为什么需要 json <a class="header-anchor" href="#为什么需要-json" aria-label="Permalink to &quot;为什么需要 json&quot;"></a></h2>
<p>讨论如下引用场景，家中的智能设备将状态上报给微信上的 webapp 显示。
设备端利用 socket 进行状态的上报，服务端采用<br>
a 是一个智能设备它会将每小时温度的数据存储为如下结构体。由于设备使用的是 C 语言数据结构如下:</p>
<div class="language-c++"><button title="Copy Code" class="copy"></button><span class="lang">c++</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">   typeof </span><span style="color:#F97583">struct</span><span style="color:#B392F0"> deviceTmp</span><span style="color:#E1E4E8">{  </span></span>
<span class="line"><span style="color:#F97583">       int</span><span style="color:#E1E4E8">  tmpTime[],</span><span style="color:#6A737D">   //温度的变化的时间戳</span></span>
<span class="line"><span style="color:#F97583">       int</span><span style="color:#E1E4E8">  tmpData[]</span><span style="color:#6A737D">    //对应各时间戳的温度</span></span>
<span class="line"><span style="color:#E1E4E8">   }</span></span></code></pre>
</div><p>假设传输方式为字符串模式，利用 socket 将消息发给了 node 的服务端处理，由于 node 采用的是 js
它需要把上述消息转变为如下格式。</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">   deviceTemp </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#E1E4E8">    tmpTime:[],</span></span>
<span class="line"><span style="color:#E1E4E8">    tmpData:[]</span></span>
<span class="line"><span style="color:#E1E4E8">   }</span></span></code></pre>
</div><p>如果 node 服务器还需要使用 http 将消息发给 php 服务器保存历史数据。则 php
服务器希望数据格式如下:</p>
<div class="language-php"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#79B8FF">      deviceTemp</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> aray</span><span style="color:#E1E4E8">(</span></span>
<span class="line"><span style="color:#9ECBFF">        "tmpTime"</span><span style="color:#F97583"> =></span><span style="color:#79B8FF"> array</span><span style="color:#E1E4E8">(),</span></span>
<span class="line"><span style="color:#9ECBFF">        "tmpData"</span><span style="color:#F97583"> =></span><span style="color:#79B8FF"> array</span><span style="color:#E1E4E8">()</span></span>
<span class="line"><span style="color:#E1E4E8">        </span></span>
<span class="line"><span style="color:#E1E4E8">      )</span></span></code></pre>
</div><p>我们来看一下整个消息的处理过程</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">设备 --编码结构体为字符串--> node服务器 --</span></span>
<span class="line"><span style="color:#E1E4E8">--> node 解码字符串 --编码字符串传给 php --> php 解码字符串处理</span></span></code></pre>
</div><p>数据本身为两个数组，由于设备，node 服务器，php 服务器采用不同的语言，所以在语法表征
相同数据结构时会存在差异。如何保证字符串在传送的过程中无需自定义加解码格式。</p>
<h2 id="json-是什么" tabindex="-1">json 是什么 <a class="header-anchor" href="#json-是什么" aria-label="Permalink to &quot;json 是什么&quot;"></a></h2>
<p>理解了上面的问题可以看出 json 是一种编码方式，规定了如何利用文本来表征不同的数据结构。
所以我们所说的 json 对象更具体来说是如何使用文本模式来表征对象(它只能表征数据对象属性并不能表征方法)。</p>
<p>json 的灵感来自 js 的对象字面量语法。采用键值对的方式来表示数据结构。
支持的基本数据类型包括<code>数值、字符串、数组,键值对结构</code></p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">   //只支持 10 进制</span></span>
<span class="line"><span style="color:#E1E4E8">   jsonNumber </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "12"</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#79B8FF">   JSON</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">parse</span><span style="color:#E1E4E8">(jsonNumber); </span><span style="color:#6A737D">// return  12</span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#6A737D">   //支持 unicode 字符集和转义字符字符串内容用双引号</span></span>
<span class="line"><span style="color:#E1E4E8">   jsonStr </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> '"dfdf</span><span style="color:#79B8FF">\n\u4e00</span><span style="color:#9ECBFF">"'</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#79B8FF">   JSON</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">parse</span><span style="color:#E1E4E8">(jsonStr); </span><span style="color:#6A737D">// {‘dfdf</span></span>
<span class="line"><span style="color:#6A737D">                        //   一'}"</span></span>
<span class="line"><span style="color:#6A737D">   //支持多维数组                </span></span>
<span class="line"><span style="color:#E1E4E8">   jsonArr </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "[1,2,3]"</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#79B8FF">   JSON</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">parse</span><span style="color:#E1E4E8">(jsonArr); </span><span style="color:#6A737D">// [1,2,3]     </span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#6A737D">   //键名必须为字符串用双引号</span></span>
<span class="line"><span style="color:#6A737D">   //{} 中定义键值对，内部支持基本类型和嵌套结构</span></span>
<span class="line"><span style="color:#E1E4E8">   jsonKeyValue </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> '{"key":12}'</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF">   JSON</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">parse</span><span style="color:#E1E4E8">(jsonKeyValue); </span><span style="color:#6A737D">// [1,2,3]       </span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#6A737D">   //注意简直对字符串中的两次转义</span></span>
<span class="line"><span style="color:#E1E4E8">   jsonKeyValue </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> '{"key":"</span><span style="color:#79B8FF">\\</span><span style="color:#9ECBFF">nvalue</span><span style="color:#79B8FF">\\</span><span style="color:#9ECBFF">u4e00"}'</span><span style="color:#E1E4E8">; </span></span>
<span class="line"><span style="color:#79B8FF">   JSON</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">parse</span><span style="color:#E1E4E8">(jsonKeyValue); </span><span style="color:#6A737D">// [1,2,3]</span></span></code></pre>
</div>]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[wamp]]></title>
            <link>https://blog.zenheart.site/posts/2016-11-14-wamp</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-11-14-wamp</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[wamp
wamp 的安装和配置笔记
 概述
wamp 是一个集成了 PHP、mysql、apache 的开发环境。
注意在 wamp 下重装环境时配置文件不会变化
这会导致原来无法运行的模块依旧不能]]></description>
            <content:encoded><![CDATA[<h1 id="wamp" tabindex="-1">wamp <a class="header-anchor" href="#wamp" aria-label="Permalink to &quot;wamp&quot;"></a></h1>
<p><strong>wamp 的安装和配置笔记</strong></p>
<h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h2>
<p>wamp 是一个集成了 PHP、mysql、apache 的开发环境。</p>
<p><strong>注意在 wamp 下重装环境时配置文件不会变化</strong>
这会导致原来无法运行的模块依旧不能正常工作。</p>
<ol>
<li>不要随便修改配置文件。记得备份，搞清楚了再动手。</li>
</ol>
<h2 id="debug" tabindex="-1">debug <a class="header-anchor" href="#debug" aria-label="Permalink to &quot;debug&quot;"></a></h2>
<p>在安装 apache 是，软件运行可能会出故障解决思路如下。</p>
<ol>
<li>定位错误</li>
</ol>
<p><img src="https://blog.zenheart.site/assets/2016-11-14-apache.D0LnY4kW.gif" alt="" loading="lazy"></p>
<p>若显示没有占用，请查看 apache 下 error log 的信息。
若利用上述步骤任无法定位问题，进入 wamp 下 apache 的 bin 目录。wamp 软件下路径如下
<code>\wamp\bin\apache\apache2.4.9\bin</code>。
在该路径下打开命令行工具，执行如下语句。</p>
<div class="language-dos"><button title="Copy Code" class="copy"></button><span class="lang">dos</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>   httpd.exe -e debug  //该命令会显示 apache 的加载过程</span></span></code></pre>
</div><p>根据结果定位错误位置。</p>
<ol start="2">
<li>处理错误</li>
</ol>
<ul>
<li>
<p>端口被占用</p>
<p>若Test Port 80 端口被占用。修改文件 apache.sysConst 。</p>
<pre><code>  Listen 0.0.0.0:80 改为
  Listen 0.0.0.0::8080
</code></pre>
</li>
<li>
<p>端口未被占用，wamp 服务为橙色</p>
<ol>
<li>左键点击 apache 图标，点击 Apache &gt; Service &gt; Install Service。</li>
<li>左键点击 apache 图标，点击  Apache &gt; Service &gt; Start Service</li>
<li>左键点击 apache 图标，点击 Put online 即可</li>
<li>若在执行上述步骤是出现 <code>Could not execute menu item</code>请参看如下链接<br>
<a href="http://stackoverflow.com/questions/10266656/could-not-execute-menu-item-internal-errorexception-when-changing-php-vers" target="_blank" rel="noreferrer">修改上线错误</a></li>
</ol>
</li>
<li>
<p>端口未被占用但是启用服务后显示 <code>Forbidden</code></p>
</li>
</ul>
<h2 id="配置数据库时无法重启" tabindex="-1">配置数据库时无法重启 <a class="header-anchor" href="#配置数据库时无法重启" aria-label="Permalink to &quot;配置数据库时无法重启&quot;"></a></h2>
<p>修改 <code>my.ini</code> 的配置文件时注意保存为 <strong>ASCII</strong> 格式。
<a href="http://stackoverflow.com/questions/8020297/mysql-my-cnf-file-found-option-without-preceding-group" target="_blank" rel="noreferrer">第一行错误</a></p>
<h2 id="经验" tabindex="-1">经验 <a class="header-anchor" href="#经验" aria-label="Permalink to &quot;经验&quot;"></a></h2>
<p>配置文件出错时去各分离部分查找问题。</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/2016-11-14-apache.D0LnY4kW.gif" length="0" type="image/gif"/>
        </item>
        <item>
            <title><![CDATA[putty]]></title>
            <link>https://blog.zenheart.site/posts/2016-12-02-putty</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-12-02-putty</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[putty
putty 的使用笔记
 利用 putty 实现利用远程服务器建立 tunnel 通道
1. 打开 putty 界面进行配置
    1. 配置会话选项填写远程服务器地址
    2. 选]]></description>
            <content:encoded><![CDATA[<h1 id="putty" tabindex="-1">putty <a class="header-anchor" href="#putty" aria-label="Permalink to &quot;putty&quot;"></a></h1>
<p><strong>putty 的使用笔记</strong></p>
<h2 id="利用-putty-实现利用远程服务器建立-tunnel-通道" tabindex="-1">利用 putty 实现利用远程服务器建立 tunnel 通道 <a class="header-anchor" href="#利用-putty-实现利用远程服务器建立-tunnel-通道" aria-label="Permalink to &quot;利用 putty 实现利用远程服务器建立 tunnel 通道&quot;"></a></h2>
<ol>
<li>
<p>打开 putty 界面进行配置</p>
<ol>
<li>配置会话选项填写远程服务器地址</li>
<li>选择 ssh -&gt; tunnel
<ol>
<li>Destination 选择 Dynamic 和 Auto</li>
<li>Source port 选择 1024 端口 点击添加</li>
</ol>
</li>
<li>重新回到 session 点击连接</li>
</ol>
<p><img src="https://blog.zenheart.site/assets/2016-12-02-putty.VqIVpCCg.gif" alt="" loading="lazy"></p>
</li>
<li>
<p>打开 firefox 选择工具 -&gt; 选项</p>
<ol>
<li>选择高级 -&gt;  网络 -&gt; 设置</li>
<li>选择手动配置 -&gt; SOCKS 主机
填入 localhost 1024 端口</li>
<li>点击确定后即可利用远程服务器作为 tunnel 通道实现访问。</li>
</ol>
<p><img src="https://blog.zenheart.site/assets/2016-12-02-putty1.iB9bvwM3.gif" alt="" loading="lazy"></p>
</li>
</ol>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/2016-12-02-putty.VqIVpCCg.gif" length="0" type="image/gif"/>
        </item>
        <item>
            <title><![CDATA[redis ]]></title>
            <link>https://blog.zenheart.site/posts/2016-12-18-redis</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-12-18-redis</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[redis 
redis 数据库的使用笔记
 环境配置
1. 源码安装 redis
```shell
    
   wget http://download.redis.io/redis-stabl]]></description>
            <content:encoded><![CDATA[<h1 id="redis" tabindex="-1">redis <a class="header-anchor" href="#redis" aria-label="Permalink to &quot;redis&quot;"></a></h1>
<p><strong>redis 数据库的使用笔记</strong></p>
<h1 id="环境配置" tabindex="-1">环境配置 <a class="header-anchor" href="#环境配置" aria-label="Permalink to &quot;环境配置&quot;"></a></h1>
<ol>
<li>源码安装 redis</li>
</ol>
<div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">   # </span></span>
<span class="line"><span style="color:#B392F0">   wget</span><span style="color:#9ECBFF"> http://download.redis.io/redis-stable.tar.gz</span></span>
<span class="line"><span style="color:#B392F0">   tar</span><span style="color:#9ECBFF"> xvzf</span><span style="color:#9ECBFF"> redis-stable.tar.gz</span></span>
<span class="line"><span style="color:#79B8FF">   cd</span><span style="color:#9ECBFF"> redis-stable</span></span>
<span class="line"><span style="color:#B392F0">   make</span></span></code></pre>
</div><ol start="2">
<li>安装 tcl 工具,<a href="http://www.linuxfromscratch.org/blfs/view/cvs/general/tcl.html" target="_blank" rel="noreferrer">tcl</a> 安装网页
参照连接进行安装。</li>
<li>启动</li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># mac</span></span>
<span class="line"><span style="color:#B392F0">sudo</span><span style="color:#9ECBFF"> brew</span><span style="color:#9ECBFF"> services</span><span style="color:#9ECBFF"> start</span><span style="color:#9ECBFF"> redis</span></span></code></pre>
</div><ol start="4">
<li>测试</li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 连接 redis</span></span>
<span class="line"><span style="color:#6A737D"># 若正常连接说明开启成功</span></span>
<span class="line"><span style="color:#B392F0">redis-cli</span></span></code></pre>
</div><h3 id="php-redis-扩展安装" tabindex="-1">php redis 扩展安装 <a class="header-anchor" href="#php-redis-扩展安装" aria-label="Permalink to &quot;php redis 扩展安装&quot;"></a></h3>
<ul>
<li>
<p><strong>centos 系统</strong></p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 确保安装  phpize</span></span>
<span class="line"><span style="color:#B392F0">yum</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> php71w-devel</span></span>
<span class="line"><span style="color:#6A737D"># 克隆 php redis 项目</span></span>
<span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> clone</span><span style="color:#9ECBFF"> https://github.com/phpredis/phpredis.git</span></span>
<span class="line"><span style="color:#6A737D"># 进入项目根目录</span></span>
<span class="line"><span style="color:#6A737D"># 参考 https://github.com/phpredis/phpredis#installation 完成剩余步骤</span></span></code></pre>
</div></li>
</ul>
<h2 id="工具" tabindex="-1">工具 <a class="header-anchor" href="#工具" aria-label="Permalink to &quot;工具&quot;"></a></h2>
<ul>
<li><a href="https://redislabs.com/blog/so-youre-looking-for-the-redis-gui/" target="_blank" rel="noreferrer">gui 工具</a></li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[百度地图]]></title>
            <link>https://blog.zenheart.site/posts/2016-12-26-baidu_map</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2016-12-26-baidu_map</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[
# 百度地图


**百度地图的使用笔记**


## 快速入门
这里讲解如何在 web 中使用百度地图 API.
1. 进入百度地图网站 [申请秘钥](http://lbsyun.baidu.com/)
2. 创建应用 ![](./img/2016-12-26-baidu_map.jpg)
3. 在界面中包含 js 脚本，其余加载方式详见 [百度 js 说明](http://lbsyun.baidu.com/index.php?title=jspopular/guide/introduction#.E8.8E.B7.E5.8F.96JavaScript_API.E6.9C.8D.E5.8A.A1.E6.96.B9.E6.B3.95)

    ```html
    <script src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥" type="text/javascript"></script>
        
    ```

4. 在界面中创造放置地图的元素
    
    ```html
       <div id="map" style="width:500px;height:320px"></div>  
    ```
5. 使用百度 js 对象创建地图
    ```html
       <script>
           /** 不要加 `# 号`，直接填入 id 名即可
            *  1. 创建 地图对象
            */
        
           var map = new BMap.Map("map"); 
          
          // 2. 创建坐标点 地理坐标点，经度:116.404，纬度:39.915
          var point = new BMap.Point(116.404, 39.915);          
          
          // 3. 地图初始化,15 表示地图比例的显示级别
          map.centerAndZoom(point, 15);
       
         // 4. 配置地图参数 过两秒后，将地图中心点移到经度:116.404，纬度:39.918 的地方 
         window.setTimeout(function(){  
             map.panTo(new BMap.Point(116.409, 39.918));    
         }, 2000);
       </script>     
    ```
    
## 基本概念
开发地图应用时相关术语如下。

| 名称   | 作用                                           |
| :]]></description>
            <content:encoded><![CDATA[<h1 id="百度地图" tabindex="-1">百度地图 <a class="header-anchor" href="#百度地图" aria-label="Permalink to &quot;百度地图&quot;"></a></h1>
<p><strong>百度地图的使用笔记</strong></p>
<h2 id="快速入门" tabindex="-1">快速入门 <a class="header-anchor" href="#快速入门" aria-label="Permalink to &quot;快速入门&quot;"></a></h2>
<p>这里讲解如何在 web 中使用百度地图 API.</p>
<ol>
<li>
<p>进入百度地图网站 <a href="http://lbsyun.baidu.com/" target="_blank" rel="noreferrer">申请秘钥</a></p>
</li>
<li>
<p>创建应用 <img src="https://blog.zenheart.site/assets/2016-12-26-baidu_map.ClUfAsWP.jpg" alt="" loading="lazy"></p>
</li>
<li>
<p>在界面中包含 js 脚本，其余加载方式详见 <a href="http://lbsyun.baidu.com/index.php?title=jspopular/guide/introduction#.E8.8E.B7.E5.8F.96JavaScript_API.E6.9C.8D.E5.8A.A1.E6.96.B9.E6.B3.95" target="_blank" rel="noreferrer">百度 js 说明</a></p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">script</span><span style="color:#B392F0"> src</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"http://api.map.baidu.com/api?v=2.0&#x26;ak=您的密钥"</span><span style="color:#B392F0"> type</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"text/javascript"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">script</span><span style="color:#E1E4E8">></span></span></code></pre>
</div></li>
<li>
<p>在界面中创造放置地图的元素</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">   &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> id</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"map"</span><span style="color:#B392F0"> style</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"width:500px;height:320px"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span></code></pre>
</div></li>
<li>
<p>使用百度 js 对象创建地图</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">   &#x3C;</span><span style="color:#85E89D">script</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#6A737D">       /** 不要加 `# 号`，直接填入 id 名即可</span></span>
<span class="line"><span style="color:#6A737D">        *  1. 创建 地图对象</span></span>
<span class="line"><span style="color:#6A737D">        */</span></span>
<span class="line"><span style="color:#E1E4E8">    </span></span>
<span class="line"><span style="color:#F97583">       var</span><span style="color:#E1E4E8"> map </span><span style="color:#F97583">=</span><span style="color:#F97583"> new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Map</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"map"</span><span style="color:#E1E4E8">); </span></span>
<span class="line"><span style="color:#E1E4E8">      </span></span>
<span class="line"><span style="color:#6A737D">      // 2. 创建坐标点 地理坐标点，经度:116.404，纬度:39.915</span></span>
<span class="line"><span style="color:#F97583">      var</span><span style="color:#E1E4E8"> point </span><span style="color:#F97583">=</span><span style="color:#F97583"> new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Point</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">116.404</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">39.915</span><span style="color:#E1E4E8">);          </span></span>
<span class="line"><span style="color:#E1E4E8">      </span></span>
<span class="line"><span style="color:#6A737D">      // 3. 地图初始化,15 表示地图比例的显示级别</span></span>
<span class="line"><span style="color:#E1E4E8">      map.</span><span style="color:#B392F0">centerAndZoom</span><span style="color:#E1E4E8">(point, </span><span style="color:#79B8FF">15</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#6A737D">     // 4. 配置地图参数 过两秒后，将地图中心点移到经度:116.404，纬度:39.918 的地方 </span></span>
<span class="line"><span style="color:#E1E4E8">     window.</span><span style="color:#B392F0">setTimeout</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">function</span><span style="color:#E1E4E8">(){  </span></span>
<span class="line"><span style="color:#E1E4E8">         map.</span><span style="color:#B392F0">panTo</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Point</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">116.409</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">39.918</span><span style="color:#E1E4E8">));    </span></span>
<span class="line"><span style="color:#E1E4E8">     }, </span><span style="color:#79B8FF">2000</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">   &#x3C;/</span><span style="color:#85E89D">script</span><span style="color:#E1E4E8">></span></span></code></pre>
</div></li>
</ol>
<h2 id="基本概念" tabindex="-1">基本概念 <a class="header-anchor" href="#基本概念" aria-label="Permalink to &quot;基本概念&quot;"></a></h2>
<p>开发地图应用时相关术语如下。</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">名称</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">控件</td>
<td>控制地图显示属性的小组件，例如定位，比例尺等</td>
</tr>
<tr>
<td style="text-align:left">覆盖物</td>
<td>叠加到地图上的显示称为覆盖物，例如目的地标记等</td>
</tr>
</tbody>
</table>
<h3 id="控件" tabindex="-1">控件 <a class="header-anchor" href="#控件" aria-label="Permalink to &quot;控件&quot;"></a></h3>
<p>百度支持的基本控件</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">类名称</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Control</td>
<td>抽象基类，所有控件均继承此类</td>
</tr>
<tr>
<td style="text-align:left">NavigationControl</td>
<td>平移缩放控件，实现平移缩放</td>
</tr>
<tr>
<td style="text-align:left">OverviewMapControl</td>
<td>缩略地图控件，实现可折叠的缩略地图</td>
</tr>
<tr>
<td style="text-align:left">ScaleControl</td>
<td>比例尺控件，显示地图的比例关系</td>
</tr>
<tr>
<td style="text-align:left">MapTypeControl</td>
<td>地图类型控件，显示地图的比例关系</td>
</tr>
<tr>
<td style="text-align:left">CopyrightControl</td>
<td>版权控件</td>
</tr>
<tr>
<td style="text-align:left">GeolocationControl</td>
<td>定位控件</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>控件操作</strong></p>
</blockquote>
<ol>
<li>
<p>添加控件</p>
<p>在实例化地图对象后使用 <code>addControl</code> 方法添加控件</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">   // 添加平移缩放控件</span></span>
<span class="line"><span style="color:#E1E4E8">   map.</span><span style="color:#B392F0">addControl</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">NavigationControl</span><span style="color:#E1E4E8">());</span></span></code></pre>
</div></li>
<li>
<p>配置控件</p>
<ol>
<li>更改位置</li>
<li>修改大小</li>
</ol>
</li>
</ol>
<blockquote>
<p><strong>自定义控件</strong></p>
</blockquote>
<p>自定义控件，需要继承控件的基类。
构造器中必须包含如下属性</p>
<ul>
<li>defaultAnchor 设置控件位置</li>
<li>defaultOffset 设置控件偏移</li>
</ul>
<p>参照百度说明，定义单击放大两个图像级别控件。</p>
<ol>
<li>
<p>设置构造函数</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">   // 定义一个控件类，即function    </span></span>
<span class="line"><span style="color:#F97583">   function</span><span style="color:#B392F0"> ZoomControl</span><span style="color:#E1E4E8">(){    </span></span>
<span class="line"><span style="color:#6A737D">       // 设置默认停靠位置和偏移量  </span></span>
<span class="line"><span style="color:#79B8FF">       this</span><span style="color:#E1E4E8">.defaultAnchor </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> BMAP_ANCHOR_TOP_LEFT</span><span style="color:#E1E4E8">;    </span></span>
<span class="line"><span style="color:#79B8FF">       this</span><span style="color:#E1E4E8">.defaultOffset </span><span style="color:#F97583">=</span><span style="color:#F97583"> new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Size</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">10</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">10</span><span style="color:#E1E4E8">);    </span></span>
<span class="line"><span style="color:#E1E4E8">   }    </span></span>
<span class="line"><span style="color:#6A737D">   // 通过JavaScript的prototype属性继承于BMap.Control   </span></span>
<span class="line"><span style="color:#79B8FF">   ZoomControl</span><span style="color:#E1E4E8">.</span><span style="color:#79B8FF">prototype</span><span style="color:#F97583"> =</span><span style="color:#F97583"> new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Control</span><span style="color:#E1E4E8">();</span></span></code></pre>
</div></li>
<li>
<p>初始化控件</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">// 自定义控件必须实现initialize方法，并且将控件的DOM元素返回   </span></span>
<span class="line"><span style="color:#6A737D">// 在本方法中创建个div元素作为控件的容器，并将其添加到地图容器中   </span></span>
<span class="line"><span style="color:#79B8FF">ZoomControl</span><span style="color:#E1E4E8">.</span><span style="color:#79B8FF">prototype</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">initialize</span><span style="color:#F97583"> =</span><span style="color:#F97583"> function</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">map</span><span style="color:#E1E4E8">){    </span></span>
<span class="line"><span style="color:#6A737D">// 创建一个DOM元素   </span></span>
<span class="line"><span style="color:#F97583"> var</span><span style="color:#E1E4E8"> div </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> document.</span><span style="color:#B392F0">createElement</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"div"</span><span style="color:#E1E4E8">);    </span></span>
<span class="line"><span style="color:#6A737D">// 添加文字说明    </span></span>
<span class="line"><span style="color:#E1E4E8"> div.</span><span style="color:#B392F0">appendChild</span><span style="color:#E1E4E8">(document.</span><span style="color:#B392F0">createTextNode</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"放大2级"</span><span style="color:#E1E4E8">));    </span></span>
<span class="line"><span style="color:#6A737D"> // 设置样式    </span></span>
<span class="line"><span style="color:#E1E4E8"> div.style.cursor </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "pointer"</span><span style="color:#E1E4E8">;    </span></span>
<span class="line"><span style="color:#E1E4E8"> div.style.border </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "1px solid gray"</span><span style="color:#E1E4E8">;    </span></span>
<span class="line"><span style="color:#E1E4E8"> div.style.backgroundColor </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "white"</span><span style="color:#E1E4E8">;    </span></span>
<span class="line"><span style="color:#6A737D"> // 绑定事件，点击一次放大两级    </span></span>
<span class="line"><span style="color:#E1E4E8"> div.</span><span style="color:#B392F0">onclick</span><span style="color:#F97583"> =</span><span style="color:#F97583"> function</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">e</span><span style="color:#E1E4E8">){  </span></span>
<span class="line"><span style="color:#E1E4E8">  map.</span><span style="color:#B392F0">zoomTo</span><span style="color:#E1E4E8">(map.</span><span style="color:#B392F0">getZoom</span><span style="color:#E1E4E8">() </span><span style="color:#F97583">+</span><span style="color:#79B8FF"> 2</span><span style="color:#E1E4E8">);    </span></span>
<span class="line"><span style="color:#E1E4E8"> }    </span></span>
<span class="line"><span style="color:#6A737D"> // 添加DOM元素到地图中   </span></span>
<span class="line"><span style="color:#E1E4E8"> map.</span><span style="color:#B392F0">getContainer</span><span style="color:#E1E4E8">().</span><span style="color:#B392F0">appendChild</span><span style="color:#E1E4E8">(div);    </span></span>
<span class="line"><span style="color:#6A737D"> // 将DOM元素返回  </span></span>
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> div;    </span></span>
<span class="line"><span style="color:#E1E4E8"> }</span></span></code></pre>
</div></li>
<li>
<p>添加自定义控件</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">    map.</span><span style="color:#B392F0">addControl</span><span style="color:#E1E4E8">( </span><span style="color:#F97583">new</span><span style="color:#B392F0"> ZoomControl</span><span style="color:#E1E4E8">());</span></span></code></pre>
</div></li>
</ol>
<h3 id="覆盖物" tabindex="-1">覆盖物 <a class="header-anchor" href="#覆盖物" aria-label="Permalink to &quot;覆盖物&quot;"></a></h3>
<p>覆盖物有如下几类</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">对象名</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Overlay</td>
<td>覆盖物的抽象基类，所有覆盖物继承此基类</td>
</tr>
<tr>
<td style="text-align:left">Marker</td>
<td>标注地图上的点，可自定义图标形状</td>
</tr>
<tr>
<td style="text-align:left">Label</td>
<td>地图上文本标注，可自定义文本内容</td>
</tr>
<tr>
<td style="text-align:left">Polyline</td>
<td>地图上折线</td>
</tr>
<tr>
<td style="text-align:left">Polygon</td>
<td>地图上多边形，可自定义填充色</td>
</tr>
<tr>
<td style="text-align:left">Circle</td>
<td>地图上原型区块</td>
</tr>
<tr>
<td style="text-align:left">InfoWindow</td>
<td>地图上信息窗口,同一时刻只能有一个信息窗口显示</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>覆盖物使用</strong></p>
</blockquote>
<p>类似空间，使用<code>addOverlay</code>添加覆盖物</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">   //初始化覆盖物添加坐标</span></span>
<span class="line"><span style="color:#F97583">   var</span><span style="color:#E1E4E8"> point </span><span style="color:#F97583">=</span><span style="color:#F97583"> new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Point</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">116.404</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">39.915</span><span style="color:#E1E4E8">);    </span></span>
<span class="line"><span style="color:#6A737D">   //添加覆盖物</span></span>
<span class="line"><span style="color:#E1E4E8">   map.</span><span style="color:#B392F0">addOverlay</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Marker</span><span style="color:#E1E4E8">(point));</span></span></code></pre>
</div><blockquote>
<p><strong>自定义覆盖物</strong></p>
</blockquote>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">   function</span><span style="color:#B392F0"> addMarker</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">point</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">index</span><span style="color:#E1E4E8">){  </span><span style="color:#6A737D">// 创建图标对象   </span></span>
<span class="line"><span style="color:#F97583">   var</span><span style="color:#E1E4E8"> myIcon </span><span style="color:#F97583">=</span><span style="color:#F97583"> new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Icon</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"ev_charger.png"</span><span style="color:#E1E4E8">, </span><span style="color:#F97583">new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Size</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">25</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">25</span><span style="color:#E1E4E8">), {    </span></span>
<span class="line"><span style="color:#6A737D">   // 指定定位位置。   </span></span>
<span class="line"><span style="color:#6A737D">   // 当标注显示在地图上时，其所指向的地理位置距离图标左上    </span></span>
<span class="line"><span style="color:#6A737D">   // 角各偏移10像素和25像素。您可以看到在本例中该位置即是   </span></span>
<span class="line"><span style="color:#6A737D">      // 图标中央下端的尖角位置。    </span></span>
<span class="line"><span style="color:#E1E4E8">      offset: </span><span style="color:#F97583">new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Size</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">10</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">25</span><span style="color:#E1E4E8">),    </span></span>
<span class="line"><span style="color:#6A737D">      // 设置图片偏移。   </span></span>
<span class="line"><span style="color:#6A737D">      // 当您需要从一幅较大的图片中截取某部分作为标注图标时，您   </span></span>
<span class="line"><span style="color:#6A737D">      // 需要指定大图的偏移位置，此做法与css sprites技术类似。    </span></span>
<span class="line"><span style="color:#E1E4E8">      imageOffset: </span><span style="color:#F97583">new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Size</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">0</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">0</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8"> index </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 25</span><span style="color:#E1E4E8">)   </span><span style="color:#6A737D">// 设置图片偏移    </span></span>
<span class="line"><span style="color:#E1E4E8">    });      </span></span>
<span class="line"><span style="color:#6A737D">   // 创建标注对象并添加到地图   </span></span>
<span class="line"><span style="color:#F97583">    var</span><span style="color:#E1E4E8"> marker </span><span style="color:#F97583">=</span><span style="color:#F97583"> new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Marker</span><span style="color:#E1E4E8">(point, {icon: myIcon});    </span></span>
<span class="line"><span style="color:#E1E4E8">    map.</span><span style="color:#B392F0">addOverlay</span><span style="color:#E1E4E8">(marker);    </span></span>
<span class="line"><span style="color:#E1E4E8">   }    </span></span>
<span class="line"><span style="color:#6A737D">   // 随机向地图添加10个标注    </span></span>
<span class="line"><span style="color:#F97583">   var</span><span style="color:#E1E4E8"> bounds </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> map.</span><span style="color:#B392F0">getBounds</span><span style="color:#E1E4E8">();    </span></span>
<span class="line"><span style="color:#F97583">   var</span><span style="color:#E1E4E8"> lngSpan </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> bounds.maxX </span><span style="color:#F97583">-</span><span style="color:#E1E4E8"> bounds.minX;    </span></span>
<span class="line"><span style="color:#F97583">   var</span><span style="color:#E1E4E8"> latSpan </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> bounds.maxY </span><span style="color:#F97583">-</span><span style="color:#E1E4E8"> bounds.minY;    </span></span>
<span class="line"><span style="color:#F97583">   for</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">var</span><span style="color:#E1E4E8"> i </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 0</span><span style="color:#E1E4E8">; i </span><span style="color:#F97583">&#x3C;</span><span style="color:#79B8FF"> 10</span><span style="color:#E1E4E8">; i </span><span style="color:#F97583">++</span><span style="color:#E1E4E8">) {    </span></span>
<span class="line"><span style="color:#F97583">    var</span><span style="color:#E1E4E8"> point </span><span style="color:#F97583">=</span><span style="color:#F97583"> new</span><span style="color:#E1E4E8"> BMap.</span><span style="color:#B392F0">Point</span><span style="color:#E1E4E8">(bounds.minX </span><span style="color:#F97583">+</span><span style="color:#E1E4E8"> lngSpan </span><span style="color:#F97583">*</span><span style="color:#E1E4E8"> (Math.</span><span style="color:#B392F0">random</span><span style="color:#E1E4E8">() </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 0.7</span><span style="color:#F97583"> +</span><span style="color:#79B8FF"> 0.15</span><span style="color:#E1E4E8">),    </span></span>
<span class="line"><span style="color:#E1E4E8">                               bounds.minY </span><span style="color:#F97583">+</span><span style="color:#E1E4E8"> latSpan </span><span style="color:#F97583">*</span><span style="color:#E1E4E8"> (Math.</span><span style="color:#B392F0">random</span><span style="color:#E1E4E8">() </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 0.7</span><span style="color:#F97583"> +</span><span style="color:#79B8FF"> 0.15</span><span style="color:#E1E4E8">));    </span></span>
<span class="line"><span style="color:#B392F0">    addMarker</span><span style="color:#E1E4E8">(point, i);    </span></span>
<span class="line"><span style="color:#E1E4E8">   }</span></span></code></pre>
</div><h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<ul>
<li><a href="http://lbsyun.baidu.com/index.php?title=open/library" target="_blank" rel="noreferrer">百度工具包</a></li>
<li><a href="http://lbsyun.baidu.com/jsdemo.htm#c1_14" target="_blank" rel="noreferrer">百度地图示例</a></li>
<li><a href="http://wiki.lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html" target="_blank" rel="noreferrer">地图类参考</a></li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/2016-12-26-baidu_map.ClUfAsWP.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[github]]></title>
            <link>https://blog.zenheart.site/posts/2017-01-12-github</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-01-12-github</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[github
github 的使用笔记
 github pages
 概述
github 提供 `&lt;username
github page 存在两种类型.
* 用户或组织的主页
    * 仓]]></description>
            <content:encoded><![CDATA[<h1 id="github" tabindex="-1">github <a class="header-anchor" href="#github" aria-label="Permalink to &quot;github&quot;"></a></h1>
<p><strong>github 的使用笔记</strong></p>
<h2 id="github-pages" tabindex="-1">github pages <a class="header-anchor" href="#github-pages" aria-label="Permalink to &quot;github pages&quot;"></a></h2>
<h3 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h3>
<p>github 提供 <code>&lt;username&gt;.github.io</code> 的域名,作为用户 github 仓库静态服务的地址.
github page 存在两种类型.</p>
<ul>
<li>
<p>用户或组织的主页</p>
<ul>
<li>仓库名必须为 <code>&lt;username&gt;.github.io</code></li>
<li>整个 master 分支下的内容用来编译生成你的主页</li>
<li>仓库根目录,映射地址为 <code>&lt;username&gt;.github.io/</code></li>
</ul>
</li>
<li>
<p>用户或组织项目主页</p>
<ul>
<li>master 或 gh-pages 整个分支编译生成项目主页</li>
<li>只使用 master 下的 <code>docs</code> 文件夹作为项目主页</li>
<li>项目根目录或 docs 目录,映射地址为 <code>&lt;username&gt;.github.io/&lt;projectname&gt;/</code></li>
</ul>
</li>
</ul>
<p>路径映射原理参见 <a href="https://help.github.com/articles/user-organization-and-project-pages/" target="_blank" rel="noreferrer">用户组织项目页面</a>.
使用 github page 具有如下限制</p>
<ul>
<li>资料内容不大于 1GB</li>
<li>流量限制 100GB/月</li>
<li>编译限制 10/小时</li>
</ul>
<p>github 主页除了利用 html ,还可使用 <a href="https://jekyllrb.com/docs/installation/" target="_blank" rel="noreferrer">Jekyll</a>
来编译生成静态页面.</p>
<h2 id="github-pages-快速配置" tabindex="-1">github pages 快速配置 <a class="header-anchor" href="#github-pages-快速配置" aria-label="Permalink to &quot;github pages 快速配置&quot;"></a></h2>
<p>下面以用户 github pages 为例讲解配置步骤.
项目中的 github pages 类似.</p>
<ol>
<li>
<p>在 github 主页创建仓库名为 <code>&lt;username&gt;.github.io</code> 的项目</p>
</li>
<li>
<p>在创建的项目的 <code>Settings</code> 选项 <code>github pages</code> 区域</p>
<ul>
<li>选择以 master branch 为主页 (默认纪委该选项)</li>
</ul>
</li>
<li>
<p>在仓库中中添加 <code>index.html</code> 文件内容为</p>
</li>
</ol>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">>hello world!&#x3C;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><ol start="4">
<li>保存修改后,访问 <code>http(s)://&lt;username&gt;.github.io/index.html</code> 即可查看到内容.</li>
</ol>
<p>可参考</p>
<ul>
<li><a href="https://help.github.com/categories/customizing-github-pages/" target="_blank" rel="noreferrer">github pages 自定义</a></li>
<li><a href="https://github.com/showcases/github-pages-examples" target="_blank" rel="noreferrer">github pages demo</a></li>
</ul>
<h2 id="使用-jekyll-编译原始内容" tabindex="-1">使用 jekyll 编译原始内容 <a class="header-anchor" href="#使用-jekyll-编译原始内容" aria-label="Permalink to &quot;使用 jekyll 编译原始内容&quot;"></a></h2>
<ol>
<li>忽略文件中添加 _<code>site</code> 文件夹作为本地浏览内容</li>
<li>添加全局配置文件 <code>_config.yml</code></li>
</ol>
<p>参看 <a href="http://jmcglone.com/guides/github-pages/" target="_blank" rel="noreferrer">github pages 基本使用</a></p>
<h2 id="github-key-already-in-use" tabindex="-1">github Key already in use <a class="header-anchor" href="#github-key-already-in-use" aria-label="Permalink to &quot;github Key already in use&quot;"></a></h2>
<p><a href="https://help.github.com/articles/error-key-already-in-use/" target="_blank" rel="noreferrer">解决方法</a></p>
<p>删除仓库中的公钥.在全局设置中添加即可.</p>
<h2 id="github-api" tabindex="-1">github api <a class="header-anchor" href="#github-api" aria-label="Permalink to &quot;github api&quot;"></a></h2>
<ol>
<li>登录用户后,在 <code>Settings/Developer settings</code>
personal access tokens 下生成 token.</li>
<li>参考 <a href="https://developer.github.com/v3/guides/getting-started/#create-a-repository" target="_blank" rel="noreferrer">api </a> 进行调用</li>
</ol>
<p>也可采用其他授权方式调用接口 <a href="https://developer.github.com/v3/auth/#basic-authentication" target="_blank" rel="noreferrer">授权调用</a></p>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<ul>
<li><a href="https://jekyllrb.com/" target="_blank" rel="noreferrer">jekyll</a></li>
<li><a href="https://help.github.com/articles/custom-domain-redirects-for-github-pages-sites/" target="_blank" rel="noreferrer">域名重定向规则</a></li>
<li><a href="https://pages.github.com/" target="_blank" rel="noreferrer">github.io 快速入门</a></li>
<li><a href="http://www.worldhello.net/gotgithub/03-project-hosting/050-homepage.html" target="_blank" rel="noreferrer">github.io  搭建</a></li>
<li><a href="https://help.github.com/categories/customizing-github-pages/" target="_blank" rel="noreferrer">github help</a></li>
<li><a href="https://help.github.com/articles/configuring-a-publishing-source-for-github-pages/" target="_blank" rel="noreferrer">config github page</a></li>
<li><a href="https://pages.github.com/" target="_blank" rel="noreferrer">github pages</a></li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[sublime]]></title>
            <link>https://blog.zenheart.site/posts/2017-02-04-sublime</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-02-04-sublime</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[sublime
sublime 编辑器的使用
 概述
sublime 是一款编辑器。
 基本配置
1. 去官网下载对应的版本进行安装
sublime text
安装完成后使用 `subl --vers]]></description>
            <content:encoded><![CDATA[<h1 id="sublime" tabindex="-1">sublime <a class="header-anchor" href="#sublime" aria-label="Permalink to &quot;sublime&quot;"></a></h1>
<p><strong>sublime 编辑器的使用</strong></p>
<h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h2>
<p>sublime 是一款编辑器。</p>
<h2 id="基本配置" tabindex="-1">基本配置 <a class="header-anchor" href="#基本配置" aria-label="Permalink to &quot;基本配置&quot;"></a></h2>
<ol>
<li>去官网下载对应的版本进行安装
<a href="https://www.sublimetext.com/3" target="_blank" rel="noreferrer">sublime text</a></li>
</ol>
<p>安装完成后使用 <code>subl --version</code> 查看版本。
在 <code>help -&gt; enter lincense</code> 中输入如下秘钥升级到 sublime 3.</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>   —– BEGIN LICENSE —–</span></span>
<span class="line"><span>   Michael Barnes</span></span>
<span class="line"><span>   Single User License</span></span>
<span class="line"><span>   EA7E-821385</span></span>
<span class="line"><span>   8A353C41 872A0D5C DF9B2950 AFF6F667</span></span>
<span class="line"><span>   C458EA6D 8EA3C286 98D1D650 131A97AB</span></span>
<span class="line"><span>   AA919AEC EF20E143 B361B1E7 4C8B7F04</span></span>
<span class="line"><span>   B085E65E 2F5F5360 8489D422 FB8FC1AA</span></span>
<span class="line"><span>   93F6323C FD7F7544 3F39C318 D95E6480</span></span>
<span class="line"><span>   FCCC7561 8A4A1741 68FA4223 ADCEDE07</span></span>
<span class="line"><span>   200C25BE DBBC4855 C4CFB774 C5EC138C</span></span>
<span class="line"><span>   0FEC1CEF D9DCECEC D3A5DAD1 01316C36</span></span>
<span class="line"><span>   —— END LICENSE ——</span></span></code></pre>
</div><p>若密钥不可用可咨询查找。</p>
<ol start="2">
<li>
<p>安装包管理工具 package control</p>
<ol>
<li>
<p>去 <a href="https://packagecontrol.io/installation#st3" target="_blank" rel="noreferrer">package control</a></p>
</li>
<li>
<p>参照描述进行安装</p>
<ol>
<li>参照 simple 的步骤，在sublime 下利用快捷键<code>ctrl + ~</code> 打开控制台，复制其中 sublime3 内容到控制行。点击回车</li>
<li>安装完成后重启 sublime</li>
<li>利用 <code>ctrl + shift + p</code> 打开模板，在其中输入<code>package control</code> 可以看到一系类的指令直接点击<code>install package</code> 就会在在弹出一个窗口，直接在窗口中安装你所需要的插件即可</li>
</ol>
<p>安装该软件时可可能汇报如下错误，缺失 _ssl 文件。解决如下<a href="https://github.com/wbond/package_control/issues/989" target="_blank" rel="noreferrer">缺失_ssl</a></p>
</li>
<li>
<p>参看 <a href="https://packagecontrol.io/docs/usage" target="_blank" rel="noreferrer">package usage</a> 验证安装成功</p>
</li>
</ol>
</li>
<li>
<p>利用包管理工具安装如下插件</p>
<ol>
<li>使用 <code>ctrl + shift + p</code>(linux) 打开包管理工具</li>
<li>输入 pci ，选择 <code>install package</code> 安装插件</li>
<li>注意输入如下插件名进行安装
<ul>
<li>autoprefix      自动添加 css 前缀</li>
<li>colorpicker     自动添加颜色</li>
<li>emmet            快速编写 css 的利器</li>
<li>html-css-js prettify 格式化利器</li>
<li>git gutter       标识文件修改</li>
<li>gutter color      标识 css 有颜色属性的语句</li>
</ul>
</li>
</ol>
</li>
</ol>
<h2 id="常用快捷键" tabindex="-1">常用快捷键 <a class="header-anchor" href="#常用快捷键" aria-label="Permalink to &quot;常用快捷键&quot;"></a></h2>
<h3 id="编辑" tabindex="-1">编辑 <a class="header-anchor" href="#编辑" aria-label="Permalink to &quot;编辑&quot;"></a></h3>
<ul>
<li><code>ctrl + shift + d</code> 复制一行</li>
<li><code>ctrl + shift + 上下键 </code> 移动某一行</li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[技术学习方法论]]></title>
            <link>https://blog.zenheart.site/posts/2017-02-09-how_to_learning_language</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-02-09-how_to_learning_language</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[# 技术学习方法论

**技术学习的目的方法等**

]]></description>
            <content:encoded><![CDATA[<h1 id="技术学习方法论" tabindex="-1">技术学习方法论 <a class="header-anchor" href="#技术学习方法论" aria-label="Permalink to &quot;技术学习方法论&quot;"></a></h1>
<p><strong>技术学习的目的方法等</strong></p>
<hr>
<h2 id="引言" tabindex="-1">引言 <a class="header-anchor" href="#引言" aria-label="Permalink to &quot;引言&quot;"></a></h2>
<p>在学习繁杂的 web 技术过程中，有时会陷入一定的焦虑，焦虑的问题如下！</p>
<ol>
<li>如何选择技术栈？</li>
<li>如何快速上手一门技术？</li>
<li>学会一门技术到精通一门技术的考量标准到底是什么？</li>
<li>如何成为专家级的技术人员？
...</li>
</ol>
<h2 id="技术的阶段性" tabindex="-1">技术的阶段性 <a class="header-anchor" href="#技术的阶段性" aria-label="Permalink to &quot;技术的阶段性&quot;"></a></h2>
<ol>
<li>听过但是忘了</li>
<li>见过还记得</li>
<li>做过且理解</li>
</ol>
<h2 id="如何选择技术栈" tabindex="-1">如何选择技术栈 <a class="header-anchor" href="#如何选择技术栈" aria-label="Permalink to &quot;如何选择技术栈&quot;"></a></h2>
<!-- TODO:此处需补充 -->
<h2 id="学习模式" tabindex="-1">学习模式 <a class="header-anchor" href="#学习模式" aria-label="Permalink to &quot;学习模式&quot;"></a></h2>
<p>通过阅读有些的博文总结出了一些内在的规律性。</p>
<ol>
<li><strong>套路化</strong>
有详细的操作流程和操作步骤，具有逻辑性和条理性。</li>
<li><strong>阶梯性</strong><br>
讲解的方式符合认知规律，都是从最基本的概念入手，逐层递进，实现对知识的整理和讲解。</li>
<li><strong>模块性</strong><br>
自成体系，有独立成章，整片文章具有弱相关和强独立，这就意味着对于不同层级的阅读者，能够提供多样的阅读体验。</li>
</ol>
<h2 id="学习问题" tabindex="-1">学习问题 <a class="header-anchor" href="#学习问题" aria-label="Permalink to &quot;学习问题&quot;"></a></h2>
<ol>
<li>建立基础认知，这是第一个阶段学会用</li>
<li>建立场景，这是目前最缺乏的东西，每次，学完都没有绑定典型情景,导致基本认知出现断裂。需要进行如下强化。
<ol>
<li>总结典型应用场景</li>
<li>积累共性场景和模式</li>
<li>精简优化场景形成模板</li>
</ol>
</li>
<li>建立场景化后需要进一步进行系统级构建
<ol>
<li>场景的组合使用</li>
<li>建立场景模式的搭建原则</li>
</ol>
</li>
</ol>
<h2 id="递归原则" tabindex="-1">递归原则 <a class="header-anchor" href="#递归原则" aria-label="Permalink to &quot;递归原则&quot;"></a></h2>
<ol>
<li>从基本层级开始</li>
<li>深化一个层级</li>
<li>实现递归</li>
</ol>
<h2 id="读源码" tabindex="-1">读源码 <a class="header-anchor" href="#读源码" aria-label="Permalink to &quot;读源码&quot;"></a></h2>
<p>弄清楚设计思路，进行检索。</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[mermaid]]></title>
            <link>https://blog.zenheart.site/posts/2017-04-20-mermaid</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-04-20-mermaid</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[mermaid
基于 markdown 或 hmml 的画图工具
 参考资料
*  ] [mermaid]]></description>
            <content:encoded><![CDATA[<h1 id="mermaid" tabindex="-1">mermaid <a class="header-anchor" href="#mermaid" aria-label="Permalink to &quot;mermaid&quot;"></a></h1>
<p><strong>基于 markdown 或 hmml 的画图工具</strong></p>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<ul>
<li>[ ] <a href="http://knsv.github.io/mermaid/#mermaid" target="_blank" rel="noreferrer">mermaid</a></li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[github pages]]></title>
            <link>https://blog.zenheart.site/posts/2017-04-30-github-pages</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-04-30-github-pages</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[github pages
github pages 的使用详解
 概述
github pages  是基于 github 的静态仓库.
可以利用 github pages 建立属于你的静态博客.此外 ]]></description>
            <content:encoded><![CDATA[<h1 id="github-pages" tabindex="-1">github pages <a class="header-anchor" href="#github-pages" aria-label="Permalink to &quot;github pages&quot;"></a></h1>
<p><strong>github pages 的使用详解</strong></p>
<h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h2>
<p><a href="https://pages.github.com/" target="_blank" rel="noreferrer">github pages</a>  是基于 github 的静态仓库.
可以利用 github pages 建立属于你的静态博客.此外 github 还提供了基于 <a href="http://jekyllrb.com/" target="_blank" rel="noreferrer">jekyll</a>
的静态网站编译服务,参照 jekyll 的文档规则将文件上传到 github,它会将内容自动编译成静态网站.通过 <code>&lt;username&gt;.github.io</code> 可以直接访问网站内容.</p>
<h2 id="快速入门" tabindex="-1">快速入门 <a class="header-anchor" href="#快速入门" aria-label="Permalink to &quot;快速入门&quot;"></a></h2>
<ol>
<li>
<p>在 github 创建 <code>&lt;username&gt;.github.io</code> 的仓库.
例如我的 github 账户名为 <code>zenHeart</code> 仓库名为 <code>zenHeart.githu.io</code>.</p>
</li>
<li>
<p>本地安装 jekyll 的环境.</p>
<p>先保证安装了 ruby 环境.</p>
<ol>
<li>
<p>安装 jekyll</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">gem</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> jekyll</span></span></code></pre>
</div></li>
<li>
<p>安装 bundle 包管理工具</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">gem</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> bundle</span></span></code></pre>
</div></li>
</ol>
</li>
<li>
<p>初始化 jekyll blog.</p>
</li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 选择路径,初始化 jekyll 的 blog 目录</span></span>
<span class="line"><span style="color:#B392F0">jekyll</span><span style="color:#9ECBFF"> new</span><span style="color:#9ECBFF"> github_blog</span><span style="color:#E1E4E8"> </span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 切换到该目录</span></span>
<span class="line"><span style="color:#79B8FF">cd</span><span style="color:#9ECBFF"> github_blog</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 安装依赖</span></span>
<span class="line"><span style="color:#B392F0">bundle</span><span style="color:#9ECBFF"> install</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 查看测试网页</span></span>
<span class="line"><span style="color:#B392F0">jekyll</span><span style="color:#9ECBFF"> serve</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 访问 localhost:4000 即可看到 jekyll</span></span></code></pre>
</div><ol start="4">
<li>配置本地仓库</li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 在 gitpage_blog 文件下初始化  </span></span>
<span class="line"><span style="color:#B392F0">git</span><span style="color:#9ECBFF"> init</span></span></code></pre>
</div><p>编辑 <code>.gitignore</code> 文件
添加如下内容</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span># 忽略项目文件</span></span>
<span class="line"><span>.idea</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 忽略本地编译后站点</span></span>
<span class="line"><span>_site</span></span></code></pre>
</div><p>添加 github pages 仓库地址</p>
<div class="language-git"><button title="Copy Code" class="copy"></button><span class="lang">git</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>git remote add &#x3C;url></span></span></code></pre>
</div><div class="language-javascript"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">var</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">function</span><span style="color:#B392F0"> add</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">a</span><span style="color:#E1E4E8">,</span><span style="color:#FFAB70">b</span><span style="color:#E1E4E8">) {</span></span>
<span class="line"><span style="color:#F97583">    return</span><span style="color:#E1E4E8"> a </span><span style="color:#F97583">+</span><span style="color:#E1E4E8"> b;</span></span>
<span class="line"><span style="color:#E1E4E8">  </span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#79B8FF">JSON</span><span style="color:#E1E4E8">.</span><span style="color:#B392F0">stringify</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'hello'</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">console.</span><span style="color:#B392F0">log</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'demo'</span><span style="color:#E1E4E8">);</span></span></code></pre>
</div>]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[jekyll]]></title>
            <link>https://blog.zenheart.site/posts/2017-05-05-jekyll</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-05-05-jekyll</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[
# jekyll

**jekyll 的使用笔记**


## 概述
jekyll 是基于 ruby 的静态博客生成器.
结合 [github pages](https://pages.github.com/)
可以实现快速部署个人静态博客.

## 快速入门

1. 环境安装
    * `brew install ruby` 安装 ruby,mac 默认安装了 [ruby](http://www.ruby-lang.org/en/downloads/) 环境.
    * `curl -L get.rvm.io | bash -s stable` 安装 ruby 版本管理工具 [rvm](http://www.rvm.io/)
    * `gem install jekyll bundler` 安装 [jekyll][jekyll],[bundler][bundler]

2. 新建 jekyll 博客.

    ```bash
    # 在家目录创建 blog 文件夹
    mkdir ~/blog

    # 在 blog 目录下初始化 jekyll_demo
    jekyll new ~/blog/jekyll_demo

    # 在 jekyll_demo 目录下安装依赖包
    bundle install

    # 编译本地 jekyll 博客
    jekyll serve
    ```
    访问 <http://localhost:4000>即可查看到 jekyll 默认主题 [minima](https://github.com/jekyll/minima)
    生成的静态页面.


jekyll serve 编译后的目录结构如下.

```text
|-- Gemfile
|-- Gemfile.lock
|-- _config.yml
|-- _posts
|-- _site
|-- about.md
`-- index.md
```

各文件含义

| 文件                                             | 作用                                        |
| :]]></description>
            <content:encoded><![CDATA[<h1 id="jekyll" tabindex="-1">jekyll <a class="header-anchor" href="#jekyll" aria-label="Permalink to &quot;jekyll&quot;"></a></h1>
<p><strong>jekyll 的使用笔记</strong></p>
<h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h2>
<p>jekyll 是基于 ruby 的静态博客生成器.
结合 <a href="https://pages.github.com/" target="_blank" rel="noreferrer">github pages</a>
可以实现快速部署个人静态博客.</p>
<h2 id="快速入门" tabindex="-1">快速入门 <a class="header-anchor" href="#快速入门" aria-label="Permalink to &quot;快速入门&quot;"></a></h2>
<ol>
<li>
<p>环境安装</p>
<ul>
<li><code>brew install ruby</code> 安装 ruby,mac 默认安装了 <a href="http://www.ruby-lang.org/en/downloads/" target="_blank" rel="noreferrer">ruby</a> 环境.</li>
<li><code>curl -L get.rvm.io | bash -s stable</code> 安装 ruby 版本管理工具 <a href="http://www.rvm.io/" target="_blank" rel="noreferrer">rvm</a></li>
<li><code>gem install jekyll bundler</code> 安装 <a href="http://jekyllrb.com/docs/quickstart/" target="_blank" rel="noreferrer">jekyll</a>,<a href="http://bundler.io/" target="_blank" rel="noreferrer">bundler</a></li>
</ul>
</li>
<li>
<p>新建 jekyll 博客.</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 在家目录创建 blog 文件夹</span></span>
<span class="line"><span style="color:#B392F0">mkdir</span><span style="color:#9ECBFF"> ~/blog</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 在 blog 目录下初始化 jekyll_demo</span></span>
<span class="line"><span style="color:#B392F0">jekyll</span><span style="color:#9ECBFF"> new</span><span style="color:#9ECBFF"> ~/blog/jekyll_demo</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 在 jekyll_demo 目录下安装依赖包</span></span>
<span class="line"><span style="color:#B392F0">bundle</span><span style="color:#9ECBFF"> install</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 编译本地 jekyll 博客</span></span>
<span class="line"><span style="color:#B392F0">jekyll</span><span style="color:#9ECBFF"> serve</span></span></code></pre>
</div><p>访问 <a href="http://localhost:4000" target="_blank" rel="noreferrer">http://localhost:4000</a>即可查看到 jekyll 默认主题 <a href="https://github.com/jekyll/minima" target="_blank" rel="noreferrer">minima</a>
生成的静态页面.</p>
</li>
</ol>
<p>jekyll serve 编译后的目录结构如下.</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>|-- Gemfile</span></span>
<span class="line"><span>|-- Gemfile.lock</span></span>
<span class="line"><span>|-- _config.yml</span></span>
<span class="line"><span>|-- _posts</span></span>
<span class="line"><span>|-- _site</span></span>
<span class="line"><span>|-- about.md</span></span>
<span class="line"><span>`-- index.md</span></span></code></pre>
</div><p>各文件含义</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">文件</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><a href="https://ruby-china.org/topics/26655" target="_blank" rel="noreferrer"><code>Gemfile</code></a></td>
<td>ruby 安装包配置文件</td>
</tr>
<tr>
<td style="text-align:left"><code>Gemfile.lock</code></td>
<td><a href="http://bundler.io/" target="_blank" rel="noreferrer">bundler</a> 记录已安装包的文件</td>
</tr>
<tr>
<td style="text-align:left"><code>_config.yml</code></td>
<td><a href="http://jekyllrb.com/docs/quickstart/" target="_blank" rel="noreferrer">jekyll</a> 编译器配置文件</td>
</tr>
<tr>
<td style="text-align:left"><code>_posts</code></td>
<td>放置文章的目录</td>
</tr>
<tr>
<td style="text-align:left"><code>_site</code></td>
<td>编译器生成的静态网站</td>
</tr>
<tr>
<td style="text-align:left"><code>about.md</code></td>
<td>介绍信息,默认编译成 <code>_site/about.html</code> 文件</td>
</tr>
<tr>
<td style="text-align:left"><code>index.md</code></td>
<td>主站索引,默认编译成 <code>_site/index.html</code> 文件</td>
</tr>
</tbody>
</table>
<p>详见 <a href="http://jekyllrb.com/docs/structure/" target="_blank" rel="noreferrer">jekyll 目录结构</a></p>
<h2 id="创建新文章" tabindex="-1">创建新文章 <a class="header-anchor" href="#创建新文章" aria-label="Permalink to &quot;创建新文章&quot;"></a></h2>
<p>在 <code>_posts</code> 目录下新建名为 <code>&lt;site.time | date: '%Y-%m-%d' &gt;-jkeyll.md</code>的文件.
添加如下内容.</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span></span></span>
<span class="line"><span>---</span></span>
<span class="line"><span>title: jekyll</span></span>
<span class="line"><span>tags: jekyll ruby</span></span>
<span class="line"><span>---</span></span>
<span class="line"><span></span></span>
<span class="line"><span>jekyll demo</span></span>
<span class="line"><span>===</span></span>
<span class="line"><span></span></span>
<span class="line"><span>**前言: 讲解 jeyll 的使用**</span></span>
<span class="line"><span>---</span></span>
<span class="line"><span></span></span>
<span class="line"><span>today is &#x3C;site.time | date: '%Y-%m-%d' ></span></span></code></pre>
</div><p>重新编译<code>jekyll serve</code>访问 <a href="http://localhost:4000" target="_blank" rel="noreferrer">http://localhost:4000</a> 即可看到
如下内容</p>
<p>创建文件需要符合三点.</p>
<ol>
<li>
<p>文件名符合 <code>&lt;YYYY-MM-DD&gt;-&lt;filename&gt;</code> 的格式.
文件后缀取决于你用的文本类型例如 <code>.md</code> 表 markdown 类型.</p>
</li>
<li>
<p>文件开头为</p>
<div class="language-txt"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span></span></span>
<span class="line"><span>---</span></span>
<span class="line"><span>title: jekyll</span></span>
<span class="line"><span>tags: jekyll ruby</span></span>
<span class="line"><span>---</span></span></code></pre>
</div><p>符合 <a href="http://jekyllrb.com/docs/frontmatter/" target="_blank" rel="noreferrer">front matter</a> 格式. 该格式基于 <a href="https://www.wikiwand.com/zh-cn/YAML" target="_blank" rel="noreferrer">YAML</a>
语法.用来定义文章中的变量,给 jekyll 解析.例如 title 变量值会被编译为对应 html 的 title 标签中.</p>
</li>
<li>
<p>文章的内容</p>
<div class="language-md"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">jekyll demo</span></span>
<span class="line"><span style="color:#79B8FF;font-weight:bold">===</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8;font-weight:bold">**前言: 讲解 jeyll 的使用**</span></span>
<span class="line"><span style="color:#79B8FF;font-weight:bold">---</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">today is {{site.time | date: '%Y-%m-%d' }}</span></span></code></pre>
</div><p>符合对应的语法格式, jekyll 通过文件名后缀选择对应的转义引擎,
例如 <code>.md</code> 文件,默认使用 <a href="https://kramdown.gettalong.org/" target="_blank" rel="noreferrer">kramdown</a> 转义为 html.
可以看到文件内容除了支持标准的 markdown 文法,还支持模板,
<a href="http://jekyllrb.com/docs/quickstart/" target="_blank" rel="noreferrer">jekyll</a> 使用 <a href="https://shopify.github.io/liquid/" target="_blank" rel="noreferrer">liquid</a>
来转义模板语法.</p>
</li>
</ol>
<h2 id="概念建立" tabindex="-1">概念建立 <a class="header-anchor" href="#概念建立" aria-label="Permalink to &quot;概念建立&quot;"></a></h2>
<p>通过以上实例我们可以直接在 <code>_post</code> 文件夹下
建立符合格式的文章,重新编译即可创建博客.
但是这只是最基础的内容,对于常见的博客我们可能有如下需求.</p>
<ul>
<li>更换博客主题(默认主题太简陋)</li>
<li>实现索引文件(用来分类显示所有博文)</li>
<li>添加评论系统</li>
<li>添加博文统计系统</li>
<li>个性化配置</li>
</ul>
<p>以上的需求我们会逐一讲解.</p>
<h2 id="更换主题" tabindex="-1">更换主题 <a class="header-anchor" href="#更换主题" aria-label="Permalink to &quot;更换主题&quot;"></a></h2>
<p>使用 <code>jekyll new &lt;path&gt;</code> 命令默认使用的是 minima 主题.
更换主题的步骤如下.</p>
<ol>
<li>去 <a href="http://jekyllthemes.org/" target="_blank" rel="noreferrer">jekyll-theme</a> 选择一个你喜欢的主题
也可参看知乎 <a href="https://www.zhihu.com/question/20223939" target="_blank" rel="noreferrer">简洁明快的 jekyll 模板</a></li>
<li>进入主题的 github 页面,按照官方说明进行配置即可</li>
</ol>
<p>简要概述就是把 _post 中的内容拷贝到主题对应文件中.
同时按照主题要求配置好自己个人信息即可.</p>
<h2 id="静态服务器的工作流" tabindex="-1">静态服务器的工作流 <a class="header-anchor" href="#静态服务器的工作流" aria-label="Permalink to &quot;静态服务器的工作流&quot;"></a></h2>
<p>jekyll 整个处理流程,步骤如下.</p>
<ol>
<li>读取<code>_config.yml</code> 配置项,确定 jekyll 引擎的工作,
空文件会利用默认配置进行处理.</li>
<li>在工作目录全局递归查找文件头符合 <code>front matter tags</code> 格式的内容.</li>
<li>模板处理
<ol>
<li>
<p>jekylll 处理模板变量</p>
<ul>
<li><code>site</code> 包含整个静态网站信息,所有页面均可引用</li>
<li><code>page</code> 包含该静态页面信息,可在页面中备引用</li>
<li><code>post</code> 提交集合的变量</li>
</ul>
</li>
<li>
<p>liqiud 利用该模板将变量替换为对应内容.除了简单的变量替换模板还提供如下功能.</p>
<ul>
<li>liqiud tags</li>
<li>liqiud variable</li>
<li>liqiud filter 实现内容过滤,</li>
</ul>
</li>
<li>
<p>内容格式转换
使用 <a href="https://kramdown.gettalong.org/converter/html.html" target="_blank" rel="noreferrer">kramdown</a> 将 markdown 等文本内容转换为 html 标签.</p>
</li>
<li>
<p>布局排版
将文章写入设定的 <code>layout</code> 模板,或默认模板的 <code>&lt;content&gt;</code> 中,
递归 layout 流程 <a href="http://jekyllrb.com/tutorials/convert-site-to-jekyll/#how-layouts-work" target="_blank" rel="noreferrer">递归 layout</a></p>
</li>
<li>
<p>文件写入
将排版后的文档按照文件路径或 <code>permalink</code> 配置项写入 <code>_site</code> 目录下</p>
</li>
</ol>
</li>
</ol>
<h2 id="常见错误" tabindex="-1">常见错误 <a class="header-anchor" href="#常见错误" aria-label="Permalink to &quot;常见错误&quot;"></a></h2>
<p><strong>误解布局先后顺序</strong></p>
<ol>
<li>liquid 解析变量在 jekyll 模板转化之前.
可以需要解析的模板变量放入 <code>front formatter</code> 之中</li>
</ol>
<p><strong>忽略文件类型影响</strong></p>
<p>内容的编译是基于文件类型完成的.
若在 html 文件中包含 <code>markdowm</code> 类型文件.
解析器不会渲染.可以直接使用 html 替换对应文本内容即可</p>
<p><strong>复合使用</strong></p>
<p>例如模板的颜色高亮.使用如下结构</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>{% highlight javascript %}</span></span>
<span class="line"><span>console.log('alert');</span></span>
<span class="line"><span>{% endhighlight %}</span></span></code></pre>
</div><p>无需在高亮内容中再使用 markdown 语法.
直接编写需要高亮的内容即可.
牢记静态网站的编译顺序.</p>
<p>liqiud 变量 -&gt;  内容解析器 -&gt; front formatter</p>
<h2 id="学习内容" tabindex="-1">学习内容 <a class="header-anchor" href="#学习内容" aria-label="Permalink to &quot;学习内容&quot;"></a></h2>
<ol>
<li>全局配置文件</li>
<li>liquid 模板语法</li>
<li>页面配置 <code>front formatter</code></li>
<li>jekyll 常用特性
<ul>
<li>layout</li>
<li>premalink</li>
<li>...</li>
</ul>
</li>
</ol>
<h2 id="常用设置" tabindex="-1">常用设置 <a class="header-anchor" href="#常用设置" aria-label="Permalink to &quot;常用设置&quot;"></a></h2>
<h3 id="配置-404-页面" tabindex="-1">配置 404 页面 <a class="header-anchor" href="#配置-404-页面" aria-label="Permalink to &quot;配置 404 页面&quot;"></a></h3>
<p>只需在工作目录的根目录添加 <code>404.md</code> 或 <code>404.html</code> 即可.
或者直接将想作为 404 返回界面的文件的 <code>pernalink</code> 设置为 <code>/404.html</code> 即可.
若将今天页面布置到 apache 或 ngnix 服务器上,直接参看官方配置即可.</p>
<h3 id="自定义渲染模板" tabindex="-1">自定义渲染模板 <a class="header-anchor" href="#自定义渲染模板" aria-label="Permalink to &quot;自定义渲染模板&quot;"></a></h3>
<ol>
<li>创建自定义模板</li>
</ol>
<p>在工作目录的的 <code>_layouts</code> 目录中,新建 default.html.
可以利用模板变量定义引用.核心配置
* 主内容去使用 <code>&lt;content&gt;</code>进行替换
* title 利用 <code>&lt;page.title&gt;</code> 替换</p>
<ol start="2">
<li>模板引用</li>
</ol>
<p>在需要使用该模板的页面 <code>fornt formatter</code> 中配置 <code>layout</code> 为 <code>_layouts</code> 下的文件名.</p>
<ol start="3">
<li>重新编译内容即可</li>
</ol>
<p><strong>其他</strong></p>
<p>参见 <a href="http://jekyllrb.com/tutorials/convert-site-to-jekyll/" target="_blank" rel="noreferrer">jekyll tutorials</a></p>
<h3 id="快速入门-1" tabindex="-1">快速入门 <a class="header-anchor" href="#快速入门-1" aria-label="Permalink to &quot;快速入门&quot;"></a></h3>
<p>前提保证安装了 ruby 和 rubyGems 的保管理工具.</p>
<ol>
<li>环境安装</li>
</ol>
<div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">sudo</span><span style="color:#9ECBFF"> gem</span><span style="color:#9ECBFF"> isntall</span><span style="color:#9ECBFF"> jekyll</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 创建新 blog</span></span>
<span class="line"><span style="color:#B392F0">jekyll</span><span style="color:#9ECBFF"> new</span><span style="color:#9ECBFF"> blog</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 切换到主目录</span></span>
<span class="line"><span style="color:#79B8FF">cd</span><span style="color:#9ECBFF"> myblog</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 编译和创建服务</span></span>
<span class="line"><span style="color:#B392F0">bundle</span><span style="color:#9ECBFF"> exec</span><span style="color:#9ECBFF"> jekyll</span><span style="color:#9ECBFF"> serve</span></span></code></pre>
</div><h2 id="jekyll-原理" tabindex="-1">jekyll 原理 <a class="header-anchor" href="#jekyll-原理" aria-label="Permalink to &quot;jekyll 原理&quot;"></a></h2>
<p>项目文件 -&gt; 渲染模板 -&gt; 格式转换 -&gt; 静态网站(html,css,js)</p>
<p>详细步骤:</p>
<ol>
<li>site 变量,收集所有静态页面定义的变量.</li>
<li>liquid 利用该模板解释文档中的内容
<ul>
<li>liquid</li>
</ul>
</li>
</ol>
<h2 id="渲染模板支持的功能" tabindex="-1">渲染模板支持的功能 <a class="header-anchor" href="#渲染模板支持的功能" aria-label="Permalink to &quot;渲染模板支持的功能&quot;"></a></h2>
<p><a href="http://jekyllrb.com/docs/templates/#link" target="_blank" rel="noreferrer">templates 模板</a></p>
<p><a href="http://jekyllrb.com/docs/variables/" target="_blank" rel="noreferrer">variable</a></p>
<p>页面收集功能.当内容非提交或主页面时.
利用 <a href="http://jekyllrb.com/docs/collections/" target="_blank" rel="noreferrer">collections</a> 归纳页面.
例如按照标签,时间线等.</p>
<h2 id="collections-使用" tabindex="-1">collections 使用 <a class="header-anchor" href="#collections-使用" aria-label="Permalink to &quot;collections 使用&quot;"></a></h2>
<p>利用 collection 来对文章进行分类</p>
<ol>
<li>去 <code>_config.yml</code> 文件添加配置,注意文件名称前加 <code>_</code> 才可引用.</li>
</ol>
<div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#85E89D">collections</span><span style="color:#E1E4E8">:</span></span>
<span class="line"><span style="color:#85E89D">  my_collection</span><span style="color:#E1E4E8">:</span></span>
<span class="line"><span style="color:#85E89D">    output</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">true</span></span>
<span class="line"><span style="color:#85E89D">    permalink</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">/:collection/:name</span></span></code></pre>
</div><p>也可选择其他的映射方式 <a href="http://jekyllrb.com/docs/collections/" target="_blank" rel="noreferrer">collections 映射</a></p>
<ol start="2">
<li>在更目录创建对应的 <code>_my_collection</code> 的文件夹</li>
</ol>
<p>实际上 <code>_posts</code> 就是 jekyll 内部默认的 <code>collections</code> .</p>
<p>自定义变量放在 <code>_data</code> 利用 <code>site.data.&lt;file_name&gt;</code> 进行引用
支持  <code>json,yaml,csv</code> 三种文件类型.</p>
<h2 id="本地文件和-url-映射原理" tabindex="-1">本地文件和 url 映射原理 <a class="header-anchor" href="#本地文件和-url-映射原理" aria-label="Permalink to &quot;本地文件和 url 映射原理&quot;"></a></h2>
<p>默认映射方式 <code>/:categories/:year/:month/:day/:title.html</code>
配置路径映射的方式有两种.</p>
<ul>
<li>在每个文件中的 <code>fromt matter</code> 中设置 <code>permalink</code> 属性</li>
<li>在 _config.yml 中进行配置,参见 <a href="http://jekyllrb.com/docs/configuration/" target="_blank" rel="noreferrer">config</a>
和 <a href="http://jekyllrb.com/docs/collections/" target="_blank" rel="noreferrer">collections</a></li>
</ul>
<p>前者的设置会覆盖全局设置.常用技巧</p>
<ul>
<li>忽略文件后缀,会将文件作为 index.html 放入目录</li>
</ul>
<p>本地的文件类型分为三种.</p>
<ul>
<li>pages 直接加载的静态页面或内容</li>
<li>定义在 collections 模块中的内容</li>
<li>属于 post 目录下的内容</li>
</ul>
<p>应为对于 post 文件下的内容命名有强约定,而对于其他两种类型没有此约定.
所以在全局设置 <code>permalink</code> 时对不同文件类型的表示有区别.</p>
<p>例如在全局环境下配置 <code>permalink: data</code></p>
<ul>
<li>_posts 下的文件 url 为 <code>/:categories/:year/:month/:day/:title.html</code></li>
<li>collection 和 page 为 <code>/:title.html</code></li>
</ul>
<h2 id="待度清单" tabindex="-1">待度清单 <a class="header-anchor" href="#待度清单" aria-label="Permalink to &quot;待度清单&quot;"></a></h2>
<ul>
<li>[ ] <a href="http://jmcglone.com/guides/github-pages/" target="_blank" rel="noreferrer">jekyll 基本入门</a></li>
<li>[ ] 博客迁移 <a href="http://jekyllrb.com/docs/migrations/" target="_blank" rel="noreferrer">blog migrations</a></li>
<li>[ ] 可以包含自定义 sass 文件  <a href="http://jekyllrb.com/docs/assets/" target="_blank" rel="noreferrer">asset</a></li>
</ul>
<p>语言使用 ruby.</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>.</span></span>
<span class="line"><span>├── _config.yml</span></span>
<span class="line"><span>├── _data</span></span>
<span class="line"><span>|   └── members.yml</span></span>
<span class="line"><span>├── _drafts</span></span>
<span class="line"><span>|   ├── begin-with-the-crazy-ideas.md</span></span>
<span class="line"><span>|   └── on-simplicity-in-technology.md</span></span>
<span class="line"><span>├── _includes</span></span>
<span class="line"><span>|   ├── footer.html</span></span>
<span class="line"><span>|   └── header.html</span></span>
<span class="line"><span>├── _layouts</span></span>
<span class="line"><span>|   ├── default.html</span></span>
<span class="line"><span>|   └── post.html</span></span>
<span class="line"><span>├── _posts</span></span>
<span class="line"><span>|   ├── 2007-10-29-why-every-programmer-should-play-nethack.md</span></span>
<span class="line"><span>|   └── 2009-04-26-barcamp-boston-4-roundup.md</span></span>
<span class="line"><span>├── _sass</span></span>
<span class="line"><span>|   ├── _base.scss</span></span>
<span class="line"><span>|   └── _layout.scss</span></span>
<span class="line"><span>├── _site</span></span>
<span class="line"><span>├── .jekyll-metadata</span></span>
<span class="line"><span>└── index.html # can also be an 'index.md' with valid YAML Frontmatter</span></span></code></pre>
</div><p>文件作用.</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">文件或路径</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">_config.yml</td>
<td>保存文本编译的配置信息 <a href="http://jekyllrb.com/docs/configuration/" target="_blank" rel="noreferrer">config</a></td>
</tr>
<tr>
<td style="text-align:left">_drafts</td>
<td>草稿为发布的提交,<a href="http://jekyllrb.com/docs/drafts/" target="_blank" rel="noreferrer">草稿工作流</a></td>
</tr>
<tr>
<td style="text-align:left">_includes</td>
<td>自定义重用模板</td>
</tr>
<tr>
<td style="text-align:left">_layouts</td>
<td>包装提交文件的模板</td>
</tr>
<tr>
<td style="text-align:left">_posts</td>
<td>编辑完成的动态文件内容</td>
</tr>
<tr>
<td style="text-align:left">_data</td>
<td>格式化后的网页内容</td>
</tr>
<tr>
<td style="text-align:left">_sass</td>
<td>sass 文件</td>
</tr>
<tr>
<td style="text-align:left">_site</td>
<td>默认编译形成的示例目录</td>
</tr>
<tr>
<td style="text-align:left">.jekyll-metadata</td>
<td>追踪未修改文件</td>
</tr>
<tr>
<td style="text-align:left">index.html,index.md</td>
<td>主页</td>
</tr>
<tr>
<td style="text-align:left">other files</td>
<td>所有其他文件目录,例如图片,css 等</td>
</tr>
</tbody>
</table>
<p>核心配置文件 <code>_config.yml</code> 决定 jekyll 的编译逻辑.
常用配置如下. <a href="http://jekyllrb.com/docs/configuration/" target="_blank" rel="noreferrer">http://jekyllrb.com/docs/configuration/</a>.</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">配置</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">site source</td>
<td>设置 jekyll 读取文件的路径</td>
</tr>
<tr>
<td style="text-align:left">site destination</td>
<td>设置 jekyll 写入文件路径</td>
</tr>
<tr>
<td style="text-align:left">exclude</td>
<td>排出的路径或文件</td>
</tr>
<tr>
<td style="text-align:left">include</td>
<td>包含的路径和文件</td>
</tr>
<tr>
<td style="text-align:left">keep files</td>
<td>组织 jekyll 重新生成的文件或路径</td>
</tr>
<tr>
<td style="text-align:left">time zone</td>
<td>设置主站的时区</td>
</tr>
<tr>
<td style="text-align:left">encoding</td>
<td>设置文件编码</td>
</tr>
<tr>
<td style="text-align:left">safe</td>
<td>不懂</td>
</tr>
</tbody>
</table>
<h2 id="编辑方法" tabindex="-1">编辑方法 <a class="header-anchor" href="#编辑方法" aria-label="Permalink to &quot;编辑方法&quot;"></a></h2>
<ol>
<li>_posts 存放已编写好的内容</li>
<li>_drafts 存放草稿</li>
</ol>
<h3 id="post-文件规则" tabindex="-1">post 文件规则 <a class="header-anchor" href="#post-文件规则" aria-label="Permalink to &quot;post 文件规则&quot;"></a></h3>
<ul>
<li>
<p>文件名 <code>year-month-day-title.markup</code></p>
<ul>
<li>year 四位格式</li>
<li>month,day 2 位格式</li>
<li>markup 问文件格式</li>
</ul>
</li>
<li>
<p>文件开头符合 <a href="http://jekyllrb.com/docs/posts/" target="_blank" rel="noreferrer">yaml front matter</a></p>
<ul>
<li>利用 <code>---</code> 划分题头和正文</li>
<li>题头用来定义模板需要的默认变量,例如 title 等</li>
<li>文件头定义字段可利用 liquid 模板语法引用.</li>
<li>文件头也可为空,但必须保留 <code>---</code> 的结构,给 skeyll 解析</li>
<li><strong>注意文本格式不要是 bom 的 utf-8,特别是在 windows 下</strong></li>
</ul>
</li>
<li>
<p>文件内容,支持如下格式</p>
<ul>
<li><a href="https://daringfireball.net/projects/markdown/" target="_blank" rel="noreferrer">markdown</a></li>
<li><a href="https://www.promptworks.com/textile" target="_blank" rel="noreferrer">textile</a></li>
</ul>
</li>
</ul>
<p>文件开头提供如下的全局变量给 jekyll 去使用.</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">变量名</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">layout</td>
<td>定义布局文件,文件必须存在于 <code>_layouts</code> 目录下</td>
</tr>
<tr>
<td style="text-align:left">date</td>
<td>YYYY-MM-DD HH:MM:SS +/-TTTT 用来确保文件分类正确</td>
</tr>
<tr>
<td style="text-align:left">category,categories</td>
<td>配合 yaml list 实现路由的多种映射类型</td>
</tr>
<tr>
<td style="text-align:left">tags</td>
<td>文章的标签</td>
</tr>
<tr>
<td style="text-align:left">permalink</td>
<td>设置文件和 url 之间的映射关系</td>
</tr>
<tr>
<td style="text-align:left">published</td>
<td>是否编译显示该页面,布尔值</td>
</tr>
<tr>
<td style="text-align:left">page</td>
<td>每个页面包含的变量</td>
</tr>
<tr>
<td style="text-align:left">sites</td>
<td>网站变量</td>
</tr>
</tbody>
</table>
<p>利用 <code>jekyll serve --unpublished 或 --drafts 来编译草稿或私有文件</code></p>
<p>文件引用路径可以包含变量</p>
<div class="language-md"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">site.url 在编译时会变为项目根路径</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">![](</span><span style="color:#E1E4E8;text-decoration:underline">{{site.url}}/path/file</span><span style="color:#E1E4E8">)</span></span></code></pre>
</div><p>标注 post 文件格式如下</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span></span></span>
<span class="line"><span>    ---  ---> YAML 格式的题头</span></span>
<span class="line"><span>    layout: post  --> 布局模式为 post</span></span>
<span class="line"><span>    title:  "test skeyll" --> 文章主题</span></span>
<span class="line"><span>    date:   2015-11-17 16:16:01 -0600 --> 文章创建时间</span></span>
<span class="line"><span>    categories: jekyll update -->文章分类</span></span>
<span class="line"><span>    ---</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    ---> 文章正文</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `bundle exec jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated.</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.</span></span></code></pre>
</div><p>文件内容的引用使用<code>assets</code> 或 <code>downloads</code> 文件夹.
为了防止应用路径丢失可以在引用前加入<code>&lt;site.url&gt;</code> 变量.
若加载资源一直属于根目录下则直接使用<code>/path/source</code> 即可.</p>
<div class="language-md"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">![</span><span style="color:#DBEDFF;text-decoration:underline">test</span><span style="color:#E1E4E8">](</span><span style="color:#E1E4E8;text-decoration:underline">{{site.url}}/assets/test.jpg</span><span style="color:#E1E4E8">)</span></span></code></pre>
</div><p>可以直接在内容区域使用模板,例如想在文章结尾列出所有文章.</p>
<div class="language-md"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;ul></span></span>
<span class="line"><span style="color:#E1E4E8">  {% for post in site.posts %}</span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;li></span></span>
<span class="line"><span style="color:#E1E4E8">      &#x3C;a href="{{ post.url }}">{{ post.title }}&#x3C;/a></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;/li></span></span>
<span class="line"><span style="color:#E1E4E8">  {% endfor %}</span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/ul></span></span></code></pre>
</div><p>内部模板引擎会将所有文章逐一列出.</p>
<h2 id="插件体系" tabindex="-1">插件体系 <a class="header-anchor" href="#插件体系" aria-label="Permalink to &quot;插件体系&quot;"></a></h2>
<p><a href="http://jekyllrb.com/docs/plugins/#converters-1" target="_blank" rel="noreferrer">plugins</a></p>
<p>注意由于 github pages 中使用的是安全模式进行的编译,意味着你不能使用自定义插件进行编译.
基于此建议本地编译,在 githubpage 上传编译后的内容.</p>
<p>插件安装的三种方式</p>
<ul>
<li>在 <code>_plugins</code> 目录下放置插件</li>
<li>在 <code>_config.yml</code> 文件中添加插件</li>
</ul>
<div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#85E89D">plugins</span><span style="color:#E1E4E8">: [[</span><span style="color:#9ECBFF">jekyll-coffeescript</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">jekyll-watch</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">jekyll-assets</span><span style="color:#E1E4E8">]</span></span></code></pre>
</div><p>利用 <code>gem istall jekyll-coffeescript jekyll-watch  jekyll-assets</code> 安装插件</p>
<ul>
<li>在 <code>Gemfile</code> 中添加相关插件</li>
</ul>
<div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#9ECBFF">group :jekyll_plugins do</span></span>
<span class="line"><span style="color:#9ECBFF">   gem "my-jekyll-plugin"</span></span>
<span class="line"><span style="color:#9ECBFF">   gem "another-jekyll-plugin"</span></span>
<span class="line"><span style="color:#9ECBFF"> end</span></span></code></pre>
</div><p>使用  <code>bundle install</code> 进行安装.</p>
<p>这三种方式可以被同时使用.插件一般分为五大类.</p>
<ol>
<li><a href="http://jekyllrb.com/docs/plugins/#generators" target="_blank" rel="noreferrer">generators</a></li>
</ol>
<p>定义一个符合自己规则的编译规则.
利用 generators 可以在每个文件中添加自定义内容.</p>
<ol start="2">
<li><a href="http://jekyllrb.com/docs/plugins/#converters" target="_blank" rel="noreferrer">Converters</a></li>
</ol>
<p>选择新的转换器来转换文档内容</p>
<ol start="3">
<li><a href="http://jekyllrb.com/docs/plugins/#commands" target="_blank" rel="noreferrer">Commands</a></li>
</ol>
<p>定义命令在文章中引用.</p>
<ol start="4">
<li><a href="http://jekyllrb.com/docs/plugins/#tags" target="_blank" rel="noreferrer">Tags</a></li>
</ol>
<p>自定义标签在模板中使用</p>
<ol start="5">
<li><a href="http://jekyllrb.com/docs/plugins/#hooks" target="_blank" rel="noreferrer">Hooks</a></li>
</ol>
<p>利用钩子在引擎执行的各个阶段实现自动化控制.</p>
<p><strong>导航</strong></p>
<ul>
<li>提取数据放入 _data 目录</li>
<li>在题头循环导出数据</li>
</ul>
<ol>
<li>利用 data 定义分类用模板进行显示.</li>
</ol>
<div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#85E89D">docs_list_title</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">Docs</span></span>
<span class="line"><span style="color:#85E89D">docs</span><span style="color:#E1E4E8">:</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">- </span><span style="color:#85E89D">title</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">Introduction</span></span>
<span class="line"><span style="color:#85E89D">  url</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">introduction.html</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">- </span><span style="color:#85E89D">title</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">Configuration</span></span>
<span class="line"><span style="color:#85E89D">  url</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">configuration.html</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">- </span><span style="color:#85E89D">title</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">Deployment</span></span>
<span class="line"><span style="color:#85E89D">  url</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">deployment.html</span></span></code></pre>
</div><p>若要产生排序的列表使用过滤器.</p>
<p>使用模板语言进行过滤.</p>
<h2 id="模板原理" tabindex="-1">模板原理 <a class="header-anchor" href="#模板原理" aria-label="Permalink to &quot;模板原理&quot;"></a></h2>
<p>利用 <a href="https://shopify.github.io/liquid/" target="_blank" rel="noreferrer">liqiud</a> 进行模板解析.
利用题头进行变量定义.
模板应用方法.</p>
<blockquote>
<p><strong>变量</strong></p>
</blockquote>
<pre><code>--- --&gt; 利用 yaml 题头进行变量定义
test:hello
---

**&lt;page.test&gt;** --&gt; 此处解析变量,注意变量属于 page 的属性
</code></pre>
<p>若想添加原始页面,直接在编译生成的静态网站中建立文档即可.
或者直接在在资源的根目录或子目录,创建 html 文件.
或题头符合 YAML 规范的 mark 文档,都会直接被编译到静态文件根目录
下的相应位置. jekyll 编译器会遍历根目录下内容进行处理.
若存在非 jekyll 直接规定的文件夹则直接编译到静态网站的相应位置.
同时会根据文件的类型进行默认的编译.利用 <code>permalink</code> 属性控制
markdown 等文档类型的编译位置.</p>
<h2 id="坑" tabindex="-1">坑 <a class="header-anchor" href="#坑" aria-label="Permalink to &quot;坑&quot;"></a></h2>
<p><strong>ruby 版本不够</strong></p>
<ol>
<li>使用 brew 安装 rvm ,ruby 版本管理工具</li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">curl</span><span style="color:#79B8FF"> -L</span><span style="color:#9ECBFF"> get.rvm.io</span><span style="color:#F97583"> |</span><span style="color:#B392F0"> bash</span><span style="color:#79B8FF"> -s</span><span style="color:#9ECBFF"> stable</span></span>
<span class="line"><span style="color:#79B8FF">source</span><span style="color:#9ECBFF"> ~/.rvm/scripts/rvm</span></span></code></pre>
</div><ol start="2">
<li>使用 rvm 管理 ruby 安装包</li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 验证 rvm 安装成功</span></span>
<span class="line"><span style="color:#B392F0">rvm</span><span style="color:#79B8FF"> -v</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 列出所有 ruby 安装版本</span></span>
<span class="line"><span style="color:#B392F0">rvm</span><span style="color:#9ECBFF"> list</span><span style="color:#9ECBFF"> known</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 安装 ruby,</span></span>
<span class="line"><span style="color:#B392F0">rvm</span><span style="color:#9ECBFF"> install</span><span style="color:#79B8FF"> 2.1.4</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 使用某版本 ruby 并设为默认</span></span>
<span class="line"><span style="color:#B392F0">rvm</span><span style="color:#9ECBFF"> use</span><span style="color:#79B8FF"> 2.1.4</span><span style="color:#79B8FF"> --default</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 查看已安装版本</span></span>
<span class="line"><span style="color:#B392F0">rvm</span><span style="color:#9ECBFF"> list</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 卸载已安装版本</span></span>
<span class="line"><span style="color:#B392F0">rvm</span><span style="color:#9ECBFF"> remove</span><span style="color:#79B8FF"> 2.1.4</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 查看安装镜像</span></span>
<span class="line"><span style="color:#B392F0">gem</span><span style="color:#9ECBFF"> source</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 跟换镜像</span></span>
<span class="line"><span style="color:#B392F0">gem</span><span style="color:#9ECBFF"> update</span><span style="color:#79B8FF"> --system</span></span>
<span class="line"><span style="color:#B392F0">gem</span><span style="color:#9ECBFF"> uninstall</span><span style="color:#9ECBFF"> rubygems-updates</span></span>
<span class="line"><span style="color:#B392F0">gem</span><span style="color:#9ECBFF"> sources</span><span style="color:#79B8FF"> -r</span><span style="color:#9ECBFF"> http://rubygems.org/</span></span>
<span class="line"><span style="color:#B392F0">gem</span><span style="color:#9ECBFF"> sources</span><span style="color:#79B8FF"> -a</span><span style="color:#9ECBFF"> http://rubyg.taobao.org</span></span></code></pre>
</div><p><strong>不理解 ruby 生态</strong></p>
<ul>
<li>gem 是 ruby 环境的包管理工具</li>
<li>gemfile 是 ruby 安装配置文件</li>
<li>bundle 也是包管理工具,但是比 gem 高级,支持批量安装</li>
<li>使用 rvm 管理 ruby 版本</li>
<li>jekyll 是基于 ruby 的静态生成器</li>
<li>jekyll 插件可以利用 bundle 来安装依赖</li>
</ul>
<p><a href="https://github.com/jekyll/jekyll-compose" target="_blank" rel="noreferrer">jekyll-compose</a></p>
<h2 id="颜色高亮" tabindex="-1">颜色高亮 <a class="header-anchor" href="#颜色高亮" aria-label="Permalink to &quot;颜色高亮&quot;"></a></h2>
<ol>
<li></li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">gem</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> rouge</span></span></code></pre>
</div><ol start="2">
<li></li>
</ol>
<div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#85E89D">highlighter</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">rouge</span></span></code></pre>
</div><h2 id="资料" tabindex="-1">资料 <a class="header-anchor" href="#资料" aria-label="Permalink to &quot;资料&quot;"></a></h2>
<p><a href="https://swaac.tamouse.org/jekyll/workflow/2016/01/13/jekyll-guard-livereload/" target="_blank" rel="noreferrer">自动加载</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[samba]]></title>
            <link>https://blog.zenheart.site/posts/2017-05-25-samba</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-05-25-samba</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[samba
搭建 samba 文件服务笔记
 概述
利用 samba 可以搭建在 windows 下可访问的文件服务。
使用`apt-get install sambat`命令进行安装。
安装完成后跳]]></description>
            <content:encoded><![CDATA[<h1 id="samba" tabindex="-1">samba <a class="header-anchor" href="#samba" aria-label="Permalink to &quot;samba&quot;"></a></h1>
<p><strong>搭建 samba 文件服务笔记</strong></p>
<h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h2>
<p>利用 samba 可以搭建在 windows 下可访问的文件服务。
使用<code>apt-get install sambat</code>命令进行安装。
安装完成后跳转到<code>vi /etc/samba/smb.conf</code>文件下
可以在<a href="https://www.samba.org/samba/docs/man/manpages/smb.conf.5.html" target="_blank" rel="noreferrer">samba配置项说明</a>
查看详细配置。</p>
<p>利用 windows 进行连接时，使用网络驱动器实现盘符挂载</p>
<p><img src="https://blog.zenheart.site/assets/2017-05-25-samba.B_tUSH3p.gif" alt="" loading="lazy"></p>
<h2 id="遇到问题" tabindex="-1">遇到问题 <a class="header-anchor" href="#遇到问题" aria-label="Permalink to &quot;遇到问题&quot;"></a></h2>
<h3 id="windos-不显示文件映射" tabindex="-1">windos 不显示文件映射 <a class="header-anchor" href="#windos-不显示文件映射" aria-label="Permalink to &quot;windos 不显示文件映射&quot;"></a></h3>
<p>在使用时 windows 无法正常显示映射路径。
重新注销后再次登录即可。</p>
<h3 id="不同用户进行映射" tabindex="-1">不同用户进行映射 <a class="header-anchor" href="#不同用户进行映射" aria-label="Permalink to &quot;不同用户进行映射&quot;"></a></h3>
<ol>
<li>win7 系统修改 <code>C:\Windows\System32\drivers\etc\hosts</code> 文件<div class="language-md"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">	&#x3C;ip 地址> &#x3C;dns 映射> &#x3C;别名1> &#x3C;别名2>..</span></span></code></pre>
</div></li>
<li>连接的时候利用别名进行连接
<a href="http://superuser.com/questions/95872/sambawindows-allow-multiple-connections-by-different-users" target="_blank" rel="noreferrer">多用户登录</a></li>
<li>连接时使用 <code>\\&lt;别名&gt;\&lt;文件路径&gt;</code> 进行连接</li>
</ol>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/2017-05-25-samba.B_tUSH3p.gif" length="0" type="image/gif"/>
        </item>
        <item>
            <title><![CDATA[fiddler]]></title>
            <link>https://blog.zenheart.site/posts/2017-09-12-fiddler</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-09-12-fiddler</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[fiddler
讲解fiddler的使用
 fiddler 概述
fiddler 是一个 windows 平台下的 http 抓包工具作用如下：
1. 查看 http 请求
2. 前后端接口调试
3.]]></description>
            <content:encoded><![CDATA[<h1 id="fiddler" tabindex="-1">fiddler <a class="header-anchor" href="#fiddler" aria-label="Permalink to &quot;fiddler&quot;"></a></h1>
<p><strong>讲解fiddler的使用</strong></p>
<h2 id="fiddler-概述" tabindex="-1">fiddler 概述 <a class="header-anchor" href="#fiddler-概述" aria-label="Permalink to &quot;fiddler 概述&quot;"></a></h2>
<p>fiddler 是一个 windows 平台下的 http 抓包工具作用如下：</p>
<ol>
<li>查看 http 请求</li>
<li>前后端接口调试</li>
<li>测试通信性能</li>
</ol>
<h2 id="fiddler-概念" tabindex="-1">fiddler 概念 <a class="header-anchor" href="#fiddler-概念" aria-label="Permalink to &quot;fiddler 概念&quot;"></a></h2>
<h3 id="fiddler-的使用模式" tabindex="-1">fiddler 的使用模式 <a class="header-anchor" href="#fiddler-的使用模式" aria-label="Permalink to &quot;fiddler 的使用模式&quot;"></a></h3>
<ul>
<li>流模式 (string) 随时接收</li>
<li>缓冲模式（buffering）数据流保存完才会发送</li>
</ul>
<h3 id="常见使用" tabindex="-1">常见使用 <a class="header-anchor" href="#常见使用" aria-label="Permalink to &quot;常见使用&quot;"></a></h3>
<p>利用 <code>view -&gt; toolbar</code>  控制工具栏的显示</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[理解版本命名及限定规则]]></title>
            <link>https://blog.zenheart.site/posts/2017-09-26-version</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-09-26-version</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[
# 理解版本命名及限定规则

**版本命名和版本限定的相关知识**


## 版本命名规则
我们常见的版本命名格式为

```
[name].x.y.z-[state]
```

* `name`为可选字段,一般为 `v`,表示 version 
* `x.y.z` 为各版本的序号，遵循 [语义化版本命名规范](http://semver.org/lang/zh-CN/)
  **实际上基于此规范,不应该在版本前出现 name 字段.**

* `state` 可选字段,表示版本状态,例如 `b` 表示 beta 测试版,其他常见状态,后有详述

### 语义化版本命名规则
该规则对版本的迭代命名,做了很好的限制.
核心规则如下.

| 序号 | 格式要求 | 说明                                                          |
| :]]></description>
            <content:encoded><![CDATA[<h1 id="理解版本命名及限定规则" tabindex="-1">理解版本命名及限定规则 <a class="header-anchor" href="#理解版本命名及限定规则" aria-label="Permalink to &quot;理解版本命名及限定规则&quot;"></a></h1>
<p><strong>版本命名和版本限定的相关知识</strong></p>
<h2 id="版本命名规则" tabindex="-1">版本命名规则 <a class="header-anchor" href="#版本命名规则" aria-label="Permalink to &quot;版本命名规则&quot;"></a></h2>
<p>我们常见的版本命名格式为</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>[name].x.y.z-[state]</span></span></code></pre>
</div><ul>
<li>
<p><code>name</code>为可选字段,一般为 <code>v</code>,表示 version</p>
</li>
<li>
<p><code>x.y.z</code> 为各版本的序号，遵循 <a href="http://semver.org/lang/zh-CN/" target="_blank" rel="noreferrer">语义化版本命名规范</a>
<strong>实际上基于此规范,不应该在版本前出现 name 字段.</strong></p>
</li>
<li>
<p><code>state</code> 可选字段,表示版本状态,例如 <code>b</code> 表示 beta 测试版,其他常见状态,后有详述</p>
</li>
</ul>
<h3 id="语义化版本命名规则" tabindex="-1">语义化版本命名规则 <a class="header-anchor" href="#语义化版本命名规则" aria-label="Permalink to &quot;语义化版本命名规则&quot;"></a></h3>
<p>该规则对版本的迭代命名,做了很好的限制.
核心规则如下.</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">序号</th>
<th style="text-align:left">格式要求</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">x</td>
<td style="text-align:left">非负整数</td>
<td style="text-align:left">主版本号(major)，进行不向下兼容的修改时，递增主版本号</td>
</tr>
<tr>
<td style="text-align:left">y</td>
<td style="text-align:left">非负整数</td>
<td style="text-align:left">次版本号(minor)，保持向下兼容,新增特性时，递增次版本号</td>
</tr>
<tr>
<td style="text-align:left">z</td>
<td style="text-align:left">非负整数</td>
<td style="text-align:left">修订号(patch),保持向下兼容,修复问题但不影响特性时，递增修订号</td>
</tr>
</tbody>
</table>
<ul>
<li><code>0.y.z</code> 表示开发阶段，一切可能随时改变，非稳定版。</li>
<li><code>1.0.0</code> 界定此版本为初始稳定版，后面的一切更新都基于此版本进行修改。</li>
</ul>
<h3 id="版本状态" tabindex="-1">版本状态 <a class="header-anchor" href="#版本状态" aria-label="Permalink to &quot;版本状态&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">描述方式</th>
<th>说明</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>α</code>或<code>a</code></td>
<td>alpha 版</td>
<td>内测版本，内部测试的版本，bug 较多</td>
</tr>
<tr>
<td style="text-align:left"><code>β</code>或<code>b</code></td>
<td>beta 版</td>
<td>公测版本，给外部进行测试的版本，有缺陷</td>
</tr>
<tr>
<td style="text-align:left"><code>γ</code>或<code>g</code></td>
<td>Gamma 版</td>
<td>相当成熟的测试版，于发行版相差无几</td>
</tr>
<tr>
<td style="text-align:left"><code>rc</code></td>
<td>Release Candidate</td>
<td>是前面三种测试版的进一步版本，实现了全部功能，清除了大部分 bug，接近发布倒计时，有时会进一步细分为 rc1,rc2</td>
</tr>
</tbody>
</table>
<blockquote>
<p>实际上大部分前端工具均遵守上述规则</p>
</blockquote>
<p>在商业软件中还会见到如下字段.</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">描述方式</th>
<th>说明</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>Demo</code></td>
<td>演示版</td>
<td>只集成了正式版部分功能，无法升级</td>
</tr>
<tr>
<td style="text-align:left"><code>SP</code></td>
<td>SP1</td>
<td>是 service pack 的意思表示升级包</td>
</tr>
<tr>
<td style="text-align:left"><code>Trial</code></td>
<td>试用版</td>
<td>试用版</td>
</tr>
<tr>
<td style="text-align:left"><code>Unregistered</code></td>
<td>未注册</td>
<td>有功能或时间限制的版本</td>
</tr>
<tr>
<td style="text-align:left"><code>Lite</code></td>
<td>精简版</td>
<td>只含有正式版核心功能</td>
</tr>
<tr>
<td style="text-align:left"><code>enhance</code></td>
<td>增强版</td>
<td>属于正式版1</td>
</tr>
<tr>
<td style="text-align:left"><code>free</code></td>
<td>免费版</td>
<td>自由使用版本</td>
</tr>
<tr>
<td style="text-align:left"><code>release</code></td>
<td>发行版</td>
<td>有时间限制</td>
</tr>
<tr>
<td style="text-align:left"><code>upgrade</code></td>
<td>升级版</td>
<td>有功能增强或修复 bug</td>
</tr>
<tr>
<td style="text-align:left"><code>Retail</code></td>
<td>零售版</td>
<td>单独发售</td>
</tr>
<tr>
<td style="text-align:left"><code>Cardware</code></td>
<td>共享版</td>
<td>公用许可证</td>
</tr>
</tbody>
</table>
<h2 id="版本限定" tabindex="-1">版本限定 <a class="header-anchor" href="#版本限定" aria-label="Permalink to &quot;版本限定&quot;"></a></h2>
<p>在进行包管理时,为了保证安装依赖的兼容性.
必须对依赖包版本进行限定.参考  <a href="https://docs.npmjs.com/misc/semver" target="_blank" rel="noreferrer">npm 限定描述</a>
举例如下</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#79B8FF">  "devDependencies"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#79B8FF">    "karma"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"0.13.22"</span></span>
<span class="line"><span style="color:#E1E4E8">  }</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span></code></pre>
</div><p>表示安装 <code>0.13.22</code> 版本的 karma.</p>
<p>为了方便理解,版本限定的语法简述为为 <code>[范围描述]&lt;版本号描述&gt;</code></p>
<ul>
<li>
<p>范围描述可选,必须配和版本描述确定范围,无法独立存在</p>
<ul>
<li>
<p><code>&lt;</code> 小于某一版本号</p>
</li>
<li>
<p><code>&lt;=</code> 小于等于某一版本号</p>
</li>
<li>
<p><code>&gt;</code> 大于某一版本号</p>
</li>
<li>
<p><code>&gt;=</code> 大于等于某一版本号</p>
</li>
<li>
<p><code>=</code> 等于某一版本号,没有意义和直接写该版本号一样</p>
</li>
<li>
<p><code>~</code> 基于版本号描述的最新补丁版本</p>
</li>
<li>
<p><code>^</code> 基于版本号描述的最新兼容版本</p>
</li>
<li>
<p><code>-</code> 某个范围,<strong>他应该出现在两个版本描述中间,实际上语法应为 <code>&lt;版本描述&gt;-&lt;版本描述&gt;</code>,写在此处为了统一</strong></p>
<p>严格来讲对 <code>~,^</code> 的表述需要结合具体的包管理工具和版本号规则来确定.但是对于一般使用记住如下原则.
<strong><code>^</code>  是确保版本兼容性时,默认对次版本号的限定约束</strong>
<strong><code>~</code>  是确保版本兼容性时,默认对补丁号的约束</strong></p>
</li>
</ul>
<blockquote>
<p>利用 <code>^,~</code> 的意义在于确保工具包对依赖版本的兼容性,排除主版本更迭,
造成依赖失效的可能.</p>
</blockquote>
</li>
<li>
<p>版本描述</p>
<ul>
<li><code>*</code> 通配符,类似 <code>glob</code> 模式 <code>*</code></li>
<li><code>x,X</code> 约等于 <code>*</code> 号,通常用于次版本和补丁的通配.</li>
<li><code>0</code> 警惕这个字符,说明该依赖还未稳定(<strong>如果它遵守语义化命名的话</strong>),此外当该字符出现在最前面时,会改变 <code>^,~</code> 的限定特性.</li>
</ul>
</li>
</ul>
<p>相关举例如下</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>&#x3C; 1.2.3     小于1.2.3 的版本均可 </span></span>
<span class="line"><span>= 1.2.3     只支持等于1.2.3 的版本 </span></span>
<span class="line"><span>&#x3C;= 1.2.3    只支持小于等于1.2.3 的版本</span></span>
<span class="line"><span>> 1.2.3     只支持大于 1.2.3 的版本</span></span>
<span class="line"><span>>= 1.2.3    只支持大于等于 1.2.3 的版本</span></span>
<span class="line"><span>1.2.3-2     支持 >=1.2.3 &#x3C;3.0.0 的版本</span></span>
<span class="line"><span>1.x.1       支持 >=1.0.1 &#x3C;1.1.0 的版本</span></span>
<span class="line"><span>*           支持 >= 0.0.0 的版本</span></span>
<span class="line"><span>""          同 *</span></span>
<span class="line"><span>1           表示 >=1.0.0 &#x3C;2.0.0 其余任意位置为空相似</span></span>
<span class="line"><span>1.0         >= 1.0.0 &#x3C; 1.1.0</span></span>
<span class="line"><span>~1.1.1      >=1.1.1 &#x3C;1.2.0</span></span>
<span class="line"><span>~1.1        >=1.1.0 &#x3C;1.2.0</span></span>
<span class="line"><span>~1          >=1.0.0 &#x3C;2.0.0</span></span>
<span class="line"><span>^1.1.1      >=1.1.1 &#x3C;2.0.0</span></span>
<span class="line"><span>^0.1.1      >=0.1.1 &#x3C;0.2.0 注意这里,不要以为是 0.1.1-1.0.0 之间</span></span>
<span class="line"><span>^0.0.1      >=0.0.1 &#x3C;0.0.2 同上,请注意</span></span></code></pre>
</div><blockquote>
<p>注意大部分包管理工具均遵守上述规则,但是在进行版本限定时,请参考包管理工具的配置项说明,确定语法格式.</p>
</blockquote>
<h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h2>
<p>最常用的知识</p>
<h3 id="核心命名规则" tabindex="-1">核心命名规则 <a class="header-anchor" href="#核心命名规则" aria-label="Permalink to &quot;核心命名规则&quot;"></a></h3>
<ul>
<li>版本号通常称为 <code>x.y.z</code>
<ul>
<li>x 主版本号,一般向下不兼容时增加此值</li>
<li>y 次版本号,向下兼容,添加新特性时增加此值</li>
<li>z 补丁号,修复问题为改变特性时增加此值</li>
<li><code>a,b,rc</code> 分别表示 内测,公测,发行状态</li>
</ul>
</li>
</ul>
<h3 id="版本限定-1" tabindex="-1">版本限定 <a class="header-anchor" href="#版本限定-1" aria-label="Permalink to &quot;版本限定&quot;"></a></h3>
<ul>
<li><code>~</code> 在依赖版本兼容下,最近的补丁版</li>
<li><code>^</code> 在依赖版本兼容下,最近的次版本</li>
</ul>
<blockquote>
<p>重点是保证版本依赖的兼容性,不允许出现依赖的主版本号范围可变,即使你的开发包依旧可用</p>
</blockquote>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<p><a href="http://semver.org/lang/zh-CN/" target="_blank" rel="noreferrer">语义化版本规范</a></p>
<p><a href="https://docs.npmjs.com/misc/semver" target="_blank" rel="noreferrer">npm 版本说明</a></p>
<p><a href="https://getcomposer.org/doc/articles/versions.md" target="_blank" rel="noreferrer">composer version constraints</a></p>
<p><a href="http://wenku.baidu.com/view/267166728e9951e79b892703.html" target="_blank" rel="noreferrer">百度文库-版本说明详解</a></p>
<p><a href="https://www.wikiwand.com/en/Software_versioning" target="_blank" rel="noreferrer">wiki 软件版本</a></p>
<p><a href="http://serve.3ezy.com/stackoverflow.com/questions/22343224/" target="_blank" rel="noreferrer">What's the difference between tilde(~) and caret(^) in package.json</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[gitbook 使用入门]]></title>
            <link>https://blog.zenheart.site/posts/2018-01-11-gitbook</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2018-01-11-gitbook</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[
# gitbook 使用入门

**gitbook 笔记**   


## gitbook 基本介绍
**gitbook** 是用来制作电子书的开源工具。使用 [markdown](markdown) 文法来撰写文章。利用 gitbook 实现网络版的电子书制作。   
除此之外你还可以将书籍导出为 *epub*、*pdf*、*mobi* 的格式，方便自己和他人阅读。   

## 快速入门
### 安装 gitbook
1. 软件安装，软件的使用方法参见[附录教程](#appendix)

      [gitbook 官方下载地址](https://www.gitbook.com/editor)

2. 命令行安装

    在安装 node 环境的基础上，利用 npm 安装 gitbook<br>
    (对 node 和 npm 不懂的请参看 [node 入门](node_guide.md))
    ```
    npm install gitbook-cli -g //全局安装 gitbook
    ```

### 初始化gitbook
安装后，显示安装版本来确认安装成功
```
gitbook -V //注意 V 大写
```
新建目录，在其中初始化 gitbook
```
gitbook init
```
初始化后默认生成文件如下
```
.
├── README.md
└── SUMMARY.md
```
编辑 `SUMMARY.md` 修改内容
```
# Summary

* [Introduction](README.md)
* [第一章](c1/c1s1.md)
```
更改原路径为如下结构，并在`c1s1.md` 中编写**markdown**文件
```
.
├── README.md
└── SUMMARY.md
├── c1/
|   └── c1s1.md
```

### 编译运行 gitbook
编译的作用是将 markdown 文件转变为可以访问的 html
```
gitbook build
```
开启 gitbook 服务
```
gitbook serve
```
编译成功后显示信息

![](./img/2018-01-11-tool_gitbook_1.jpg)

在浏览器中打开连接
![](./img/2018-01-11-tool_gitbook_2.jpg)


### 错误及说明
1. 在 windos 上安装 gitbook 的软件后，可以直接像使用
markdown 编辑器一样去撰写书籍，上传到自己的 gitbook 账户即可浏览。
2. 笔者在 windos 7 上运行 `gitbook build` 时会出现如下错误
![](./img/2018-01-11-tool_gitbook_3.jpg)

错误是随机的也可能发生别的组件安装缺失的情况，解决步骤如下

   1. 在主目录下建立 book.json 的文件
   2. 根据错误提示安装对应的组件包，组件包去 [NPM 官网](https://www.npmjs.com/) 中查找
   3. 查找到对应安装包名称后，在 book.json 中写入如下内容
    ```
   {
        "plugins": ["-fontsettings","-sharing","-lunr","-search","-highlight","-livereload"]
    }

    ```
   4. 重新编译`gitbook build`
   5. 重新启动服务`gitbook serve`
   6. 此时会显示如下信息说明启动成功

      ![](./img/2018-01-11-tool_gitbook_4.jpg)

   7. 打开浏览器输入地址即可

## 详细介绍
通过快速入门我们对 gitbook 有了一个基本认识，下面来讲解在使用中常见的需求

### 书籍的上传
注意上传书籍时，若将 _gitbook 放入了忽略文档，则书籍需要在服务器端编译，就是下图中的 UPDATE 选项。   
建议在本地编辑好书籍后直接上传，包含 _gitbook 文件。 
   
当在本地编辑完书籍后，进入 [gitbook 官网](https://www.gitbook.com/)
用 github 账号登录，创建一本新书，点击新书中的 settings options子目录，在其中获得远程书本的仓库地址

![](./img/2018-01-11-tool_gitbook_5.jpg)

再点击 gitbook 右上角图标进入如下界面

![](./img/2018-01-11-tool_gitbook_6.jpg)

记住 application 中的仓库凭证，在获得了仓库的地址和密码后你就可以将本地书籍推送
到远程仓库了。推送流程如下
```
    git remote add gitbook https://git.gitbook.com/{{UserName}}/{{Book}}.git  //添加远程仓库名
    git push -u -f gitbook master //上传你的书籍到远程仓库
```
完成以上流程后你就可以在自己的书籍中看到上传内容。为了避免在上传时反复输入用户名和密码可以创建
~/.netrc 文件(只针对 linux 用户)
```
echo machine git.gitbook.com valid USERNAME-or-EMAIL password API-TOKEN-or-PASSWORD >> ~/.netrc
```
当然你也可以使用命令行创建新仓库
```
    git init // 在 gitbook 的根路径下初始化 git
    git add {{yourbook}} // 添加你需要上传的文件
    git commit -m {{comment}} // 填写你的上传说明
    git remote add gitbook https://git.gitbook.com/{{UserName}}/{{Book}}.git  //添加远程仓库名
    git push -u -f gitbook master //上传你的书籍到远程仓库
```

若使用的是 gitbook editor 必须现在远程新建书本。
然后点击 `edit`即可看到书本的地址，再推送即可
或者点击`book setting`也可以看到该设置。


### 生成其它格式书籍
你可以将自己的学习总结整理成册，利用 gitbook 生成 equb、pdf 等格式便于离线阅读。

由于在使用中依赖 ebook-convert，对于 windos 用户安装如下
1. 下载对应系统的应用[calibre](https://calibre-ebook.com/download)
2. 配置环境变量，将`C:\Program Files\Calibre2`路径添加到 PATH 的环境变量中
3. 安装 ebook-convert `npm install ebook-convert -g
4. 在书本根目录使用 `gitbook pdf` 生成电子书

在书籍根目录下可以保存封面要求如下
1. 1800*2360 的 cover.jpg 200*262 的 cover_small.jpg


在 mac 下的操作步骤.

```bash
#安装 calibre 
brew cask install calibre

# 创建命令行的软连接工具
sudo ln -s /Applications/calibre.app/Contents/MacOS/ebook-convert /usr/bin

# 编译生成 pdf
gitbook pdf
```

### 书籍配置
官方给出的基本结构如下

```
.
├── book.json
├── README.md
├── SUMMARY.md
├── chapter-1/
|   ├── README.md
|   └── something.md
└── chapter-2/
    ├── README.md
    └── something.md
```
各文件说明

| 文件        | 描述                                 |
| :]]></description>
            <content:encoded><![CDATA[<h1 id="gitbook-使用入门" tabindex="-1">gitbook 使用入门 <a class="header-anchor" href="#gitbook-使用入门" aria-label="Permalink to &quot;gitbook 使用入门&quot;"></a></h1>
<p><strong>gitbook 笔记</strong></p>
<h2 id="gitbook-基本介绍" tabindex="-1">gitbook 基本介绍 <a class="header-anchor" href="#gitbook-基本介绍" aria-label="Permalink to &quot;gitbook 基本介绍&quot;"></a></h2>
<p><strong>gitbook</strong> 是用来制作电子书的开源工具。使用 <a href="./markdown">markdown</a> 文法来撰写文章。利用 gitbook 实现网络版的电子书制作。<br>
除此之外你还可以将书籍导出为 <em>epub</em>、<em>pdf</em>、<em>mobi</em> 的格式，方便自己和他人阅读。</p>
<h2 id="快速入门" tabindex="-1">快速入门 <a class="header-anchor" href="#快速入门" aria-label="Permalink to &quot;快速入门&quot;"></a></h2>
<h3 id="安装-gitbook" tabindex="-1">安装 gitbook <a class="header-anchor" href="#安装-gitbook" aria-label="Permalink to &quot;安装 gitbook&quot;"></a></h3>
<ol>
<li>
<p>软件安装，软件的使用方法参见<a href="#appendix">附录教程</a></p>
<p><a href="https://www.gitbook.com/editor" target="_blank" rel="noreferrer">gitbook 官方下载地址</a></p>
</li>
<li>
<p>命令行安装</p>
<p>在安装 node 环境的基础上，利用 npm 安装 gitbook<br>
(对 node 和 npm 不懂的请参看 <a href="./node_guide">node 入门</a>)</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>npm install gitbook-cli -g //全局安装 gitbook</span></span></code></pre>
</div></li>
</ol>
<h3 id="初始化gitbook" tabindex="-1">初始化gitbook <a class="header-anchor" href="#初始化gitbook" aria-label="Permalink to &quot;初始化gitbook&quot;"></a></h3>
<p>安装后，显示安装版本来确认安装成功</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>gitbook -V //注意 V 大写</span></span></code></pre>
</div><p>新建目录，在其中初始化 gitbook</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>gitbook init</span></span></code></pre>
</div><p>初始化后默认生成文件如下</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>.</span></span>
<span class="line"><span>├── README.md</span></span>
<span class="line"><span>└── SUMMARY.md</span></span></code></pre>
</div><p>编辑 <code>SUMMARY.md</code> 修改内容</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span># Summary</span></span>
<span class="line"><span></span></span>
<span class="line"><span>* [Introduction](README.md)</span></span>
<span class="line"><span>* [第一章](c1/c1s1.md)</span></span></code></pre>
</div><p>更改原路径为如下结构，并在<code>c1s1.md</code> 中编写<strong>markdown</strong>文件</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>.</span></span>
<span class="line"><span>├── README.md</span></span>
<span class="line"><span>└── SUMMARY.md</span></span>
<span class="line"><span>├── c1/</span></span>
<span class="line"><span>|   └── c1s1.md</span></span></code></pre>
</div><h3 id="编译运行-gitbook" tabindex="-1">编译运行 gitbook <a class="header-anchor" href="#编译运行-gitbook" aria-label="Permalink to &quot;编译运行 gitbook&quot;"></a></h3>
<p>编译的作用是将 markdown 文件转变为可以访问的 html</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>gitbook build</span></span></code></pre>
</div><p>开启 gitbook 服务</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>gitbook serve</span></span></code></pre>
</div><p>编译成功后显示信息</p>
<p><img src="https://blog.zenheart.site/assets/2018-01-11-tool_gitbook_1.CZkYQXxv.jpg" alt="" loading="lazy"></p>
<p>在浏览器中打开连接
<img src="https://blog.zenheart.site/assets/2018-01-11-tool_gitbook_2.D4Cv6Bvn.jpg" alt="" loading="lazy"></p>
<h3 id="错误及说明" tabindex="-1">错误及说明 <a class="header-anchor" href="#错误及说明" aria-label="Permalink to &quot;错误及说明&quot;"></a></h3>
<ol>
<li>在 windos 上安装 gitbook 的软件后，可以直接像使用
markdown 编辑器一样去撰写书籍，上传到自己的 gitbook 账户即可浏览。</li>
<li>笔者在 windos 7 上运行 <code>gitbook build</code> 时会出现如下错误
<img src="https://blog.zenheart.site/assets/2018-01-11-tool_gitbook_3.BkC2IwUR.jpg" alt="" loading="lazy"></li>
</ol>
<p>错误是随机的也可能发生别的组件安装缺失的情况，解决步骤如下</p>
<ol>
<li>在主目录下建立 book.json 的文件</li>
<li>根据错误提示安装对应的组件包，组件包去 <a href="https://www.npmjs.com/" target="_blank" rel="noreferrer">NPM 官网</a> 中查找</li>
<li>查找到对应安装包名称后，在 book.json 中写入如下内容</li>
</ol>
<pre><code>```
</code></pre>
<p>{
&quot;plugins&quot;: [&quot;-fontsettings&quot;,&quot;-sharing&quot;,&quot;-lunr&quot;,&quot;-search&quot;,&quot;-highlight&quot;,&quot;-livereload&quot;]
}</p>
<pre><code>```
</code></pre>
<ol start="4">
<li>
<p>重新编译<code>gitbook build</code></p>
</li>
<li>
<p>重新启动服务<code>gitbook serve</code></p>
</li>
<li>
<p>此时会显示如下信息说明启动成功</p>
<p><img src="https://blog.zenheart.site/assets/2018-01-11-tool_gitbook_4.Dqg5u_GX.jpg" alt="" loading="lazy"></p>
</li>
<li>
<p>打开浏览器输入地址即可</p>
</li>
</ol>
<h2 id="详细介绍" tabindex="-1">详细介绍 <a class="header-anchor" href="#详细介绍" aria-label="Permalink to &quot;详细介绍&quot;"></a></h2>
<p>通过快速入门我们对 gitbook 有了一个基本认识，下面来讲解在使用中常见的需求</p>
<h3 id="书籍的上传" tabindex="-1">书籍的上传 <a class="header-anchor" href="#书籍的上传" aria-label="Permalink to &quot;书籍的上传&quot;"></a></h3>
<p>注意上传书籍时，若将 _gitbook 放入了忽略文档，则书籍需要在服务器端编译，就是下图中的 UPDATE 选项。<br>
建议在本地编辑好书籍后直接上传，包含 _gitbook 文件。</p>
<p>当在本地编辑完书籍后，进入 <a href="https://www.gitbook.com/" target="_blank" rel="noreferrer">gitbook 官网</a>
用 github 账号登录，创建一本新书，点击新书中的 settings options子目录，在其中获得远程书本的仓库地址</p>
<p><img src="https://blog.zenheart.site/assets/2018-01-11-tool_gitbook_5.BN8nvuEK.jpg" alt="" loading="lazy"></p>
<p>再点击 gitbook 右上角图标进入如下界面</p>
<p><img src="https://blog.zenheart.site/assets/2018-01-11-tool_gitbook_6.CbRf5Lcv.jpg" alt="" loading="lazy"></p>
<p>记住 application 中的仓库凭证，在获得了仓库的地址和密码后你就可以将本地书籍推送
到远程仓库了。推送流程如下</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>    git remote add gitbook https://git.gitbook.com/{{UserName}}/{{Book}}.git  //添加远程仓库名</span></span>
<span class="line"><span>    git push -u -f gitbook master //上传你的书籍到远程仓库</span></span></code></pre>
</div><p>完成以上流程后你就可以在自己的书籍中看到上传内容。为了避免在上传时反复输入用户名和密码可以创建
~/.netrc 文件(只针对 linux 用户)</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>echo machine git.gitbook.com valid USERNAME-or-EMAIL password API-TOKEN-or-PASSWORD >> ~/.netrc</span></span></code></pre>
</div><p>当然你也可以使用命令行创建新仓库</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>    git init // 在 gitbook 的根路径下初始化 git</span></span>
<span class="line"><span>    git add {{yourbook}} // 添加你需要上传的文件</span></span>
<span class="line"><span>    git commit -m {{comment}} // 填写你的上传说明</span></span>
<span class="line"><span>    git remote add gitbook https://git.gitbook.com/{{UserName}}/{{Book}}.git  //添加远程仓库名</span></span>
<span class="line"><span>    git push -u -f gitbook master //上传你的书籍到远程仓库</span></span></code></pre>
</div><p>若使用的是 gitbook editor 必须现在远程新建书本。
然后点击 <code>edit</code>即可看到书本的地址，再推送即可
或者点击<code>book setting</code>也可以看到该设置。</p>
<h3 id="生成其它格式书籍" tabindex="-1">生成其它格式书籍 <a class="header-anchor" href="#生成其它格式书籍" aria-label="Permalink to &quot;生成其它格式书籍&quot;"></a></h3>
<p>你可以将自己的学习总结整理成册，利用 gitbook 生成 equb、pdf 等格式便于离线阅读。</p>
<p>由于在使用中依赖 ebook-convert，对于 windos 用户安装如下</p>
<ol>
<li>下载对应系统的应用<a href="https://calibre-ebook.com/download" target="_blank" rel="noreferrer">calibre</a></li>
<li>配置环境变量，将<code>C:\Program Files\Calibre2</code>路径添加到 PATH 的环境变量中</li>
<li>安装 ebook-convert `npm install ebook-convert -g</li>
<li>在书本根目录使用 <code>gitbook pdf</code> 生成电子书</li>
</ol>
<p>在书籍根目录下可以保存封面要求如下</p>
<ol>
<li>1800<em>2360 的 cover.jpg 200</em>262 的 cover_small.jpg</li>
</ol>
<p>在 mac 下的操作步骤.</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">#安装 calibre </span></span>
<span class="line"><span style="color:#B392F0">brew</span><span style="color:#9ECBFF"> cask</span><span style="color:#9ECBFF"> install</span><span style="color:#9ECBFF"> calibre</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 创建命令行的软连接工具</span></span>
<span class="line"><span style="color:#B392F0">sudo</span><span style="color:#9ECBFF"> ln</span><span style="color:#79B8FF"> -s</span><span style="color:#9ECBFF"> /Applications/calibre.app/Contents/MacOS/ebook-convert</span><span style="color:#9ECBFF"> /usr/bin</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 编译生成 pdf</span></span>
<span class="line"><span style="color:#B392F0">gitbook</span><span style="color:#9ECBFF"> pdf</span></span></code></pre>
</div><h3 id="书籍配置" tabindex="-1">书籍配置 <a class="header-anchor" href="#书籍配置" aria-label="Permalink to &quot;书籍配置&quot;"></a></h3>
<p>官方给出的基本结构如下</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>.</span></span>
<span class="line"><span>├── book.json</span></span>
<span class="line"><span>├── README.md</span></span>
<span class="line"><span>├── SUMMARY.md</span></span>
<span class="line"><span>├── chapter-1/</span></span>
<span class="line"><span>|   ├── README.md</span></span>
<span class="line"><span>|   └── something.md</span></span>
<span class="line"><span>└── chapter-2/</span></span>
<span class="line"><span>    ├── README.md</span></span>
<span class="line"><span>    └── something.md</span></span></code></pre>
</div><p>各文件说明</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">文件</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">book.json</td>
<td style="text-align:left">存储对书本的配置信息例如版本、插件等</td>
</tr>
<tr>
<td style="text-align:left">README.md</td>
<td style="text-align:left">对于书籍或章节的简介</td>
</tr>
<tr>
<td style="text-align:left">SUMMARY.md</td>
<td style="text-align:left">书本目录</td>
</tr>
<tr>
<td style="text-align:left">GLOSSARY.md</td>
<td style="text-align:left">显示文章中的术语</td>
</tr>
</tbody>
</table>
<h4 id="summary-文件" tabindex="-1">summary 文件 <a class="header-anchor" href="#summary-文件" aria-label="Permalink to &quot;summary 文件&quot;"></a></h4>
<p>summary 用来配置文档目录，支持层级嵌套，gitbook 利用它生成书本的目录结构
范例如下：</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span># 目录</span></span>
<span class="line"><span></span></span>
<span class="line"><span>* [第一章](c1/README.md)</span></span>
<span class="line"><span>    * [第一节](c1/c1s1.md)</span></span>
<span class="line"><span>    * [第二节](c1/c1s2.md)</span></span>
<span class="line"><span>* [第二章](c2/README.md)</span></span>
<span class="line"><span>    * [第一节](c2/c2s1.md)</span></span>
<span class="line"><span>    * [第二节](c2/c2s2.md)</span></span></code></pre>
</div><p>可以支持在目录中使用锚点</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span># 目录</span></span>
<span class="line"><span></span></span>
<span class="line"><span>* [第一章](c1/README.md)</span></span>
<span class="line"><span>    * [第一节](c2/c2s1.md#mark)</span></span>
<span class="line"><span>        *[第一段](c2/c2s1.md#p1)</span></span></code></pre>
</div><p>利用markdown标题和水平线语法可以将目录划分为块</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span># 目录</span></span>
<span class="line"><span></span></span>
<span class="line"><span>### 第一块</span></span>
<span class="line"><span>* [第一章](c1/README.md)</span></span>
<span class="line"><span>    * [第一节](c2/c2s1.md#mark)</span></span>
<span class="line"><span>        *[第一段](c2/c2s1.md#p1)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>### 第二块</span></span></code></pre>
</div><p>在目录前生成扉页</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span></span></span>
<span class="line"><span>---</span></span>
<span class="line"><span>书名：WEB 学习笔记</span></span>
<span class="line"><span>---</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 目录</span></span>
<span class="line"><span>...</span></span></code></pre>
</div><p>####　book.json 文件
详细配置参见 <a href="https://toolchain.gitbook.com/config.html" target="_blank" rel="noreferrer">gitbook 配置说明</a>
本书的配置文件如下</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#79B8FF">  "title"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"WEB 学习笔记"</span><span style="color:#FDAEB7;font-style:italic">，</span></span>
<span class="line"><span style="color:#9ECBFF">  "language"</span><span style="color:#FDAEB7;font-style:italic">:</span><span style="color:#9ECBFF"> "zh"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">  "author"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"zenheart"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">  "output"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">null</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">  "plugins"</span><span style="color:#E1E4E8">: [</span><span style="color:#9ECBFF">"-fontsettings"</span><span style="color:#E1E4E8">,</span><span style="color:#9ECBFF">"-sharing"</span><span style="color:#E1E4E8">,</span><span style="color:#9ECBFF">"-lunr"</span><span style="color:#E1E4E8">,</span><span style="color:#9ECBFF">"-search"</span><span style="color:#E1E4E8">,</span><span style="color:#9ECBFF">"-highlight"</span><span style="color:#E1E4E8">,</span><span style="color:#9ECBFF">"-livereload"</span><span style="color:#E1E4E8">],</span></span>
<span class="line"><span style="color:#79B8FF">  "variables"</span><span style="color:#E1E4E8">: {}</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span></code></pre>
</div><h3 id="glossary-md" tabindex="-1">glossary.md <a class="header-anchor" href="#glossary-md" aria-label="Permalink to &quot;glossary.md&quot;"></a></h3>
<p>定义术语</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>    ## 术语1</span></span>
<span class="line"><span>    解释</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    ## 术语2</span></span>
<span class="line"><span>    解释</span></span></code></pre>
</div><p>解释
1  #book-search-results &gt; div.search-noresu...</p>
<h3 id="gitbook-忽略" tabindex="-1">gitbook 忽略 <a class="header-anchor" href="#gitbook-忽略" aria-label="Permalink to &quot;gitbook 忽略&quot;"></a></h3>
<p>若想在 gitbook 下实现文件的忽略。可以利用</p>
<ul>
<li>.gitignore</li>
<li>.ignore</li>
<li>.boolignore
三种格式的文件实现。语法遵循 .gitignore 语法规则。</li>
</ul>
<h3 id="gitbook-评论" tabindex="-1">gitbook 评论 <a class="header-anchor" href="#gitbook-评论" aria-label="Permalink to &quot;gitbook 评论&quot;"></a></h3>
<p>利用 gitbook 评论系统来实现协作开发。
注意在采用该模式时，要保证 gitbook 的为段落。</p>
<h2 id="插件使用" tabindex="-1">插件使用 <a class="header-anchor" href="#插件使用" aria-label="Permalink to &quot;插件使用&quot;"></a></h2>
<p><a href="https://github.com/GitbookIO/theme-api" target="_blank" rel="noreferrer">gitbook theme api</a></p>
<h2 id="常见错误" tabindex="-1">常见错误 <a class="header-anchor" href="#常见错误" aria-label="Permalink to &quot;常见错误&quot;"></a></h2>
<h3 id="gitbook-error-enoent" tabindex="-1">gitbook Error: ENOENT <a class="header-anchor" href="#gitbook-error-enoent" aria-label="Permalink to &quot;gitbook Error: ENOENT&quot;"></a></h3>
<p>升级 gitbook <code>gitbook update</code></p>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<p><a href="https://help.gitbook.com/books/how-can-i-use-git.html" target="_blank" rel="noreferrer">如何利用 git 更新书籍</a></p>
<p><a href="https://developer.gitbook.com/" target="_blank" rel="noreferrer">gitbook api</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/2018-01-11-tool_gitbook_1.CZkYQXxv.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[postman]]></title>
            <link>https://blog.zenheart.site/posts/2018-04-18-postman</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2018-04-18-postman</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[postman
postman 的使用
 功能
* 利用 runner 导入测试数据
* 支持使用
    * 变量
    * api
    
    可以把 postman 当做一个宿主环境
*]]></description>
            <content:encoded><![CDATA[<h1 id="postman" tabindex="-1">postman <a class="header-anchor" href="#postman" aria-label="Permalink to &quot;postman&quot;"></a></h1>
<p><strong>postman 的使用</strong></p>
<h2 id="功能" tabindex="-1">功能 <a class="header-anchor" href="#功能" aria-label="Permalink to &quot;功能&quot;"></a></h2>
<ul>
<li>
<p>利用 runner 导入测试数据</p>
</li>
<li>
<p>支持使用</p>
<ul>
<li><a href="https://www.getpostman.com/docs/v6/postman/environments_and_globals/variables" target="_blank" rel="noreferrer">变量</a></li>
<li><a href="https://www.getpostman.com/docs/v6/postman/scripts/postman_sandbox_api_reference" target="_blank" rel="noreferrer">api</a></li>
</ul>
<p>可以把 postman 当做一个宿主环境</p>
</li>
<li>
<p><a href="https://www.getpostman.com/docs/v6/postman/collection_runs/working_with_data_files" target="_blank" rel="noreferrer">data file</a> 支持单一请求的多种情况测试</p>
</li>
<li>
<p>利用 code 将请求转换为其他的语言.</p>
</li>
<li>
<p>利用目录进一步细分 collection</p>
</li>
<li>
<p>保存响应作为测试用例</p>
</li>
<li>
<p>采用链接的方式分享 <code>collection</code>,详见 <a href="https://www.getpostman.com/docs/v6/postman/collections/sharing_collections" target="_blank" rel="noreferrer">分享 collection</a></p>
</li>
<li>
<p>直接在 import 中导入 curl 请求.</p>
</li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[xmind]]></title>
            <link>https://blog.zenheart.site/posts/2018-10-26-xmind</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2018-10-26-xmind</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[xmind
详解 xmind 的使用
 xmind
讲解 xmind 的使用
 快捷键
* `⌘ + 鼠标移动`  该移动可避免图形插入节点中
* `⌘ + 鼠标选择` 可复选其他内容
 经验
 复制]]></description>
            <content:encoded><![CDATA[<h1 id="xmind" tabindex="-1">xmind <a class="header-anchor" href="#xmind" aria-label="Permalink to &quot;xmind&quot;"></a></h1>
<p><strong>详解 xmind 的使用</strong></p>
<h2 id="xmind-1" tabindex="-1">xmind <a class="header-anchor" href="#xmind-1" aria-label="Permalink to &quot;xmind&quot;"></a></h2>
<p>讲解 xmind 的使用</p>
<h2 id="快捷键" tabindex="-1">快捷键 <a class="header-anchor" href="#快捷键" aria-label="Permalink to &quot;快捷键&quot;"></a></h2>
<ul>
<li><code>⌘ + 鼠标移动</code>  <strong>该移动可避免图形插入节点中</strong></li>
<li><code>⌘ + 鼠标选择</code> 可复选其他内容</li>
</ul>
<h2 id="经验" tabindex="-1">经验 <a class="header-anchor" href="#经验" aria-label="Permalink to &quot;经验&quot;"></a></h2>
<h3 id="复制联系" tabindex="-1">复制联系 <a class="header-anchor" href="#复制联系" aria-label="Permalink to &quot;复制联系&quot;"></a></h3>
<ol>
<li>按住左键拖动选择自定义主题内容,</li>
<li>按住 <code>⌘</code> 选择联系箭头</li>
<li><code>⌘ + c</code> 复制整个内容区</li>
<li>将整个内容区粘贴到关联节点</li>
</ol>
<blockquote>
<p><strong>tip</strong>
由于 xmind 会自动把复制内容合并到节点,
可以选择联系的主题节点,拖动到不产生自动合并的地方
再按住 <code>⌘</code> 拖动联系节点,此时不会产生自动合并</p>
</blockquote>
<p>结合自定义主题和结构可创造复杂的图例.</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[转义字符 \t]]></title>
            <link>https://blog.zenheart.site/posts/2019-05-11-escape</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2019-05-11-escape</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[
# 转义字符 \t

**转义字符 \t**


## 引言
在学习 [c 程序设计语言第二版](https://book.douban.com/subject/1139336/)
时,无法理解习题 1.20 **制表符终止位** 的概念,查阅相关资料,发现是未理解转义字符 `\t`

## 制表符(TAB)
`\t` 制表符用于控制水平光标位置。
在终端默认为 8 个字符,制表符的特性总结为:**将当前光标自动移动到,距离最近的下一个8n字符间隔之后,n 为正整数**

::: tip
8 个**字符间隔**是默认行为,可用 `tabs n` 设定 `\t` 的间距
,**字符间隔**为单个空格宽度 ,若为中文等其他字符可能占据多个**字符间隔**
:::

而之前的错误认知一直以为制表符，代替固定的**字符间隔**,例如 `\t` 表示 3 个**字符间隔**可以采用如下方式验证

shell 中输入如下指令

```bash
# 在出现 \t 的位置后利用 | 标识
echo "hello--\t|中aa\t|\t|\na\t|]]></description>
            <content:encoded><![CDATA[<h1 id="转义字符-t" tabindex="-1">转义字符 \t <a class="header-anchor" href="#转义字符-t" aria-label="Permalink to &quot;转义字符 \t&quot;"></a></h1>
<p><strong>转义字符 \t</strong></p>
<h2 id="引言" tabindex="-1">引言 <a class="header-anchor" href="#引言" aria-label="Permalink to &quot;引言&quot;"></a></h2>
<p>在学习 <a href="https://book.douban.com/subject/1139336/" target="_blank" rel="noreferrer">c 程序设计语言第二版</a>
时,无法理解习题 1.20 <strong>制表符终止位</strong> 的概念,查阅相关资料,发现是未理解转义字符 <code>\t</code></p>
<h2 id="制表符-tab" tabindex="-1">制表符(TAB) <a class="header-anchor" href="#制表符-tab" aria-label="Permalink to &quot;制表符(TAB)&quot;"></a></h2>
<p><code>\t</code> 制表符用于控制水平光标位置。
在终端默认为 8 个字符,制表符的特性总结为:<strong>将当前光标自动移动到,距离最近的下一个8n字符间隔之后,n 为正整数</strong></p>
<div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>8 个<strong>字符间隔</strong>是默认行为,可用 <code>tabs n</code> 设定 <code>\t</code> 的间距
,<strong>字符间隔</strong>为单个空格宽度 ,若为中文等其他字符可能占据多个<strong>字符间隔</strong></p>
</div>
<p>而之前的错误认知一直以为制表符，代替固定的<strong>字符间隔</strong>,例如 <code>\t</code> 表示 3 个<strong>字符间隔</strong>可以采用如下方式验证</p>
<p>shell 中输入如下指令</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 在出现 \t 的位置后利用 | 标识</span></span>
<span class="line"><span style="color:#79B8FF">echo</span><span style="color:#9ECBFF"> "hello--\t|中aa\t|\t|\na\t|----\t|------\t|"</span></span></code></pre>
</div><p>在 <code>\t</code> 后填充 <code>|</code> 字符模拟光标位置,输出结果为:</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>hello-- |中aa   |       |</span></span>
<span class="line"><span>a       |----   |------ |</span></span></code></pre>
</div><p>结果可知 <code>\t</code> 会自动调整光标位置,使之在 8n 个<strong>字符间隔</strong>之后</p>
<p>也可以在 <code>vscode</code> 编辑其中验证此特性,输入一个或多个字符按一下 <code>tab</code> 键看光标会移动到哪？</p>
<blockquote>
<p>注意编辑器中查看 <code>tab</code> 相关设置,确定使能了制表符特性</p>
</blockquote>
<p>实际上在文档软件中也存在制表符概念,这里以 mac 自带的 pages 举例。
参看动图:</p>
<p><img src="https://blog.zenheart.site/assets/2019-05-11-tab.DFBeogEF.png" alt="" loading="lazy"></p>
<p>可以看到,在按下 <code>tab</code> 键后,光标的自动移动到,布局中设定的制表符距离之后。</p>
<p>通过修改距离,会更改光标的移动间距,读者可以尝试输入字符再按 tab 键,确认光标移动是否符合如下规则</p>
<blockquote>
<p>光标只会相对每行起始位置,移动到最近 <code>xn</code> 间距后,<code>x</code> 表示设定的距离,<code>n</code> 为正整数</p>
</blockquote>
<p>通过上述示例希望读者完全理解 <code>\t</code> 的作用。</p>
<p>此外推荐阅读 <a href="https://www.ruanyifeng.com/blog/2006/04/post_213.html" target="_blank" rel="noreferrer">阮一峰回车和换行符</a> 理解 <code>\r</code> 和 <code>\n</code></p>
<p>既然理解了制表符的功能制表符终止位的含义就清晰可见了</p>
<blockquote>
<p><strong>制表符终止位是指使用制表符键所对应的光标位置</strong></p>
</blockquote>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/2019-05-11-tab.DFBeogEF.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[module]]></title>
            <link>https://blog.zenheart.site/projects/how-module-work/module</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/how-module-work/module</guid>
            <pubDate>Sun, 02 Feb 2020 03:16:53 GMT</pubDate>
            <description><![CDATA[
# module

**前言:讲解前端的模块加载**

]]></description>
            <content:encoded><![CDATA[<h1 id="module" tabindex="-1">module <a class="header-anchor" href="#module" aria-label="Permalink to &quot;module&quot;"></a></h1>
<p><strong>前言:讲解前端的模块加载</strong></p>
<hr>
<h1 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h1>
<p>前端开发，乱象丛生。如何形成 js 浏览器的生态圈。
模块加载的基本概念。</p>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<ul>
<li>[ ] <a href="http://javascript.ruanyifeng.com/nodejs/module.html" target="_blank" rel="noreferrer">阮一峰 commonjs</a></li>
<li>[ ] <a href="https://75team.com/post/%E8%AF%91%E7%A5%9E%E9%A9%AC%E6%98%AFamd-commonjs-umd.html" target="_blank" rel="noreferrer">amd commonjs umd</a></li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[emmet 使用手册]]></title>
            <link>https://blog.zenheart.site/posts/2017-02-09-emmet</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-02-09-emmet</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[# emmet 使用手册

**利用 emmet 提高前端编写效率** 

]]></description>
            <content:encoded><![CDATA[<h1 id="emmet-使用手册" tabindex="-1">emmet 使用手册 <a class="header-anchor" href="#emmet-使用手册" aria-label="Permalink to &quot;emmet 使用手册&quot;"></a></h1>
<p><strong>利用 emmet 提高前端编写效率</strong></p>
<hr>
<h2 id="环境安装" tabindex="-1">环境安装 <a class="header-anchor" href="#环境安装" aria-label="Permalink to &quot;环境安装&quot;"></a></h2>
<p><a href="http://docs.emmet.io/" target="_blank" rel="noreferrer">emmet 官网</a> 下载编辑器插件，PHPSTORM 默认安装 EMMET 来开发代码</p>
<h2 id="快速上手" tabindex="-1">快速上手 <a class="header-anchor" href="#快速上手" aria-label="Permalink to &quot;快速上手&quot;"></a></h2>
<p>采用缩写来定义常用的标签属性，及标签。例如
#id1 按下 tab 键后会变成<code>&lt;div id=&quot;id1&quot;&gt;&lt;/div&gt;</code>
演示一个复杂的例子。
范例：</p>
<div class="language-md"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">#page>div.logo+ul#navigation>li*5>a{Item $}</span></span></code></pre>
</div><p>按下 TAB 键后展开结果为：</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> id</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"page"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"logo"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#B392F0"> id</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"navigation"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#E1E4E8">>Item 1&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#E1E4E8">>Item 2&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#E1E4E8">>Item 3&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#E1E4E8">>Item 4&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#E1E4E8">>Item 5&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><p>将上述范例进行拆解，<code>#page</code> 默认产生了一个 id 为 div 的标签，<code>&gt;</code> 和 CSS 的自结合符含义相同，代表 <code>id=page</code> 的 div 标签内部嵌套了，
<code>class=logo</code> 的 div 其中 <code>.logo</code> 即表示类名为 <code>logo</code> <code>+</code> 号类似 CSS 的相邻兄弟结合符及 <code>id=navigation</code> 的ul 和div 之间是并列关系
在后面的 <code>*5</code> 表示前面的 <code>li</code> 出现 5 次，{ $}表示 a 标签中包含按次序
增加的 Item 1-5 的内容。再根据标识符优先级关系可以将上面的结构表示如下
<code>#page&gt;(div.logo+(ul#navigatiaon&gt;(li*5&gt;a{Item $})))</code></p>
<h2 id="符号详解" tabindex="-1">符号详解 <a class="header-anchor" href="#符号详解" aria-label="Permalink to &quot;符号详解&quot;"></a></h2>
<p>EMMET 的语法类似与 CSS 的选择器标识符，语法分为  HTML 内部标签的简明写法和 style 中 CSS 的简明语法使用
并且支持嵌套操作，这在生成表格和产生表单等嵌套层级元素中及其有效，若自定标签例如 <code>tag</code> 按 tab 键后会变成标签格式
在组合时中间不能加空格，因为 EMMET 会将空格识别为结束，当然字符串中或<code>{}</code> 中的空格除外。</p>
<h3 id="嵌套操作符" tabindex="-1">嵌套操作符 <a class="header-anchor" href="#嵌套操作符" aria-label="Permalink to &quot;嵌套操作符&quot;"></a></h3>
<ul>
<li><strong>子代:<code>&gt;</code></strong></li>
</ul>
<p>范例：<code>div&gt;ul&gt;li</code></p>
<p>结果</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><ul>
<li><strong>兄弟:<code>+</code></strong></li>
</ul>
<p>范例：<code>div+p+bp</code></p>
<p>结果</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#FDAEB7;font-style:italic">bp</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#FDAEB7;font-style:italic">bp</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><ul>
<li><strong>上升:<code>^</code></strong></li>
</ul>
<p>范例：<code>div+div&gt;p&gt;span+em^^bq+p</code></p>
<p>讲解：看上面范例攀爬元素可以出现多次，由于每出现一次<code>&gt;</code>代表树的深度加一，
<code>^</code> 的作用是使后面的元素或元素组(下面会有范例)向上移动一层，当<code>^</code>的符号大于树的深度时
就是最外层元素，</p>
<p>结果:</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">span</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">span</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">em</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">em</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">blockquote</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">blockquote</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">```html</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">* **元素组:`()`**</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">范例：`div>(header>ul>li*2>a)+footer>p`</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">结果</span></span>
<span class="line"><span style="color:#E1E4E8">```html</span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">header</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">            &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">            &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;/</span><span style="color:#85E89D">header</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">footer</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;/</span><span style="color:#85E89D">footer</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><ul>
<li><strong>元素组:<code>()</code></strong></li>
</ul>
<p>范例：<code>div&gt;(header&gt;ul&gt;li*2&gt;a)+footer&gt;p</code></p>
<p>结果</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">header</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">            &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">            &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;/</span><span style="color:#85E89D">header</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">footer</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">        &#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;/</span><span style="color:#85E89D">footer</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><h3 id="属性操作符" tabindex="-1">属性操作符 <a class="header-anchor" href="#属性操作符" aria-label="Permalink to &quot;属性操作符&quot;"></a></h3>
<p><strong>ID 和类元素:<code>#、.</code></strong></p>
<p>范例：<code>div#header+div.page+div#footer.class1.class2.class3</code></p>
<p>结果</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> id</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"header"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"page"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> id</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"footer"</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"class1 class2 class3"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><p><strong>自定义属性:<code>[属性名1=&quot;属性值1...&quot; 属性名2=&quot;属性值1&quot;...]</code></strong></p>
<p>范例：<code>td[title=&quot;Hello world!&quot; colspan=3]</code></p>
<p>结果</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">td</span><span style="color:#B392F0"> title</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"Hello world!"</span><span style="color:#B392F0"> colspan</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"3"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">td</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><p><strong>项目编号:<code>$</code>、<code>$@-</code>、<code>$@n</code></strong>
解释:<code>$</code> 来表示顺序增加，<code>$@-</code>按照 <code>*n1</code> 从 n1 开始倒序减少,<code>$@n</code> 表示从
n 开始计数,这两种符号也可以结合使用<code>$@-n</code> 表示从基数为 n 加上重复符的次数倒序排列</p>
<p>范例：
1.<code>ul&gt;li.item$*5</code>
2.<code>ul&gt;li.item$@-*5</code>
3.<code>ul&gt;li.items$@10*5</code>
4.<code>ul&gt;li.items$@-10*5</code></p>
<p>结果</p>
<ol>
<li></li>
</ol>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item1"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item2"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item3"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item4"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item5"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><ol start="2">
<li></li>
</ol>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item5"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item4"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item3"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item2"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"item1"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><ol start="3">
<li></li>
</ol>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items10"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items11"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items12"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items13"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items14"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><ol>
<li></li>
</ol>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items14"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items13"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items12"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items11"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">    &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"items10"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><p><strong>文本:<code>{}</code></strong></p>
<p>范例：<code>a[&quot;http://www.baidu.com&quot;]{Click me}</code></p>
<p>结果</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"http://www.baidu.com"</span><span style="color:#E1E4E8">>Click me&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><h3 id="元素类型" tabindex="-1">元素类型 <a class="header-anchor" href="#元素类型" aria-label="Permalink to &quot;元素类型&quot;"></a></h3>
<p>所有元素的缩写和展开方式，都是以 json 的格式存储在 <a href="https://github.com/emmetio/emmet/blob/master/lib/snippets.json" target="_blank" rel="noreferrer">snippets.json</a>
的文件之下，这就意味着你可以自己修改，此文件来增加你所需要的缩写扩展。具体详见<a href="http://docs.emmet.io/abbreviations/types/" target="_blank" rel="noreferrer">EMMET 元素扩展</a></p>
<h3 id="隐式标签名" tabindex="-1">隐式标签名 <a class="header-anchor" href="#隐式标签名" aria-label="Permalink to &quot;隐式标签名&quot;"></a></h3>
<p>解释：当你在只使用 <code>#类名</code> 或 <code>.属性名</code> 是他可以根据父标签自动将属性添加到可能的标签中</p>
<p>举例:
1.<code>span#s1&gt;#s2</code>
2.<code>ul&gt;.l_1</code></p>
<p>结果:</p>
<ol>
<li></li>
</ol>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">span</span><span style="color:#B392F0"> id</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"s1"</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">span</span><span style="color:#B392F0"> id</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"s2"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">span</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">span</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><ol start="2">
<li></li>
</ol>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">  &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"l_1"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><h3 id="乱数假文生成器" tabindex="-1"><a href="http://baike.baidu.com/link?url=hhaREMXKD4-FXl8e_K3p-8rcrJo0pxI26Ky9VDvoHX-9djUboExXcAcFnoF1_tI1TT_Kph5fcnDf4fQ9SVJVda" target="_blank" rel="noreferrer">乱数假文</a>生成器 <a class="header-anchor" href="#乱数假文生成器" aria-label="Permalink to &quot;[乱数假文](http://baike.baidu.com/link?url=hhaREMXKD4-FXl8e_K3p-8rcrJo0pxI26Ky9VDvoHX-9djUboExXcAcFnoF1_tI1TT_Kph5fcnDf4fQ9SVJVda)生成器&quot;"></a></h3>
<p>解释：乱数假文是一堆无意义的英文字符序列，是用来验证印刷排版的，你可以在段落中先插入这些，乱序字符
来模拟看排版是否正确。<code>lorm</code>后面跟数字可以控制生成的单词数量</p>
<p>举例:
1.<code>p&gt;lorem</code>
2.<code>p&gt;lorem3</code></p>
<p>结果:
1.</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus delectus eaque est iste laboriosam minima</span></span>
<span class="line"><span style="color:#E1E4E8">necessitatibus, nostrum numquam officiis quaerat qui recusandae reiciendis repellat sint soluta tempora unde vero</span></span>
<span class="line"><span style="color:#E1E4E8">voluptas!</span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><ol start="2">
<li></li>
</ol>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">>Lorem ipsum dolor.&#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span></code></pre>
</div><h2 id="css-缩写" tabindex="-1">CSS 缩写 <a class="header-anchor" href="#css-缩写" aria-label="Permalink to &quot;CSS 缩写&quot;"></a></h2>
<p>直接在 style 标签或 .css 文件中使用 css 缩写就会被，emmet 展开，</p>
<p>举例:1.<code>m:10p</code>2.<code>mr10r</code>3.<code>p5rem+m10px!</code></p>
<p>结果:</p>
<div class="language-css"><button title="Copy Code" class="copy"></button><span class="lang">css</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">/* 1 */</span></span>
<span class="line"><span style="color:#E1E4E8">margin: 10%;</span></span>
<span class="line"><span style="color:#6A737D">/* 2 */</span></span>
<span class="line"><span style="color:#85E89D">margin-right</span><span style="color:#E1E4E8">: 10rem;</span></span>
<span class="line"><span style="color:#6A737D">/* 3 */</span></span>
<span class="line"><span style="color:#E1E4E8">margin: 10px !important;</span></span></code></pre>
</div><p>解释: css 缩写的展开方式及其智能，自动识别缩写全称及单位，感叹号代表重要性。</p>
<h3 id="厂商前缀" tabindex="-1">厂商前缀 <a class="header-anchor" href="#厂商前缀" aria-label="Permalink to &quot;厂商前缀&quot;"></a></h3>
<p>对于不同属性由于各浏览器厂商会定义自己的规则前缀，在使用 emmet 缩写时自动帮我们识别，添加所有
可能会出现不同前置标签的属性。</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[点击穿透]]></title>
            <link>https://blog.zenheart.site/posts/2017-02-22-click_through</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2017-02-22-click_through</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[点击穿透
在移动端，弹出层的事件会触发下层界面中的事件。
点击穿透
segmentfault 点击穿透
 Deferred long-running timer task(s) to improve ]]></description>
            <content:encoded><![CDATA[<h1 id="点击穿透" tabindex="-1">点击穿透 <a class="header-anchor" href="#点击穿透" aria-label="Permalink to &quot;点击穿透&quot;"></a></h1>
<p>在移动端，弹出层的事件会触发下层界面中的事件。</p>
<p><a href="http://www.tuicool.com/articles/6NfaUnM" target="_blank" rel="noreferrer">点击穿透</a>
<a href="https://segmentfault.com/a/1190000003848737" target="_blank" rel="noreferrer">segmentfault 点击穿透</a></p>
<h2 id="deferred-long-running-timer-task-s-to-improve-scrolling-smoothness" tabindex="-1">Deferred long-running timer task(s) to improve scrolling smoothness <a class="header-anchor" href="#deferred-long-running-timer-task-s-to-improve-scrolling-smoothness" aria-label="Permalink to &quot;Deferred long-running timer task(s) to improve scrolling smoothness&quot;"></a></h2>
<ul>
<li>[ ] <a href="https://stackoverflow.com/questions/37367200/deferred-long-running-timer-tasks-to-improve-scrolling-smoothness" target="_blank" rel="noreferrer">stackoverflow 解答</a></li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[windows 使用技巧]]></title>
            <link>https://blog.zenheart.site/posts/2018-02-01-windows</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2018-02-01-windows</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[windows 使用技巧
windows 系统使用经验
 windos 环境配置
 任务管理器
双击空白区域会隐藏工具栏。
任务管理器最小化模式
 运行命令框
利用 `windows + r` 进入运]]></description>
            <content:encoded><![CDATA[<h1 id="windows-使用技巧" tabindex="-1">windows 使用技巧 <a class="header-anchor" href="#windows-使用技巧" aria-label="Permalink to &quot;windows 使用技巧&quot;"></a></h1>
<p><strong>windows 系统使用经验</strong></p>
<h2 id="windos-环境配置" tabindex="-1">windos 环境配置 <a class="header-anchor" href="#windos-环境配置" aria-label="Permalink to &quot;windos 环境配置&quot;"></a></h2>
<h3 id="任务管理器" tabindex="-1">任务管理器 <a class="header-anchor" href="#任务管理器" aria-label="Permalink to &quot;任务管理器&quot;"></a></h3>
<p>双击空白区域会隐藏工具栏。
<a href="https://support.microsoft.com/en-us/kb/193050" target="_blank" rel="noreferrer">任务管理器最小化模式</a></p>
<h3 id="运行命令框" tabindex="-1">运行命令框 <a class="header-anchor" href="#运行命令框" aria-label="Permalink to &quot;运行命令框&quot;"></a></h3>
<p>利用 <code>windows + r</code> 进入运行对话框,你可以在对话框中输入你想要打开的软件名，
在打开运行后，利用 <code>f4</code> 可以查看最近的指令
举例：</p>
<div class="language-txt"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>#  打开绘画工具</span></span>
<span class="line"><span>mspaint </span></span>
<span class="line"><span></span></span>
<span class="line"><span>#  打开资源管理器</span></span>
<span class="line"><span>resmon </span></span>
<span class="line"><span></span></span>
<span class="line"><span>#  任务管理器</span></span>
<span class="line"><span>taskmgr </span></span>
<span class="line"><span></span></span>
<span class="line"><span>#  打开计算器</span></span>
<span class="line"><span>calc </span></span>
<span class="line"><span></span></span>
<span class="line"><span>#  打开 dos 命令窗口</span></span>
<span class="line"><span>cmd </span></span>
<span class="line"><span></span></span>
<span class="line"><span>#  打开photoshop，如果你已经安装了的话</span></span>
<span class="line"><span>photoshop </span></span>
<span class="line"><span></span></span>
<span class="line"><span># 打开记事本</span></span>
<span class="line"><span>notepad </span></span>
<span class="line"><span></span></span>
<span class="line"><span># windows 自带截图工具</span></span>
<span class="line"><span>snippingTool </span></span>
<span class="line"><span></span></span>
<span class="line"><span># 打开设备管理器</span></span>
<span class="line"><span>devmgmt.msc  </span></span>
<span class="line"><span></span></span>
<span class="line"><span># 打开环境变量配置</span></span>
<span class="line"><span>sysdm.cpl</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 打开服务管理</span></span>
<span class="line"><span>services.msc</span></span></code></pre>
</div><p>可以利用运行窗口快速启动不同软件配置如下。</p>
<h2 id="软件" tabindex="-1">软件 <a class="header-anchor" href="#软件" aria-label="Permalink to &quot;软件&quot;"></a></h2>
<h3 id="powershell" tabindex="-1">powershell <a class="header-anchor" href="#powershell" aria-label="Permalink to &quot;powershell&quot;"></a></h3>
<p>windows 下新版 shell</p>
<h3 id="everything" tabindex="-1">everything <a class="header-anchor" href="#everything" aria-label="Permalink to &quot;everything&quot;"></a></h3>
<p>实现快速的文件查找。</p>
<p><a href="https://xbeta.info/everything/faq.htm#How_do_I_use_regex" target="_blank" rel="noreferrer">everything 常见问题</a></p>
<h3 id="chocolatey" tabindex="-1"><a href="https://chocolatey.org/" target="_blank" rel="noreferrer">Chocolatey</a> <a class="header-anchor" href="#chocolatey" aria-label="Permalink to &quot;[Chocolatey](https://chocolatey.org/)&quot;"></a></h3>
<p>实现利用命令进行软件安装
常用命令。</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 更新自身</span></span>
<span class="line"><span style="color:#B392F0">choco</span><span style="color:#9ECBFF"> upgrade</span><span style="color:#9ECBFF"> chocolatey</span></span></code></pre>
</div><h3 id="notebook" tabindex="-1">notebook <a class="header-anchor" href="#notebook" aria-label="Permalink to &quot;notebook&quot;"></a></h3>
<p>多方同步工具。
在使用时注意新的笔记本需要打开后才可使用。
若无法同步先去远程服务器查看服务器端是否有结果。
<a href="https://xbeta.info/everything/faq.htm#How_do_I_include_spaces_in_my_search" target="_blank" rel="noreferrer">资料</a></p>
<h3 id="synergy" tabindex="-1">synergy <a class="header-anchor" href="#synergy" aria-label="Permalink to &quot;synergy&quot;"></a></h3>
<p>实现一套键鼠控制多台电脑</p>
<h2 id="使用技巧" tabindex="-1">使用技巧 <a class="header-anchor" href="#使用技巧" aria-label="Permalink to &quot;使用技巧&quot;"></a></h2>
<h3 id="外界显示器配置" tabindex="-1">外界显示器配置 <a class="header-anchor" href="#外界显示器配置" aria-label="Permalink to &quot;外界显示器配置&quot;"></a></h3>
<p><img src="https://blog.zenheart.site/assets/2018-02-01-windows-mul-screen.DsOUvoN9.gif" alt="" loading="lazy"></p>
<h3 id="更改系统盘符" tabindex="-1">更改系统盘符 <a class="header-anchor" href="#更改系统盘符" aria-label="Permalink to &quot;更改系统盘符&quot;"></a></h3>
<ol>
<li>右键点击计算机-&gt;管理-&gt;磁盘管理</li>
<li>选择对应磁盘-&gt;更改驱动器号和路径</li>
<li>选择新的驱动器号即可</li>
</ol>
<h2 id="dos-命令" tabindex="-1">dos 命令 <a class="header-anchor" href="#dos-命令" aria-label="Permalink to &quot;dos 命令&quot;"></a></h2>
<h3 id="systeminfo" tabindex="-1">systeminfo <a class="header-anchor" href="#systeminfo" aria-label="Permalink to &quot;systeminfo&quot;"></a></h3>
<p>功能：显示 windows 系统参数</p>
<h3 id="ver" tabindex="-1">ver <a class="header-anchor" href="#ver" aria-label="Permalink to &quot;ver&quot;"></a></h3>
<p>功能：显示系统版本</p>
<h3 id="netstat" tabindex="-1">netstat <a class="header-anchor" href="#netstat" aria-label="Permalink to &quot;netstat&quot;"></a></h3>
<p>功能：显示网络连接</p>
<p>举例：</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 查看 tcp 会话状态</span></span>
<span class="line"><span style="color:#B392F0">netstat</span><span style="color:#79B8FF">  -p</span><span style="color:#9ECBFF"> tcp</span><span style="color:#9ECBFF">  //查看</span><span style="color:#9ECBFF"> tcp</span><span style="color:#9ECBFF"> 会话状态</span></span>
<span class="line"><span style="color:#6A737D"># 显示某会话</span></span>
<span class="line"><span style="color:#6A737D"># -a 显示所有网络会话</span></span>
<span class="line"><span style="color:#6A737D"># -o 显示进程 id</span></span>
<span class="line"><span style="color:#6A737D"># -n 显示序号</span></span>
<span class="line"><span style="color:#6A737D"># 查询端口 8080 设计的进程信息</span></span>
<span class="line"><span style="color:#B392F0">netstat</span><span style="color:#79B8FF"> -nao</span><span style="color:#F97583"> |</span><span style="color:#B392F0"> findstr</span><span style="color:#79B8FF"> 8080</span></span></code></pre>
</div><h3 id="findstr" tabindex="-1">findstr <a class="header-anchor" href="#findstr" aria-label="Permalink to &quot;findstr&quot;"></a></h3>
<p>查询字符串内容</p>
<h3 id="set" tabindex="-1">SET <a class="header-anchor" href="#set" aria-label="Permalink to &quot;SET&quot;"></a></h3>
<p>设置环境变量</p>
<p><strong>范例:</strong></p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 设置环境变量</span></span>
<span class="line"><span style="color:#B392F0">SET</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">env_nam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span><span style="color:#9ECBFF"> =</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">valu</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 清空该变量</span></span>
<span class="line"><span style="color:#B392F0">SET</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">env_nam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span><span style="color:#9ECBFF"> =</span><span style="color:#E1E4E8"> </span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 追加变量</span></span>
<span class="line"><span style="color:#B392F0">STE</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">env_nam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span><span style="color:#9ECBFF"> =</span><span style="color:#9ECBFF"> %</span><span style="color:#F97583">&#x3C;</span><span style="color:#9ECBFF">env_nam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span><span style="color:#9ECBFF">%</span><span style="color:#E1E4E8">;</span><span style="color:#F97583">&#x3C;</span><span style="color:#E1E4E8">add_value</span><span style="color:#F97583">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 显示变量,不存在会报未定义</span></span>
<span class="line"><span style="color:#B392F0">SET</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">env_nam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span></span></code></pre>
</div><h3 id="start" tabindex="-1">start <a class="header-anchor" href="#start" aria-label="Permalink to &quot;start&quot;"></a></h3>
<p>启动一个命令行窗口</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>   start . //打开当前工作目录 </span></span>
<span class="line"><span>   start xx //打开应用，应用可以简写后放在 windows 目录下实现 </span></span>
<span class="line"><span>   start . //打开当前工作目录</span></span></code></pre>
</div><p>可以使用该命令执行 windows 脚本，后缀为 <code>.cmd</code> 的文件。</p>
<div class="language-cmd"><button title="Copy Code" class="copy"></button><span class="lang">cmd</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">   # 文件名</span></span>
<span class="line"><span style="color:#E1E4E8">   start /B </span><span style="color:#F97583">&#x3C;</span><span style="color:#E1E4E8">command_file_name</span><span style="color:#F97583">></span></span></code></pre>
</div><h3 id="tasklist" tabindex="-1">tasklist <a class="header-anchor" href="#tasklist" aria-label="Permalink to &quot;tasklist&quot;"></a></h3>
<p>显示当前任务</p>
<div class="language-dos"><button title="Copy Code" class="copy"></button><span class="lang">dos</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>   tasklist /fi "imagename eq chrome*" //查找所有和 chrome 有关的进程 </span></span>
<span class="line"><span>   tasklist /fi "memusage gt 50000"  //查找占用内存超过50000kB 的进程</span></span></code></pre>
</div><h3 id="taskkill" tabindex="-1">taskkill <a class="header-anchor" href="#taskkill" aria-label="Permalink to &quot;taskkill&quot;"></a></h3>
<p>终止当前进程</p>
<div class="language-dos"><button title="Copy Code" class="copy"></button><span class="lang">dos</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>   taskkill /im chrome*  //杀死所有和 chrome 有关的进程</span></span></code></pre>
</div><h3 id="type" tabindex="-1">type <a class="header-anchor" href="#type" aria-label="Permalink to &quot;type&quot;"></a></h3>
<p>显示文件内容</p>
<h3 id="select-string" tabindex="-1">select-string <a class="header-anchor" href="#select-string" aria-label="Permalink to &quot;select-string&quot;"></a></h3>
<p>类似 linux 下的 grep 指令。</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 显示对应的 tcp 连接</span></span>
<span class="line"><span style="color:#B392F0">netstat</span><span style="color:#79B8FF"> -tno</span><span style="color:#F97583"> |</span><span style="color:#E1E4E8"> select-string </span><span style="color:#9ECBFF">":1111*"</span></span></code></pre>
</div><h2 id="net" tabindex="-1">net <a class="header-anchor" href="#net" aria-label="Permalink to &quot;net&quot;"></a></h2>
<p>用来停止和重启网络服务</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 开启服务</span></span>
<span class="line"><span style="color:#B392F0">net</span><span style="color:#9ECBFF"> start</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">server_nam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span><span style="color:#E1E4E8"> </span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 停止服务</span></span>
<span class="line"><span style="color:#B392F0">net</span><span style="color:#9ECBFF"> stop</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">server_nam</span><span style="color:#E1E4E8">e</span><span style="color:#F97583">></span></span></code></pre>
</div><p><strong>注意若使用命令时报 error 5 ，说明需要使用管理员权限执行此命令</strong></p>
<h2 id="快捷键" tabindex="-1">快捷键 <a class="header-anchor" href="#快捷键" aria-label="Permalink to &quot;快捷键&quot;"></a></h2>
<h3 id="窗口控制" tabindex="-1">窗口控制 <a class="header-anchor" href="#窗口控制" aria-label="Permalink to &quot;窗口控制&quot;"></a></h3>
<ul>
<li><code>alt + f4</code> 关闭窗口</li>
<li><code>ctrl + w</code> 关闭当前窗口</li>
<li><code>shift + 应用图标</code> 在新窗口打开应用</li>
<li><code>ctrl + shift + esc</code>  迅速打开任务管理器</li>
<li><code>win + break</code>  快速打开系统信息</li>
<li><code>win + p</code>  切换扩展屏模式</li>
<li><code>win + B</code>  定位到任务栏，系统工具</li>
<li><code>win + n</code> 打开任务对应窗口，<code>n = [1-9]</code> 均可</li>
<li><code>win + T</code> 预览任务栏应用</li>
<li><code>win + SPACE</code> 显示桌面</li>
<li><code>ctrl + shift + 鼠标左键 + 应用图标</code> 管理员方式打开应用</li>
</ul>
<h3 id="文件夹相关" tabindex="-1">文件夹相关 <a class="header-anchor" href="#文件夹相关" aria-label="Permalink to &quot;文件夹相关&quot;"></a></h3>
<ul>
<li><code>alt + ↑ | ← | →</code> 父级和子级文件夹之间的切换</li>
<li><code>shift + 鼠标右键</code> 可以在此处打开命令窗口</li>
<li><code>ctrl + shift + n</code>   新建文件夹</li>
<li><code>ctrl + d</code>   删除文件夹</li>
<li><code>f2</code>   重命名文件</li>
<li><code>alt + d</code>   删除文件夹</li>
<li><code>鼠标</code> 同分区移动文件是剪切粘贴。</li>
<li><code>ctrl + 鼠标</code> 同分区复制文件</li>
<li><code>鼠标</code> 不同分区复制文件</li>
<li><code>shift + 鼠标</code> 不同分区剪切粘贴文件</li>
<li><code>alt + 鼠标</code> 创建快捷方式</li>
</ul>
<h2 id="windows-环境变量详解" tabindex="-1">windows 环境变量详解 <a class="header-anchor" href="#windows-环境变量详解" aria-label="Permalink to &quot;windows 环境变量详解&quot;"></a></h2>
<blockquote>
<p>PATH</p>
</blockquote>
<p>path 在查找时，会根据顺序进行搜索。
如果找到了对应路径就不会继续查找。
在安装多个版本的软件时可以利用这个特性实现对版本的访问控制。</p>
<p><code>PATH=c:\python\2.5;c:\python\2.6</code> 此时会默认使用 2.5.
<code>PATH=c:\python\2.6;c:\python\2.2</code> 此时会默认使用 2.6.</p>
<h2 id="软件安装" tabindex="-1">软件安装 <a class="header-anchor" href="#软件安装" aria-label="Permalink to &quot;软件安装&quot;"></a></h2>
<p>使用 windows 进行软件安装时，若出现缺少某组件。
按照如下思路解决。</p>
<ol>
<li>可能是已安装该安装包，但是非官方资源软件无法识别。</li>
<li>未安装该安装包</li>
</ol>
<p>解决步骤</p>
<blockquote>
<p>问题 1</p>
</blockquote>
<ol>
<li>利用 <code>windows + r</code> 打开运行窗口输入 <code>control panel</code> 打开控制面板选择<code>程序和功能</code></li>
<li>在程序中查找对应的安装包，若存在但是安装显示错误，就先卸载。</li>
<li>若无法直接卸载利用<code>windows clean up</code> 工具进行。</li>
<li>卸载完后重新安装软件</li>
</ol>
<blockquote>
<p>问题2</p>
</blockquote>
<ol>
<li>直接去官网下载对应安装包</li>
<li>重新安装即可</li>
</ol>
<h2 id="虚拟光驱使用" tabindex="-1">虚拟光驱使用 <a class="header-anchor" href="#虚拟光驱使用" aria-label="Permalink to &quot;虚拟光驱使用&quot;"></a></h2>
<p>对于 iso 的镜像文件，先挂在为虚拟光驱在进行运行。</p>
<h2 id="微软软件的使用" tabindex="-1">微软软件的使用 <a class="header-anchor" href="#微软软件的使用" aria-label="Permalink to &quot;微软软件的使用&quot;"></a></h2>
<h3 id="excel2007-的使用" tabindex="-1">excel2007 的使用 <a class="header-anchor" href="#excel2007-的使用" aria-label="Permalink to &quot;excel2007 的使用&quot;"></a></h3>
<blockquote>
<p><strong>行操作</strong></p>
</blockquote>
<ul>
<li><code>ctrl + shift + +</code> 插入一行</li>
<li><code>ctrl + -</code> 删除一行</li>
<li><code>f4</code> 重复上一步操作</li>
<li>选中行后利用左下角实心点拖动即可</li>
</ul>
<blockquote>
<p><strong>选项卡</strong></p>
</blockquote>
<ol>
<li>选中需要添加选项框的单元格</li>
<li>点击 数据 -&gt; 数据有效性</li>
<li>选择序列模式</li>
<li>在来源中将多条选项利用英文逗号隔开即可</li>
</ol>
<p><strong>注意勾选提供下拉箭头</strong></p>
<blockquote>
<p><strong>条件格式</strong></p>
</blockquote>
<ol>
<li>选择需要设置条件格式的单元格</li>
<li>点击 开始 -&gt; 条件格式 -&gt; 管理规则</li>
<li>新建规则,根据需求选择对应规则类型</li>
<li>完成规则描述,选择对应的填充样式</li>
<li>点击确认规则样式即可被运用到对应的单元格</li>
</ol>
<blockquote>
<p><strong>条件筛选</strong></p>
</blockquote>
<ol>
<li>选择要进行筛选的列</li>
<li>开始 -&gt; 排序和筛选 -&gt; 筛选</li>
<li>点击筛选的下拉框进行选择即可</li>
</ol>
<p><strong>利用条件筛选可以满足大部分的需求</strong></p>
<blockquote>
<p><strong>甘特图</strong></p>
</blockquote>
<p><a href="https://www.zhihu.com/question/20995941" target="_blank" rel="noreferrer">甘特图画法</a></p>
<blockquote>
<p><strong>分行求最值</strong></p>
</blockquote>
<p><a href="http://stackoverflow.com/questions/20269814/how-do-i-get-the-max-value-from-the-sum-of-two-columns-in-excel" target="_blank" rel="noreferrer">数组模式</a></p>
<blockquote>
<p><strong>合并单元格</strong></p>
</blockquote>
<ul>
<li>使用 <code>=&lt;单元格1&gt;  &lt;单元格2&gt;'</code></li>
</ul>
<h3 id="连接运算" tabindex="-1">连接运算 <a class="header-anchor" href="#连接运算" aria-label="Permalink to &quot;连接运算&quot;"></a></h3>
<p>使用 <code>&lt;单元格&gt; &amp; &quot;&lt;字符串内容&gt;&quot;</code> 的模式连接内容</p>
<h2 id="outlook" tabindex="-1">outlook <a class="header-anchor" href="#outlook" aria-label="Permalink to &quot;outlook&quot;"></a></h2>
<h3 id="设置邮箱签名" tabindex="-1">设置邮箱签名 <a class="header-anchor" href="#设置邮箱签名" aria-label="Permalink to &quot;设置邮箱签名&quot;"></a></h3>
<ol>
<li>新建邮件,点击签名</li>
<li>创建签名,名称和内容</li>
<li>设置签名在新邮件中使用</li>
</ol>
<h3 id="添加联系人" tabindex="-1">添加联系人 <a class="header-anchor" href="#添加联系人" aria-label="Permalink to &quot;添加联系人&quot;"></a></h3>
<ol>
<li>点击联系人</li>
<li>创建通讯录</li>
<li>选择联系人即可</li>
</ol>
<h2 id="系统备份还原升级详解" tabindex="-1">系统备份还原升级详解 <a class="header-anchor" href="#系统备份还原升级详解" aria-label="Permalink to &quot;系统备份还原升级详解&quot;"></a></h2>
<h3 id="升级" tabindex="-1">升级 <a class="header-anchor" href="#升级" aria-label="Permalink to &quot;升级&quot;"></a></h3>
<h4 id="硬件配置查看" tabindex="-1">硬件配置查看 <a class="header-anchor" href="#硬件配置查看" aria-label="Permalink to &quot;硬件配置查看&quot;"></a></h4>
<ol>
<li>查看支持最大内存</li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 进入 cmd 控制台 </span></span>
<span class="line"><span style="color:#B392F0">wmic</span><span style="color:#9ECBFF"> memphysicla</span><span style="color:#9ECBFF"> get</span><span style="color:#9ECBFF"> maxcapacity</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 返回值除以 1024*1024 即为最大支持内存容量</span></span></code></pre>
</div><ol>
<li><a href="http://detail.zol.com.cn/386/385547/article_eva_53_91.shtml" target="_blank" rel="noreferrer">华硕拆机查看</a></li>
</ol>
<h4 id="安装固态硬盘" tabindex="-1">安装固态硬盘 <a class="header-anchor" href="#安装固态硬盘" aria-label="Permalink to &quot;安装固态硬盘&quot;"></a></h4>
<p>固态硬盘选购技巧</p>
<p><a href="https://www.zhihu.com/question/20369676" target="_blank" rel="noreferrer">知乎详解</a></p>
<ol>
<li>使用 <a href="http://jingyan.baidu.com/article/08b6a591fee1c214a9092210.html" target="_blank" rel="noreferrer">ahci 模式</a></li>
</ol>
<h2 id="重装系统" tabindex="-1">重装系统 <a class="header-anchor" href="#重装系统" aria-label="Permalink to &quot;重装系统&quot;"></a></h2>
<h3 id="启动-u-盘" tabindex="-1">启动 u 盘 <a class="header-anchor" href="#启动-u-盘" aria-label="Permalink to &quot;启动 u 盘&quot;"></a></h3>
<p>启动 u 盘 有两种类型.</p>
<ul>
<li>uefi 适用于 2012 之后的电脑,是一种新的启动方式</li>
<li>u 盘启动,对于较旧电脑不具有 uefi 的 bios 启动方式.
此时需要使用 u 盘启动.手动设置实现启动功能.</li>
</ul>
<h3 id="pe-使用" tabindex="-1">pe 使用 <a class="header-anchor" href="#pe-使用" aria-label="Permalink to &quot;pe 使用&quot;"></a></h3>
<ol>
<li>配置好 pe 启动盘</li>
<li>利用 pe 启动盘配置好系统</li>
<li>格式化固态硬盘
<ol>
<li>尽量减少分区数量</li>
<li>扇区设置为 4096 对齐</li>
</ol>
</li>
</ol>
<p><strong>注意 windows 光盘默认不带有驱动,所以在固态分区后,请先将网卡驱动和驱动精灵拷贝到
非系统盘,后续方便进行系统安装</strong></p>
<ol start="4">
<li>
<p>重启计算机,按 esc 进入启动引导.注意不同品牌的启动引导可能不同.
参见如下.
<img src="http://www.windowszj.com/uploads/allimg/170130/00000W126-2.jpg" alt="" loading="lazy"></p>
</li>
<li>
<p>在 bios 配置界面将 sata 接口配置为 AHCI 模式,此模式会提升固态硬盘的读写速率.</p>
</li>
<li>
<p>选择 bios 启动项,若为光盘安装则直接选用 dvd 模式,若为 ep,则选择对应的安装镜像即可</p>
</li>
<li>
<p>若安装系统不带有驱动则使用前面拷贝到非系统分区的驱动进行安装.</p>
</li>
</ol>
<h2 id="系统备份" tabindex="-1">系统备份 <a class="header-anchor" href="#系统备份" aria-label="Permalink to &quot;系统备份&quot;"></a></h2>
<h3 id="windows-自带备份工具" tabindex="-1">windows 自带备份工具 <a class="header-anchor" href="#windows-自带备份工具" aria-label="Permalink to &quot;windows 自带备份工具&quot;"></a></h3>
<p>在备份之前理解如下概念</p>
<ul>
<li><strong>驱动器</strong> 表示被格式化的存储设备例如光盘，硬盘，软盘等</li>
<li><strong>系统镜像</strong> 只包含 windows 系统的驱动器（默认包含所有盘符）</li>
<li><strong>备份文件</strong> 对需要保存的文件进行压缩处理</li>
<li><strong>备份期</strong> 保存整个系统进行的时间节点</li>
</ul>
<ol>
<li>点击控制面板选择备份和还原</li>
<li>选择备份，备份方式有三种
<ul>
<li>本地硬盘</li>
<li>光盘</li>
<li>网络硬盘</li>
</ul>
</li>
<li>选择需要备份的文件和自动备份的时间设定</li>
<li>进行备份即可</li>
</ol>
<p><strong>还原系统</strong></p>
<ol>
<li>选择备份和还原</li>
</ol>
<p>利用还原可以对系统文件进行恢复</p>
<p>若要恢复整个镜像.使用高级恢复选择对应的文件即可.</p>
<p><strong>对于系统镜像不支持网络操作</strong></p>
<p><strong>可以使用 windows 进行文件备份实现网络恢复.但是不要备份系统</strong></p>
<p><strong>完全还原还是使用 ghost 文件</strong></p>
<h3 id="ghost" tabindex="-1">ghost <a class="header-anchor" href="#ghost" aria-label="Permalink to &quot;ghost&quot;"></a></h3>
<p>利用 ghost 实现对硬盘的恢复.
在初始装机时将安装好驱动和更新的系统盘符进行备份.</p>
<p>在使用 pe 启动后直接利用 ghost 文件进行恢复.</p>
<h3 id="显示隐藏桌面" tabindex="-1">显示隐藏桌面 <a class="header-anchor" href="#显示隐藏桌面" aria-label="Permalink to &quot;显示隐藏桌面&quot;"></a></h3>
<ol>
<li>点击运行搜索显示</li>
<li>选择显示隐藏图标</li>
<li>点选需要的图标即可</li>
</ol>
<h2 id="操作系统使用经验" tabindex="-1">操作系统使用经验 <a class="header-anchor" href="#操作系统使用经验" aria-label="Permalink to &quot;操作系统使用经验&quot;"></a></h2>
<ol>
<li>使用包管理工具</li>
<li>进一切可能熟悉和精通命令行</li>
<li>尽可能自动化</li>
<li>形成工作流,远离舒适区</li>
</ol>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/2018-02-01-windows-mul-screen.DsOUvoN9.gif" length="0" type="image/gif"/>
        </item>
        <item>
            <title><![CDATA[phpstorm 使用指南]]></title>
            <link>https://blog.zenheart.site/posts/2018-08-10-phpstorm</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2018-08-10-phpstorm</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[
# phpstorm 使用指南

**phpstorm 的使用技巧**



## 概述
笔者将 phpstorm 使用总结如下

* `环境配置` phpstrom 的常用配置
* `快捷键` 笔者常用的快捷键进行了分类整理
* `工具` 讲解笔者在使用中常用 phpstorm 功能
* `其他` 总结使用经验及其他内容
    

## 配置工作环境
phpstorm 中大部分配置均在 `file -> Default Settings` 中完成.
对应快捷键:
* `⌘ + ,` mac 环境
* `ctrl + alt + s` windows 环境

> 该快捷键在后续描述中不会强调,但非常重要!

### 主题配置
1. 选择主题 [phpstorm 主题网站](http://www.phpstorm-themes.com/)
2. 根据机型选择配置文件
    * `MAC`  选择 `.icls`   
    * `WINDOWS` 选择 `.XML`   
3. 替换主题,参照[主题帮助说明](http://www.phpstorm-themes.com/content/help)    
4. 选择主题


    ![](http://oap05mfra.bkt.clouddn.com/phpstorm1.gif)
    
### 设置键盘映射风格
phpstorm 在 mac 和 windows 默认快捷键有区别.
通过设置 `keymap` 可保证统一性.
 
* `ctrl + '`(注意是反引号) 选择 keymap 设置对应的快捷键风格

###  依赖工具
* 配置 SVN 的工作环境   
在 `settings -> version_control -> subversion` 中设置 svn.exe 的安装路径

* 配置 git    
在 `settings -> version_control -> git` 中设置 git.exe 的安装路径
    
* 添加浏览器   
    1. 打开设置
    2. 搜索  browser,添加新浏览器路径

### 插件安装
在设置界面搜索 plugins ,打开搜索各种插件.笔者使用插件如下

* `key prompert` 提醒使用键盘快捷键的工具
* `IdeaVim` 开启 vim 模式的编辑器
* `BashSupport` 支持 shell 的高亮
* `settings repository` 实现多台电脑的配置同步 **注意在同步配置后,涉及到路径的配置,在不同电脑上时需手动修复**
* `live edit` 配合 chrome,实现同步编辑



### 配置共享
1. 导出导入设置
[如何导出和导入配置文件](https://www.jetbrains.com/help/phpstorm/2016.2/exporting-and-importing-settings.html)

2. 共享配置文件
[共享配置文件说明](https://www.jetbrains.com/help/phpstorm/2016.1/sharing-your-ide-settings.html)

### wamp 关联 phpstorm
1. 打开配置界面
2. 参照如下 gif [wamp关联 phpstorm](./img/2018-08-10-phpstorm_wamp.gif)


## 快捷键

以 windows 模式下举例.若要查找快捷键.
打开设置面板,搜索 `keymap` 再查找对应快捷键即可.

### 控制光标位置
* `ctrl + m` 将光标定位到文件中心
* `alt + j` 多列模式进行选中,只会选择相同的单词
* `alt + shift + j` 取消多列模式
* `ctrl + shift + m` 匹配括号的位置，会将光标移动到对应正括号和反括号位置
* `ctrl + [ 或 ]` 具有相似功能
* `ctrl + shift + [ 或 ]` 可已选中对应的括号区域
* `ctrl + pageup` 将光标移动到页面顶头
* `ctrl + pagedown` 将光标移动到页面底部
* `ctrl + g`  输入`:行号:列号`快速定位文件位置

### 编辑文档
**删除**
* `ctrl + y` 删除一行，删除从
* `ctrl + delete` 删除光标后内容 
* `ctrl + backspace` 删除光标前一个字的内容  
* `ctrl + enter` 在行首会在该行前创建新行，行末会在改行后创建新行

**复制**   
* `ctrl + d` 复制选中块，若没有则只是复制当前行
* `ctrl + shift + v` 粘贴文档时可以选择行数，多选时按住`shift`，也可以显示剪切板历史

**选择移动**
* `ctrl + w` 进行选择扩展,加`shift`反向操作扩展
* `shift + ↑ 或 ↓` 向上或向下移动一行
* `shift + ↑ 或 ↓` 向上或向下选中多行
* `home 或 end`移动到行首或行末
* `shift + home 或 end` 选择光标到行首或行末的内容
* `pageup 或 pagedown` 向上或向下移动一页
* `shift pageup 或 pagedown` 向上或向下选择一页
* `ctrl + shift + [ 或 ]` 选择匹配括号的内容，注意使用时光标要放在括号前后才起作用
* `shift + alt + ↑ 或 ↓` 将光标对应行向上或向下移动，也可以选中多行进行移动
* `shift + ctrl  + ↑ 或 ↓` 对于函数等内容，它是向上或向下移动整个函数
* `ctrl + shift + l ` 格式化代码，再加上`alt` 可以格式化全局
* `alt + shift + insert` 实现按照矩形格式来选择文本的功能

**文件控制**
* `ctrl + b` 跳转到函数 ，或者按住`ctrl` 点击函数也可实现该效果。
* `ctrl + f12` 显示函数之间的结构关系  
* `alt + ↑ 或 ↓` 函数跳转的上下切换
* `ctrl + alt + ←  或 →` 实现前进和返回，但是在windows 中这两个快捷键被用来转换屏幕,所以建议自定义快捷键。
* `ctrl + alt + backspace` 也可实现返回的功能
* `F2` 当出现规则检查错误时进行导航，加`shift`为反向导航，利用`ctrl+f1`查看错误原因,`alt+enter`查看解决办法
* `F6` 和 `F5` 移动和复制文件，在弹出框中写入路径即可
* `ctrl + alt + shift + t`在项目文件树中使用，会出现对文件移动、复制等操作
* `shift + f6` 项目窗口中使用可以重命名文件，在编辑模式下没有作用
* `alt + insert` 新建文件
* `ctrl + shift + f` 在工程中查找内容
* `ctrl + shift + U` 或者 edit | toggle case 修改字母大小写
* `ctrl + -` 收缩当前区块
* `ctrl + +` 展开当前区块
* `ctrl + shift + -` 收缩所有区块
* `ctrl + shift + +` 展开所有区块

**设置与查找**
* `ctrl + n` 全局查找类
* `ctrl + shift + n` 全局查找文件，你可以在查找时追加`:行号:列号`快速定位文件位置
* `ctrl + shift + n` 使用该方法也可以查找目录，只需要在搜索关键字后加上`/`的路径索引符即可
* `ctrl + shift +a` 查找 PHPSTORM 命令的名称，及快捷键，可以迅速执行
* `ctrl + q` 快速查找文档帮助在阅读函数时非常有用
* `ctrl + alt + t` 利用此实现环绕


**设置标签**   
* `shift + f11`,`f11` 设置和清除标签,利用标签来进行文件的修改

**添加注释**
* `ctrl + /` 添加单行注释
* `ctrl + shift +\` 添加多行注释

> 注释模式会随着使用语言自动变化


**高级编辑功能**
* `alt + enter` 在编辑 php 时，若字符串为 HTML 片段，可以利用该功能实现片段代码编写
* `alt + enter` 该命令在不同环境有多种操作非常重要
* `ctrl + alt + m` 在编码时，可以将选择的块新建成函数
* `shift + F6` 在修改函数或文件名的同时，引用该函数或文件的地方也会同时修改
* `ctrl + alt + n` 当光标在函数变量附近时，使用该快捷键会将变量内容变成内联模式

### 工作窗口切换
**项目树和文件之间的切换**
* `alt + f1 + 1` 在全局查找到文件以后，利用该快捷键迅速定位在 项目树中的的位置
* `f4`  实现在查找到的文件和项目树之间进行切换
* `alt+左右方向键` 进行文件切换

**工作窗口切换**
* `ctrl+tab+左右方向键`切换所有工作选项
* `alt + number` 例如 `alt + 打开关闭工程
* `alt + 1` 打开关闭工程文件夹，可以直接在项目树中输入字符进行查找，也可利用上下左右键进行展开
* `alt + 6` 查看 todo 信息
* `alt + 7` 打开函数结构显示
* `ctrl + tab` 切换显示工具栏
* `alt + f12` 快速打开控制台
* `F12` 打开最近关闭的窗口
* `shift + esc` 退出，`esc` 也有退出功能。
* `ctrl + f4` 在非编辑窗口下会退出，在编辑窗口下会关闭当前窗口
* `f4 和 shift +f4` 打开工程文件夹中所在位置的文件，在新窗口中打开
* `ctrl + shift + e`打开最近编辑的文件列表,`ctrl + e`相似
* `alt + home` 迅速回到顶层导航栏位置，利用上下左右箭头切换文件，这是可以利用上下左右键进行切换和展开
* `f2` 导航到下一个错误
* `shift + f2` 上一个错误
* `alt + f12` 打开终端
* `ctrl + shift +t` 在打开终端下创建新终端
* `ctrl + shift +w` 在打开终端下关闭终端

> 拖动工作路径和文件到终端下会创建一个指向该路径的新终端


### 杂项
* `ctrl + j` 查询当前文件支持的自定义模板
* `双击 shift` 显示最近的文件夹,类似 `ctrl + e`




## 工具
### 利用 TODO
**应用场景**
1. 标注你以后有待修改的代码
2. 团队协作时，告诉其他人需要维护的部分
3. 记录代办事项

**使用方法**  

> 单人使用  

利用注释快捷键添加注释,在注释中包含
`todo 描述信息`,以 js 代码举例

```js
//todo 完成 xx 函数重构
```

利用 `alt + 6` 即可查看项目中所有代办事项

> 多人模式

1. 打开设置,搜索 todo,添加新的 todo 模式，
2. 添加过滤器,点击 todo 窗口的漏斗图标就会看到自己的过滤器。
3. 添加 todo 模板
    1. 在 设置选型中设置好新的标记和过滤器
    2. 使用 live template 编辑模板   
    ![](./img/2018-08-10-phpstorm.png)
    3. 编辑模板中的变量   
    ![](./img/2018-08-10-phpstorm1.png)

更详细的描参见 [官方帮助](https://www.jetbrains.com/help/phpstorm/defining-todo-patterns-and-filters.html?search=todo)

> 使用建议
   
形成自己的 todo 风格，参考 stackoverflow 讨论([todo 的技巧](http://stackoverflow.com/questions/2944360/tokens-in-visual-studio-hack-todo-any-other))   

```
    红色: 无法编译和运行的代码 
    // Error - 编译或运行时出错的代码
    // Broken - 代码无法运行或发生崩溃
    // WTF - 极度丑陋的代码
   
    橙色: 代码可以运行，但是方法不恰当
    // Hack - 为了使代码能正常运行而添加的黑客方法
    // FixMe - 代码实现了功能但是可以再可维护性、性能等方面进行改善
    // Bug - 代码已上线，但有时会出现 BUG
    // Review - 代码可以正常工作但是需要复审
    // Smells - 类似于修补
   
    蓝色: 代码可以正常运行，但是需要添加特性或补充
    // Todo - 函数还没有完善
    // Note - 解释目前的进展方便其他人
```

### 自定义模板
1. 设置面板中搜索 live template
2. 创建模板组，它的作用是将一组模板放在一起，目的是便于管理，模板组命名可以参考如下规则
    * 根据文件类型建立模板组，比如 md 表示所有 markdown 文件下的模板
    * 只建立一个模板组 locke ,以自己的用户名建立模板组
    * 按照使用场景建立模板组 ，code 表示编程的模板组。
3. 在建立的模板组下创建模板,主要是确定如下方面

    ![](./img/2018-08-10-phpstorm_live_template.jpg)

4. 设置成功后在对应格式的文件中使用 `ctrl + j` 可以查看该文件类型对应支持的模板。
或者直接输入模板的简写，使用 tab 进行扩展。

在使用模板中有一些常用的预定义变量 

| phpstorm 内置变量 | 作用                         |
| :]]></description>
            <content:encoded><![CDATA[<h1 id="phpstorm-使用指南" tabindex="-1">phpstorm 使用指南 <a class="header-anchor" href="#phpstorm-使用指南" aria-label="Permalink to &quot;phpstorm 使用指南&quot;"></a></h1>
<p><strong>phpstorm 的使用技巧</strong></p>
<h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h2>
<p>笔者将 phpstorm 使用总结如下</p>
<ul>
<li><code>环境配置</code> phpstrom 的常用配置</li>
<li><code>快捷键</code> 笔者常用的快捷键进行了分类整理</li>
<li><code>工具</code> 讲解笔者在使用中常用 phpstorm 功能</li>
<li><code>其他</code> 总结使用经验及其他内容</li>
</ul>
<h2 id="配置工作环境" tabindex="-1">配置工作环境 <a class="header-anchor" href="#配置工作环境" aria-label="Permalink to &quot;配置工作环境&quot;"></a></h2>
<p>phpstorm 中大部分配置均在 <code>file -&gt; Default Settings</code> 中完成.
对应快捷键:</p>
<ul>
<li><code>⌘ + ,</code> mac 环境</li>
<li><code>ctrl + alt + s</code> windows 环境</li>
</ul>
<blockquote>
<p>该快捷键在后续描述中不会强调,但非常重要!</p>
</blockquote>
<h3 id="主题配置" tabindex="-1">主题配置 <a class="header-anchor" href="#主题配置" aria-label="Permalink to &quot;主题配置&quot;"></a></h3>
<ol>
<li>
<p>选择主题 <a href="http://www.phpstorm-themes.com/" target="_blank" rel="noreferrer">phpstorm 主题网站</a></p>
</li>
<li>
<p>根据机型选择配置文件</p>
<ul>
<li><code>MAC</code>  选择 <code>.icls</code></li>
<li><code>WINDOWS</code> 选择 <code>.XML</code></li>
</ul>
</li>
<li>
<p>替换主题,参照<a href="http://www.phpstorm-themes.com/content/help" target="_blank" rel="noreferrer">主题帮助说明</a></p>
</li>
<li>
<p>选择主题</p>
<p><img src="http://oap05mfra.bkt.clouddn.com/phpstorm1.gif" alt="" loading="lazy"></p>
</li>
</ol>
<h3 id="设置键盘映射风格" tabindex="-1">设置键盘映射风格 <a class="header-anchor" href="#设置键盘映射风格" aria-label="Permalink to &quot;设置键盘映射风格&quot;"></a></h3>
<p>phpstorm 在 mac 和 windows 默认快捷键有区别.
通过设置 <code>keymap</code> 可保证统一性.</p>
<ul>
<li><code>ctrl + '</code>(注意是反引号) 选择 keymap 设置对应的快捷键风格</li>
</ul>
<h3 id="依赖工具" tabindex="-1">依赖工具 <a class="header-anchor" href="#依赖工具" aria-label="Permalink to &quot;依赖工具&quot;"></a></h3>
<ul>
<li>
<p>配置 SVN 的工作环境<br>
在 <code>settings -&gt; version_control -&gt; subversion</code> 中设置 svn.exe 的安装路径</p>
</li>
<li>
<p>配置 git<br>
在 <code>settings -&gt; version_control -&gt; git</code> 中设置 git.exe 的安装路径</p>
</li>
<li>
<p>添加浏览器</p>
<ol>
<li>打开设置</li>
<li>搜索  browser,添加新浏览器路径</li>
</ol>
</li>
</ul>
<h3 id="插件安装" tabindex="-1">插件安装 <a class="header-anchor" href="#插件安装" aria-label="Permalink to &quot;插件安装&quot;"></a></h3>
<p>在设置界面搜索 plugins ,打开搜索各种插件.笔者使用插件如下</p>
<ul>
<li><code>key prompert</code> 提醒使用键盘快捷键的工具</li>
<li><code>IdeaVim</code> 开启 vim 模式的编辑器</li>
<li><code>BashSupport</code> 支持 shell 的高亮</li>
<li><code>settings repository</code> 实现多台电脑的配置同步 <strong>注意在同步配置后,涉及到路径的配置,在不同电脑上时需手动修复</strong></li>
<li><code>live edit</code> 配合 chrome,实现同步编辑</li>
</ul>
<h3 id="配置共享" tabindex="-1">配置共享 <a class="header-anchor" href="#配置共享" aria-label="Permalink to &quot;配置共享&quot;"></a></h3>
<ol>
<li>
<p>导出导入设置
<a href="https://www.jetbrains.com/help/phpstorm/2016.2/exporting-and-importing-settings.html" target="_blank" rel="noreferrer">如何导出和导入配置文件</a></p>
</li>
<li>
<p>共享配置文件
<a href="https://www.jetbrains.com/help/phpstorm/2016.1/sharing-your-ide-settings.html" target="_blank" rel="noreferrer">共享配置文件说明</a></p>
</li>
</ol>
<h3 id="wamp-关联-phpstorm" tabindex="-1">wamp 关联 phpstorm <a class="header-anchor" href="#wamp-关联-phpstorm" aria-label="Permalink to &quot;wamp 关联 phpstorm&quot;"></a></h3>
<ol>
<li>打开配置界面</li>
<li>参照如下 gif <a href="./img/2018-08-10-phpstorm_wamp.gif">wamp关联 phpstorm</a></li>
</ol>
<h2 id="快捷键" tabindex="-1">快捷键 <a class="header-anchor" href="#快捷键" aria-label="Permalink to &quot;快捷键&quot;"></a></h2>
<p>以 windows 模式下举例.若要查找快捷键.
打开设置面板,搜索 <code>keymap</code> 再查找对应快捷键即可.</p>
<h3 id="控制光标位置" tabindex="-1">控制光标位置 <a class="header-anchor" href="#控制光标位置" aria-label="Permalink to &quot;控制光标位置&quot;"></a></h3>
<ul>
<li><code>ctrl + m</code> 将光标定位到文件中心</li>
<li><code>alt + j</code> 多列模式进行选中,只会选择相同的单词</li>
<li><code>alt + shift + j</code> 取消多列模式</li>
<li><code>ctrl + shift + m</code> 匹配括号的位置，会将光标移动到对应正括号和反括号位置</li>
<li><code>ctrl + [ 或 ]</code> 具有相似功能</li>
<li><code>ctrl + shift + [ 或 ]</code> 可已选中对应的括号区域</li>
<li><code>ctrl + pageup</code> 将光标移动到页面顶头</li>
<li><code>ctrl + pagedown</code> 将光标移动到页面底部</li>
<li><code>ctrl + g</code>  输入<code>:行号:列号</code>快速定位文件位置</li>
</ul>
<h3 id="编辑文档" tabindex="-1">编辑文档 <a class="header-anchor" href="#编辑文档" aria-label="Permalink to &quot;编辑文档&quot;"></a></h3>
<p><strong>删除</strong></p>
<ul>
<li><code>ctrl + y</code> 删除一行，删除从</li>
<li><code>ctrl + delete</code> 删除光标后内容</li>
<li><code>ctrl + backspace</code> 删除光标前一个字的内容</li>
<li><code>ctrl + enter</code> 在行首会在该行前创建新行，行末会在改行后创建新行</li>
</ul>
<p><strong>复制</strong></p>
<ul>
<li><code>ctrl + d</code> 复制选中块，若没有则只是复制当前行</li>
<li><code>ctrl + shift + v</code> 粘贴文档时可以选择行数，多选时按住<code>shift</code>，也可以显示剪切板历史</li>
</ul>
<p><strong>选择移动</strong></p>
<ul>
<li><code>ctrl + w</code> 进行选择扩展,加<code>shift</code>反向操作扩展</li>
<li><code>shift + ↑ 或 ↓</code> 向上或向下移动一行</li>
<li><code>shift + ↑ 或 ↓</code> 向上或向下选中多行</li>
<li><code>home 或 end</code>移动到行首或行末</li>
<li><code>shift + home 或 end</code> 选择光标到行首或行末的内容</li>
<li><code>pageup 或 pagedown</code> 向上或向下移动一页</li>
<li><code>shift pageup 或 pagedown</code> 向上或向下选择一页</li>
<li><code>ctrl + shift + [ 或 ]</code> 选择匹配括号的内容，注意使用时光标要放在括号前后才起作用</li>
<li><code>shift + alt + ↑ 或 ↓</code> 将光标对应行向上或向下移动，也可以选中多行进行移动</li>
<li><code>shift + ctrl  + ↑ 或 ↓</code> 对于函数等内容，它是向上或向下移动整个函数</li>
<li><code>ctrl + shift + l </code> 格式化代码，再加上<code>alt</code> 可以格式化全局</li>
<li><code>alt + shift + insert</code> 实现按照矩形格式来选择文本的功能</li>
</ul>
<p><strong>文件控制</strong></p>
<ul>
<li><code>ctrl + b</code> 跳转到函数 ，或者按住<code>ctrl</code> 点击函数也可实现该效果。</li>
<li><code>ctrl + f12</code> 显示函数之间的结构关系</li>
<li><code>alt + ↑ 或 ↓</code> 函数跳转的上下切换</li>
<li><code>ctrl + alt + ←  或 →</code> 实现前进和返回，但是在windows 中这两个快捷键被用来转换屏幕,所以建议自定义快捷键。</li>
<li><code>ctrl + alt + backspace</code> 也可实现返回的功能</li>
<li><code>F2</code> 当出现规则检查错误时进行导航，加<code>shift</code>为反向导航，利用<code>ctrl+f1</code>查看错误原因,<code>alt+enter</code>查看解决办法</li>
<li><code>F6</code> 和 <code>F5</code> 移动和复制文件，在弹出框中写入路径即可</li>
<li><code>ctrl + alt + shift + t</code>在项目文件树中使用，会出现对文件移动、复制等操作</li>
<li><code>shift + f6</code> 项目窗口中使用可以重命名文件，在编辑模式下没有作用</li>
<li><code>alt + insert</code> 新建文件</li>
<li><code>ctrl + shift + f</code> 在工程中查找内容</li>
<li><code>ctrl + shift + U</code> 或者 edit | toggle case 修改字母大小写</li>
<li><code>ctrl + -</code> 收缩当前区块</li>
<li><code>ctrl + +</code> 展开当前区块</li>
<li><code>ctrl + shift + -</code> 收缩所有区块</li>
<li><code>ctrl + shift + +</code> 展开所有区块</li>
</ul>
<p><strong>设置与查找</strong></p>
<ul>
<li><code>ctrl + n</code> 全局查找类</li>
<li><code>ctrl + shift + n</code> 全局查找文件，你可以在查找时追加<code>:行号:列号</code>快速定位文件位置</li>
<li><code>ctrl + shift + n</code> 使用该方法也可以查找目录，只需要在搜索关键字后加上<code>/</code>的路径索引符即可</li>
<li><code>ctrl + shift +a</code> 查找 PHPSTORM 命令的名称，及快捷键，可以迅速执行</li>
<li><code>ctrl + q</code> 快速查找文档帮助在阅读函数时非常有用</li>
<li><code>ctrl + alt + t</code> 利用此实现环绕</li>
</ul>
<p><strong>设置标签</strong></p>
<ul>
<li><code>shift + f11</code>,<code>f11</code> 设置和清除标签,利用标签来进行文件的修改</li>
</ul>
<p><strong>添加注释</strong></p>
<ul>
<li><code>ctrl + /</code> 添加单行注释</li>
<li><code>ctrl + shift +\</code> 添加多行注释</li>
</ul>
<blockquote>
<p>注释模式会随着使用语言自动变化</p>
</blockquote>
<p><strong>高级编辑功能</strong></p>
<ul>
<li><code>alt + enter</code> 在编辑 php 时，若字符串为 HTML 片段，可以利用该功能实现片段代码编写</li>
<li><code>alt + enter</code> 该命令在不同环境有多种操作非常重要</li>
<li><code>ctrl + alt + m</code> 在编码时，可以将选择的块新建成函数</li>
<li><code>shift + F6</code> 在修改函数或文件名的同时，引用该函数或文件的地方也会同时修改</li>
<li><code>ctrl + alt + n</code> 当光标在函数变量附近时，使用该快捷键会将变量内容变成内联模式</li>
</ul>
<h3 id="工作窗口切换" tabindex="-1">工作窗口切换 <a class="header-anchor" href="#工作窗口切换" aria-label="Permalink to &quot;工作窗口切换&quot;"></a></h3>
<p><strong>项目树和文件之间的切换</strong></p>
<ul>
<li><code>alt + f1 + 1</code> 在全局查找到文件以后，利用该快捷键迅速定位在 项目树中的的位置</li>
<li><code>f4</code>  实现在查找到的文件和项目树之间进行切换</li>
<li><code>alt+左右方向键</code> 进行文件切换</li>
</ul>
<p><strong>工作窗口切换</strong></p>
<ul>
<li><code>ctrl+tab+左右方向键</code>切换所有工作选项</li>
<li><code>alt + number</code> 例如 `alt + 打开关闭工程</li>
<li><code>alt + 1</code> 打开关闭工程文件夹，可以直接在项目树中输入字符进行查找，也可利用上下左右键进行展开</li>
<li><code>alt + 6</code> 查看 todo 信息</li>
<li><code>alt + 7</code> 打开函数结构显示</li>
<li><code>ctrl + tab</code> 切换显示工具栏</li>
<li><code>alt + f12</code> 快速打开控制台</li>
<li><code>F12</code> 打开最近关闭的窗口</li>
<li><code>shift + esc</code> 退出，<code>esc</code> 也有退出功能。</li>
<li><code>ctrl + f4</code> 在非编辑窗口下会退出，在编辑窗口下会关闭当前窗口</li>
<li><code>f4 和 shift +f4</code> 打开工程文件夹中所在位置的文件，在新窗口中打开</li>
<li><code>ctrl + shift + e</code>打开最近编辑的文件列表,<code>ctrl + e</code>相似</li>
<li><code>alt + home</code> 迅速回到顶层导航栏位置，利用上下左右箭头切换文件，这是可以利用上下左右键进行切换和展开</li>
<li><code>f2</code> 导航到下一个错误</li>
<li><code>shift + f2</code> 上一个错误</li>
<li><code>alt + f12</code> 打开终端</li>
<li><code>ctrl + shift +t</code> 在打开终端下创建新终端</li>
<li><code>ctrl + shift +w</code> 在打开终端下关闭终端</li>
</ul>
<blockquote>
<p>拖动工作路径和文件到终端下会创建一个指向该路径的新终端</p>
</blockquote>
<h3 id="杂项" tabindex="-1">杂项 <a class="header-anchor" href="#杂项" aria-label="Permalink to &quot;杂项&quot;"></a></h3>
<ul>
<li><code>ctrl + j</code> 查询当前文件支持的自定义模板</li>
<li><code>双击 shift</code> 显示最近的文件夹,类似 <code>ctrl + e</code></li>
</ul>
<h2 id="工具" tabindex="-1">工具 <a class="header-anchor" href="#工具" aria-label="Permalink to &quot;工具&quot;"></a></h2>
<h3 id="利用-todo" tabindex="-1">利用 TODO <a class="header-anchor" href="#利用-todo" aria-label="Permalink to &quot;利用 TODO&quot;"></a></h3>
<p><strong>应用场景</strong></p>
<ol>
<li>标注你以后有待修改的代码</li>
<li>团队协作时，告诉其他人需要维护的部分</li>
<li>记录代办事项</li>
</ol>
<p><strong>使用方法</strong></p>
<blockquote>
<p>单人使用</p>
</blockquote>
<p>利用注释快捷键添加注释,在注释中包含
<code>todo 描述信息</code>,以 js 代码举例</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">//todo 完成 xx 函数重构</span></span></code></pre>
</div><p>利用 <code>alt + 6</code> 即可查看项目中所有代办事项</p>
<blockquote>
<p>多人模式</p>
</blockquote>
<ol>
<li>打开设置,搜索 todo,添加新的 todo 模式，</li>
<li>添加过滤器,点击 todo 窗口的漏斗图标就会看到自己的过滤器。</li>
<li>添加 todo 模板
<ol>
<li>在 设置选型中设置好新的标记和过滤器</li>
<li>使用 live template 编辑模板<br>
<img src="https://blog.zenheart.site/assets/2018-08-10-phpstorm.BMrCN8Ed.png" alt="" loading="lazy"></li>
<li>编辑模板中的变量<br>
<img src="https://blog.zenheart.site/assets/2018-08-10-phpstorm1.ELcfYuw1.png" alt="" loading="lazy"></li>
</ol>
</li>
</ol>
<p>更详细的描参见 <a href="https://www.jetbrains.com/help/phpstorm/defining-todo-patterns-and-filters.html?search=todo" target="_blank" rel="noreferrer">官方帮助</a></p>
<blockquote>
<p>使用建议</p>
</blockquote>
<p>形成自己的 todo 风格，参考 stackoverflow 讨论(<a href="http://stackoverflow.com/questions/2944360/tokens-in-visual-studio-hack-todo-any-other" target="_blank" rel="noreferrer">todo 的技巧</a>)</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>    红色: 无法编译和运行的代码 </span></span>
<span class="line"><span>    // Error - 编译或运行时出错的代码</span></span>
<span class="line"><span>    // Broken - 代码无法运行或发生崩溃</span></span>
<span class="line"><span>    // WTF - 极度丑陋的代码</span></span>
<span class="line"><span>   </span></span>
<span class="line"><span>    橙色: 代码可以运行，但是方法不恰当</span></span>
<span class="line"><span>    // Hack - 为了使代码能正常运行而添加的黑客方法</span></span>
<span class="line"><span>    // FixMe - 代码实现了功能但是可以再可维护性、性能等方面进行改善</span></span>
<span class="line"><span>    // Bug - 代码已上线，但有时会出现 BUG</span></span>
<span class="line"><span>    // Review - 代码可以正常工作但是需要复审</span></span>
<span class="line"><span>    // Smells - 类似于修补</span></span>
<span class="line"><span>   </span></span>
<span class="line"><span>    蓝色: 代码可以正常运行，但是需要添加特性或补充</span></span>
<span class="line"><span>    // Todo - 函数还没有完善</span></span>
<span class="line"><span>    // Note - 解释目前的进展方便其他人</span></span></code></pre>
</div><h3 id="自定义模板" tabindex="-1">自定义模板 <a class="header-anchor" href="#自定义模板" aria-label="Permalink to &quot;自定义模板&quot;"></a></h3>
<ol>
<li>
<p>设置面板中搜索 live template</p>
</li>
<li>
<p>创建模板组，它的作用是将一组模板放在一起，目的是便于管理，模板组命名可以参考如下规则</p>
<ul>
<li>根据文件类型建立模板组，比如 md 表示所有 markdown 文件下的模板</li>
<li>只建立一个模板组 locke ,以自己的用户名建立模板组</li>
<li>按照使用场景建立模板组 ，code 表示编程的模板组。</li>
</ul>
</li>
<li>
<p>在建立的模板组下创建模板,主要是确定如下方面</p>
<p><img src="https://blog.zenheart.site/assets/2018-08-10-phpstorm_live_template.D3VBq18X.jpg" alt="" loading="lazy"></p>
</li>
<li>
<p>设置成功后在对应格式的文件中使用 <code>ctrl + j</code> 可以查看该文件类型对应支持的模板。
或者直接输入模板的简写，使用 tab 进行扩展。</p>
</li>
</ol>
<p>在使用模板中有一些常用的预定义变量</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">phpstorm 内置变量</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="5.611ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 2480 683" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D438" d="M492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(764,0)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1652,0)"><path data-c="1D437" d="M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>E</mi><mi>N</mi><mi>D</mi></math></mjx-assistive-mml></mjx-container></td>
<td>用来确定模板展开后的光标位置</td>
</tr>
</tbody>
</table>
<p>其余变量参见 <a href="https://www.jetbrains.com/help/phpstorm/live-template-variables.html?search=varia" target="_blank" rel="noreferrer">模板变量</a></p>
<h3 id="调试代码" tabindex="-1">调试代码 <a class="header-anchor" href="#调试代码" aria-label="Permalink to &quot;调试代码&quot;"></a></h3>
<p>重点是理解 phpstorm <a href="https://www.jetbrains.com/help/phpstorm/run-debug-configurations.html?search=run/debug" target="_blank" rel="noreferrer">run/debug 调试器配置</a>
不同语言需要不同的调试环境.此外需要熟悉 <a href="https://www.jetbrains.com/help/phpstorm/debug-tool-window.html?search=debug" target="_blank" rel="noreferrer">phpstorm 调试窗口</a></p>
<h4 id="js" tabindex="-1">js <a class="header-anchor" href="#js" aria-label="Permalink to &quot;js&quot;"></a></h4>
<p>参考 <a href="https://www.jetbrains.com/help/phpstorm/debugging-javascript-deployed-to-a-remote-server.html?search=javascript%20de#d109205e87" target="_blank" rel="noreferrer">官方调试说明</a></p>
<h4 id="html" tabindex="-1">html <a class="header-anchor" href="#html" aria-label="Permalink to &quot;html&quot;"></a></h4>
<p>官方帮助 <a href="https://www.jetbrains.com/help/pycharm/2016.3/live-edit.html?search=live%20ed" target="_blank" rel="noreferrer">liveedit</a></p>
<ol>
<li>首先安装 <code>liveedit</code> 插件</li>
<li>安装 JetBrains IDE Support chrome 插件</li>
<li>在 phpstorm 中修改界面,chrome 会同步更新</li>
</ol>
<p>可以配置  <a href="https://developer.chrome.com/extensions/match_patterns" target="_blank" rel="noreferrer">match pattern</a></p>
<p><strong>可能存在问题</strong></p>
<ol>
<li>若无法正常运行查看页面是否有错误</li>
<li>注意配置为 javascript 调试模式</li>
</ol>
<h4 id="php" tabindex="-1">php <a class="header-anchor" href="#php" aria-label="Permalink to &quot;php&quot;"></a></h4>
<p>详细步骤参见 <a href="https://confluence.jetbrains.com/display/PhpStorm/Zero-configuration+Web+Application+Debugging+with+Xdebug+and+PhpStorm" target="_blank" rel="noreferrer">xdebug 配置</a></p>
<ol>
<li>
<p>打开设置界面选择 php-&gt;interpreter 打开 php.ini</p>
<p><img src="https://blog.zenheart.site/assets/2018-08-10-php_debug.CbApKH_X.gif" alt="" loading="lazy"></p>
</li>
<li>
<p>在打开的配置界面中查找<code>[xdebug]</code>，并修改如下配置信息</p>
</li>
</ol>
<div class="language-ini"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">[xdebug]</span></span>
<span class="line"><span style="color:#6A737D">;开启远程调试界面</span></span>
<span class="line"><span style="color:#F97583">xdebug.remote_enable</span><span style="color:#E1E4E8"> = 1 </span></span>
<span class="line"><span style="color:#6A737D">;设置远程界面地址</span></span>
<span class="line"><span style="color:#F97583">xdebug.remote_host</span><span style="color:#E1E4E8"> = </span><span style="color:#9ECBFF">"localhost"</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#6A737D">;开启远程监听端口</span></span>
<span class="line"><span style="color:#F97583">xdebug.remote_port</span><span style="color:#E1E4E8">= 9000</span></span>
<span class="line"><span style="color:#F97583">xdebug.profiler_enable</span><span style="color:#E1E4E8"> = off</span></span>
<span class="line"><span style="color:#F97583">xdebug.profiler_enable_trigger</span><span style="color:#E1E4E8"> = off </span></span>
<span class="line"><span style="color:#6A737D">;xdebug.profiler_output_name = cachegrind.out.%t.%p</span></span>
<span class="line"><span style="color:#6A737D">;xdebug.profiler_output_dir = "D:/work_software/wamp/tmp"</span></span>
<span class="line"><span style="color:#F97583">xdebug.show_local_vars</span><span style="color:#E1E4E8">=0</span></span>
<span class="line"><span style="color:#6A737D">;xdebug 运行环境</span></span>
<span class="line"><span style="color:#F97583">xdebug.idekey</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"PHPSTORM"</span></span></code></pre>
</div><ol start="3">
<li>在 chrome 下安装 xdebug helper,修改 Ide key　为 phpstorm。</li>
<li>在 phpstorm 下选择 run-&gt;启动 debug 监听</li>
<li>在 phpstorm 页面中设置断点</li>
<li>在浏览器中开启 xdebug helper 调试后，刷新页面即可</li>
</ol>
<p>可参考</p>
<ul>
<li><a href="https://confluence.jetbrains.com/display/PhpStorm/Validating+Your+Debugging+Configuration" target="_blank" rel="noreferrer">xdebug</a></li>
<li><a href="https://confluence.jetbrains.com/display/PhpStorm/Zero-configuration+Web+Application+Debugging+with+Xdebug+and+PhpStorm" target="_blank" rel="noreferrer">phpstomr xdebug</a></li>
</ul>
<p><strong>坑</strong></p>
<blockquote>
<p>9000 端口不可用</p>
</blockquote>
<p>php-fpm 占用了此端口,所以注意屏蔽该端口使用 9100 代替即可</p>
<h4 id="node" tabindex="-1">node <a class="header-anchor" href="#node" aria-label="Permalink to &quot;node&quot;"></a></h4>
<p><a href="https://confluence.jetbrains.com/display/WI/Running+and+debugging+Node.js+application" target="_blank" rel="noreferrer">调试 node 应用</a></p>
<h3 id="cvs" tabindex="-1">cvs <a class="header-anchor" href="#cvs" aria-label="Permalink to &quot;cvs&quot;"></a></h3>
<ol>
<li>选择 VCS 选择版本控制软件</li>
<li>选择 git -&gt; clone 操作</li>
<li>输入远程仓库地址</li>
<li>选择本地保存文件夹</li>
<li>克隆到本地后，利用默认的远程仓库 <code>origin</code> 实现 push 和 pull 操作。</li>
</ol>
<p>利用<code>配置-&gt;版本控制-&gt;忽略文件</code> 添加忽略信息.
详见 <a href="https://www.jetbrains.com/help/phpstorm/configuring-ignored-files.html?search=ignore" target="_blank" rel="noreferrer">phpstomr 官方忽略文件</a></p>
<p>也可以使用 <code>ctrl + 9</code> 切换到版本控制.
选择图标来忽略文件.</p>
<p>可以利用 phpstorm 解决冲突图例如下</p>
<p><img src="https://blog.zenheart.site/assets/2018-08-10-phpstorm_solve_conflict.0QdwMths.jpg" alt="" loading="lazy"></p>
<p>详见 <a href="https://www.jetbrains.com/help/phpstorm/2016.3/resolving-conflicts.html" target="_blank" rel="noreferrer">phpstorm 冲突解决</a></p>
<p>参考如下方式配置 phpstorm 为冲突解决工具</p>
<h4 id="配置-phpstorm-为-mergetool-工具" tabindex="-1">配置 phpstorm 为 mergetool 工具 <a class="header-anchor" href="#配置-phpstorm-为-mergetool-工具" aria-label="Permalink to &quot;配置 phpstorm 为 mergetool 工具&quot;"></a></h4>
<p>参考 <a href="https://gist.github.com/jvandyke/4355099#gistcomment-1437345" target="_blank" rel="noreferrer">git 配置讨论</a></p>
<p>phpstorm</p>
<div class="language-ini"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">[diff]</span></span>
<span class="line"><span style="color:#F97583">  tool</span><span style="color:#E1E4E8"> = pstorm</span></span>
<span class="line"><span style="color:#B392F0">[difftool]</span></span>
<span class="line"><span style="color:#F97583">  prompt</span><span style="color:#E1E4E8"> = false</span></span>
<span class="line"><span style="color:#B392F0">[difftool.pstorm]</span></span>
<span class="line"><span style="color:#F97583">  cmd</span><span style="color:#E1E4E8"> = /usr/local/bin/pstorm diff </span><span style="color:#9ECBFF">"$LOCAL"</span><span style="color:#9ECBFF"> "$REMOTE"</span></span>
<span class="line"><span style="color:#B392F0">[merge]</span></span>
<span class="line"><span style="color:#F97583">  tool</span><span style="color:#E1E4E8"> = pstorm</span></span>
<span class="line"><span style="color:#B392F0">[mergetool.pstorm]</span></span>
<span class="line"><span style="color:#F97583">  cmd</span><span style="color:#E1E4E8"> = /usr/local/bin/pstorm merge </span><span style="color:#9ECBFF">"$LOCAL"</span><span style="color:#9ECBFF"> "$REMOTE"</span><span style="color:#9ECBFF"> "$BASE"</span><span style="color:#9ECBFF"> "$MERGED"</span></span></code></pre>
</div><p>webstorm</p>
<div class="language-ini"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#B392F0">[diff]</span></span>
<span class="line"><span style="color:#F97583">  tool</span><span style="color:#E1E4E8"> = wstorm</span></span>
<span class="line"><span style="color:#B392F0">[difftool]</span></span>
<span class="line"><span style="color:#F97583">  prompt</span><span style="color:#E1E4E8"> = false</span></span>
<span class="line"><span style="color:#B392F0">[difftool.wstorm]</span></span>
<span class="line"><span style="color:#F97583">  cmd</span><span style="color:#E1E4E8"> = /usr/local/bin/wstorm diff </span><span style="color:#9ECBFF">"$LOCAL"</span><span style="color:#9ECBFF"> "$REMOTE"</span></span>
<span class="line"><span style="color:#B392F0">[merge]</span></span>
<span class="line"><span style="color:#F97583">  tool</span><span style="color:#E1E4E8"> = wstorm</span></span>
<span class="line"><span style="color:#B392F0">[mergetool.wstorm]</span></span>
<span class="line"><span style="color:#F97583">  cmd</span><span style="color:#E1E4E8"> = /usr/local/bin/wstorm merge </span><span style="color:#9ECBFF">"$LOCAL"</span><span style="color:#9ECBFF"> "$REMOTE"</span><span style="color:#9ECBFF"> "$BASE"</span><span style="color:#9ECBFF"> "$MERGED"</span></span></code></pre>
</div><div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>可以点击顶栏 <code>tools-&gt; Run Command</code> 触发 phpstorm 命令行工具,
更具体的使用参见 <a href="https://blog.jetbrains.com/phpstorm/2013/07/command-line-tools-in-phpstorm/" target="_blank" rel="noreferrer">phpstorm cli</a></p>
</div>
<h2 id="自动环绕" tabindex="-1">自动环绕 <a class="header-anchor" href="#自动环绕" aria-label="Permalink to &quot;自动环绕&quot;"></a></h2>
<ul>
<li><code>alt + ctrl + t</code> 可以自动添加各种类型的包围快</li>
</ul>
<p><img src="https://blog.zenheart.site/assets/2018-08-10-phpstorm_surrond.D93DDfsd.png" alt="" loading="lazy"> 需要进行如下配置</p>
<h2 id="利用命令打开文件" tabindex="-1">利用命令打开文件 <a class="header-anchor" href="#利用命令打开文件" aria-label="Permalink to &quot;利用命令打开文件&quot;"></a></h2>
<ol>
<li>
<p>选择 <code>tools -&gt; create command line launcher</code></p>
</li>
<li>
<p>点击确认后即可利用</p>
</li>
</ol>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D"># 打开文件</span></span>
<span class="line"><span style="color:#B392F0">pstorm</span><span style="color:#F97583"> &#x3C;</span><span style="color:#9ECBFF">file_nae</span><span style="color:#E1E4E8">m</span><span style="color:#F97583">></span></span></code></pre>
</div><h2 id="查看代码结构" tabindex="-1">查看代码结构 <a class="header-anchor" href="#查看代码结构" aria-label="Permalink to &quot;查看代码结构&quot;"></a></h2>
<p>利用 view-&gt;toolwindow-&gt;structure 查看代码结构</p>
<p>各图标含义如下</p>
<p><a href="https://www.jetbrains.com/help/phpstorm/symbols.html" target="_blank" rel="noreferrer">图标含义</a></p>
<h2 id="macros" tabindex="-1">macros <a class="header-anchor" href="#macros" aria-label="Permalink to &quot;macros&quot;"></a></h2>
<p>利用 macro 来录制宏.</p>
<ol>
<li><code>edit -&gt; macros -&gt; start macro recording</code> 开始记录宏</li>
<li>执行需要记录的操作</li>
<li><code>edit -&gt; macros -&gt; stop macro recording</code></li>
</ol>
<p>结束后会要求输入宏名称.
保存后利用 <code>edit -&gt; macros -&gt; start macro recording</code> 播放录制的宏</p>
<blockquote>
<p>可以在 php 设置中为 <code>macros</code> 分配快捷键,加快操作</p>
</blockquote>
<h2 id="其他" tabindex="-1">其他 <a class="header-anchor" href="#其他" aria-label="Permalink to &quot;其他&quot;"></a></h2>
<h3 id="经验" tabindex="-1">经验 <a class="header-anchor" href="#经验" aria-label="Permalink to &quot;经验&quot;"></a></h3>
<blockquote>
<p>工欲善其事,必先利其器</p>
</blockquote>
<p>对于工具的使用笔者的原则为</p>
<ul>
<li><code>常看帮助</code> 不会使用的地方先去源头看帮助.不要陷入漫长的查找中</li>
<li><code>多总结,多记录</code> 对于配置方面的工作,记下来免得下回又要重来</li>
<li><code>不要受限</code> 当这个工具无法满足你时.请结合其他工具.前提是官方以明确指出没有该特性</li>
</ul>
<h3 id="使用问题" tabindex="-1">使用问题 <a class="header-anchor" href="#使用问题" aria-label="Permalink to &quot;使用问题&quot;"></a></h3>
<h4 id="缓存" tabindex="-1">缓存 <a class="header-anchor" href="#缓存" aria-label="Permalink to &quot;缓存&quot;"></a></h4>
<p>phpstorm 及其占用缓存.当电脑变慢时.
利用 <code>file -&gt; invalidate caches/restart</code> 重启应用.</p>
<h4 id="工具栏消失" tabindex="-1">工具栏消失 <a class="header-anchor" href="#工具栏消失" aria-label="Permalink to &quot;工具栏消失&quot;"></a></h4>
<p>进入 view 菜单选择 <code>tool bar</code> 和 <code>tool button</code> 即可。</p>
<h3 id="清除无用的-css-样式" tabindex="-1">清除无用的 css 样式 <a class="header-anchor" href="#清除无用的-css-样式" aria-label="Permalink to &quot;清除无用的 css 样式&quot;"></a></h3>
<ol>
<li><code>code -&gt; run</code> 或者利用快捷键  <code>alt + ctrl + shift + i</code></li>
<li>输入 <code>unused css</code></li>
<li>选择删除无效的 css 样式</li>
</ol>
<h3 id="文件恢复" tabindex="-1">文件恢复 <a class="header-anchor" href="#文件恢复" aria-label="Permalink to &quot;文件恢复&quot;"></a></h3>
<ol>
<li>右键点击工程文件夹</li>
<li>选择<code>local hostory</code></li>
<li>选择 <code>show history</code></li>
<li>选中想要还原的状态，点击返回箭头即可。</li>
</ol>
<h3 id="文本对齐" tabindex="-1">文本对齐 <a class="header-anchor" href="#文本对齐" aria-label="Permalink to &quot;文本对齐&quot;"></a></h3>
<ol>
<li>键值对对齐
<a href="http://stackoverflow.com/questions/29795116/stop-phpstorm-from-aligning-associative-arrays" target="_blank" rel="noreferrer">键值对对齐</a></li>
<li>变量申明对齐
<img src="https://blog.zenheart.site/assets/2018-08-10-phpstorm-align-consecutive.CzE-7Ojw.jpg" alt="" loading="lazy"></li>
</ol>
<h3 id="修改-index-索引映射" tabindex="-1">修改 index 索引映射 <a class="header-anchor" href="#修改-index-索引映射" aria-label="Permalink to &quot;修改 index 索引映射&quot;"></a></h3>
<p>该方法可以节约 <code>phpstorm</code> 缓存.
在配置相中打开 <code>file types</code>
选择 <code>ignore files and folders</code> 添加需要忽略的文件夹.
支持 <code>glob</code> 模式的查找.</p>
<h3 id="file-watcher" tabindex="-1">file watcher <a class="header-anchor" href="#file-watcher" aria-label="Permalink to &quot;file watcher&quot;"></a></h3>
<p>文件自动监察运行.
详见 <img src="https://blog.zenheart.site/assets/2018-08-10-phpstorm-file-watcher._5FTeazm.png" alt="" loading="lazy"></p>
<p>更详细的配置参见官方说明 <a href="https://www.jetbrains.com/help/phpstorm/new-watcher-dialog.html#immediateFileSynchronization" target="_blank" rel="noreferrer">new watcher dialog</a></p>
<p>重点为</p>
<ol>
<li>配置检测文件的作用域.具体规则参见
<a href="https://www.jetbrains.com/help/phpstorm/scope.html" target="_blank" rel="noreferrer">文件 scope</a></li>
<li>文件变化后执行脚本配置</li>
</ol>
<ul>
<li>[ ] <a href="https://www.jetbrains.com/help/phpstorm/testing-with-phpunit.html" target="_blank" rel="noreferrer">phpunit</a></li>
</ul>
<h3 id="创建的文件被识别为文本模式-无法高亮" tabindex="-1">创建的文件被识别为文本模式,无法高亮 <a class="header-anchor" href="#创建的文件被识别为文本模式-无法高亮" aria-label="Permalink to &quot;创建的文件被识别为文本模式,无法高亮&quot;"></a></h3>
<ol>
<li>打开配置,搜索 file types</li>
<li>在右侧查找 Text 类型</li>
<li>在 registered patterns 中删除被误识别的模式,点击 ok 即可.</li>
</ol>
<p>参考  <a href="https://stackoverflow.com/questions/48223377/phpstorm-cant-highlight-the-file" target="_blank" rel="noreferrer">PhpStorm can't highlight the file</a></p>
<h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to &quot;参考资料&quot;"></a></h2>
<p><a href="https://www.sitepoint.com/phpstorm-top-productivity-hacks-shortcuts/" target="_blank" rel="noreferrer">phpstorm 利用快捷键</a></p>
<p><a href="http://manovotny.com/phpstorm-keyboard-shortcuts/" target="_blank" rel="noreferrer">phpstorm 节约时间的快捷键技巧</a></p>
<p><a href="https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/24" target="_blank" rel="noreferrer">phpstorm 使用视频</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="http://oap05mfra.bkt.clouddn.com/phpstorm1.gif" length="0" type="image/gif"/>
        </item>
        <item>
            <title><![CDATA[web 简史]]></title>
            <link>https://blog.zenheart.site/posts/2018-09-22-web-history</link>
            <guid isPermaLink="false">https://blog.zenheart.site/posts/2018-09-22-web-history</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[web 简史
简述 web 的发展历史,理解技术演化的缘由
 第一个网页
故事从[伯纳斯-李][bns]开始,他在[CERN][CERN]担任软件工程师时发现查找资料很不方便。
因为各种资料存储在不同]]></description>
            <content:encoded><![CDATA[<h1 id="web-简史" tabindex="-1">web 简史 <a class="header-anchor" href="#web-简史" aria-label="Permalink to &quot;web 简史&quot;"></a></h1>
<p><strong>简述 web 的发展历史,理解技术演化的缘由</strong></p>
<h2 id="第一个网页" tabindex="-1">第一个网页 <a class="header-anchor" href="#第一个网页" aria-label="Permalink to &quot;第一个网页&quot;"></a></h2>
<p>故事从<a href="https://zh.wikipedia.org/wiki/%E8%92%82%E5%A7%86%C2%B7%E4%BC%AF%E7%BA%B3%E6%96%AF-%E6%9D%8E" target="_blank" rel="noreferrer">伯纳斯-李</a>开始,他在<a href="http://home.web.cern.ch/" target="_blank" rel="noreferrer">CERN</a>担任软件工程师时发现查找资料很不方便。
因为各种资料存储在不同的电脑上，他必须登录对应电脑来获取资料。为了实现不同电脑之间资源的共享,他需要解决如下问题:</p>
<ol>
<li>如何实现多台电脑间资源的共享</li>
<li>如何解决不同类型电脑上资源显示的问题</li>
</ol>
<p>在 1989 年他完成了初步构想。并与 1990 年发明了第一个<a href="https://zh.wikipedia.org/wiki/WorldWideWeb" target="_blank" rel="noreferrer">浏览器</a>和<a href="https://zh.wikipedia.org/wiki/CERN_httpd" target="_blank" rel="noreferrer">服务器</a>.
于是第一个<a href="http://info.cern.ch/" target="_blank" rel="noreferrer">网站</a>诞生了.随后在 1994 年他创建了<a href="./www">万维网联盟</a>,来实现对WEB技术的规范化。
这就是如今大名鼎鼎的<a href="https://www.w3.org/" target="_blank" rel="noreferrer"><strong>W3C网站</strong></a>。早期的 WEB 组织，为了利于 WEB 的正常发展提出了几个革命性观点:</p>
<ol>
<li><strong>去中心化</strong>
没有资源的总控中心，所有 WEB 的资源都应该是独立的节点</li>
<li><strong>无差别</strong>
网络资源连接之间不具有差异性，也称网络中立性原则</li>
<li><strong>自底向上设计</strong>
人人皆可为 WEB 做贡献而不是只有专家才可</li>
<li><strong>通用性</strong>
任何人都何以发布任何资源，但必须遵守相同的规则(遵从 W3C 的规范等)</li>
<li><strong>一致性</strong>
对于通用的标准，任何人都必须遵守，并且保持一致</li>
</ol>
<h2 id="第一个图形浏览器" tabindex="-1">第一个图形浏览器 <a class="header-anchor" href="#第一个图形浏览器" aria-label="Permalink to &quot;第一个图形浏览器&quot;"></a></h2>
<p>在 1990 年，伯纳斯李提出 WEB 思想后，1993 年 NCSA 发明了第一个运行在图形界面下的  <a href="https://zh.wikipedia.org/wiki/Mosaic" target="_blank" rel="noreferrer">mosaic</a>浏览器。
该浏览器实现了内联图片和带颜色的超链接等功能，而这个项目的领导者<a href="https://zh.wikipedia.org/wiki/%E9%A9%AC%E5%85%8B%C2%B7%E5%AE%89%E5%BE%B7%E6%A3%AE" target="_blank" rel="noreferrer">马克·安德森</a>随后离职开创了<a href="https://zh.wikipedia.org/wiki/%E7%BD%91%E6%99%AF%E5%AF%BC%E8%88%AA%E8%80%85" target="_blank" rel="noreferrer">网景公司</a></p>
<h2 id="js-的诞生" tabindex="-1">js 的诞生 <a class="header-anchor" href="#js-的诞生" aria-label="Permalink to &quot;js 的诞生&quot;"></a></h2>
<p>在当时用户利用浏览器只能显示静态资源,<a href="https://zh.wikipedia.org/wiki/%E9%A9%AC%E5%85%8B%C2%B7%E5%AE%89%E5%BE%B7%E6%A3%AE" target="_blank" rel="noreferrer">马克·安德森</a> 为了实现客户端脚本功能,在 1995 年网景公司的雇员<a href="https://zh.wikipedia.org/wiki/%E5%B8%83%E8%98%AD%E7%99%BB%C2%B7%E8%89%BE%E5%85%8B" target="_blank" rel="noreferrer">布兰登·艾克</a>发明了 javascript 来增强和用户的交互。</p>
<p>网景公司的浏览器初衷是不依赖于运行平台的应用程序，这使得微软感受到了威胁，在网景推出具有 js 功能的浏览器后，微软也不甘落后在浏览器中加入了自己的脚本语言<code>Jscript</code>.</p>
<p>两家公司为了获取市场份额。相继在自己的浏览器中加入新功能，第一次浏览器大战就此拉开战幕。</p>
<h2 id="css-的诞生" tabindex="-1">css 的诞生 <a class="header-anchor" href="#css-的诞生" aria-label="Permalink to &quot;css 的诞生&quot;"></a></h2>
<p>由于当时 WEB 还是基于 HTML 规范。而自从图形浏览器出现后，为了实现丰富的视觉效果， W3C
在 HTML 标签中加入了类似于<code>FONT、CETEER</code>等用来控制文本展现的标签。导致在书写页面时混杂着大量的页面呈现逻辑。</p>
<p>为了改变这种现状，在 1996 年，W3C 发布了 CSS1，将控制页面呈现的内容单独分离出来。而微软
也顺势发布了支持这些规范的 ie3 浏览器。</p>
<h2 id="ecmascript-规范" tabindex="-1">EcmaScript 规范 <a class="header-anchor" href="#ecmascript-规范" aria-label="Permalink to &quot;EcmaScript 规范&quot;"></a></h2>
<p>在这场持续的战争中产生了如下问题：</p>
<ol>
<li>把加入新功能的重要性放在修复错误之前</li>
<li>不尊重 W3C 的标准，采用专属格式
介于上述现状，1996- 1997 ECMA 承担起了规范脚本语言 js 的任务，这个规范就是
<a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" target="_blank" rel="noreferrer">EcmaScript</a>,他规范了脚本的语法和内建对象。第一次浏览器大战在 1998 年
以微软的胜利告终。</li>
</ol>
<h2 id="cgi" tabindex="-1">cgi <a class="header-anchor" href="#cgi" aria-label="Permalink to &quot;cgi&quot;"></a></h2>
<p>在 web 发展的初期它只能获取静态页面。为了实现类似统计访问者数量，
获取数据数据库中的内同并显示等功能，就需要在请求后，利用服务器端的脚本将处理返回。
这样的功能在当时称为<a href="https://zh.wikipedia.org/wiki/CGI" target="_blank" rel="noreferrer">cgi</a>,随后随着 WEB 的富应用化就出现了类似 PHP、
ASP.NET、Python、Ruby等服务端的语言，它们实现了对请求结果进行处理，
例如查询数据库、处理用户数据等在返回 HTML 或其他资源的功能。</p>
<h2 id="表单技术" tabindex="-1">表单技术 <a class="header-anchor" href="#表单技术" aria-label="Permalink to &quot;表单技术&quot;"></a></h2>
<p>另一个方面，为了实现客户端向服务器提交数据，比如订购货物，<a href="http://www.joomlavision.com/illustrated-history-web-forms/" target="_blank" rel="noreferrer">表单</a>技术发展起来。</p>
<h2 id="xmlhttprequest" tabindex="-1">XMLHttpRequest <a class="header-anchor" href="#xmlhttprequest" aria-label="Permalink to &quot;XMLHttpRequest&quot;"></a></h2>
<p>可是在使用类似表单的技术时，由于客户端需要等待服务端返回处理结果。微软在2000年利用<code>XMLHttpRequest</code>对象实现了对请求的异步加载。</p>
<h2 id="ajax" tabindex="-1">ajax <a class="header-anchor" href="#ajax" aria-label="Permalink to &quot;ajax&quot;"></a></h2>
<p>随后 2005 年goole在开发google地图时,雇员<a href="https://zh.wikipedia.org/wiki/%E5%82%91%E8%A5%BF%C2%B7%E8%A9%B9%E5%A7%86%E5%A3%AB%C2%B7%E8%B3%88%E7%91%9E%E7%89%B9" target="_blank" rel="noreferrer">杰西·詹姆士·贾瑞特</a>谈论了利用<a href="https://zh.wikipedia.org/wiki/AJAX" target="_blank" rel="noreferrer">ajax</a>
技术来实现异步加载。通过跟新浏览器中 DOM 对象节点，实现了在不刷新页面的前提下，从服务器获取数据。
由于 ajax 的出现，使复杂的 web 应用成为可能，出现了像 <code>gmail、google map</code>这样的杀手级应用。
时间推进到 2007-2010 年，涌现了三种开发潮流。</p>
<ol>
<li>web 向移动页面倾斜</li>
<li>jquery 将 js 在前端兼容性等问题进行了解决</li>
<li>node.js 发布了，使 js 在服务端运行成为可能。</li>
</ol>
<h2 id="mv" tabindex="-1">MV* <a class="header-anchor" href="#mv" aria-label="Permalink to &quot;MV*&quot;"></a></h2>
<p>伴随 web 应用的进一步复杂，基于 DOM 操作的 jquery 库无法胜任类似客户端应用复杂度的 SPA.</p>
<p>借鉴路由管理、模板等后端开发理念，前端出现了 backbone,ember,derby,meteor，angular 等
MV* 框架。这些框架整合了各种开发需求，形成了一套完整的应用开发体系。</p>
<p>此外由于 node 在后端的强势发展，及 W3C 等在 html5 和其他 web 标准的逐步完善。
原来单纯的 html 静态资源，渐渐脱离了后端的控制，独立出来成为了完整的前端体系。
包括开发的自动化，各种开发模式百花齐放，产生了如今的前端。</p>
<h2 id="参考文章" tabindex="-1">参考文章 <a class="header-anchor" href="#参考文章" aria-label="Permalink to &quot;参考文章&quot;"></a></h2>
<p><a href="https://www.w3.org/People/Berners-Lee/Kids.html" target="_blank" rel="noreferrer">Berners-Lee:ansers for young people</a>
<a href="http://blog.jobbole.com/45169/" target="_blank" rel="noreferrer">web 历史技术参考</a><br>
<a href="http://webfoundation.org/about/vision/history-of-the-web/" target="_blank" rel="noreferrer">web 的历史</a><br>
<a href="https://www.w3.org/History.html" target="_blank" rel="noreferrer">a little history of 3w</a><br>
<a href="https://www.devsaran.com/blog/history-web-application-development" target="_blank" rel="noreferrer">web 程序开发的历史</a><br>
<a href="http://royal.pingdom.com/2007/12/07/a-history-of-the-dynamic-web/" target="_blank" rel="noreferrer">动态脚本语言的历史</a><br>
<a href="http://techtracer.com/2007/03/12/the-birth-of-ajax-an-amazing-story/" target="_blank" rel="noreferrer">ajax 的诞生</a><br>
<a href="http://blog.froont.com/brief-history-of-web-design-for-designers/" target="_blank" rel="noreferrer">web 设计简明历史</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[模块]]></title>
            <link>https://blog.zenheart.site/projects/how-module-work/README</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/how-module-work/README</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[该系列详细讲解模块的运行机制
 概述
 commonjs]]></description>
            <content:encoded><![CDATA[<h1 id="模块" tabindex="-1">模块 <a class="header-anchor" href="#模块" aria-label="Permalink to &quot;模块&quot;"></a></h1>
<p><strong>该系列详细讲解模块的运行机制</strong></p>
<h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h2>
<h2 id="commonjs" tabindex="-1">commonjs <a class="header-anchor" href="#commonjs" aria-label="Permalink to &quot;commonjs&quot;"></a></h2>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[1 颜色]]></title>
            <link>https://blog.zenheart.site/projects/photoshop/1.color</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/photoshop/1.color</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[1 颜色
 颜色的表现
当你利用 PS 来处理图片时，你的交互对象是显示屏，显示屏显示颜色的决定可以看做以下两个指标平
光强：背光的亮度
颜色：滤镜的偏振
 颜色的感知
颜色是基于人类的感光系统所产生]]></description>
            <content:encoded><![CDATA[<h2 id="_1-颜色" tabindex="-1">1 颜色 <a class="header-anchor" href="#_1-颜色" aria-label="Permalink to &quot;1 颜色&quot;"></a></h2>
<h3 id="颜色的表现" tabindex="-1">颜色的表现 <a class="header-anchor" href="#颜色的表现" aria-label="Permalink to &quot;颜色的表现&quot;"></a></h3>
<p>当你利用 PS 来处理图片时，你的交互对象是显示屏，显示屏显示颜色的决定可以看做以下两个指标平</p>
<p>光强：背光的亮度</p>
<p>颜色：滤镜的偏振</p>
<h3 id="颜色的感知" tabindex="-1">颜色的感知 <a class="header-anchor" href="#颜色的感知" aria-label="Permalink to &quot;颜色的感知&quot;"></a></h3>
<p>颜色是基于人类的感光系统所产生的，由于所有的图片及视觉的感知都依赖与
视觉，所以必须了解我们是如感知颜色及识别差异的，人眼利用红、绿、蓝三种视锥细胞来感受
颜色，利用视杆细胞来感受物体明暗的差异。而颜色是由不同光的波长决定的，亮度是由光强决定的。
而我们能够认知不同颜色是源于人的是锥细胞对不同波长的光会有不一样的感受强度，而基于红绿蓝三种基本视锥细胞在感受颜色上
变化的差异而产生了对颜色感知，同理明暗的感知也是基于视杆细胞而来的。而对于透明度的感知实际上是混色原理。
利用混色实现背景和图像的融合。</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[debug]]></title>
            <link>https://blog.zenheart.site/projects/wechat/debug</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/wechat/debug</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[
debug
===
**前言:讲解微信调试环境的搭建**

]]></description>
            <content:encoded><![CDATA[<h1 id="debug" tabindex="-1">debug <a class="header-anchor" href="#debug" aria-label="Permalink to &quot;debug&quot;"></a></h1>
<p><strong>前言:讲解微信调试环境的搭建</strong></p>
<hr>
<h1 id="环境配置" tabindex="-1">环境配置 <a class="header-anchor" href="#环境配置" aria-label="Permalink to &quot;环境配置&quot;"></a></h1>
<ol>
<li>去微信网站下载官方调试工具<br>
<a href="https://mp.weixin.qq.com/wiki/10/e5f772f4521da17fa0d7304f68b97d7e.html" target="_blank" rel="noreferrer">调试工具下载网站</a></li>
<li>非微信运营者参考如下链接绑定开发者 <a href="https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1455784140" target="_blank" rel="noreferrer">web 开发者工具</a></li>
</ol>
<h1 id="蓝牙设备调试技巧" tabindex="-1">蓝牙设备调试技巧 <a class="header-anchor" href="#蓝牙设备调试技巧" aria-label="Permalink to &quot;蓝牙设备调试技巧&quot;"></a></h1>
<h2 id="在使用-jsapi-的库时保证调用的页面和生成" tabindex="-1">在使用 JSAPI 的库时保证调用的页面和生成 <a class="header-anchor" href="#在使用-jsapi-的库时保证调用的页面和生成" aria-label="Permalink to &quot;在使用 JSAPI 的库时保证调用的页面和生成&quot;"></a></h2>
<p>JSAPI 的界面相同。</p>
<div class="language-php"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#6A737D">   	// 注意 URL 一定要动态获取，不能 hardcode.</span></span>
<span class="line"><span style="color:#E1E4E8">   	$protocol </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">!</span><span style="color:#79B8FF">empty</span><span style="color:#E1E4E8">($_SERVER[</span><span style="color:#9ECBFF">'HTTPS'</span><span style="color:#E1E4E8">]) </span><span style="color:#F97583">&#x26;&#x26;</span><span style="color:#E1E4E8"> $_SERVER[</span><span style="color:#9ECBFF">'HTTPS'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">!==</span><span style="color:#9ECBFF"> 'off'</span><span style="color:#F97583"> ||</span><span style="color:#E1E4E8"> $_SERVER[</span><span style="color:#9ECBFF">'SERVER_PORT'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">==</span><span style="color:#79B8FF"> 443</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">?</span><span style="color:#9ECBFF"> "https://"</span><span style="color:#F97583"> :</span><span style="color:#9ECBFF"> "http://"</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">   	$url </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $callUrl;</span><span style="color:#6A737D">//注意这个地方</span></span>
<span class="line"><span style="color:#E1E4E8">   	$noncestr</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"abc"</span><span style="color:#E1E4E8">;</span><span style="color:#6A737D">//可以随便定义</span></span>
<span class="line"><span style="color:#E1E4E8">   	$jsapi_ticket</span><span style="color:#F97583">=</span><span style="color:#79B8FF">$this</span><span style="color:#F97583">-></span><span style="color:#B392F0">get_jsapi_ticket</span><span style="color:#E1E4E8">();</span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#E1E4E8">   	$timestamp</span><span style="color:#F97583">=</span><span style="color:#79B8FF">time</span><span style="color:#E1E4E8">();</span></span>
<span class="line"><span style="color:#6A737D">         //$url="http://1.atulocke.sinaapp.com/sample.php";</span></span>
<span class="line"><span style="color:#E1E4E8">   	$str</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"jsapi_ticket="</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">$jsapi_ticket</span><span style="color:#F97583">.</span><span style="color:#9ECBFF">"&#x26;noncestr="</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">$noncestr</span><span style="color:#F97583">.</span><span style="color:#9ECBFF">"&#x26;timestamp="</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">$timestamp</span><span style="color:#F97583">.</span><span style="color:#9ECBFF">"&#x26;url="</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">$url;</span></span>
<span class="line"><span style="color:#E1E4E8">   	$signature</span><span style="color:#F97583">=</span><span style="color:#79B8FF">sha1</span><span style="color:#E1E4E8">($str);</span></span>
<span class="line"><span style="color:#E1E4E8">   </span></span>
<span class="line"><span style="color:#E1E4E8">       $signPackage </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> array</span><span style="color:#E1E4E8">(</span></span>
<span class="line"><span style="color:#9ECBFF">         "appId"</span><span style="color:#F97583">     =></span><span style="color:#79B8FF"> $this</span><span style="color:#F97583">-></span><span style="color:#E1E4E8">appId,</span></span>
<span class="line"><span style="color:#9ECBFF">         "nonceStr"</span><span style="color:#F97583">  =></span><span style="color:#E1E4E8"> $noncestr,</span></span>
<span class="line"><span style="color:#9ECBFF">         "timestamp"</span><span style="color:#F97583"> =></span><span style="color:#E1E4E8"> $timestamp,</span></span>
<span class="line"><span style="color:#9ECBFF">         "url"</span><span style="color:#F97583">       =></span><span style="color:#E1E4E8"> $url,</span></span>
<span class="line"><span style="color:#9ECBFF">         "signature"</span><span style="color:#F97583"> =></span><span style="color:#E1E4E8"> $signature,</span></span>
<span class="line"><span style="color:#9ECBFF">         "rawString"</span><span style="color:#F97583"> =></span><span style="color:#E1E4E8"> $str</span></span>
<span class="line"><span style="color:#E1E4E8">       );</span></span>
<span class="line"><span style="color:#F97583">       return</span><span style="color:#E1E4E8"> $signPackage; </span></span>
<span class="line"><span style="color:#E1E4E8">     }</span></span></code></pre>
</div><h2 id="在设备-api-无法正常调用时注意打开调试信息" tabindex="-1">在设备 api 无法正常调用时注意打开调试信息 <a class="header-anchor" href="#在设备-api-无法正常调用时注意打开调试信息" aria-label="Permalink to &quot;在设备 api 无法正常调用时注意打开调试信息&quot;"></a></h2>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#E1E4E8">        wx.</span><span style="color:#B392F0">config</span><span style="color:#E1E4E8">({</span></span>
<span class="line"><span style="color:#E1E4E8">               debug: </span><span style="color:#79B8FF">false</span><span style="color:#E1E4E8">,</span><span style="color:#6A737D">//注意把调试信息打开</span></span>
<span class="line"><span style="color:#E1E4E8">               appId: token.appId,</span></span>
<span class="line"><span style="color:#E1E4E8">               timestamp:token.timestamp,</span></span>
<span class="line"><span style="color:#E1E4E8">                nonceStr: token.nonceStr,</span></span>
<span class="line"><span style="color:#E1E4E8">                   signature:token.signature,</span></span>
<span class="line"><span style="color:#E1E4E8">       });</span></span></code></pre>
</div><h2 id="记得将前后端的页面进行分离" tabindex="-1">记得将前后端的页面进行分离 <a class="header-anchor" href="#记得将前后端的页面进行分离" aria-label="Permalink to &quot;记得将前后端的页面进行分离&quot;"></a></h2>
<p>尽量不要出现前后端代码冗杂在一起的情况，
使用接口方式进行结合。不要暴露代码接口。
采用重定向方式进行文件设置。</p>
<h2 id="jsapi-调用出错说明" tabindex="-1">jsapi 调用出错说明 <a class="header-anchor" href="#jsapi-调用出错说明" aria-label="Permalink to &quot;jsapi 调用出错说明&quot;"></a></h2>
<blockquote>
<p><strong>the permission value is offline verifying</strong></p>
</blockquote>
<p>出现该错误原因有2</p>
<ol>
<li>传入参数有误</li>
<li>未将调用函数注入 WX 对象。
具体内容参考:<a href="http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html" target="_blank" rel="noreferrer">JSSDK 附录5常见错误说明</a></li>
</ol>
<h1 id="微信-jsapi-对象介绍" tabindex="-1">微信 JSAPI 对象介绍 <a class="header-anchor" href="#微信-jsapi-对象介绍" aria-label="Permalink to &quot;微信 JSAPI 对象介绍&quot;"></a></h1>
<p>微信内置有浏览器，其浏览器是基于 QQ 浏览器的精简版。
所以在使用设备的 JSAPI 或微信的 JSSDK 时，都会设置到浏览器的内建的
宿主对象使用，微信内置有浏览器对象 WeixinJSBridge ，该对象需要客户端进行初始化。
初始化代码如下:</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="color:#F97583">   if</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">typeof</span><span style="color:#E1E4E8"> WeixinJSBridge </span><span style="color:#F97583">==</span><span style="color:#9ECBFF"> "object"</span><span style="color:#F97583"> &#x26;&#x26;</span><span style="color:#F97583"> typeof</span><span style="color:#E1E4E8"> WeixinJSBridge.invoke </span><span style="color:#F97583">==</span><span style="color:#9ECBFF"> "function"</span><span style="color:#E1E4E8">) {</span></span>
<span class="line"><span style="color:#B392F0">       callback</span><span style="color:#E1E4E8">();</span></span>
<span class="line"><span style="color:#E1E4E8">   } </span><span style="color:#F97583">else</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#F97583">       if</span><span style="color:#E1E4E8"> (document.addEventListener) {</span></span>
<span class="line"><span style="color:#E1E4E8">           document.</span><span style="color:#B392F0">addEventListener</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"WeixinJSBridgeReady"</span><span style="color:#E1E4E8">, callback, </span><span style="color:#79B8FF">false</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">       } </span><span style="color:#F97583">else</span><span style="color:#F97583"> if</span><span style="color:#E1E4E8"> (document.attachEvent) {</span></span>
<span class="line"><span style="color:#E1E4E8">           document.</span><span style="color:#B392F0">attachEvent</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"WeixinJSBridgeReady"</span><span style="color:#E1E4E8">, callback);</span></span>
<span class="line"><span style="color:#E1E4E8">           document.</span><span style="color:#B392F0">attachEvent</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"onWeixinJSBridgeReady"</span><span style="color:#E1E4E8">, callback);</span></span>
<span class="line"><span style="color:#E1E4E8">       }</span></span>
<span class="line"><span style="color:#E1E4E8">   }</span></span>
<span class="line"><span style="color:#6A737D">   //callback即为调用WeixinJSBridge的相关接口的函数</span></span></code></pre>
</div><p>该对象初始成功回拥有如下方法</p>
<h2 id="weixinjsbridge-方法" tabindex="-1">WeixinJSBridge 方法 <a class="header-anchor" href="#weixinjsbridge-方法" aria-label="Permalink to &quot;WeixinJSBridge 方法&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">方法名</th>
<th style="text-align:left">用途</th>
<th style="text-align:left">通用形式</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">invoke</td>
<td style="text-align:left">调用指定 API</td>
<td style="text-align:left">WeixinJSBridge.invoke(&quot;API名称&quot;,&quot;调用参数&quot;,&lt;回调函数&gt;);</td>
</tr>
<tr>
<td style="text-align:left">on</td>
<td style="text-align:left">事件监听</td>
<td style="text-align:left">WeixinJSBridge.on(&quot;事件名称&quot;,&lt;回调函数&gt;);</td>
</tr>
</tbody>
</table>
<p>具体内容参考:<a href="https://github.com/weui/weui/wiki/%E5%BE%AE%E4%BF%A1JSAPI" target="_blank" rel="noreferrer">WEUI说明</a></p>
<h2 id="微信的隐藏-bug" tabindex="-1">微信的隐藏 bug <a class="header-anchor" href="#微信的隐藏-bug" aria-label="Permalink to &quot;微信的隐藏 bug&quot;"></a></h2>
<ul>
<li>用户仅向公众号发送信息，无其他互动，公众号仅能通过客服接口向此用户发送20条信息。</li>
<li>用户仅在公众号点击菜单，无其他互动，公众号仅能通过客服接口向此用户发2条信息。</li>
</ul>
<p>意味着如果想主动向客户发送信息,必须发送消息后.才可复位该限制.</p>
<h1 id="微信设备-jsapi-使用详解" tabindex="-1">微信设备 JSAPI 使用详解 <a class="header-anchor" href="#微信设备-jsapi-使用详解" aria-label="Permalink to &quot;微信设备 JSAPI 使用详解&quot;"></a></h1>
<ol>
<li>使用之前的初始化
设备端库在使用之前需要保证已经加载，WeixinJSBridge 对象。
在加载此对象成功后，调用 openWXDeviceLib 函数初始化设备库即可使用微信的
JSAPI 设备函数库。核心代码如下。</li>
</ol>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"></span></code></pre>
</div>]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[readme]]></title>
            <link>https://blog.zenheart.site/projects/wechat/readme</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/wechat/readme</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[
readme
===
**前言:微信开发说明**

]]></description>
            <content:encoded><![CDATA[<h1 id="readme" tabindex="-1">readme <a class="header-anchor" href="#readme" aria-label="Permalink to &quot;readme&quot;"></a></h1>
<p><strong>前言:微信开发说明</strong></p>
<hr>
<h1 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h1>
<p>记录在微信开发中遇到的问题和解决方法。
主要分为以下几块</p>
<ol>
<li>微信设备端开发总结
<ol>
<li>蓝牙设备</li>
<li>wifi 设备</li>
</ol>
</li>
<li>微信网页开发总结
<ol>
<li>jssdk 的使用</li>
<li>公众号接口汇总</li>
</ol>
</li>
</ol>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[natapp]]></title>
            <link>https://blog.zenheart.site/projects/wechat/tool</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/wechat/tool</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[
]]></description>
            <content:encoded><![CDATA[<hr>
<h2 id="title-tooltags-toolbirth-2017-07-11modified-2017-07-11" tabindex="-1">title: tool<br>
tags: tool<br>
birth: 2017-07-11<br>
modified: 2017-07-11 <a class="header-anchor" href="#title-tooltags-toolbirth-2017-07-11modified-2017-07-11" aria-label="Permalink to &quot;title: tool    
tags: tool      
birth: 2017-07-11      
modified: 2017-07-11&quot;"></a></h2>
<h1 id="tool" tabindex="-1">tool <a class="header-anchor" href="#tool" aria-label="Permalink to &quot;tool&quot;"></a></h1>
<p><strong>前言:讲解微信开发的工具集</strong></p>
<hr>
<h2 id="natapp" tabindex="-1">natapp <a class="header-anchor" href="#natapp" aria-label="Permalink to &quot;natapp&quot;"></a></h2>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[web_dev]]></title>
            <link>https://blog.zenheart.site/projects/wechat/web_dev</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/wechat/web_dev</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[
web_dev
===
**前言:微信官方文档网页开发说明**

]]></description>
            <content:encoded><![CDATA[<h1 id="web-dev" tabindex="-1">web_dev <a class="header-anchor" href="#web-dev" aria-label="Permalink to &quot;web_dev&quot;"></a></h1>
<p><strong>前言:微信官方文档网页开发说明</strong></p>
<hr>
<h2 id="网页开发" tabindex="-1"><a href="https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1483682025_enmey" target="_blank" rel="noreferrer">网页开发</a> <a class="header-anchor" href="#网页开发" aria-label="Permalink to &quot;[网页开发](https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1483682025_enmey)&quot;"></a></h2>
<p>浏览器内核为 <code>WKWebview</code> 或 <code>UIWebview</code>
微信 6.5.3 以后支持手动切换内核.</p>
<ol>
<li>微信主页点击右上角加好</li>
<li>点击添加朋友</li>
<li>输入 <code>:switchweb</code></li>
<li>会给出提示框显示当前使用内核为 <code>UIWebview</code> 还是 <code>WKWebview</code></li>
</ol>
<blockquote>
<p>在 WKebview 界面下会出现闪烁问题,</p>
</blockquote>
<p>查看当前内核</p>
<ul>
<li>进入任意网页下拉网页</li>
<li>点击任意网页右上角菜单</li>
</ul>
<p>显示 <code>此网页由</code> 为 <code>WKWebview</code> ,<code>网页由</code> 为 <code>UIWebview</code></p>
<p>利用 <code>window.__wxjs_is_wkwebview</code> 为真使用 <code>WKWebview</code></p>
<p><strong>经验在 ios 特性时,使用 safri 来进行类比</strong></p>
<p>微信在 <code>WKWebview</code> 中注入了 <code>JSBridge</code> 对象.
重点关注如下问题</p>
<ul>
<li>页面功能</li>
<li>页面屏幕适配</li>
<li>利用微信按钮点击返回行为</li>
<li>页面 js 缘分兼容性</li>
<li>JSAPI 兼容性</li>
<li>cookie 和 localstroage 存储</li>
<li>cache-control 缓存机制设定</li>
</ul>
<h3 id="jsapi" tabindex="-1">jsapi <a class="header-anchor" href="#jsapi" aria-label="Permalink to &quot;jsapi&quot;"></a></h3>
<ul>
<li>不支持 <code>cache</code> api.</li>
<li>wx.config 失败</li>
</ul>
<p>ios 微信 6.5.1 以下,使用 HTMl5 <code>Histroy API</code></p>
<ul>
<li><code>pushState</code></li>
<li><code>popState</code></li>
<li><code>replaceState</code> 控制页面导航时(单页面应用)
同时使用 <code>JSSDK</code> wx.config 授权 jsapi 出现无权限而调用失败</li>
</ul>
<p>ios 微信 6.5.2 之后,可能出现此问题</p>
<blockquote>
<p>注意使用 jssdk 时开启调试模式简化调试步骤</p>
</blockquote>
<h3 id="cookie-和-localstorage" tabindex="-1">cookie 和 localStorage <a class="header-anchor" href="#cookie-和-localstorage" aria-label="Permalink to &quot;cookie 和 localStorage&quot;"></a></h3>
<p>退出微信会被清空.</p>
<p>需保证服务端设置了 <code>cache control</code> 后再进行 html 页面缓存设置.</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[wechatPay]]></title>
            <link>https://blog.zenheart.site/projects/wechat/wechatPay</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/wechat/wechatPay</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[
wechatPay
===
**前言:微信支付**

]]></description>
            <content:encoded><![CDATA[<h1 id="wechatpay" tabindex="-1">wechatPay <a class="header-anchor" href="#wechatpay" aria-label="Permalink to &quot;wechatPay&quot;"></a></h1>
<p><strong>前言:微信支付</strong></p>
<hr>
<h1 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to &quot;概述&quot;"></a></h1>
<h2 id="支付模式" tabindex="-1">支付模式 <a class="header-anchor" href="#支付模式" aria-label="Permalink to &quot;支付模式&quot;"></a></h2>
<p>支持的支付模式</p>
<ol>
<li>刷卡支付  适用于线下面对面收银场景</li>
<li>扫码支付 商户系统生成支付二维码,无需面对面的支付方式</li>
<li>公众号支付 公众号内调用支付接口完成支付</li>
<li>APP 支付 调用微信 sdk 接口完成支付行为</li>
</ol>
<h2 id="技术术语" tabindex="-1">技术术语 <a class="header-anchor" href="#技术术语" aria-label="Permalink to &quot;技术术语&quot;"></a></h2>
<ul>
<li><strong>微信公众平台</strong> 微信提供企业服务的轻应用</li>
<li><strong>微信开放平台</strong> 提供给第三方调用微信接口的能力.为开发者模式</li>
<li><strong>微信商户平台</strong> 提供微信支付的功能平台</li>
<li><strong>微信企业号</strong> 不清楚?</li>
<li><strong>微信支付系统</strong> 实现微信支付等逻辑的系统</li>
<li><strong>商户收银系统</strong> POS 收银机,用来录入商品信息,生成订单,客户支付,打印小票的机器
<ul>
<li>需要搞清楚 POS 机软体的运行方式</li>
</ul>
</li>
<li><strong>商户后台系统</strong> 商户后台处理业务逻辑的总称</li>
<li><strong>商户证书</strong> 提供二进制文件，作为微信支付的后台凭证</li>
<li><strong>签名</strong> 常用签名算法 MD5,SHA128,SHA256,HMAC</li>
<li><strong>openId</strong> 用户在公众号下的唯一标识</li>
<li><strong>mch_id</strong> 微信支付对应的商户 id 号</li>
<li><strong>api 秘钥</strong> 商户系统和微信后台进行交易的接口秘钥</li>
<li><strong>Appid</strong> 公众号 id</li>
<li><strong>Appsecret</strong> 公众号秘钥</li>
</ul>
<p>对于开发重点关注的参数如下:</p>
<p><strong>APPID</strong> 微信服务号对应的识别 id
<strong>mch_id</strong> 开通微信支付后对应的商户账号
<strong>API 密钥</strong> 支付交易中的签名密钥,用于微信核对支付信息
<strong>Appsecret</strong> 调用微信接口的凭证</p>
<p>详情参见 <a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=3_1" target="_blank" rel="noreferrer">支付账户</a></p>
<h2 id="微信支付协议规范" tabindex="-1">微信支付协议规范 <a class="header-anchor" href="#微信支付协议规范" aria-label="Permalink to &quot;微信支付协议规范&quot;"></a></h2>
<ol>
<li>采用 https 的方式传输</li>
<li>采用 post 方式提交</li>
<li>采用 xml 进行数据交互</li>
<li>采用 utf8 编码</li>
<li>签名算法进行接口验证</li>
<li>签名要求
<ol>
<li>
<p>将所有非空的参数按照字典排序生成 stringA</p>
</li>
<li>
<p>生成摘要</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span> </span></span>
<span class="line"><span>   stringSignTemp="stringA&#x26;key=192006250b4c09247ec02edce69f6a2d"</span></span>
<span class="line"><span>   sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"</span></span></code></pre>
</div></li>
<li>
<p>将生成的新字段添加到传入参数中，作为一个新字段
字段中有一个 <code>nonce_str</code> 为随机项，用来保证签名的不可预测性。</p>
</li>
<li>
<p>微信证书的说明
<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3" target="_blank" rel="noreferrer">微信证书的作用</a></p>
</li>
</ol>
</li>
<li>证书要求</li>
<li>逻辑判断
<ol>
<li>先判断协议字段，错误返回</li>
<li>再判断业务，错误返回</li>
<li>最后判断交易状态，错误返回</li>
</ol>
</li>
</ol>
<h1 id="支付开发" tabindex="-1">支付开发 <a class="header-anchor" href="#支付开发" aria-label="Permalink to &quot;支付开发&quot;"></a></h1>
<h2 id="支付字段规定" tabindex="-1">支付字段规定 <a class="header-anchor" href="#支付字段规定" aria-label="Permalink to &quot;支付字段规定&quot;"></a></h2>
<h3 id="对应支付选择" tabindex="-1">对应支付选择 <a class="header-anchor" href="#对应支付选择" aria-label="Permalink to &quot;对应支付选择&quot;"></a></h3>
<p>在不同支付场景使用对应开发接口。
其中选择方式如下。</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">使用场景</th>
<th>支付模式</th>
<th>商品字段规则</th>
<th>样例</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">PC 网站</td>
<td>扫码支付</td>
<td>商品主页-商品描述</td>
<td>qq 会员充值</td>
<td>无</td>
</tr>
<tr>
<td style="text-align:left">微信浏览器</td>
<td>公众号支付</td>
<td>商家名称-销售商品类目</td>
<td>逻辑思维-图书</td>
<td>线上商店，商家名称必须为实际销售商品店家</td>
</tr>
<tr>
<td style="text-align:left">门店扫码</td>
<td>公众号支付</td>
<td>店名-销售商品类目</td>
<td>天虹南山店-超市</td>
<td>线下门店支付</td>
</tr>
<tr>
<td style="text-align:left">门店扫码</td>
<td>扫码支付</td>
<td>店名-销售商品类目</td>
<td>天虹南山店-超市</td>
<td>线下门店支付</td>
</tr>
<tr>
<td style="text-align:left">门店刷卡</td>
<td>刷卡支付</td>
<td>店名-销售商品类目</td>
<td>天虹南山店-超市</td>
<td>线下门店支付</td>
</tr>
<tr>
<td style="text-align:left">第三方手机浏览器</td>
<td>H5 支付</td>
<td>主页 title 名-商品概述</td>
<td>腾讯充值中心-QQ会员充值</td>
<td></td>
</tr>
<tr>
<td style="text-align:left">第三方 APP</td>
<td>APP 支付</td>
<td>应用市场 APP 名-商品概述</td>
<td>天天爱消除-游戏充值</td>
<td></td>
</tr>
</tbody>
</table>
<p><a href="https://mp.weixin.qq.com/wiki" target="_blank" rel="noreferrer">微信门店详解</a></p>
<h3 id="金额要求" tabindex="-1">金额要求 <a class="header-anchor" href="#金额要求" aria-label="Permalink to &quot;金额要求&quot;"></a></h3>
<p><strong>微信支付金额限定在对应币种的最小单位</strong></p>
<p>交易类型</p>
<ul>
<li>JSAPI-- 公众号支付</li>
<li>NATIVE -- 原生扫码支付</li>
<li>APP -- app 支付，以上利用统一支付接口进行调用</li>
<li>MICROPAY -- 有单独的接口</li>
</ul>
<p>货币种类</p>
<ul>
<li>CNY 人民币</li>
</ul>
<p>时间必须为北京时间，精确到秒</p>
<p>商户订单号，由商户自行生成，必须保证唯一性（采用系统时间加随机序列来生成订单号）
具体规则。
* 若支付失败重新支付，使用原订单号
* 已支付或关闭撤销订单需重新生成订单号</p>
<p>银行类型参见下表 <a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2" target="_blank" rel="noreferrer">参数规定</a></p>
<p><a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_3" target="_blank" rel="noreferrer">证书功能详解</a></p>
<h2 id="支付前期准备" tabindex="-1">支付前期准备 <a class="header-anchor" href="#支付前期准备" aria-label="Permalink to &quot;支付前期准备&quot;"></a></h2>
<p>准备工作，必须包含如下条件</p>
<ul>
<li>有认证了的服务号并且开通了微信支付</li>
<li>获取如下信息写入微信官方 demo 配置文件
<ul>
<li><strong>AppID</strong> 绑定微信支付的服务号</li>
<li><strong>AppSecret</strong> 绑定微信支付的服务号密码</li>
<li><strong>Mch_id</strong> 商户编号,微信支付-&gt;商户信息查看</li>
<li><strong>APIKey</strong> 商户支付密钥,在微信支付中使用的密钥, 商户 -&gt; api 安全查看</li>
<li><strong>SSLCERT_PATH</strong></li>
<li><strong>SSLKEY_PATH</strong></li>
</ul>
</li>
</ul>
<p>支付开发流程如下</p>
<ol>
<li>
<p>配置微信公众平台</p>
<ol>
<li>开发基本配置保证服务器的正常连接</li>
<li>设置，公众号设置 -&gt; 功能设置中允许域名接口</li>
<li>微信支付中修改支付授权目录和支付回调 url</li>
<li>安装对应证书</li>
</ol>
</li>
<li>
<p>利用参看 <a href="https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html" target="_blank" rel="noreferrer">微信授权</a>获取 code</p>
</li>
</ol>
<p><a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx37bcdb3936e6fb03&amp;connect_redirect=1&amp;redirect_uri=http:%2F%2F1.zsyd.applinzi.com%2FYDPAY%2Fcharge.test.php&amp;response_type=code&amp;scope=snsapi_base&amp;state=STATE" target="_blank" rel="noreferrer">https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx37bcdb3936e6fb03&amp;connect_redirect=1&amp;redirect_uri=http:%2F%2F1.zsyd.applinzi.com%2FYDPAY%2Fcharge.test.php&amp;response_type=code&amp;scope=snsapi_base&amp;state=STATE</a></p>
<ol start="3">
<li>
<p>利用 code 获取 opneid</p>
</li>
<li>
<p>利用 openid 生成账单</p>
</li>
<li>
<p>利用账单调用微信支付接口</p>
</li>
</ol>
<h2 id="常见坑" tabindex="-1">常见坑 <a class="header-anchor" href="#常见坑" aria-label="Permalink to &quot;常见坑&quot;"></a></h2>
<h3 id="redirect-url-错误" tabindex="-1">redirect_url 错误 <a class="header-anchor" href="#redirect-url-错误" aria-label="Permalink to &quot;redirect_url 错误&quot;"></a></h3>
<p>去公众号设置-&gt;功能设置中修改文件路径即可
添加网页授权路径即可.</p>
<ol>
<li>必须精确到调用支付的文件夹</li>
<li>不允许有 <code>_</code> 为字符的文件名</li>
<li><strong>支付路径必须和公众号中设置的完全一样,特别是 <code>//</code> <code>/</code> 的问题</strong></li>
</ol>
<h3 id="不使用微信库如何获取-openid" tabindex="-1">不使用微信库如何获取 openId <a class="header-anchor" href="#不使用微信库如何获取-openid" aria-label="Permalink to &quot;不使用微信库如何获取 openId&quot;"></a></h3>
<p>参看 <a href="https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html" target="_blank" rel="noreferrer">微信授权</a></p>
<p><a href="MP_verify_aD3mRHUdJlbXazQP.txt">论坛讨论</a></p>
<h3 id="支付中路径设置问题" tabindex="-1">支付中路径设置问题 <a class="header-anchor" href="#支付中路径设置问题" aria-label="Permalink to &quot;支付中路径设置问题&quot;"></a></h3>
<p><img src="https://blog.zenheart.site/assets/wechatPay.CR6WPDzr.jpg" alt="" loading="lazy"></p>
<p><a href="http://www.mengyunzhi.com/share/develop-en/183-wepay-the-url-not-regestirer.html" target="_blank" rel="noreferrer">支付路径的坑</a></p>
<h3 id="微信公众号被查封处理步骤" tabindex="-1">微信公众号被查封处理步骤 <a class="header-anchor" href="#微信公众号被查封处理步骤" aria-label="Permalink to &quot;微信公众号被查封处理步骤&quot;"></a></h3>
<p><a href="http://kf.qq.com/faq/170118UnqeUZ170118mUb6fu.html?pass_ticket=EiDyGZ30yCvUm%2Ffl6uysrqp2lByF%2FLonvOC6%2B0tZ9abuf7dQdEbXdZ96xWk2qxSB" target="_blank" rel="noreferrer">微信查封说明</a></p>
<h3 id="微信支付成功的正确判断" tabindex="-1">微信支付成功的正确判断 <a class="header-anchor" href="#微信支付成功的正确判断" aria-label="Permalink to &quot;微信支付成功的正确判断&quot;"></a></h3>
<p><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1" target="_blank" rel="noreferrer">正确逻辑</a></p>
<h1 id="获取用户-openid" tabindex="-1">获取用户 openId <a class="header-anchor" href="#获取用户-openid" aria-label="Permalink to &quot;获取用户 openId&quot;"></a></h1>
<p><a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_4" target="_blank" rel="noreferrer">用户 openId</a></p>
<p>由于在微信体系中，用户 openId 对于不同公众号具有唯一性。
建议在用户注册阶段直接存入，数据库。方便后续调用。重点。</p>
<h1 id="api-详解" tabindex="-1">api 详解 <a class="header-anchor" href="#api-详解" aria-label="Permalink to &quot;api 详解&quot;"></a></h1>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">接口</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">刷卡支付</td>
<td>需要用户提供授权码</td>
</tr>
<tr>
<td style="text-align:left">查询订单</td>
<td>用来获取支付订单状态</td>
</tr>
<tr>
<td style="text-align:left">撤销订单</td>
<td>撤销订单，再支付成功以内的 7 天均有效，注意在支付 15 s 后才执行次操作</td>
</tr>
<tr>
<td style="text-align:left">退款接口</td>
<td>支持对金额的返回，一年之内有效，</td>
</tr>
<tr>
<td style="text-align:left">退款状态查询</td>
<td>零钱支付 20 分钟内返还，银行卡最长为 3 天时间</td>
</tr>
</tbody>
</table>
<p>采用微信平台进行微信测试</p>
<p><a href="http://www.jianshu.com/p/2cb959529c96#comments" target="_blank" rel="noreferrer">用户充值原理</a></p>
<h2 id="企业付款" tabindex="-1">企业付款 <a class="header-anchor" href="#企业付款" aria-label="Permalink to &quot;企业付款&quot;"></a></h2>
<p><a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2" target="_blank" rel="noreferrer">微信企业支付</a></p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
            <enclosure url="https://blog.zenheart.site/assets/wechatPay.CR6WPDzr.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[wechat_basis]]></title>
            <link>https://blog.zenheart.site/projects/wechat/wechat_basis</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/wechat/wechat_basis</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[
wechat_basis
===
**前言:讲解微信接入的基本流程和常见坑**

]]></description>
            <content:encoded><![CDATA[<h1 id="wechat-basis" tabindex="-1">wechat_basis <a class="header-anchor" href="#wechat-basis" aria-label="Permalink to &quot;wechat_basis&quot;"></a></h1>
<p><strong>前言:讲解微信接入的基本流程和常见坑</strong></p>
<hr>
<h1 id="坑" tabindex="-1">坑 <a class="header-anchor" href="#坑" aria-label="Permalink to &quot;坑&quot;"></a></h1>
<h2 id="redirect-url-错误" tabindex="-1">redirect_url 错误 <a class="header-anchor" href="#redirect-url-错误" aria-label="Permalink to &quot;redirect_url 错误&quot;"></a></h2>
<p>进入公众号授权接口.
改写网页授权接口即可.</p>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
        <item>
            <title><![CDATA[wechat_config]]></title>
            <link>https://blog.zenheart.site/projects/wechat/wechat_config</link>
            <guid isPermaLink="false">https://blog.zenheart.site/projects/wechat/wechat_config</guid>
            <pubDate>Sat, 01 Feb 2020 12:42:51 GMT</pubDate>
            <description><![CDATA[
wechat_config
===
**前言:讲解微信配置项**

]]></description>
            <content:encoded><![CDATA[<h1 id="wechat-config" tabindex="-1">wechat_config <a class="header-anchor" href="#wechat-config" aria-label="Permalink to &quot;wechat_config&quot;"></a></h1>
<p><strong>前言:讲解微信配置项</strong></p>
<hr>
<h1 id="常见配置" tabindex="-1">常见配置 <a class="header-anchor" href="#常见配置" aria-label="Permalink to &quot;常见配置&quot;"></a></h1>
<h2 id="域名调用" tabindex="-1">域名调用 <a class="header-anchor" href="#域名调用" aria-label="Permalink to &quot;域名调用&quot;"></a></h2>
<ol>
<li>公众号设置-&gt; 功能设置</li>
<li>设置域名将文件保存到项目根路径即可</li>
</ol>
<h2 id="更改微信管理员" tabindex="-1">更改微信管理员 <a class="header-anchor" href="#更改微信管理员" aria-label="Permalink to &quot;更改微信管理员&quot;"></a></h2>
<ol>
<li>进入 <code>设置-&gt; 安全中心 -&gt; 管理员微信号</code></li>
</ol>
<p>让原始管理员扫描二维码后,新管理重新扫描二维码即可.</p>
<p>原始管理员的确定,是在微信公众平台填写注册信息时.
确定的.</p>
<ol start="2">
<li>
<p>后台更改 微信 appid 配置和数据库</p>
</li>
<li>
<p>微信基本配置修改服务器地址</p>
</li>
</ol>
<ul>
<li>url 填写这是微信向公众号推送消息的地址</li>
<li>token 微信和公众号初始握手标志</li>
<li>EncodingAESKey 随机生成即可</li>
</ul>
<ol start="4">
<li>若在获取 access_token 是出现失败逻辑
先根据 <a href="https://mp.weixin.qq.com/wiki?id=mp1421140183&amp;highline=40164" target="_blank" rel="noreferrer">access_token</a> 获取失败原因</li>
</ol>
<h2 id="_40164" tabindex="-1">40164 <a class="header-anchor" href="#_40164" aria-label="Permalink to &quot;40164&quot;"></a></h2>
<p>ip 没有权限调用该接口设置如下</p>
<ol>
<li>点击基本配置</li>
<li>ip 白名单 添加接口 ip 即可</li>
</ol>
<h2 id="修改公众号名称" tabindex="-1">修改公众号名称 <a class="header-anchor" href="#修改公众号名称" aria-label="Permalink to &quot;修改公众号名称&quot;"></a></h2>
<ol>
<li>登录微信公众号-&gt;公众号设置</li>
<li>微信号-&gt;设置微信号修改即可</li>
</ol>
<blockquote>
<p>微信公众号名字一年只能修改一次,这你改的是微信号
不是微信公众号的名称</p>
</blockquote>
<h2 id="微信公众号昵称修改" tabindex="-1">微信公众号昵称修改 <a class="header-anchor" href="#微信公众号昵称修改" aria-label="Permalink to &quot;微信公众号昵称修改&quot;"></a></h2>
<p>只有年审的时候才可以重新修改.
在认证过程中会在问一次.</p>
<p>详情参见 <a href="https://kf.qq.com/faq/120911VrYVrA160722nURN7r.html" target="_blank" rel="noreferrer">公众号修改流程</a></p>
<h2 id="重置微信公众号" tabindex="-1">重置微信公众号 <a class="header-anchor" href="#重置微信公众号" aria-label="Permalink to &quot;重置微信公众号&quot;"></a></h2>
<ul>
<li>菜单,自定义菜单关闭即可</li>
<li>接口推送 基本设置关闭即可</li>
</ul>
]]></content:encoded>
            <author>zenheart1991@gmail.com (zenheart)</author>
        </item>
    </channel>
</rss>