mycpen-blog 0.0.0-wlujbyedjj → 0.0.0-wluyemumvo
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/atom.xml +166 -158
- package/baidu_urls.txt +7 -7
- package/baidusitemap.xml +44 -20
- package/css/index.css +1 -1
- package/img/siteshot-3.jpg +0 -0
- package/img/siteshot.jpg +0 -0
- package/js/custom.js +1 -1
- package/js/fcircle.js +1 -1
- package/js/fcircle_manage_panel.js +3 -3
- package/js/home_page_swiper.js +1 -1
- package/js/people.js +1 -1
- package/js/random.js +1 -1
- package/js/random_friends_post.js +1 -1
- package/js/tianli_gpt.js +1 -1
- package/json/friend.json +1 -1
- package/json/link.json +1 -1
- package/manifest.json +1 -1
- package/music1/main.css +1 -1
- package/music1/manifest.json +2 -2
- package/package.json +1 -1
- package/search.xml +173 -3
- package/sitemap.xml +183 -108
- package/wechatOA/main.css +1 -1
package/search.xml
CHANGED
|
@@ -3,6 +3,176 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
<entry>
|
|
7
|
+
<title>13_Hexo-操作记录</title>
|
|
8
|
+
<link href="/posts/db7b8b04.html"/>
|
|
9
|
+
<url>/posts/db7b8b04.html</url>
|
|
10
|
+
|
|
11
|
+
<content type="html"><![CDATA[<h2 id="01-Giscus-评论系统">01. Giscus 评论系统<a class="header-anchor" href="#01-Giscus-评论系统"></a></h2><p>博客弃用 Twikoo,改用 Giscus 进行评论</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://butterfly.js.org/posts/4aa8abbe/#%E8%A9%95%E8%AB%96">butterfly</a></p></li><li class="lvl-3"><p><a href="https://github.com/NX-Official/NX-Official.github.io/discussions">Nick Xu</a></p></li></ol><p>网址:<a href="https://giscus.app/zh-CN">https://giscus.app/zh-CN</a></p><p><s>Discussion 分类选择 <code>General</code></s></p><p>Discussion 分类选择 <code>Announcements</code>,填写信息后获取 <code>repo_id</code>、<code>category_id</code></p><p>需注意 Giscus 不支持最新评论,详见 <a href="https://butterfly.js.org/posts/4aa8abbe/#Aside">butterfly</a></p><p>引入的 cdn 资源为 <a href="https://giscus.app/client.js">https://giscus.app/client.js</a> ,暂未找到第三方 npm cdn。可自建 Giscus,参考 <a href="https://github.com/xaoxuu/giscus/discussions/3#discussioncomment-7990318">xaoxuu</a></p><p>示例</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Giscus</span></span><br><span class="line"><span class="comment"># https://giscus.app/</span></span><br><span class="line"><span class="attr">giscus:</span></span><br><span class="line"> <span class="attr">repo:</span> <span class="string">xx/xx</span></span><br><span class="line"> <span class="attr">repo_id:</span> <span class="string">xx</span></span><br><span class="line"> <span class="attr">category_id:</span> <span class="string">xx</span></span><br><span class="line"> <span class="attr">theme:</span></span><br><span class="line"> <span class="attr">light:</span> <span class="string">light</span></span><br><span class="line"> <span class="attr">dark:</span> <span class="string">dark</span></span><br><span class="line"> <span class="attr">option:</span></span><br><span class="line"> <span class="attr">data-category:</span> <span class="string">Announcements</span></span><br><span class="line"> <span class="attr">data-input-position:</span> <span class="string">top</span></span><br><span class="line"> <span class="attr">data-lang:</span> <span class="string">zh-CN</span></span><br><span class="line"> <span class="attr">data-loading:</span> <span class="string">lazy</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>其它参考</p><ol><li class="lvl-3"><p>自建 Giscus,未使用 <a href="https://github.com/xaoxuu/giscus/discussions/3#discussioncomment-7990318">xaoxuu</a></p></li><li class="lvl-3"><p><a href="https://github.com/eallion/eallion.com/discussions">https://github.com/eallion/eallion.com/discussions</a></p></li><li class="lvl-3"><p><a href="https://github.com/xaoxuu/blog-comments/discussions">https://github.com/xaoxuu/blog-comments/discussions</a></p></li></ol>]]></content>
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
<categories>
|
|
15
|
+
|
|
16
|
+
<category> Hexo </category>
|
|
17
|
+
|
|
18
|
+
</categories>
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
<tags>
|
|
22
|
+
|
|
23
|
+
<tag> Hexo </tag>
|
|
24
|
+
|
|
25
|
+
</tags>
|
|
26
|
+
|
|
27
|
+
</entry>
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
<entry>
|
|
32
|
+
<title>12_Hexo-GitHub Actions 发布博客静态资源至 NPM</title>
|
|
33
|
+
<link href="/posts/8d01af11.html"/>
|
|
34
|
+
<url>/posts/8d01af11.html</url>
|
|
35
|
+
|
|
36
|
+
<content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>将博客静态文件上传至 github,通过 github action 自动发包至 npm,使用 <a href="https://npmmirror.com/">npmmirror</a> cdn</p><h2 id="npm-命令">npm 命令<a class="header-anchor" href="#npm-命令"></a></h2><p>网址: <a href="https://www.npmjs.com/">https://www.npmjs.com/</a></p><p><strong>切换源</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># https://blog.anheyu.com/posts/sdxhu.html#npm-镜像</span></span><br><span class="line"></span><br><span class="line">npm config <span class="built_in">set</span> registry http://registry.npmmirror.com</span><br><span class="line"><span class="comment"># 切回源</span></span><br><span class="line">npm config <span class="built_in">set</span> registry https://registry.npmjs.org/</span><br></pre></td></tr></table></figure><p><strong>添加本地 npm 用户</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 仅第一次使用需要添加用户,之后会提示你输入你的npm账号密码以及注册邮箱</span></span><br><span class="line">npm adduser</span><br><span class="line"><span class="comment"># 非第一次使用直接登录即可,之后会提示你输入你的npm账号密码以及注册邮箱</span></span><br><span class="line">npm login</span><br></pre></td></tr></table></figure><p><strong>初始化</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm init</span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2024/image/202403242339716.jpg" alt="image-20240324233905199" style="zoom: 50%;" /><p><strong>发布</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm publish</span><br></pre></td></tr></table></figure><p><strong>生成 npm token</strong></p><p>npm 官网 => 头像 => Access Tokens => Generate New Token => 勾选 Automation</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2024/image/202403242343688.jpg" alt="image-20240324234307284" style="zoom: 33%;" /><p>github 仓库新增 <code>NPM_TOKEN</code> 的 secrets</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2024/image/202403250021463.jpg" alt="image-20240325002106180" style="zoom: 25%;" /><h2 id="示例">示例<a class="header-anchor" href="#示例"></a></h2><h3 id="package-json">package.json<a class="header-anchor" href="#package-json"></a></h3><p><code>scripts/generate_package_json.js</code>,生成 public/package.json</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 生成 public/.package.json</span></span><br><span class="line"><span class="comment">// https://blog.anheyu.com/posts/72ea.html</span></span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">generator</span>.<span class="title function_">register</span>(<span class="string">'npmpackagejson'</span>, <span class="keyword">function</span>(<span class="params">locals</span>){</span><br><span class="line"><span class="comment">// Object</span></span><br><span class="line"><span class="keyword">return</span> {</span><br><span class="line"><span class="attr">path</span>: <span class="string">'/package.json'</span>,</span><br><span class="line"><span class="attr">data</span>: <span class="string">`{</span></span><br><span class="line"><span class="string"> "name": "mycpen-blog",</span></span><br><span class="line"><span class="string"> "version": "0.0.0",</span></span><br><span class="line"><span class="string"> "description": "mycpen blog static file",</span></span><br><span class="line"><span class="string"> "main": "index.js",</span></span><br><span class="line"><span class="string"> "directories": {</span></span><br><span class="line"><span class="string"> "lib": "lib"</span></span><br><span class="line"><span class="string"> },</span></span><br><span class="line"><span class="string"> "scripts": {</span></span><br><span class="line"><span class="string"> "test": "echo \\"Error: no test specified\\" && exit 1"</span></span><br><span class="line"><span class="string"> },</span></span><br><span class="line"><span class="string"> "repository": {</span></span><br><span class="line"><span class="string"> "type": "git",</span></span><br><span class="line"><span class="string"> "url": "git+https://github.com/mycpen/blog.git"</span></span><br><span class="line"><span class="string"> },</span></span><br><span class="line"><span class="string"> "author": "mycpen",</span></span><br><span class="line"><span class="string"> "license": "ISC",</span></span><br><span class="line"><span class="string"> "bugs": {</span></span><br><span class="line"><span class="string"> "url": "https://github.com/mycpen/blog/issues"</span></span><br><span class="line"><span class="string"> },</span></span><br><span class="line"><span class="string"> "homepage": "https://github.com/mycpen/blog#readme"</span></span><br><span class="line"><span class="string">}</span></span><br><span class="line"><span class="string">`</span>};</span><br><span class="line">});</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="npm-push">npm push<a class="header-anchor" href="#npm-push"></a></h3><p><code>scripts/npmpublish.js</code>,生成 public/.github/workflows/autopublish.yml</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 生成 public/.github/workflows/autopublish.yml</span></span><br><span class="line"><span class="comment">// 推送静态资源至 npm</span></span><br><span class="line"><span class="comment">// https://akilar.top/posts/e82444a6/#具体操作步骤</span></span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">generator</span>.<span class="title function_">register</span>(<span class="string">'npmpush'</span>, <span class="keyword">function</span>(<span class="params">locals</span>){</span><br><span class="line"> <span class="comment">// Object</span></span><br><span class="line"> <span class="keyword">return</span> {</span><br><span class="line"> <span class="attr">path</span>: <span class="string">'/.github/workflows/autopublish.yml'</span>,</span><br><span class="line"> <span class="attr">data</span>: <span class="string">`name: Node.js Package</span></span><br><span class="line"><span class="string"># 监测分支,2020年10月后github新建仓库默认分支改为main,记得更改</span></span><br><span class="line"><span class="string">on:</span></span><br><span class="line"><span class="string"> push:</span></span><br><span class="line"><span class="string"> branches:</span></span><br><span class="line"><span class="string"> - main</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">jobs:</span></span><br><span class="line"><span class="string"> publish-npm:</span></span><br><span class="line"><span class="string"> runs-on: ubuntu-latest</span></span><br><span class="line"><span class="string"> steps:</span></span><br><span class="line"><span class="string"> - uses: actions/checkout@v2</span></span><br><span class="line"><span class="string"> - uses: actions/setup-node@v1</span></span><br><span class="line"><span class="string"> with:</span></span><br><span class="line"><span class="string"> node-version: "18.x"</span></span><br><span class="line"><span class="string"> registry-url: https://registry.npmjs.org/</span></span><br><span class="line"><span class="string"> - run: npm publish</span></span><br><span class="line"><span class="string"> env:</span></span><br><span class="line"><span class="string"> NODE_AUTH_TOKEN: `</span>+ <span class="string">'${{secrets.npm_token}}'</span> + <span class="string">`</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> - name: Wait for 3 minutes</span></span><br><span class="line"><span class="string"> run: sleep 180 # 等待 3 分钟,单位为秒</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> - name: Sync package from npm to npmmirror</span></span><br><span class="line"><span class="string"> run: |</span></span><br><span class="line"><span class="string"> npm install -g cnpm --registry=https://registry.npmmirror.com</span></span><br><span class="line"><span class="string"> cnpm sync mycpen-blog</span></span><br><span class="line"><span class="string">`</span></span><br><span class="line">};</span><br><span class="line">});</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="npmignore">.npmignore<a class="header-anchor" href="#npmignore"></a></h3><p><code>scripts/npmignore.js</code>,生成 public/.npmignore。目的 不提交 .html 这类文件至 npm</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 生成 public/.npmignore</span></span><br><span class="line"><span class="comment">// https://akilar.top/posts/e82444a6/</span></span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">generator</span>.<span class="title function_">register</span>(<span class="string">'npmignore'</span>, <span class="keyword">function</span>(<span class="params">locals</span>){</span><br><span class="line"><span class="comment">// Object</span></span><br><span class="line"><span class="keyword">return</span> {</span><br><span class="line"><span class="attr">path</span>: <span class="string">'/.npmignore'</span>,</span><br><span class="line"><span class="attr">data</span>: <span class="string">`**/*.html</span></span><br><span class="line"><span class="string">.github/</span></span><br><span class="line"><span class="string">download/</span></span><br><span class="line"><span class="string">ads.txt</span></span><br><span class="line"><span class="string">CNAME</span></span><br><span class="line"><span class="string">robots.txt</span></span><br><span class="line"><span class="string">`</span>};</span><br><span class="line">});</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="change-version">change version<a class="header-anchor" href="#change-version"></a></h3><p><code>.github/replace-localfile-url.py</code>,修改 public/package.json version</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result, search_fileType_list</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">'/'</span>, search_result, search_fileType_list)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> search_fileType_list:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">f'.*\\<span class="subst">{i}</span>$'</span>, each_file) == [each_file]:</span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i 's/old_str/new_str/'</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"r"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"w"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"><span class="comment"># ==================================================================</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># npm time version | npm_converted_time</span></span><br><span class="line"><span class="comment"># ------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># 将数字和字母对应关系定义为字典</span></span><br><span class="line">npm_num_mapping = {</span><br><span class="line"> <span class="string">'0'</span>: [<span class="string">'a'</span>, <span class="string">'b'</span>, <span class="string">'u'</span>], <span class="string">'1'</span>: [<span class="string">'c'</span>, <span class="string">'d'</span>, <span class="string">'v'</span>], <span class="string">'2'</span>: [<span class="string">'e'</span>, <span class="string">'f'</span>, <span class="string">'w'</span>], <span class="string">'3'</span>: [<span class="string">'g'</span>, <span class="string">'h'</span>, <span class="string">'x'</span>],</span><br><span class="line"> <span class="string">'4'</span>: [<span class="string">'i'</span>, <span class="string">'j'</span>, <span class="string">'y'</span>], <span class="string">'5'</span>: [<span class="string">'k'</span>, <span class="string">'l'</span>, <span class="string">'z'</span>], <span class="string">'6'</span>: [<span class="string">'m'</span>, <span class="string">'n'</span>], <span class="string">'7'</span>: [<span class="string">'o'</span>, <span class="string">'p'</span>],</span><br><span class="line"> <span class="string">'8'</span>: [<span class="string">'q'</span>, <span class="string">'r'</span>], <span class="string">'9'</span>: [<span class="string">'s'</span>, <span class="string">'t'</span>]</span><br><span class="line">}</span><br><span class="line"><span class="comment"># 当前时间</span></span><br><span class="line">npm_now = datetime.now()</span><br><span class="line"><span class="comment"># 格式化当前时间为指定格式 2403230741</span></span><br><span class="line">npm_formatted_time = npm_now.strftime(<span class="string">"%y%m%d%H%M"</span>)</span><br><span class="line"><span class="comment"># 数字替换为随机映射字母 ejugfhupjv</span></span><br><span class="line">npm_converted_time = <span class="string">''</span></span><br><span class="line"><span class="keyword">for</span> char <span class="keyword">in</span> npm_formatted_time:</span><br><span class="line"> <span class="keyword">if</span> char.isdigit():</span><br><span class="line"> npm_converted_time += <span class="string">''</span>.join(random.choice(npm_num_mapping[char]) <span class="keyword">if</span> char <span class="keyword">in</span> npm_num_mapping <span class="keyword">else</span> char)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> npm_converted_time += char</span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 package.json 0.0.0</span></span><br><span class="line">result_npmPackageJson = [<span class="string">'./public/package.json'</span>]</span><br><span class="line">old_npmPackageJson_version = <span class="string">'0.0.0'</span></span><br><span class="line">new_npmPackageJson_version = <span class="string">f'0.0.0-<span class="subst">{npm_converted_time}</span>'</span></span><br><span class="line">count = <span class="number">0</span></span><br><span class="line"><span class="comment"># json</span></span><br><span class="line"><span class="keyword">for</span> file_name <span class="keyword">in</span> result_npmPackageJson:</span><br><span class="line"> replace(file_name, old_npmPackageJson_version, new_npmPackageJson_version)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"{} done {}"</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><code>.github/workflows/autodeploy.yml</code>,执行上方 py 脚本 <code>- name: Replace localFile URL</code></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Auto</span> <span class="string">deploy</span></span><br><span class="line"><span class="comment"># 当有改动推送到master分支时,启动Action</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line"> <span class="attr">workflow_dispatch:</span></span><br><span class="line"> <span class="attr">push:</span></span><br><span class="line"> <span class="attr">branches:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line"> <span class="attr">deploy:</span></span><br><span class="line"> <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line"> <span class="attr">steps:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">检查分支</span></span><br><span class="line"> <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line"> <span class="attr">with:</span></span><br><span class="line"> <span class="attr">ref:</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">szenius/set-timezone@v1.0</span> <span class="comment"># 设置执行环境的时区</span></span><br><span class="line"> <span class="attr">with:</span></span><br><span class="line"> <span class="attr">timezoneLinux:</span> <span class="string">"Asia/Shanghai"</span></span><br><span class="line"></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Node</span></span><br><span class="line"> <span class="attr">uses:</span> <span class="string">actions/setup-node@v1</span></span><br><span class="line"> <span class="attr">with:</span></span><br><span class="line"> <span class="attr">node-version:</span> <span class="string">"18.x"</span></span><br><span class="line"></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Hexo</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> export TZ='Asia/Shanghai'</span></span><br><span class="line"><span class="string"> npm install hexo-cli -g</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">缓存</span> <span class="string">Hexo</span></span><br><span class="line"> <span class="attr">uses:</span> <span class="string">actions/cache@v4</span></span><br><span class="line"> <span class="attr">id:</span> <span class="string">cache</span></span><br><span class="line"> <span class="attr">with:</span></span><br><span class="line"> <span class="attr">path:</span> <span class="string">node_modules</span></span><br><span class="line"> <span class="attr">key:</span> <span class="string">${{runner.OS}}-${{hashFiles('**/package-lock.json')}}</span></span><br><span class="line"></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装依赖</span></span><br><span class="line"> <span class="attr">if:</span> <span class="string">steps.cache.outputs.cache-hit</span> <span class="type">!=</span> <span class="string">'true'</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> npm install gulp-cli -g #全局安装gulp</span></span><br><span class="line"><span class="string"> npm install --save</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Generate</span> <span class="string">static</span> <span class="string">file</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> hexo clean ; hexo generate ; gulp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Set</span> <span class="string">up</span> <span class="string">Python</span> <span class="number">3.10</span></span><br><span class="line"> <span class="attr">uses:</span> <span class="string">actions/setup-python@v3</span></span><br><span class="line"> <span class="attr">with:</span></span><br><span class="line"> <span class="attr">python-version:</span> <span class="string">"3.10"</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">dependencies</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> python -m pip install --upgrade pip</span></span><br><span class="line"><span class="string"> pip install requests</span></span><br><span class="line"><span class="string"></span> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Replace</span> <span class="string">imageBed</span> <span class="string">URL</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> python .github/replace-imgbed-url-v2.py</span></span><br><span class="line"><span class="string"></span> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Replace</span> <span class="string">localFile</span> <span class="string">URL</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> python .github/replace-localfile-url.py</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Delete</span> <span class="string">static</span> <span class="string">file</span> <span class="string">repository</span> <span class="string">tags</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> mkdir tmp_mycpen</span></span><br><span class="line"><span class="string"> cd tmp_mycpen</span></span><br><span class="line"><span class="string"> git clone https://github.com/mycpen/blog.git</span></span><br><span class="line"><span class="string"> cd blog</span></span><br><span class="line"><span class="string"> git push --force --quiet "https://mycpen:${{ secrets.GH_TOKEN }}@github.com/mycpen/blog.git" --delete $(git tag -l)</span></span><br><span class="line"><span class="string"> cd ../..</span></span><br><span class="line"><span class="string"> rm -rf tmp_mycpen</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">static</span> <span class="string">file</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> cd ./public</span></span><br><span class="line"><span class="string"> git init</span></span><br><span class="line"><span class="string"> git config --global user.email 'github-actions[bot]@users.noreply.github.com'</span></span><br><span class="line"><span class="string"> git config --global user.name 'github-actions[bot]'</span></span><br><span class="line"><span class="string"> git add .</span></span><br><span class="line"><span class="string"> git commit -m "$(date +'%Y/%m/%d')"</span></span><br><span class="line"><span class="string"> tag_name=$(date +'%y.%m.%d')</span></span><br><span class="line"><span class="string"> git tag $tag_name</span></span><br><span class="line"><span class="string"> git push --force --quiet "https://mycpen:${{ secrets.GH_TOKEN }}@github.com/mycpen/blog.git" $tag_name</span></span><br><span class="line"><span class="string"> git push --force --quiet "https://mycpen:${{ secrets.GH_TOKEN }}@github.com/mycpen/blog.git" master:main</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Purge</span> <span class="string">JSD</span> <span class="string">cache</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> jsd_purge_urls=("https://purge.jsdelivr.net/gh/mycpen/blog/" "https://purge.jsdelivr.net/gh/mycpen/blog@latest/" "https://purge.jsdelivr.net/gh/mycpen/blog@main/")</span></span><br><span class="line"><span class="string"> for url in "${jsd_purge_urls[@]}"; do curl -s $url; done</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">推送百度</span> <span class="string">url</span></span><br><span class="line"> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> hexo deploy</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Delete</span> <span class="string">workflow</span> <span class="string">runs</span></span><br><span class="line"> <span class="attr">uses:</span> <span class="string">Mattraks/delete-workflow-runs@v2</span></span><br><span class="line"> <span class="attr">with:</span></span><br><span class="line"> <span class="attr">token:</span> <span class="string">${{</span> <span class="string">secrets.GH_TOKEN</span> <span class="string">}}</span></span><br><span class="line"> <span class="attr">repository:</span> <span class="string">${{</span> <span class="string">github.repository</span> <span class="string">}}</span></span><br><span class="line"> <span class="attr">retain_days:</span> <span class="number">30</span></span><br><span class="line"> <span class="attr">keep_minimum_runs:</span> <span class="number">6</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="参考">参考<a class="header-anchor" href="#参考"></a></h2><ol><li class="lvl-3"><p><a href="https://akilar.top/posts/e82444a6/">akilar | github-action推送博客部署仓库至NPM</a></p></li><li class="lvl-3"><p><a href="https://akilar.top/posts/3e956346/">akilar | npm图床</a></p></li><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/b228.html">安知鱼 | hexo博客工作流CI</a></p></li><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/72ea.html">安知鱼 | npm图床</a></p></li><li class="lvl-3"><p><a href="https://www.cnblogs.com/index-html/p/npm-upload.html#%E6%97%A0%E7%8A%B6%E6%80%81">EtherDream | 文件一键上传到 NPM</a></p></li><li class="lvl-3"><p><a href="https://npmmirror.com/">npmmirror | 同步模块 cnpm sync cnpmcore</a></p></li><li class="lvl-3"><p><a href="https://github.com/ChenYFan/CyanBlog/blob/main/prescripts/pkgpublish.js">github | CyanBlog/pkgpublish.js</a></p></li></ol>]]></content>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<categories>
|
|
40
|
+
|
|
41
|
+
<category> Hexo </category>
|
|
42
|
+
|
|
43
|
+
</categories>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<tags>
|
|
47
|
+
|
|
48
|
+
<tag> Hexo </tag>
|
|
49
|
+
|
|
50
|
+
<tag> GitHub </tag>
|
|
51
|
+
|
|
52
|
+
<tag> NPM </tag>
|
|
53
|
+
|
|
54
|
+
</tags>
|
|
55
|
+
|
|
56
|
+
</entry>
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
<entry>
|
|
61
|
+
<title>06_转载-自我提升的8个好习惯</title>
|
|
62
|
+
<link href="/posts/85a8374a.html"/>
|
|
63
|
+
<url>/posts/85a8374a.html</url>
|
|
64
|
+
|
|
65
|
+
<content type="html"><![CDATA[<p>原文:<a href="https://blog.zhuxu.xyz/archives/343/">https://blog.zhuxu.xyz/archives/343/</a></p><table><thead><tr><th colspan="2">自我提升的8个好习惯</th></tr></thead><tbody><tr><td>学习新技能</td><td>学会和自己比较</td></tr><tr><td>培养一个兴趣爱好</td><td>每天早起半小时</td></tr><tr><td>不过度透支自己</td><td>反省自己</td></tr><tr><td>保持阅读</td><td>保持好的心态</td></tr></tbody></table><h2 id="1-学习新技能">1. 学习新技能<a class="header-anchor" href="#1-学习新技能"></a></h2><p> 很多人其实不敢承认,自己害怕接受新事物、学习新技能。不是因为畏惧艰难,而是不想改变旧有的思考方式。</p><p> 然而这个时代变化飞快,唯有不断提升自己,才能跟上时代的步伐。时间对每个人都是公平的,日日精进不懈怠,才能遇见更好的自己。</p><h2 id="2-学会和自己比较">2. 学会和自己比较<a class="header-anchor" href="#2-学会和自己比较"></a></h2><p> 这个世界上,有多少人就有多少种生活方式、多少种人生目标。不要拿别人的长处,否定自己的短处,也不要羡慕别人拥有的,放大自己没有的,更不要在比较中迷失自我,忽略自己的幸福。</p><p> 人各有各的活法,没什么好比较的,当你想明白这一点,自然就能静下心来。</p><h2 id="3-培养一个兴趣爱好">3. 培养一个兴趣爱好<a class="header-anchor" href="#3-培养一个兴趣爱好"></a></h2><p> 人若有自己的兴趣爱好,生活会呈现出另一番景象。悲伤失落时,投入到兴趣中,情绪就有了排解的出口。烦躁不安时,做点喜欢的事,也会忘记烦恼、渐渐开心起来。</p><p> 一旦有了精神食粮,你会变得越来越欣赏自己,身体自然也会充满无限力量。</p><h2 id="4-每天早起半小时">4. 每天早起半小时<a class="header-anchor" href="#4-每天早起半小时"></a></h2><p> 经常听到有人说,想要自律,但不知道从何做起。那你可以尝试从每天早起30分钟开始。</p><p> 早起,意味着你有比别人更充足的时间,去准备一天的工作和生活。更重要的是,早起会让你拥有人生的掌控感,找到自己生活的节奏。早起看似是一件微不足道的小事,但在日复一日的坚持后,你会发现人生已悄然改变。</p><h2 id="5-不过度透支自己">5. 不过度透支自己<a class="header-anchor" href="#5-不过度透支自己"></a></h2><p> 很多人往往意识不到健康的重要性,总以为自己是金刚不坏之身,于是通宵熬夜、暴饮暴食,肆无忌惮地透支身体。时间久了,生活将不得不按下暂停键,用来弥补这些毫无节制的消耗。</p><p> 按时吃饭、早睡早起、坚持运动,只有对自己的身体好,身体才会给你更好的回馈。只有拥有了健康,你才能去创造更精彩的人生。</p><h2 id="6-反省自己">6. 反省自己<a class="header-anchor" href="#6-反省自己"></a></h2><p> 一个人的优秀,离不开不断的复盘和总结。每天睡觉前,可以花15分钟对这一天的经历做个简单的复盘和总结。</p><p> 哪些地方没有做好,哪些地方还可以做得更好……在这个过程中,及时总结经验、改正错误,才能在人生的道路上行稳致远。</p><h2 id="7-保持阅读">7. 保持阅读<a class="header-anchor" href="#7-保持阅读"></a></h2><p> 阅读对一个人的重要性,不只在于习得新知识,更在于它能帮助我们保持深度思考的能力,继而获得更快的成长。</p><p> 有空时,记得多读书。读书是为自己的心注入更多光亮的过程。我们所读过的每一本书,都将引领我们走向更美好的明天。</p><h2 id="8-保持好的心态">8. 保持好的心态<a class="header-anchor" href="#8-保持好的心态"></a></h2><p> 我们在生活中常常要去面对各种未知、困境和麻烦,心态不好的人会觉得这是一场磨难,而心态好的人则会把它当成一场历练。</p><p> 很多时候,心态决定了人生的状态。我们不能决定生活中会发生什么,但可以决定自己以什么样的心态应对。 保持良好的心态,才能拥有美好的未来。</p><blockquote><p>来源:十点读书 | 作者:小嗲 | 主播:赵文龙</p></blockquote>]]></content>
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
<categories>
|
|
69
|
+
|
|
70
|
+
<category> 转载 </category>
|
|
71
|
+
|
|
72
|
+
</categories>
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
<tags>
|
|
76
|
+
|
|
77
|
+
<tag> 转载 </tag>
|
|
78
|
+
|
|
79
|
+
<tag> 习惯 </tag>
|
|
80
|
+
|
|
81
|
+
</tags>
|
|
82
|
+
|
|
83
|
+
</entry>
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
<entry>
|
|
88
|
+
<title>05_转载-延寿指南-反向面试-文档写作规范</title>
|
|
89
|
+
<link href="/posts/285c50ae.html"/>
|
|
90
|
+
<url>/posts/285c50ae.html</url>
|
|
91
|
+
|
|
92
|
+
<content type="html"><![CDATA[<h2 id="程序员延寿指南">程序员延寿指南<a class="header-anchor" href="#程序员延寿指南"></a></h2><p>原文:<a href="https://github.com/geekan/HowToLiveLonger">https://github.com/geekan/HowToLiveLonger</a><br>issue:<a href="https://github.com/geekan/HowToLiveLonger/issues/143">https://github.com/geekan/HowToLiveLonger/issues/143</a></p><p>最佳操作包括:</p><ol><li class="lvl-3"><p>饮食方面:多吃蔬果和白肉,少吃蛋黄和超加工食物;中量碳水、多吃植物蛋白;多吃辣和坚果;少喝或不喝甜味饮料,喝咖啡、茶和牛奶;戒酒或每周饮酒量不超过100g。</p></li><li class="lvl-3"><p>运动方面:每周进行3次45分钟的挥拍运动。</p></li><li class="lvl-3"><p>日常生活方面:每天刷牙,睡眠时间为7小时,最好在22-24点间睡觉。</p></li><li class="lvl-3"><p>其他方面:保持健康体重,不吸烟,晒太阳,服用二甲双胍、复合维生素、亚精胺和葡萄糖胺等药物。</p></li></ol><p>以上操作可以降低全因死亡率,增加预期寿命,从而稳健地活得更久。但是需要注意,各个变量之间并不符合独立同分布假设,变量之间的实际影响也并不明确,因此需要谨慎实践。</p><h2 id="反向面试">反向面试<a class="header-anchor" href="#反向面试"></a></h2><p>原文:<a href="https://github.com/yifeikong/reverse-interview-zh">https://github.com/yifeikong/reverse-interview-zh</a></p><p>预期使用方式</p><ul class="lvl-0"><li class="lvl-2"><p>检查一下哪些问题你感兴趣</p></li><li class="lvl-2"><p>检查一下哪些是你可以自己在网上找到答案的</p></li><li class="lvl-2"><p>找不到的话就向面试官提问</p></li></ul><p>绝对不要想把这个列表里的每个问题都问一遍。(尊重面试官的时间,而且你可以通过查找已经发布的答案来显示<br>你的主动性)</p><p>请记住事情总是灵活的,组织的结构调整也会经常发生。拥有一个 bug 追踪系统并不会保证高效处理 bug。<br>CI/CD (持续集成系统) 也不一定保证交付时间会很短。</p><p><strong>职责</strong></p><ul class="lvl-0"><li class="lvl-2"><p>On-call (电话值班)的计划或者规定是什么?值班或者遇到问题加班时候有加班费吗?</p></li><li class="lvl-2"><p>我的日常工作是什么?</p></li><li class="lvl-2"><p>有给我设定的特定目标吗?</p></li><li class="lvl-2"><p>团队里面初级和高级工程师的比例是多少?(有计划改变吗)</p></li><li class="lvl-2"><p>入职培训 (onboarding) 会是什么样的?</p></li><li class="lvl-2"><p>每个开发者有多大的自由来做出决定?</p></li><li class="lvl-2"><p>在你看来,这个工作做到什么程度算成功?</p></li><li class="lvl-2"><p>你期望我在最初的一个月 / 三个月能够完成什么?</p></li><li class="lvl-2"><p>试用期结束的时候,你会怎么样衡量我的绩效?</p></li><li class="lvl-2"><p>自己单独的开发活动和按部就班工作的比例大概是怎样的?</p></li><li class="lvl-2"><p>一个典型的一天或者一周的工作是怎样安排的?</p></li><li class="lvl-2"><p>对我的申请你有什么疑虑么?</p></li><li class="lvl-2"><p>在这份工作上,我将会和谁紧密合作?</p></li><li class="lvl-2"><p>我的直接上级他们的上级都是什么样的管理风格?(事无巨细还是着眼宏观)</p></li><li class="lvl-2"><p>我在这个岗位上应该如何发展?会有哪些机会?</p></li><li class="lvl-2"><p>每天预期 / 核心工作时间是多少小时?</p></li><li class="lvl-2"><p>我入职的岗位是新增还是接替之前离职的同事?(是否有技术债需要还)?(zh)</p></li><li class="lvl-2"><p>入职之后在哪个项目组,项目是新成立还是已有的?(zh)</p></li></ul><p><strong>技术</strong></p><ul class="lvl-0"><li class="lvl-2"><p>公司常用的技术栈是什么?</p></li><li class="lvl-2"><p>你们怎么使用源码控制系统?</p></li><li class="lvl-2"><p>你们怎么测试代码?</p></li><li class="lvl-2"><p>你们怎么追踪 bug?</p></li><li class="lvl-2"><p>你们怎样监控项目?</p></li><li class="lvl-2"><p>你们怎么集成和部署代码改动?是使用持续集成和持续部署吗 (CI/CD)?</p></li><li class="lvl-2"><p>你们的基础设施搭建在版本管理系统里吗?或者是代码化的吗?</p></li><li class="lvl-2"><p>从计划到完成一项任务的工作流是什么样的?</p></li><li class="lvl-2"><p>你们如何准备故障恢复?</p></li><li class="lvl-2"><p>有标准的开发环境吗?是强制的吗?</p></li><li class="lvl-2"><p>你们需要花费多长时间来给产品搭建一个本地测试环境?(分钟 / 小时 / 天)</p></li><li class="lvl-2"><p>你们需要花费多长时间来响应代码或者依赖中的安全问题?</p></li><li class="lvl-2"><p>所有的开发者都可以使用他们电脑的本地管理员权限吗?</p></li><li class="lvl-2"><p>介绍一下你们的技术原则或者展望。</p></li><li class="lvl-2"><p>你们的代码有开发文档吗?有没有单独的供消费者阅读的文档?</p></li><li class="lvl-2"><p>你们有更高层次的文档吗?比如说 ER 图,数据库范式</p></li><li class="lvl-2"><p>你们使用静态代码分析吗?</p></li><li class="lvl-2"><p>你们如何管理内部和外部的数字资产?</p></li><li class="lvl-2"><p>你们如何管理依赖?</p></li><li class="lvl-2"><p>公司是否有技术分享交流活动?有的话,多久一次呢?(zh)</p></li><li class="lvl-2"><p>你们的数据库是怎么进行版本控制的?(zh)</p></li><li class="lvl-2"><p>业务需求有没有文档记录?是如何记录的?(zh)</p></li></ul><p><strong>团队</strong></p><ul class="lvl-0"><li class="lvl-2"><p>工作是怎么组织的?</p></li><li class="lvl-2"><p>团队内 / 团队间的交流通常是怎样的?</p></li><li class="lvl-2"><p>你们使用什么工具来做项目组织?你的实际体会是什么?</p></li><li class="lvl-2"><p>如果遇到不同的意见怎样处理?</p></li><li class="lvl-2"><p>谁来设定优先级 / 计划?</p></li><li class="lvl-2"><p>如果团队没能赶上预期发布日期怎么办?</p></li><li class="lvl-2"><p>每周都会开什么类型的会议?</p></li><li class="lvl-2"><p>会有定期的和上级的一对一谈话吗?</p></li><li class="lvl-2"><p>产品 / 服务的规划是什么样的?(n 周一发布 / 持续部署 / 多个发布流 / …)</p></li><li class="lvl-2"><p>生产环境发生事故了怎么办?是否有不批评人而分析问题的文化?</p></li><li class="lvl-2"><p>有没有一些团队正在经历还尚待解决的挑战?</p></li><li class="lvl-2"><p>你们如何跟踪进度?</p></li><li class="lvl-2"><p>预期和目标是如何设定的?谁来设定?</p></li><li class="lvl-2"><p>Code Review 如何实施?</p></li><li class="lvl-2"><p>给我介绍下团队里一个典型的 sprint</p></li><li class="lvl-2"><p>你们如何平衡技术和商业目标?</p></li><li class="lvl-2"><p>你们如何共享知识?</p></li><li class="lvl-2"><p>团队有多大?</p></li><li class="lvl-2"><p>公司技术团队的架构和人员组成?(zh)</p></li><li class="lvl-2"><p>团队内开发、产品、运营哪一方是需求的主要提出方?哪一方更强势?(zh)</p></li></ul><p><strong>问未来的同事</strong></p><ul class="lvl-0"><li class="lvl-2"><p>开发者倾向于从哪里学习?</p></li><li class="lvl-2"><p>你对在这里工作最满意的地方是?</p></li><li class="lvl-2"><p>最不满意的呢?</p></li><li class="lvl-2"><p>如果可以的话,你想改变哪里?</p></li><li class="lvl-2"><p>团队最老的成员在这里多久了?</p></li><li class="lvl-2"><p>在小团队中,有没有出现成员性格互相冲突的情况?最后是如何解决的?</p></li></ul><p><strong>公司</strong></p><ul class="lvl-0"><li class="lvl-2"><p>公司为什么在招人?(产品发展 / 新产品 / 波动…)</p></li><li class="lvl-2"><p>有没有会议 / 旅行预算?使用的规定是什么?</p></li><li class="lvl-2"><p>晋升流程是怎样的?要求 / 预期是怎样沟通的?</p></li><li class="lvl-2"><p>绩效评估流程是怎样的?</p></li><li class="lvl-2"><p>技术和管理两条职业路径是分开的吗?</p></li><li class="lvl-2"><p>对于多元化招聘的现状或者观点是什么?</p></li><li class="lvl-2"><p>有公司级别的学习资源吗?比如电子书订阅或者在线课程?</p></li><li class="lvl-2"><p>有获取证书的预算吗?</p></li><li class="lvl-2"><p>公司的成熟度如何?(早期寻找方向 / 有内容的工作 / 维护中 / …)</p></li><li class="lvl-2"><p>我可以为开源项目做贡献吗?是否需要审批?</p></li><li class="lvl-2"><p>你认为公司未来五年或者十年会发展成什么样子?</p></li><li class="lvl-2"><p>公司的大多数员工是如何看待整洁代码的?</p></li><li class="lvl-2"><p>你上次注意到有人成长是什么时候?他们在哪方面成长了?</p></li><li class="lvl-2"><p>在这里成功的定义是什么?如何衡量成功?</p></li><li class="lvl-2"><p>有体育活动或者团建么?</p></li><li class="lvl-2"><p>有内部的黑客马拉松活动吗?</p></li><li class="lvl-2"><p>公司支持开源项目吗?</p></li><li class="lvl-2"><p>有竞业限制或者保密协议需要签吗?</p></li><li class="lvl-2"><p>你们认为公司文化中的空白是什么?</p></li><li class="lvl-2"><p>能够跟我说一公司处于不良情况,以及如何处理的故事吗?</p></li><li class="lvl-2"><p>您在这工作了多久了?您觉得体验如何?(zh)</p></li><li class="lvl-2"><p>大家为什么会喜欢这里?(zh)</p></li><li class="lvl-2"><p>公司的调薪制度是如何的?(zh)</p></li></ul><p><strong>社会问题</strong></p><ul class="lvl-0"><li class="lvl-2"><p>你们关于多元化招聘什么看法?</p></li><li class="lvl-2"><p>你们的公司文化如何?你认为有什么空白么?</p></li><li class="lvl-2"><p>这里的工作生活平衡地怎么样?</p></li><li class="lvl-2"><p>公司对气候变化有什么态度吗?</p></li></ul><p><strong>冲突</strong></p><ul class="lvl-0"><li class="lvl-2"><p>不同的意见如何处理?</p></li><li class="lvl-2"><p>如果被退回了会怎样?(“这个在预计的时间内做不完”)</p></li><li class="lvl-2"><p>当团队有压力并且在超负荷工作的时候怎么处理?</p></li><li class="lvl-2"><p>如果有人注意到了在流程或者技术等其他方面又改进的地方,怎么办?</p></li><li class="lvl-2"><p>当管理层的预期和工程师的绩效之间有差距的时候如何处理?</p></li><li class="lvl-2"><p>能给我讲一个公司深处有毒环境以及如何处理的故事吗?</p></li><li class="lvl-2"><p>如果在公司内你的同事因涉嫌性侵犯他人而被调查,请问你会如何处理?</p></li><li class="lvl-2"><p>假设我自己很不幸是在公司内被性侵的受害者,在公司内部有没有争取合法权益的渠道?</p></li></ul><p><strong>商业</strong></p><ul class="lvl-0"><li class="lvl-2"><p>你们现在盈利吗?</p></li><li class="lvl-2"><p>如果没有的话,还需要多久?</p></li><li class="lvl-2"><p>公司的资金来源是什么?谁影响或者制定高层计划或方向?</p></li><li class="lvl-2"><p>你们如何挣钱?</p></li><li class="lvl-2"><p>什么阻止了你们挣更多的钱?</p></li><li class="lvl-2"><p>公司未来一年的增长计划怎样?五年呢?</p></li><li class="lvl-2"><p>你们认为什么是你们的竞争优势?</p></li><li class="lvl-2"><p>你们的竞争优势是什么?</p></li><li class="lvl-2"><p>公司未来的商业规划是怎样的?有上市的计划吗?(zh)</p></li></ul><p><strong>远程工作</strong></p><ul class="lvl-0"><li class="lvl-2"><p>远程工作和办公室工作的比例是多少?</p></li><li class="lvl-2"><p>公司提供硬件吗?更新计划如何?</p></li><li class="lvl-2"><p>使用自己的硬件办公可以吗?现在有政策吗?</p></li><li class="lvl-2"><p>额外的附件和家具可以通过公司购买吗?这方面是否有预算?</p></li><li class="lvl-2"><p>有共享办公或者上网的预算吗?</p></li><li class="lvl-2"><p>多久需要去一次办公室?</p></li><li class="lvl-2"><p>公司的会议室是否一直是视频会议就绪的?</p></li></ul><p><strong>办公室布局</strong></p><ul class="lvl-0"><li class="lvl-2"><p>办公室的布局如何?(开放的 / 小隔间 / 独立办公室)</p></li><li class="lvl-2"><p>有没有支持 / 市场 / 或者其他需要大量打电话的团队在我的团队旁边办公?</p></li></ul><p><strong>终极问题</strong></p><ul class="lvl-0"><li class="lvl-2"><p>该职位为何会空缺?</p></li><li class="lvl-2"><p>公司如何保证人才不流失?</p></li><li class="lvl-2"><p>这份工作 / 团队 / 公司最好和最坏的方面是?</p></li><li class="lvl-2"><p>你最开始为什么选择了这家公司?</p></li><li class="lvl-2"><p>你为什么留在这家公司?</p></li></ul><p><strong>待遇</strong></p><ul class="lvl-0"><li class="lvl-2"><p>如果有奖金计划的话,奖金如何分配?</p></li><li class="lvl-2"><p>如果有奖金计划的话,过去的几年里通常会发百分之多少的奖金?</p></li><li class="lvl-2"><p>有五险一金(zh)/401k(us)或者其他退休养老金等福利吗?</p></li><li class="lvl-2"><p>五险一金中,补充公积金一般交多少比例?/401k一般交多少比例?我可以自己选择这一比例吗?</p></li><li class="lvl-2"><p>有什么医疗保险吗?如果有的话何时开始?</p></li><li class="lvl-2"><p>有额外商业保险吗?例如人寿保险和额外的养老/医疗保险?</p></li><li class="lvl-2"><p>更换工作地点,公司付费吗?</p></li></ul><p><strong>休假</strong></p><ul class="lvl-0"><li class="lvl-2"><p>带薪休假时间有多久?</p></li><li class="lvl-2"><p>病假和事假是分开的还是一起算?</p></li><li class="lvl-2"><p>我可以提前使用假期时间吗?也就是说应休假期是负的?</p></li><li class="lvl-2"><p>假期的更新策略是什么样的?也就是说未休的假期能否滚入下一周期</p></li><li class="lvl-2"><p>照顾小孩的政策如何?</p></li><li class="lvl-2"><p>无薪休假政策是什么样的?</p></li><li class="lvl-2"><p>学术性休假政策是怎么样的?</p></li></ul><h2 id="技术文档写作规范">技术文档写作规范<a class="header-anchor" href="#技术文档写作规范"></a></h2><p>摘自 <a href="https://www.forvs.com/231.html">https://www.forvs.com/231.html</a></p><p>作者 <a href="https://github.com/ruanyf/document-style-guide">https://github.com/ruanyf/document-style-guide</a></p><h3 id="标题">标题<a class="header-anchor" href="#标题"></a></h3><h4 id="层级">层级<a class="header-anchor" href="#层级"></a></h4><p>标题分为四级。</p><ul class="lvl-0"><li class="lvl-2"><p>一级标题:文章的标题</p></li><li class="lvl-2"><p>二级标题:文章主要部分的大标题</p></li><li class="lvl-2"><p>三级标题:二级标题下面一级的小标题</p></li><li class="lvl-2"><p>四级标题:三级标题下面某一方面的小标题</p></li></ul><p>下面是示例。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># 一级标题</span><br><span class="line"></span><br><span class="line">## 二级标题</span><br><span class="line"></span><br><span class="line">### 三级标题</span><br><span class="line"></span><br><span class="line">#### 四级标题</span><br></pre></td></tr></table></figure><h4 id="原则">原则<a class="header-anchor" href="#原则"></a></h4><p>(1)一级标题下,不能直接出现三级标题。</p><p>示例:下面的文章结构,缺少二级标题。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"># 一级标题</span><br><span class="line"></span><br><span class="line">### 三级标题</span><br></pre></td></tr></table></figure><p>(2)标题要避免孤立编号(即同级标题只有一个)。</p><p>示例:下面的文章结构,<code>二级标题 A</code>只包含一个三级标题,完全可以省略<code>三级标题 A</code>。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">## 二级标题 A</span><br><span class="line"></span><br><span class="line">### 三级标题 A</span><br><span class="line"></span><br><span class="line">## 二级标题 B</span><br></pre></td></tr></table></figure><p>(3)下级标题不重复上一级标题的名字。</p><p>示例:下面的文章结构,二级标题与下属的三级标题同名,建议避免。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">## 概述</span><br><span class="line"></span><br><span class="line">### 概述</span><br></pre></td></tr></table></figure><p>(4)谨慎使用四级标题,尽量避免出现,保持层级的简单,防止出现过于复杂的章节。</p><p>如果三级标题下有并列性的内容,建议只使用项目列表(Item list)。</p><p>示例:下面的结构二要好于结构一。结构一适用的场景,主要是较长篇幅的内容。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">结构一</span><br><span class="line"></span><br><span class="line">### 三级标题</span><br><span class="line"></span><br><span class="line">#### 四级标题 A</span><br><span class="line"></span><br><span class="line">#### 四级标题 B</span><br><span class="line"></span><br><span class="line">#### 四级标题 C</span><br><span class="line"></span><br><span class="line">结构二</span><br><span class="line"></span><br><span class="line">### 三级标题</span><br><span class="line"></span><br><span class="line">**(1)A**</span><br><span class="line"></span><br><span class="line">**(2)B**</span><br><span class="line"></span><br><span class="line">**(3)C**</span><br></pre></td></tr></table></figure><hr><h3 id="文本">文本<a class="header-anchor" href="#文本"></a></h3><h4 id="字间距">字间距<a class="header-anchor" href="#字间距"></a></h4><p>(1)全角中文字符与半角英文字符之间,应有一个半角空格。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:本文介绍如何快速启动Windows系统。</span><br><span class="line"> </span><br><span class="line">正确:本文介绍如何快速启动 Windows 系统。</span><br></pre></td></tr></table></figure><p>(2)全角中文字符与半角阿拉伯数字之间,有没有半角空格都可,但必须保证风格统一,不能两种风格混杂。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">正确:2011年5月15日,我订购了5台笔记本电脑与10台平板电脑。</span><br><span class="line"> </span><br><span class="line">正确:2011 年 5 月 15 日,我订购了 5 台笔记本电脑与 10 台平板电脑。</span><br></pre></td></tr></table></figure><p>半角的百分号,视同阿拉伯数字。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">正确:今年我国经济增长率是6.5%。</span><br><span class="line"> </span><br><span class="line">正确:今年我国经济增长率是 6.5%。</span><br></pre></td></tr></table></figure><p>(3)英文单位若不翻译,单位前的阿拉伯数字与单位符号之间,应留出适当的空隙。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">例1:一部容量为 16 GB 的智能手机</span><br><span class="line"> </span><br><span class="line">例2:1 h = 60 min = 3,600 s</span><br></pre></td></tr></table></figure><p>(4)半角英文字符和半角阿拉伯数字,与全角标点符号之间不留空格。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:他的电脑是 MacBook Air 。</span><br><span class="line"> </span><br><span class="line">正确:他的电脑是 MacBook Air。</span><br></pre></td></tr></table></figure><h4 id="句子">句子<a class="header-anchor" href="#句子"></a></h4><p>(1)避免使用长句。</p><p>不包含任何标点符号的单个句子,或者以逗号分隔的句子构件,长度尽量保持在 20 个字以内;20~29 个字的句子,可以接受;30~39 个字的句子,语义必须明确,才能接受;多于 40 个字的句子,任何情况下都不能接受。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:本产品适用于从由一台服务器进行动作控制的单一节点结构到由多台服务器进行动作控制的并行处理程序结构等多种体系结构。</span><br><span class="line"> </span><br><span class="line">正确:本产品适用于多种体系结构。无论是由一台服务器(单一节点结构),还是由多台服务器(并行处理结构)进行动作控制,均可以使用本产品。</span><br></pre></td></tr></table></figure><p>逗号分割的长句,总长度不应该超过 100 字或者正文的 3 行。</p><p>(2)尽量使用简单句和并列句,避免使用复合句。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">并列句:他昨天生病了,没有参加会议。</span><br><span class="line"> </span><br><span class="line">复合句:那个昨天生病的人没有参加会议。</span><br></pre></td></tr></table></figure><p>(3)同样一个意思,尽量使用肯定句表达,不使用否定句表达。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:请确认没有接通装置的电源。</span><br><span class="line"> </span><br><span class="line">正确:请确认装置的电源已关闭。</span><br></pre></td></tr></table></figure><p>(4)避免使用双重否定句。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:没有删除权限的用户,不能删除此文件。</span><br><span class="line"> </span><br><span class="line">正确:用户必须拥有删除权限,才能删除此文件。</span><br></pre></td></tr></table></figure><h4 id="写作风格">写作风格<a class="header-anchor" href="#写作风格"></a></h4><p>(1)尽量不使用被动语态,改为使用主动语态。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:假如此软件尚未被安装,</span><br><span class="line"> </span><br><span class="line">正确:假如尚未安装这个软件,</span><br></pre></td></tr></table></figure><p>(2)不使用非正式的语言风格。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:Lady Gaga 的演唱会真是酷毙了,从没看过这么给力的表演!!!</span><br><span class="line"> </span><br><span class="line">正确:无法参加本次活动,我深感遗憾。</span><br></pre></td></tr></table></figure><p>(3)不使用冷僻、生造或者文言文的词语,而要使用现代汉语的常用表达方式。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:这是唯二的快速启动的方法。</span><br><span class="line"> </span><br><span class="line">正确:这是仅有的两种快速启动的方法。</span><br></pre></td></tr></table></figure><p>(4)用对“的”、“地”、“得”。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">她露出了开心的笑容。</span><br><span class="line">(形容词+的+名词)</span><br><span class="line"> </span><br><span class="line">她开心地笑了。</span><br><span class="line">(副词+地+动词)</span><br><span class="line"> </span><br><span class="line">她笑得很开心。</span><br><span class="line">(动词+得+副词)</span><br></pre></td></tr></table></figure><p>(5)使用代词时(比如“其”、“该”、“此”、“这”等词),必须明确指代的内容,保证只有一个含义。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:从管理系统可以监视中继系统和受其直接控制的分配系统。</span><br><span class="line"> </span><br><span class="line">正确:从管理系统可以监视两个系统:中继系统和受中继系统直接控制的分配系统。</span><br></pre></td></tr></table></figure><p>(6)名词前不要使用过多的形容词。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:此设备的使用必须在接受过本公司举办的正式的设备培训的技师的指导下进行。</span><br><span class="line"> </span><br><span class="line">正确:此设备必须在技师的指导下使用,且指导技师必须接受过由本公司举办的正式设备培训。</span><br></pre></td></tr></table></figure><h4 id="英文处理">英文处理<a class="header-anchor" href="#英文处理"></a></h4><p>(1)英文原文如果使用了复数形式,翻译成中文时,应该将其还原为单数形式。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">英文:⋯information stored in random access memory (RAMs)⋯</span><br><span class="line"> </span><br><span class="line">中文:……存储在随机存取存储器(RAM)里的信息……</span><br></pre></td></tr></table></figure><p>(2)外文缩写可以使用半角圆点(<code>.</code>)表示缩写。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">U.S.A.</span><br><span class="line">Apple, Inc.</span><br></pre></td></tr></table></figure><p>(3)表示中文时,英文省略号(<code>⋯</code>)应改为中文省略号(<code>……</code>)。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">英文:5 minutes later⋯</span><br><span class="line"> </span><br><span class="line">中文:5 分钟过去了……</span><br></pre></td></tr></table></figure><p>(4)英文书名或电影名改用中文表达时,双引号应改为书名号。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">英文:He published an article entitled "The Future of the Aviation".</span><br><span class="line"> </span><br><span class="line">中文:他发表了一篇名为《航空业的未来》的文章。</span><br></pre></td></tr></table></figure><p>(5)第一次出现英文词汇时,在括号中给出中文标注。此后再次出现时,直接使用英文缩写即可。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">IOC(International Olympic Committee,国际奥林匹克委员会)。这样定义后,便可以直接使用“IOC”了。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>(6)专有名词中每个词第一个字母均应大写,非专有名词则不需要大写。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">“American Association of Physicists in Medicine”(美国医学物理学家协会)是专有名词,需要大写。</span><br><span class="line"> </span><br><span class="line">“online transaction processing”(在线事务处理)不是专有名词,不应大写。</span><br></pre></td></tr></table></figure><hr><h3 id="段落">段落<a class="header-anchor" href="#段落"></a></h3><h4 id="原则-2">原则<a class="header-anchor" href="#原则-2"></a></h4><ul class="lvl-0"><li class="lvl-2"><p>一个段落只能有一个主题,或一个中心句子。</p></li><li class="lvl-2"><p>段落的中心句子放在段首,对全段内容进行概述。后面陈述的句子为核心句服务。</p></li><li class="lvl-2"><p>一个段落的长度不能超过七行,最佳段落长度小于等于四行。</p></li><li class="lvl-2"><p>段落的句子语气要使用陈述和肯定语气,避免使用感叹语气。</p></li><li class="lvl-2"><p>段落之间使用一个空行隔开。</p></li><li class="lvl-2"><p>段落开头不要留出空白字符。</p></li></ul><h4 id="引用">引用<a class="header-anchor" href="#引用"></a></h4><p>引用第三方内容时,应注明出处。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">One man’s constant is another man’s variable. — Alan Perlis</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>如果是全篇转载,请在全文开头显著位置注明作者和出处,并链接至原文。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">本文转载自 WikiQuote</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>使用外部图片时,必须在图片下方或文末标明来源。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">本文部分图片来自 Wikipedia</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><hr><h3 id="数值">数值<a class="header-anchor" href="#数值"></a></h3><h4 id="半角数字">半角数字<a class="header-anchor" href="#半角数字"></a></h4><p>阿拉伯数字一律使用半角形式,不得使用全角形式。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:这件商品的价格是1000元。</span><br><span class="line"> </span><br><span class="line">正确:这件商品的价格是 1000 元。</span><br></pre></td></tr></table></figure><h4 id="千分号">千分号<a class="header-anchor" href="#千分号"></a></h4><p>数值为千位以上,应添加千分号(半角逗号)。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">XXX 公司的实收资本为 ¥1,258,000 人民币。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>对于 4 位的数值,千分号是选用的,比如<code>1000</code>和<code>1,000</code>都可以接受。对于 4 位以上的数值,应添加千分号。</p><h4 id="货币">货币<a class="header-anchor" href="#货币"></a></h4><p>货币应为阿拉伯数字,并在数字前写出货币符号,或在数字后写出货币中文名称。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$1,000</span><br><span class="line">1,000 美元</span><br></pre></td></tr></table></figure><p>英文的货币名称,建议参考国际标准 <a href="https://en.wikipedia.org/wiki/ISO_4217">ISO 4217</a>。</p><h4 id="数值范围">数值范围<a class="header-anchor" href="#数值范围"></a></h4><p>表示数值范围时,用波浪线(<code>~</code>)或一字线(<code>—</code>)连接。参见《标点符号》一节的“连接号”部分。</p><p>带有单位或百分号时,两个数字建议都要加上单位或百分号。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">132 kg~234 kg</span><br><span class="line"> </span><br><span class="line">67%~89%</span><br></pre></td></tr></table></figure><h4 id="变化程度的表示法">变化程度的表示法<a class="header-anchor" href="#变化程度的表示法"></a></h4><p>数字的增加要使用“增加了”、“增加到”。“了”表示增量,“到”表示定量。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">增加到过去的两倍</span><br><span class="line">(过去为一,现在为二)</span><br><span class="line"> </span><br><span class="line">增加了两倍</span><br><span class="line">(过去为一,现在为三)</span><br></pre></td></tr></table></figure><p>数字的减少要使用“降低了”、“降低到”。“了”表示增量,“到”表示定量。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">降低到百分之八十</span><br><span class="line">(定额是一百,现在是八十)</span><br><span class="line"> </span><br><span class="line">降低了百分之八十</span><br><span class="line">(原来是一百,现在是二十)</span><br></pre></td></tr></table></figure><p>不能用“降低 N 倍”或“减少 N 倍”的表示法,要用“降低百分之几”或“减少百分之几”。因为减少(或降低)一倍表示数值原来为一百,现在等于零。</p><hr><h3 id="标点符号">标点符号<a class="header-anchor" href="#标点符号"></a></h3><h4 id="原则-3">原则<a class="header-anchor" href="#原则-3"></a></h4><p>(1)中文语句的标点符号,均应该采取全角符号,这样可以与全角文字保持视觉的一致。</p><p>(2)如果整句为英文,则该句使用英文/半角标点。</p><p>(3)句号、问号、叹号、逗号、顿号、分号和冒号不得出现在一行之首。</p><p>(4)点号(句号、逗号、顿号、分号、冒号)不得出现在标题的末尾,而标号(引号、括号、破折号、省略号、书名号、着重号、间隔号、叹号、问号)可以。</p><h4 id="句号">句号<a class="header-anchor" href="#句号"></a></h4><p>(1)中文语句的结尾处应该用全角句号(<code>。</code>)。</p><p>(2)句子末尾用括号加注时,句号应在括号之外。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:关于文件的输出,请参照第 1.3 节(见第 26 页。)</span><br><span class="line"> </span><br><span class="line">正确:关于文件的输出,请参照第 1.3 节(见第 26 页)。</span><br></pre></td></tr></table></figure><h4 id="逗号">逗号<a class="header-anchor" href="#逗号"></a></h4><p>(1)逗号(<code>,</code>)表示句子内部的一般性停顿。</p><p>(2)注意避免“一逗到底”,即整个段落除了结尾,全部停顿都使用逗号。</p><h4 id="顿号">顿号<a class="header-anchor" href="#顿号"></a></h4><p>(1)句子内部的并列词,应该用全角顿号(<code>、</code>) 分隔,而不用逗号,即使并列词是英语也是如此。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:我最欣赏的科技公司有 Google, Facebook, 腾讯, 阿里和百度等。</span><br><span class="line"> </span><br><span class="line">正确:我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。</span><br></pre></td></tr></table></figure><p>(2)英文句子中,并列词语之间使用半角逗号(<code>,</code>)分隔。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句:Microsoft Office includes Word, Excel, PowerPoint, Outlook and other components.</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>(3)中文句子内部的并列词,最后一个尽量使用(<code>和</code>)来连接,使句子读起来更加连贯,下面两个句子都可以,第二个更优。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">正确:我最欣赏的科技公司有 Google、Facebook、腾讯、阿里,以及百度等。</span><br><span class="line"> </span><br><span class="line">正确:我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。</span><br></pre></td></tr></table></figure><h4 id="分号">分号<a class="header-anchor" href="#分号"></a></h4><p>(1)分号(<code>;</code>)表示复句内部并列分句之间的停顿。</p><h4 id="引号">引号<a class="header-anchor" href="#引号"></a></h4><p>(1)引用时,应该使用全角双引号(<code>“ ”</code>),注意前后双引号不同。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句:许多人都认为客户服务的核心是“友好”和“专业”。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>(2)引号里面还要用引号时,外面一层用双引号,里面一层用单引号(<code>‘ ’</code>),注意前后单引号不同。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句:鲍勃解释道:“我要放音乐,可萨利说,‘不行!’。”</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><h4 id="括号">括号<a class="header-anchor" href="#括号"></a></h4><p>(1)补充说明时,使用全角圆括号(<code>()</code>),括号前后不加空格。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句:请确认所有的连接(电缆和接插件)均安装牢固。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>(2)几种括号的中英文名称。</p><table><thead><tr><th></th><th>英文</th><th>中文</th></tr></thead><tbody><tr><td><code>{ }</code></td><td>braces 或 curly brackets</td><td>大括号</td></tr><tr><td>``</td><td>square brackets 或 brackets</td><td>方括号</td></tr><tr><td><code>< ></code></td><td>angled brackets</td><td>尖括号</td></tr><tr><td><code>( )</code></td><td>parentheses</td><td>圆括号</td></tr></tbody></table><h4 id="冒号">冒号<a class="header-anchor" href="#冒号"></a></h4><p>(1)全角冒号(<code>:</code>)常用在需要解释的词语后边,引出解释和说明。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句:请确认以下几项内容:时间、地点、活动名称和来宾数量。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>(2)表示时间时,应使用半角冒号(<code>:</code>)。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句:早上 8:00</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><h4 id="省略号">省略号<a class="header-anchor" href="#省略号"></a></h4><p>(1)省略号(<code>……</code>)表示语句未完、或者语气的不连续。</p><p>(2)省略号占两个汉字空间、包含六个省略点,不要使用<code>。。。</code>或<code>...</code>等非标准形式。</p><p>(3)省略号不应与“等”这个词一起使用。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">错误:我们为会餐准备了香蕉、苹果、梨…等各色水果。</span><br><span class="line"> </span><br><span class="line">正确:我们为会餐准备了各色水果,有香蕉、苹果、梨……</span><br><span class="line"> </span><br><span class="line">正确:我们为会餐准备了香蕉、苹果、梨等各色水果。</span><br></pre></td></tr></table></figure><h4 id="感叹号">感叹号<a class="header-anchor" href="#感叹号"></a></h4><p>(1)应该使用平静的语气叙述,尽量避免使用感叹号(<code>!</code>)。</p><p>(2)不得多个感叹号连用,比如<code>!!</code>和<code>!!!</code>。</p><h4 id="破折号">破折号<a class="header-anchor" href="#破折号"></a></h4><p>(1)破折号<code>————</code>一般用于进一步解释。</p><p>(2)破折号应占两个汉字的位置。如果破折号本身只占一个汉字的位置,那么前后应该留出一个半角空格。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">例句:直觉————尽管它并不总是可靠的————告诉我,这事可能出了些问题。</span><br><span class="line"> </span><br><span class="line">例句:直觉 —— 尽管它并不总是可靠的 —— 告诉我,这事可能出了些问题。</span><br></pre></td></tr></table></figure><h4 id="连接号">连接号<a class="header-anchor" href="#连接号"></a></h4><p>(1)连接号用于连接两个类似的词。</p><p>(2)以下场合应该使用直线连接号(<code>-</code>),占一个半角字符的位置。</p><ul class="lvl-0"><li class="lvl-2"><p>两个名词的复合</p></li><li class="lvl-2"><p>图表编号</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">例句:氧化-还原反应</span><br><span class="line"> </span><br><span class="line">例句:图 1-1</span><br></pre></td></tr></table></figure><p>(3)数值范围(例如日期、时间或数字)应该使用波浪连接号(<code>~</code>)或一字号(<code>—</code>),占一个全角字符的位置。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句:2009 年~2011 年</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>注意,波浪连接号前后两个值都建议加上单位。</p><p>(4)波浪连接号也可以用汉字“至”代替。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句:周围温度:-20 °C 至 -10 °C</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><hr><h3 id="文档体系">文档体系<a class="header-anchor" href="#文档体系"></a></h3><h4 id="结构">结构<a class="header-anchor" href="#结构"></a></h4><p>软件手册是一部完整的书,建议采用下面的结构。</p><ul class="lvl-0"><li class="lvl-2"><p><strong>简介</strong>(Introduction): [必备] [文件] 提供对产品和文档本身的总体的、扼要的说明</p></li><li class="lvl-2"><p><strong>快速上手</strong>(Getting Started):[可选] [文件] 如何最快速地使用产品</p></li><li class="lvl-2"><p>入门篇</p><p>(Basics): [必备] [目录] 又称”使用篇“,提供初级的使用教程</p><ul class="lvl-2"><li class="lvl-4"><p><strong>环境准备</strong>(Prerequisite):[必备] [文件] 软件使用需要满足的前置条件</p></li><li class="lvl-4"><p><strong>安装</strong>(Installation):[可选] [文件] 软件的安装方法</p></li><li class="lvl-4"><p><strong>设置</strong>(Configuration):[必备] [文件] 软件的设置</p></li></ul></li><li class="lvl-2"><p><strong>进阶篇</strong>(Advanced):[可选] [目录] 又称”开发篇“,提供中高级的开发教程</p></li><li class="lvl-2"><p><strong>API</strong>(Reference):[可选] [目录|文件] 软件 API 的逐一介绍</p></li><li class="lvl-2"><p><strong>FAQ</strong>:[可选] [文件] 常见问题解答</p></li><li class="lvl-2"><p>附录</p><p>(Appendix):[可选] [目录] 不属于教程本身、但对阅读教程有帮助的内容</p><ul class="lvl-2"><li class="lvl-4"><p><strong>Glossary</strong>:[可选] [文件] 名词解释</p></li><li class="lvl-4"><p><strong>Recipes</strong>:[可选] [文件] 最佳实践</p></li><li class="lvl-4"><p><strong>Troubleshooting</strong>:[可选] [文件] 故障处理</p></li><li class="lvl-4"><p><strong>ChangeLog</strong>:[可选] [文件] 版本说明</p></li><li class="lvl-4"><p><strong>Feedback</strong>:[可选] [文件] 反馈方式</p></li></ul></li></ul><p>下面是两个真实范例,可参考。</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://redux.js.org/introduction/getting-started">Redux 手册</a></p></li><li class="lvl-2"><p><a href="http://flight-manual.atom.io/">Atom 手册</a></p></li></ul><h4 id="文件名">文件名<a class="header-anchor" href="#文件名"></a></h4><p>文档的文件名不得含有空格。</p><p>文件名必须使用半角字符,不得使用全角字符。这也意味着,中文不能用于文件名。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:名词解释.md</span><br><span class="line"> </span><br><span class="line">正确:glossary.md</span><br></pre></td></tr></table></figure><p>文件名建议只使用小写字母,不使用大写字母。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">错误:TroubleShooting.md</span><br><span class="line"> </span><br><span class="line">正确:troubleshooting.md </span><br></pre></td></tr></table></figure><p>为了醒目,某些说明文件的文件名,可以使用大写字母,比如<code>README</code>、<code>LICENSE</code>。</p><p>文件名包含多个单词时,单词之间建议使用半角的连词线(<code>-</code>)分隔。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">不佳:advanced_usage.md</span><br><span class="line"> </span><br><span class="line">正确:advanced-usage.md</span><br></pre></td></tr></table></figure><hr><h3 id="参考链接">参考链接<a class="header-anchor" href="#参考链接"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://www.taodocs.com/p-51273.html">产品手册中文写作规范</a>, by 华为</p></li><li class="lvl-2"><p><a href="http://guide.daocloud.io/dcs/%E5%86%99%E4%BD%9C%E8%A7%84%E8%8C%83%E5%92%8C%E6%A0%BC%E5%BC%8F%E8%A7%84%E8%8C%83-9153803.html">写作规范和格式规范</a>, by DaoCloud</p></li><li class="lvl-2"><p><a href="http://www.hitachi-tc.co.jp/company/thesis/thesis.pdf">技术写作技巧在日汉翻译中的应用</a>, by 刘方</p></li><li class="lvl-2"><p><a href="https://www.lengoo.de/documents/styleguides/lengoo_styleguide_ZH.pdf">简体中文规范指南</a>, by lengoo</p></li><li class="lvl-2"><p><a href="https://open.leancloud.cn/copywriting-style-guide.html">文档风格指南</a>, by LeanCloud</p></li><li class="lvl-2"><p><a href="https://docs.google.com/document/d/1R8lMCPf6zCD5KEA8ekZ5knK77iw9J-vJ6vEopPemqZM/edit">豌豆荚文案风格指南</a>, by 豌豆荚</p></li><li class="lvl-2"><p><a href="https://github.com/sparanoid/chinese-copywriting-guidelines">中文文案排版指北</a>, by sparanoid</p></li><li class="lvl-2"><p><a href="http://w3c.github.io/clreq/">中文排版需求</a>, by W3C</p></li><li class="lvl-2"><p><a href="http://www.ruanyifeng.com/blog/2017/02/filename-should-be-lowercase.html">为什么文件名要小写?</a>, by 阮一峰</p></li><li class="lvl-2"><p><a href="https://developers.google.com/style/">Google Developer Documentation Style Guide</a>, by Google</p></li><li class="lvl-2"><p><a href="http://www.moe.gov.cn/ewebeditor/uploadfile/2015/01/13/20150113091154536.pdf">出版物上数字用法的规定(国家标准GBT15835-2011)</a></p></li><li class="lvl-2"><p><a href="https://zh.wikisource.org/zh-hans/GB_3100-1993_%E5%9B%BD%E9%99%85%E5%8D%95%E4%BD%8D%E5%88%B6%E5%8F%8A%E5%85%B6%E5%BA%94%E7%94%A8">GB 3100-1993 国际单位制及其应用</a></p></li></ul>]]></content>
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
<categories>
|
|
96
|
+
|
|
97
|
+
<category> 转载 </category>
|
|
98
|
+
|
|
99
|
+
</categories>
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
<tags>
|
|
103
|
+
|
|
104
|
+
<tag> GitHub </tag>
|
|
105
|
+
|
|
106
|
+
<tag> 转载 </tag>
|
|
107
|
+
|
|
108
|
+
<tag> 学习 </tag>
|
|
109
|
+
|
|
110
|
+
<tag> 习惯 </tag>
|
|
111
|
+
|
|
112
|
+
</tags>
|
|
113
|
+
|
|
114
|
+
</entry>
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
<entry>
|
|
119
|
+
<title>04_转载-提问的智慧</title>
|
|
120
|
+
<link href="/posts/beb8baf2.html"/>
|
|
121
|
+
<url>/posts/beb8baf2.html</url>
|
|
122
|
+
|
|
123
|
+
<content type="html"><![CDATA[<p>具体版权见原文。原文:<a href="https://github.com/tvvocold/How-To-Ask-Questions-The-Smart-Way">https://github.com/tvvocold/How-To-Ask-Questions-The-Smart-Way</a></p><h3 id="弃权申明">弃权申明<a class="header-anchor" href="#弃权申明"></a></h3><p>许多项目的网站在如何取得帮助的部分链接了本文,这没有关系,也正是我们想要的。但如果你是该项目生成此链接的网管,请在链接附近显著位置注明:我们不提供该项目的服务支持!</p><p>我们已经领教了没有此说明带来的痛苦,我们将不停地被一些白痴纠缠,他们认为既然我们发布了本文,那么我们就有责任解决世上所有的技术问题。</p><p>如果你是因为需要帮助正在阅读本文,然后就带着可以直接从作者那取得帮助的印象离开,那么 你 就不幸成了我们所说的白痴之一。 别向 我们 提问,我们不会理睬的。 我们只是在这教你如何从那些真正懂得你软硬件问题的人那里取得帮助,但 99.9% 的时间我们不会是那些人。除非你非常地 确定 本文的作者是你遇到问题方面的专家,请不要打搅,这样大家都更开心一点。</p><h3 id="引言">引言<a class="header-anchor" href="#引言"></a></h3><p>在 黑客 的世界里,你所提技术问题的解答很大程度上取决于你提问的方式与解决此问题的难度,本文将教你如何提问才更有可能得到满意的答复。</p><p>开源程序的应用已经很广,你通常可以从其他更有经验的用户而不是黑客那里得到解答。这是好事,他们一般对新手常有的毛病更容忍一点。然尔,使用我们推荐的方法,象对待黑客那样对待这些有经验的用户,通常能最有效地得到问题的解答。</p><p>第一件需要明白的事是黑客喜欢难题和激发思考的好问题。假如不是这样,我们也不会写本文了。如果你能提出一个有趣的问题让我们咀嚼玩味,我们会感激你。好问题是种激励与礼物,帮助我们发展认知,揭示没有注意或想到的问题。在黑客中,“好问题!” 是非常热烈而真挚的赞许。</p><p>此外,黑客还有遇到简单问题就表现出敌视或傲慢的名声。有时,我们看起来还对新手和愚蠢的家伙有条件反射式的无礼,但事情并不真是这样。</p><p>我们只是毫无歉意地敌视那些提问前不愿思考、不做自己家庭作业的人。这种人就象时间无底洞──他们只知道索取,不愿意付出,他们浪费了时间,这些时间本可用于其它更有趣的问题或更值得回答的人。我们将这种人叫做 “失败者(loser)” (由于历史原因,我们有时将“loser”拼写为“lusers” 。)</p><p>我们意识到许多人只是想使用我们写的软件,他们对学习技术细节没有兴趣。对大多数人而言,计算机只是种工具,是种达到目的的手段而已。他们有自己的生活并且有更要紧的事要做,我们承认这点,也从不指望每个人都对这些让我们着迷的技术问题感兴趣。不过,我们回答问题的风格是为了适应那些真正对此有兴趣并愿意主动参与解决问题的人,这一点不会变,也不该变。如果连这都变了,我们就会在自己能做得最好的事情上不再那么犀利。</p><p>我们(大多数)是自愿者, 从自己繁忙的生活中抽时间来回答问题,有时会力不从心。因此,我们会毫不留情地滤除问题,特别是那些看起来象是失败者提的,以便更有效地把回答问题的时间留给那些胜利者。</p><p>如果你认为这种态度令人反感、以施惠者自居或傲慢自大,请检查你的假设,我们并未要求你屈服──事实上,假如你做了该做的努力,我们中的大多数将非常乐意平等地与你交流,并欢迎你接纳我们的文化。试图去帮助那些不愿自救的人对我们简直没有效率。不懂没有关系,但愚蠢地做事不行。</p><p>所以,你不必在技术上很在行才能吸引我们的注意,但你 必须 表现出能引导你在行的姿态──机 敏、有想法、善于观察、乐于主动参与问题的解决。如果你做不到这些使你与众不同的事情,我们建议你付钱跟别人签商业服务合同,而不是要求黑客无偿帮助。</p><p>如果你决定向我们求助,你不会想成为一名失败者,你也不想被看成一个失败者。得到快速有效回答的最好方法是使提问者看起来象个聪明、自信和有想法的人,并且暗示只是碰巧在某一特别问题上需要帮助。</p><p>(欢迎对本文指正,可以将建议发至 <a href="mailto:esr@thyrsus.com">esr@thyrsus.com</a> 或 <a href="mailto:respond-auto@linuxmafia.com">respond-auto@linuxmafia.com</a>。 请注意,本文不想成为一般性的 网络礼仪 指南,我一般会拒绝那些与引出技术论坛中有用的回答不特别相关的建议。)</p><h3 id="提问前">提问前<a class="header-anchor" href="#提问前"></a></h3><p>在通过电邮、新闻组或论坛提技术问题以前,做以下事情:</p><ul class="lvl-0"><li class="lvl-2"><p>尝试在你准备提问论坛的历史文档中搜索答案</p></li><li class="lvl-2"><p>尝试搜索互联网以找到答案</p></li><li class="lvl-2"><p>尝试阅读手册以找到答案</p></li><li class="lvl-2"><p>尝试阅读“常见问题文档”(FAQ)以找到答案</p></li><li class="lvl-2"><p>尝试自己检查或试验以找到答案</p></li><li class="lvl-2"><p>尝试请教懂行的朋友以找到答案</p></li><li class="lvl-2"><p>如果你是程序员,尝试阅读源代码以找到答案</p></li></ul><p>提问时,请先表明你已做了上述事情,这将有助于建立你不是寄生虫与浪费别人时间的印象。最好再表述你从中 学到的东西 ,我们喜欢回答那些表现出能从答案中学习的人。</p><p>运用某些策略,比如用谷歌(Google)搜索你遇到的各种错误提示(既搜索 谷歌论坛,也搜索网页), 这样很可能直接就找到了解决问题的文档或邮件列表线索。 即使没有结果,在邮件列表或新闻组寻求帮助时提一句“我在谷歌中搜过下列句子但没有找到什么有用的东西” 也是件好事,至少它表明了搜索引擎不能提供哪些帮助。将搜索关键词与你的问题及可能的解决方案联系起来,还有助于引导其他有类似问题的人。</p><p>别着急,不要指望几秒钟的谷歌搜索就能解决一个复杂的问题。读一下常见问题文档。在向专家提问之前,先向后靠靠放松一下,再思考一下问题。相信我们,他们能从你的提问看出你做了多少阅读与思考,如果你是有备而来,将更有可能得到解答。不要将所有问题一股脑抛出,只因你的第一次搜索没有结果(或者结果太多)。</p><p>认真地思考,准备好你的问题。轻率的提问只能得到轻率的回答,或者压根没有。在提问时,你越是表现出在此前做过思考与努力去解决自己的问题,你越有可能得到真正的帮助。</p><p>注意别提错问题。如果提问基于错误的假设,某黑客多半会一边想 “愚蠢的问题……”,一边按将错就错的答案回复你,并且希望这种只是得到你自己“问的问题”而非真正所需的解答,给你一个教训。</p><p>永远不要假设你 有资格 得到解答。你没有这种资格,毕竟你没有为此服务付费。如果你能够提出有内容、有趣和激励思考的问题──那种毫无疑问能够向社区贡献经验,而不仅仅是消极地要求从别人那获取知识的问题,你将“挣到”答案。</p><p>另一方面,表明你有能力也乐意参与问题的解决是个很好的开端。“有没有人能指个方向?”,我这还差点什么?”,“我应该查哪个网站?”,通常要比 “请给出我可以用的完整步骤”更容易得到回复,因为你表明了只要有人能指个方向,你就很乐意完成剩下的过程。</p><h3 id="提问时">提问时<a class="header-anchor" href="#提问时"></a></h3><h4 id="仔细挑选论坛">仔细挑选论坛<a class="header-anchor" href="#仔细挑选论坛"></a></h4><p>要对在哪提问留心,如果你做了下述事情,多半会被一笔勾销或被看成“失败者”:</p><ul class="lvl-0"><li class="lvl-2"><p>张贴与论坛主题无关的问题</p></li><li class="lvl-2"><p>在面向高级技术问题的论坛上张贴肤浅的问题,或者反之。</p></li><li class="lvl-2"><p>在太多不同的新闻组同时张贴</p></li><li class="lvl-2"><p>给既非熟人也没有义务解决你问题的人发送你私人的电邮</p></li></ul><p>为保护通信的渠道不被无关的东西淹没,黑客会除掉那些没有找对地方的问题,你不会想让这种事落到自己头上的。</p><p>因此,第一步是找对论坛。谷歌和其它搜索引擎还是你的朋友,可以用它们搜索你遇到困难的软硬件问题最相关的项目网站。那里通常都有项目的常见问题(FAQ)、邮件列表及文档的链接。如果你的努力(包括 阅读 FAQ)都没有结果,这些邮件列表就是最后能取得帮助的地方。项目的网站也许还有报告Bug的流程或链接,如果是这样,去看看。</p><p>向陌生的人或论坛发送邮件极有可能是在冒险。譬如,不要假设一个内容丰富的网页的作者想充当你的免费顾问,不要对你的问题是否会受到欢迎做太乐观的估计──如果你不确定,向别处发或者压根别发。</p><p>在选择论坛、新闻组或邮件列表时,别太相信名字,先看看 FAQ 或者许可书以明确你的问题是否切题。发贴前先翻翻已有的帖子,这样可以让你感受一下那里行事的方式。事实上,张贴前在新闻组或邮件列表的历史文档中搜索与你问题相关的关键词是个极好的主意,也许就找到答案了。即使没有,也能帮助你归纳出更好的问题。</p><p>别象机关枪似的一次性“扫射”所有的帮助渠道,这就象大喊大叫一样会令人不快,温柔地一个一个来。</p><p>弄懂主题!最典型的错误之一是在某种致立于跨平台可移植的语言、库或工具的论坛中提关于 Unix 或 Windows 操作系统程序接口的问题。如果你不明白为什么这是大错,最好在搞清楚概念前什么也别问。</p><p>一般来说,在仔细挑选的公共论坛中提问比在私有论坛中提同样的问题更容易得到有用的回答。有几个道理支持这点,一是看潜在的回复者有多少,二是看论坛的参与者有多少,黑客更愿回答能启发多数人的问题。</p><p>可以理解,老练的黑客和一些流行软件的作者正在承受过多的不当消息。就象那根最后压垮骆驼背的稻草一样,你的加入也有可能使情况走向极端──已经好几次了,一些流行软件的作者退出了对自己软件的支持,因为伴随而来的涌入其私人邮箱的垃圾邮件变得无法忍受。</p><h4 id="面向新手的论坛和互联网中继聊天(IRC)通常响应最快">面向新手的论坛和互联网中继聊天(IRC)通常响应最快<a class="header-anchor" href="#面向新手的论坛和互联网中继聊天(IRC)通常响应最快"></a></h4><p>本地的用户组织或者你所用的 Linux 发行版也许正在宣传新手取得帮助的论坛或 IRC 通道(在一些非英语国家,新手论坛很可能还是邮件列表),这些地方是开始提问的好去处,特别是当你觉得遇到的也许只是相对简单或者很普通的问题时。经过宣传的 IRC 通道是公开邀请提问的地方,通常可以得到实时的回复。</p><p>事实上,如果出问题的程序来自某发行版(这很常见),最好先去该发行版的论坛或邮件列表中提问,再到程序本身的项目论坛或邮件列表,(否则)该项目的黑客可能仅仅回复“用 我们的 代码”。</p><p>在任何论坛发贴以前,先看看有没有搜索功能。如果有,就试着用问题的几个关键词搜索一下,也许就有帮助。如果在此之前你已做过全面的网页搜索(你应该这样去做),还是再搜索一下论坛,搜索引擎有可能没来得及索引此论坛的全部内容。</p><p>通过论坛或 IRC 通道提供项目的用户支持有增长的趋势,电子邮件交流则更多地为项目开发者保留。所以先在论坛或 IRC 中寻求与该项目相关的帮助。</p><h4 id="第二步,使用项目的邮件列表">第二步,使用项目的邮件列表<a class="header-anchor" href="#第二步,使用项目的邮件列表"></a></h4><p>当某个项目存在开发者邮件列表时,要向列表而不是其中的个别成员提问,即使你确信他能最好地回答你的问题。查一查项目的文档和主页,找到项目的邮件列表并使用它。采用这种办法有几个很好的理由:</p><ul class="lvl-0"><li class="lvl-2"><p>向个别开发者提的问题(如果)足够好,也将对整个项目组有益。相反,如果你认为自己的问题对整个项目组来说太愚蠢,这也不能成为骚扰个别开发者的理由。</p></li><li class="lvl-2"><p>向列表提问可以分散开发者的负担,个别开发者(尤其是项目领导)也许太忙以至于没法回答你的问题。</p></li><li class="lvl-2"><p>大多数邮件列表都要存档,那些存档将被搜索引擎索引,如果你向列表提问并得到解答,将来其它人可以通过网页搜索找到你的问题和答案,也就不用再次发问了。</p></li><li class="lvl-2"><p>如果某些问题经常被问到,开发者可以利用此信息改进文档或软件本身,以使其更清楚。如果只是私下提问,就没有人能看到最常见问题的完整场景。</p></li></ul><p>如果一个项目既有 “用户” 也有“开发者”(或 “黑客”)邮件列表或论坛,而你又不摆弄那些代码,向“用户”列表或论坛提问。不要假设自己会在开发者列表中受到欢迎,那些人多半会遭受你的噪音干扰。</p><p>然尔,如果你 确信 你的问题不一般,而且在“用户” 列表或论坛中几天都没有回复,可以试试“开发者”列表或论坛。建议你在张贴前最好先暗暗地观察几天,至少看看最近几天保存的帖子,以了解那的行事方式(事实上这是参与任何私有或半私有列表的好主意)</p><p>如果你找不到一个项目的邮件列表,而只能查到项目维护者的地址,只管向其发信。即便在这种情况下,也别假设(项目)邮件列表不存在。在你的电子邮件中陈述你已经试过但没有找到合适的邮件列表,也提及你不反对将自己的邮件转发给他人(许多人认为,即使没什么秘密,私人电子邮件也不应该被公开。通过允许将你的电子邮件转发他人,你给了相应人员处置你邮件的选择)。</p><h4 id="使用有意义且明确的主题">使用有意义且明确的主题<a class="header-anchor" href="#使用有意义且明确的主题"></a></h4><p>在邮件列表、新闻组或论坛中,主题是你在五十个或更少的字以内吸引有资格专家注意的黄金机会,不要用诸如 “请帮我” (更别提大写的 “请帮我!!!!”,这种主题的消息会被条件反射式地删掉)之类的唠叨浪费机会。不要用你痛苦的深度来打动我们,相反,要在这点空间中使用超级简明扼要的问题描述。</p><p>使用主题的好惯例是“对象──偏差”(式的描述),许多技术支持组织就是这样做的。在“对象”部分指明是哪一个或哪一组东西有问题,在“偏差”部分则描述与期望的行为不一致的地方。</p><p>愚蠢:</p><blockquote><p>救命啊!我的笔记本视频工作不正常!</p></blockquote><p>明智:</p><blockquote><p><a href="http://X.org">X.org</a> 6.8.1 扭曲鼠标光标,MV1005 型号的某显卡芯片组</p></blockquote><p>更明智:</p><blockquote><p>使用 MV1005 型号的某显卡芯片组在 <a href="http://X.org">X.org</a> 6.8.1 的鼠标光标被扭曲</p></blockquote><p>编写 “对象──偏差”式描述的过程有助于你组织对问题的细致思考。是什么被影响了?仅仅是鼠标光标或者还有其它图形?只在 <a href="http://X.org">X.org</a> 中出现?或只是在其 6.8.1 版中?是针对某显卡芯片组?或者只是其中的 MV1005 型号?一个黑客只需描一眼就能够立即明白什么是你遇到的问题,什么是你自己的问题。</p><p>更一般地,想象一下在一个只显示主题的文档索引中查找。让你的主题更好地反映问题,可以使下一个搜索类似问题的人能够在文档中直接就找到答案的线索,而不用再次发贴提问。</p><p>如果你想在回复中提问,确保改变主题以表明你是在问一个问题,一个主题象 <code>Re: 测试</code> 或者 <code>Re: 新Bug</code> 的消息不太可能引起足够的注意。同时,将回复中与新主题不甚相关的引用内容尽量删除。</p><p>对于列表消息,不要直接点击回复(按钮)来开始一个全新的线索,这将限制你的观众。有些邮件阅读程序,比如 mutt,允许用户按线索排序并通过折叠线索来隐藏消息,这样做的人永远看不到你发的消息。</p><p>仅仅改变主题还不够。mutt 和其它一些邮件阅读程序还要检查邮件头主题以外的其它信息,以便为其指定线索,所以宁可发一个全新的邮件。</p><p>在论坛,因为消息与特定的线索紧密结合,并且通常在线索之外不可见,好的提问方式略有不同,通过回复提问并不要紧。不是所有论坛都允许在回复中出现分离的主题,而且这样做了基本上没有人会去看。不过,通过回复提问本身就是令人怀疑的做法,因为它们只会被正在查看该线索的人读到。所以,除非你 只想 在该线索当前活跃的人群中提问,还是另起炉灶比较好。</p><h4 id="使问题容易回复">使问题容易回复<a class="header-anchor" href="#使问题容易回复"></a></h4><p>以<code>请向……回复</code>来结束问题多半会使你得不到回答。如果你觉得花几秒钟在邮件客户端设置一下回复地址都麻烦,我们也觉得花几秒钟考虑你的问题更麻烦。如果你的邮件客户端程序不支持这样做,换个好点的;如果是操作系统不支持所有这种邮件客户端程序,也换个好点的。</p><p>在论坛,要求通过电子邮件回复是完全无礼的,除非你确信回复的信息也许是敏感的(而且有人会为了某些未知的原因,只让你而不是整个论坛知道答案)。如果你只是想在有人回复线索时得到电子邮件提醒,可以要求论坛发送。几乎所有论坛都支持诸如<code>留意本线索</code>、<code>有回复发送邮件</code>等功能。</p><h4 id="用清晰、语法、拼写正确的语句书写">用清晰、语法、拼写正确的语句书写<a class="header-anchor" href="#用清晰、语法、拼写正确的语句书写"></a></h4><p>经验告诉我们,粗心与草率的作者通常也粗心与草率地思考和编程(我敢打赌)。为这些粗心与草率的思考者回答问题没有什么好处,我们宁可将时间花在其它地方。</p><p>清楚、良好地表达你的问题非常重要。如果你觉得这样做麻烦,我们也觉得注意(你的问题)麻烦。花点额外的精力斟酌一下字句,用不着太僵硬与正式──事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它 必须 很准确,而且有迹象表明你是在思考和关注问题。</p><p>正确地拼写、使用标点和大小写,不要将 <code>its</code> 混淆为 <code>it's</code>,<code>loose</code> 搞成 <code>lose</code> 或者将 “discrete” 弄成 “discreet”。不要全部用大写,这会被视为无礼的大声嚷嚷 (全部小写也好不到哪去,因为不易阅读。Alan Cox [注:著名黑客,Linux 内核的重要参与者] 也许可以这样做,但你不行。)</p><p>一般而言,如果你写得象个半文盲似的傻子,多半得不到理睬。也不要使用即时通讯中的简写,如将 <code>you</code> 简化为 <code>u</code> 会使你看起来象一个为了节约二次击键的半文盲式的傻子。更糟的是,如果象个小孩似地鬼画桃符那绝对是在找死,可以肯定没人会理你(或者最多是给你一大堆指责与挖苦)。</p><p>如果在非母语论坛提问,你的拼写与语法错误会得到有限的宽容,但懒惰完全不会被容忍(是的,我们通常看得出其中的差别)。同时,除非你知道回复者使用的语言,请使用英语书写。繁忙的黑客一般会直接删除用他们看不懂语言写的消息。在互联网上英语是工作语言,用英语书写可以将你的问题不被阅读就被直接删除的可能性降到最低。</p><p>如果你用英语书写但它是你的第二语言,最好提醒潜在的回复者语言上可能的困难以便绕过这个问题,比如:</p><ul class="lvl-0"><li class="lvl-2"><p>英语不是我的母语,请谅解拼写错误。</p></li><li class="lvl-2"><p>如果您使用某某语言,请电邮/私聊我,也许我需要您的协助翻译我的问题。</p></li><li class="lvl-2"><p>对于这个技术术语本身我很熟悉,但对于它的一些俚语或习惯表达方式就不太明白了。</p></li><li class="lvl-2"><p>我已经同时用某某语及英语提问,如果您使用两者之一回复,我很乐意翻译。</p></li></ul><h4 id="使用易于读取且标准的文件格式发送问题">使用易于读取且标准的文件格式发送问题<a class="header-anchor" href="#使用易于读取且标准的文件格式发送问题"></a></h4><p>如果你人为地将问题搞得难以阅读,它多半会被忽略,人们更愿读易懂的问题,所以:</p><ul class="lvl-0"><li class="lvl-2"><p>使用纯文本而不是 HTML(超文本标注语言)( 关闭HTML 并不难)</p></li><li class="lvl-2"><p>使用 MIME(多用途互联网邮件扩展)附件通常没有问题,前提是真正有内容(譬如附带的源文件或补丁),而不仅仅是邮件客户端程序生成的模板(譬如只是消息内容的拷贝)。</p></li><li class="lvl-2"><p>不要发送整段只是单行句子但多次折回的邮件(这使得回复部分内容非常困难)。设想你的读者是在80个字符宽的文本终端阅读邮件,设置你的行折回点小于 80 列。</p></li><li class="lvl-2"><p>但是,也 不要 用任何固定列折回数据(譬如日志文件拷贝或会话记录)。数据应该原样包含,使回复者确信他们看到的是与你看到的一样的东西。</p></li><li class="lvl-2"><p>在英语论坛中,不要使用’Quoted-Printable’ MIME 编码发送消息。这种编码对于张贴非 ASCII 语言可能是必须的,但很多邮件程序并不支持。当它们分断时,那些文本中四处散布的 “=20”符号既难看也分散注意力,甚至有可能破坏内容的语意。</p></li><li class="lvl-2"><p>永远不要 指望黑客们阅读使用封闭的专用格式编写的文档,诸如微软公司的 Word 或 Excel 文件等。大多数黑客对此的反应就象有人将还在冒热气的猪粪倒在你门口时你的反应一样。即使他们能够处理,也很厌恶这么做。</p></li><li class="lvl-2"><p>如果你从使用视窗的电脑发送电子邮件,关闭问题颇多的微软“聪明引用”功能(在“工具” -> “自动纠正选项”的“输入时自动格式化”下去掉聪明引用的选框),以免在你的邮件中到处散布垃圾字符。</p></li><li class="lvl-2"><p>在论坛,勿滥用“表情符号”和“HTML”功能(当它们提供时)。一两个表情符号通常没有问题,但花哨的彩色文本倾向于使人认为你是个无能之辈。过滥地使用表情符号、色彩和字体会使你看来象个傻笑的小姑娘。这通常不是个好主意,除非你只是对性而不是有用的回复更有兴趣。</p></li><li class="lvl-2"><p>如果你使用图形用户界面的邮件客户端程序(如网景公司的 Messenger、微软公司的 Outlook 或者其它类似的),注意它们的缺省配置不一定满足这些要求。大多数这类程序有基于菜单的<code>查看源码</code>命令,用它来检查发送文件夹中的消息,以确保发送的是没有多余杂质的纯文本文件。</p></li></ul><h4 id="描述问题应准确且有内容">描述问题应准确且有内容<a class="header-anchor" href="#描述问题应准确且有内容"></a></h4><ul class="lvl-0"><li class="lvl-2"><p>仔细、清楚地描述问题的症状</p></li><li class="lvl-2"><p>描述问题发生的环境(主机、操作系统、应用程序,任何相关的),提供销售商的发行版和版本号(如:“Fedora Core 7”、“Slackware 9.1”等)</p></li><li class="lvl-2"><p>描述提问前做过的研究及其理解。</p></li><li class="lvl-2"><p>描述提问前为确定问题而采取的诊断步骤。</p></li><li class="lvl-2"><p>描述最近对计算机或软件配置的任何相关改变。</p></li><li class="lvl-2"><p>如果可能,提供在可控环境下重现问题的方法。</p></li><li class="lvl-2"><p>尽最大努力预测黑客会提到的问题,并提前备好答案。</p></li></ul><p>如果你认为是代码有问题,向黑客提供在可控环境下重现问题的方法尤其重要。当你这么做时,得到有用且及时回复的可能性将大大增加。</p><p><a href="http://www.chiark.greenend.org.uk/%7Esgtatham/">西蒙.泰瑟姆(Simon Tatham)</a>写过一篇《<a href="http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-tw.html">如何有效报告Bug》</a>的文章,我强烈推荐各位阅读。</p><h4 id="量不在多,精炼则灵">量不在多,精炼则灵<a class="header-anchor" href="#量不在多,精炼则灵"></a></h4><p>你应该(写得)精炼且有内容,简单地将一大堆代码或数据罗列在求助消息中达不到目的。如果你有一个很大且复杂的测试样例让程序崩溃,尝试将其裁剪得越小越好。</p><p>至少有三个理由支持这点。第一,让别人看到你在努力简化问题使你更有可能得到回复。第二,简化问题使你更有可能得到 <code>有用的</code> 回复。第三,在提纯Bug报告的过程中,你可能自己就找到了解决办法或权宜之计。</p><h4 id="别急于宣称找到Bug">别急于宣称找到Bug<a class="header-anchor" href="#别急于宣称找到Bug"></a></h4><p>当你在一个软件中遇到问题,除非你 非常、非常 的有根据,不要动辄声称找到了Bug。提示:除非你能提供解决问题的源代码补丁,或者对前一版本的回归测试表现出不正确的行为,否则你都多半不够完全确信。对于网页和文档也如此,如果你(声称)发现了文档的“Bug”,你应该能提供相应位置的替代文本。</p><p>记住,还有许多其它用户并未经历你遇到的问题,否则你在阅读文档或搜索网页时就应该发现了([你在报怨前已经做了这些,是吧 ?](#你在报怨前已经做了这些,是吧 ?))。这也意味着很有可能是你弄错了而不是软件本身有问题。</p><p>编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了Bug,也就置疑了他们的能力,即使你是对的,也有可能会使其中的部分人感到不快。(此外,)在主题中嚷嚷“Bug”也是特别不老练的。</p><p>提问时,即使你私下非常确信已经发现一个真正的Bug,最好写得象是 你 做错了什么。如果真的有Bug,你会在回复中看到这点。这样做的话,如果真有虫子,维护者就会向你道歉,这总比你弄砸了然后欠别人一个道歉要强。</p><h4 id="低声下气代替不了做自己的家庭作业">低声下气代替不了做自己的家庭作业<a class="header-anchor" href="#低声下气代替不了做自己的家庭作业"></a></h4><p>有些人明白他们不应该粗鲁或傲慢地行事并要求得到答复,但他们退到相反的低声下气的极端:“我知道我只是个可怜的新丁,一个失败者,但……”。这既使人困扰,也没有用,当伴随着对实际问题含糊的描述时还特别令人反感。</p><p>别用低级灵长类动物的办法浪费你我的时间,相反,尽可能清楚地描述背景情况和你的问题,这比低声下气更好地摆正了你的位置。</p><p>有时,论坛设有单独的初学者提问版面,如果你真的认为遇到了肤浅的问题,到那去就是了,但一样别低声下气。</p><h4 id="描述问题症状而不是猜测">描述问题症状而不是猜测<a class="header-anchor" href="#描述问题症状而不是猜测"></a></h4><p>告诉黑客是什么导致了问题是没用的(如果你的诊断理论是了不起的东西,你还会向别人咨询求助吗?)。所以,确保只是告诉他们问题的原始症状,而不是你的解释和理论,让他们来解释和诊断。如果你认为陈述自己的猜测很重要,应清楚地说明这只是你的猜测并描述为什么它们不起作用。</p><p>愚蠢:</p><blockquote><p>我在编译内核时接连遇到 SIG11 错误,怀疑主板上的某根电路丝断了,找到它们的最好办法是什么?</p></blockquote><p>明智:</p><blockquote><p>我组装的电脑(K6/233 CPU、FIC-PA2007 主板[威盛 Apollo VP2 芯片组]、Corsair PC133 SDRAM 256Mb 内存)最近在开机 20 分钟左右、做内核编译时频繁地报 SIG11 错,但在头 20 分钟内从不出问题。重启动不会复位时钟,但整夜关机会。更换所有内存未解决问题,相关的典型编译会话日志附后。</p></blockquote><p>由于以上这点许多人似乎难以掌握,这里有句话可以提醒你:“所有的诊断专家都来自密苏里州”。美国国务院的官方座右铭则是“让我看看”(出自国会议员威勒德.D.范迪弗[Willard D. Vandiver]在1899年时的讲话:“我来自一个出产玉米、棉花、牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。”)针对诊断者而言,这并不是怀疑,而只是一种真实而有用的需求,以便让他们看到与你看到的原始证据尽可能一致的东西,而不是你的猜测与总结。(所以,)让我们看看。</p><h4 id="按时间先后罗列问题症状">按时间先后罗列问题症状<a class="header-anchor" href="#按时间先后罗列问题症状"></a></h4><p>刚出问题之前发生的事情通常包含有解决问题最有效的线索。所以,记录中应准确地描述你、电脑和软件在崩溃前都做了什么。在命令行处理的情况下,有会话日志(如运行脚本工具生成的)并引用相关的若干(如20)行记录会非常有帮助。</p><p>如果崩溃的程序有诊断选项(如-v详述开关),试着选择这些能在记录中增加排错信息的选项。记住,“多”不等于“好”。试着选取适当的排错级别以便提供有用的信息而不是将阅读者淹没在垃圾中。</p><p>如果你的记录很长(如超过四段),在开头简述问题随后按时间先后罗列详细过程也许更有用。这样,黑客在读你的记录时就知道该注意哪些内容了。</p><h4 id="描述目标而不是过程">描述目标而不是过程<a class="header-anchor" href="#描述目标而不是过程"></a></h4><p>如果你想弄清楚如何做某事(而不是报告一个Bug),在开头就描述你的目标,然后才陈述遇到问题的特定步骤。</p><p>经常出现这种情况,寻求技术帮助的人在脑袋里有个更高层次的目标,他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身有问题,结果要费很大的劲才能通过。</p><p>愚蠢:</p><blockquote><p>我怎样才能让某图形程序的颜色拾取器取得十六进制的 RGB 值?</p></blockquote><p>明智:</p><blockquote><p>我正试着用自己选定数值的颜色替换一幅图片的色表,我现在知道的唯一方法是编辑每个表槽,但却无法让某图形程序的颜色拾取器取得十六进制的 RGB 值。</p></blockquote><p>第二种提法是明智的,它使得建议采用更合适的工具以完成任务的回复成为可能。</p><h4 id="别要求私下回复电邮">别要求私下回复电邮<a class="header-anchor" href="#别要求私下回复电邮"></a></h4><p>黑客们认为问题的解决过程应该公开、透明,此过程中如果更有才能的人注意到不完整或者不当之处,最初的回复才能够、也应该被纠正。同时,作为回复者也因为能力和学识被其它同行看到而得到某种回报。</p><p>当你要求私下回复时,此过程和回报都被中止。别这样做,让 回复者 来决定是否私下回答──如果他真这么做了,通常是因为他认为问题编写太差或者太肤浅,以至于对其它人毫无意义。</p><p>对这条规则存在一条有限的例外,如果你确信提问可能会引来大量雷同的回复时,那么“向我发电邮,我将为论坛归纳这些回复”将是神奇的句子。试着将邮件列表或新闻组从洪水般雷同的回复中解救出来是非常有礼貌的──但你必须信守诺言。</p><h4 id="提问应明确">提问应明确<a class="header-anchor" href="#提问应明确"></a></h4><p>漫无边际的问题通常也被视为没有明确限制的时间无底洞。最有可能给你有用答案的人通常也是最忙的人(假如只是因为他们承担了太多工作的话),这些人对于没有止境的时间无底洞极其敏感,所以他们也倾向于讨厌那些漫无边际的问题。</p><p>如果你明确了想让回复者做的事(如指点方向、发送代码、检查补丁或其它),你更有可能得到有用的回复。(因为)这样可以让他们集中精力并间接地设定了他们为帮助你需要花费的时间和精力上限,这很好。</p><p>要想理解专家生活的世界,可以这样设想:那里有丰富的专长资源但稀缺的响应时间。你暗中要求他们奉献的时间越少,你越有可能从这些真正懂行也真正很忙的专家那里得到解答。</p><p>所以限定你的问题以使专家回答时需要付出的时间最少──这通常与简化问题还不太一样。举个例,“请问可否指点一下哪有好一点的 X 解释?”通常要比“请解释一下 X”明智。如果你的代码不运行了,通常请别人看看哪有问题比叫他们帮你改正更明智。</p><h4 id="关于代码的问题">关于代码的问题<a class="header-anchor" href="#关于代码的问题"></a></h4><p>别要求他人给你出问题的代码排错而不提及应该从何入手。张贴几百行的代码,然后说一声“它不能运行”会让你得不到理睬。只贴几十行代码,然后说一句“在第七行以后,本应该显示<x>,但实际出现的是<y>”非常有可能让你得到回复。</p><p>最精确描述代码问题的方法是提供一个能展示问题的最小测试样例。什么是最小测试样例?它是对问题的展现,只需要刚好能够重现非预期行为的代码即可。如何生成一个最小测试样例?如果你知道哪一行或哪一段代码会产生问题,将其复制并提供刚好够用的外围支撑代码以构成一个完整的样例(够用是指源码刚好能被编译器、解释器或任何处理它的程序所接受)。如果你不能将问题缩小到特定的段落,复制源码并去除那些与问题无关的代码段。你能提供的最小测试样例越小越好(参见 量不在多,精炼则灵 )。</p><p>生成一个非常小的最小测试样例并不总是可能,但尽力去做是很好的锻练,这有可能帮助你找到需要自己解决的问题。即使你找不到,黑客们喜欢看到你努力过,这将使他们更合作。</p><p>如果你只是想让别人帮忙审一下代码,在最开头就要说出来,并且一定要提到你认为哪一部分特别需要关注以及为什么。</p><h4 id="别张贴家庭作业式问题">别张贴家庭作业式问题<a class="header-anchor" href="#别张贴家庭作业式问题"></a></h4><p>黑客们善于发现“家庭作业”式的问题。我们中的大多数人已经做了自己的家庭作业,那是该 你 做的,以便从中学到东西。问一下提示没有关系,但不是要求完整的解决方案。</p><p>如果你怀疑自己碰到了一个家庭作业式的问题,但仍然无法解决,试试在用户组、论坛或(作为最后一招)在项目的“用户”邮件列表或论坛中提问。尽管黑客们 会 看出来,一些老用户也许仍会给你提示。</p><h4 id="删除无意义的要求">删除无意义的要求<a class="header-anchor" href="#删除无意义的要求"></a></h4><p>抵制这种诱惑,即在求助消息末尾加上诸如“有人能帮我吗?”或“有没有答案?”之类在语义上毫无意义的东西。第一,如果问题描述还不完整,这些附加的东西最多也只能是多余的。第二,因为它们是多余的,黑客们会认为这些东西烦人──就很有可能用逻辑上无误但打发人的回复,诸如“是的,你可以得到帮助”和“不,没有给你的帮助”。</p><p>一般来说,避免提“是或否”类型的问题,除非你想得到 “是或否”类型的回答。</p><h4 id="不要把问题标记为“紧急”,即使对你而言的确如此">不要把问题标记为“紧急”,即使对你而言的确如此<a class="header-anchor" href="#不要把问题标记为“紧急”,即使对你而言的确如此"></a></h4><p>这是你的问题,不要我们的。宣称“紧急”极有可能事与愿违:大多数黑客会直接删除这种消息,他们认为这是无礼和自私地企图得到即时与特殊的关照。而且“紧急”或其它有类似含义的主题有可能触发垃圾过滤规则,潜在的回复者可能永远看不到你的问题!</p><p>有一点点局部的例外,如果你是在一些知名度很高、会使黑客们激动的地方使用程序,也许值得这样去做。在这种情况下,如果你有期限压力,也很有礼貌地提到这点,人们也许会有足够的兴趣快一点回答。</p><p>当然,这是非常冒险的,因为黑客们对什么是令人激动的标准多半与你的不同。譬如从国际空间站这样张贴没有问题,但代表感觉良好的慈善或政治原因这样做几乎肯定不行。事实上,张贴诸如“紧急:帮我救救这个毛绒绒的小海豹!”肯定会被黑客回避或光火,即使他们认为毛绒绒的小海豹很重要。</p><p>如果你觉得这不可思议,再把剩下的内容多读几遍,直到弄懂了再发贴也不迟。</p><h4 id="礼貌总是有益的">礼貌总是有益的<a class="header-anchor" href="#礼貌总是有益的"></a></h4><p>礼貌一点,使用 <code>请</code> 和 <code>谢谢你的关注</code> 或者 <code>谢谢你的关照</code>,让别人明白你感谢他们无偿花时间帮助你。</p><p>坦率地讲,这一点没有语法正确、文字清晰、准确、有内容和避免使用专用格式重要(同时也不能替代它们)。黑客们一般宁可读有点唐突但技术鲜明的Bug报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教我们什么来评价它的)</p><p>然尔,如果你已经谈清楚了技术问题,客气一点肯定会增加你得到有用回复的机会。</p><p>(我们必须指出,本文唯一受到一些老黑客认真反对的地方是以前曾经推荐过的“提前谢了”,一些黑客认为这隐含着事后不用再感谢任何人的暗示。我们的建议是要么先说 <code>提前谢了</code>,事后 再 对回复者表示感谢,要么换种方式表达,譬如用 <code>谢谢你的关注</code> 或 <code>谢谢你的关照</code>)。</p><h4 id="问题解决后追加一条简要说明">问题解决后追加一条简要说明<a class="header-anchor" href="#问题解决后追加一条简要说明"></a></h4><p>问题解决后向所有帮助过的人追加一条消息,让他们知道问题是如何解决的并再次感谢。如果问题在邮件列表或新闻组中受到广泛关注,在那里追加此消息比较恰当。</p><p>最理想的方式是向最初提问的线索回复此消息,并在主题中包含 <code>已解决</code>、<code>已搞定</code> 或其它同等含义的明显标记。在人来人往的邮件列表里,一个看见线索 <code>问题 X</code> 和 <code>问题 X-已解决</code> 的潜在回复者就明白不用再浪费时间了(除非他个人觉得“问题 X”有趣),因此可以利用此时间去解决其它问题。</p><p>追加的消息用不着太长或太复杂,一句简单的“你好──是网线坏了!谢谢大家──比尔”就比什么都没有要强。事实上,除非解决问题的技术真正高深,一条简短而亲切的总结比长篇大论要好。说明是什么行动解决了问题,用不着重演整个排错的故事。</p><p>对于有深度的问题,张贴排错历史的摘要是恰当的。描述问题的最终状态,说明是什么解决了问题,在此之后 才指明可以避免的弯路。应避免的弯路部分应放在正确的解决方案和其它总结材料之后,而不要将此消息搞成侦探推理小说。列出那些帮助过你的名字,那样你会交到朋友的。</p><p>除了有礼貌、有内容以外,这种类型的追帖将帮助其他人在邮件列表、新闻组或论坛文档中搜索到真正解决你问题的方案,从而也让他们受益。</p><p>最后,此类追帖还让每位参与协助的人因问题的解决而产生一种满足感。如果你自己不是技术专家或黑客,相信我们,这种感觉对于你寻求帮助的老手和专家是非常重要的。问题叙述到最后不知所终总是令人沮丧的,黑客们痒痒地渴望它们被解决。<code>挠痒痒</code> 为你挣到的信誉将对你下次再次张贴提问非常非常的有帮助。</p><p>考虑一下怎样才能避免他人将来也遇到类似的问题,问问自己编一份文档或 FAQ 补丁会不会有帮助,如果是的话就将补丁发给维护者。</p><p>在黑客中,这种良好的后继行动实际上比传统的礼貌更重要,也是你善待他人而赢得声誉的方式,这是非常有价值的财富。</p><h3 id="如何解读回答">如何解读回答<a class="header-anchor" href="#如何解读回答"></a></h3><h4 id="“读读该死的手册”(RTFM)和“搜搜该死的网络”(STFW):如何明白你已完全搞砸">“读读该死的手册”(RTFM)和“搜搜该死的网络”(STFW):如何明白你已完全搞砸<a class="header-anchor" href="#“读读该死的手册”(RTFM)和“搜搜该死的网络”(STFW):如何明白你已完全搞砸"></a></h4><p>有一个古老而神圣的传统:如果你收到 <code>读读该死的手册</code>(RTFM) 的回复,发信人认为你应该去“读读该死的手册”。他或她多半是对的,去读一下吧。</p><p>“读读该死的手册”(RTFM)有个年轻一点的亲戚,如果你收到“搜搜该死的网络”(STFW)的回复,发信人认为你应该“搜搜该死的网络”。那人多半也是对的,去搜一下吧。(更温和一点的说法是“<a href="http://lmgtfy.com/">谷歌是你的朋友!</a>”)</p><p>在论坛,你也可能被要求去搜索论坛的文档。事实上,有人甚至可能热心地为你提供以前解决此问题的线索。但不要依赖这种关照,提问前应该先搜索一下文档。</p><p>通常,叫你搜索的人已经打开了能解决你问题的手册或网页,正在一边看一边敲键盘。这些回复意味着他认为:</p><ul class="lvl-0"><li class="lvl-2"><p>第一,你要的信息很容易找到。</p></li><li class="lvl-2"><p>第二,自已找要比别人喂到嘴里能学得更多。</p></li></ul><p>你不应该觉得这样就被冒犯了,按黑客的标准,回复者没有不理你就是在向你表示某种尊敬,你反而应该感谢他热切地想帮助你。</p><h4 id="如果还不明白……">如果还不明白……<a class="header-anchor" href="#如果还不明白……"></a></h4><p>如果你看不懂回答,不要马上回复一个要求说明的消息,先试试那些最初提问时用过的相同工具(如手册、FAQ、网页、懂行的朋友等)试着搞懂回答。如果还是需要说明,展现你已经明白的。</p><p>譬如,假如我告诉你:“看起来象是某输入项有问题,你需要清除它”,接着是个 不好 的回帖:“什么是某输入项?”。而这是一个 很好 的跟帖:“是的,我读了手册,某某输入项只在 -z 和 -p 开关中被提到,但都没有涉及到如何清除它们,你指的是哪一个还是我弄错了什么?”</p><h4 id="对待无礼">对待无礼<a class="header-anchor" href="#对待无礼"></a></h4><p>很多黑客圈子中看似无礼的行为并不是存心冒犯。相反,它是直接了当、一针见血式的交流风格,这种风格对于更关注解决问题而不是使别人感觉舒服而混乱的人是很自然的。</p><p>如果你觉得被冒犯了,试着平静地反应。如果有人真的做了过格的事,邮件列表、新闻组或论坛中的前辈多半会招呼他。如果这 没有 发生而你却光火了,那么你发火对象的言语可能在黑客社区中看起来是正常的,而 你 将被视为有错的一方,这将伤害到你获取信息或帮助的机会。</p><p>另一方面,你会偶而真的碰到无礼和无聊的言行。与上述相反,对真正的冒犯者狠狠地打击、用犀利的语言将其驳得体无完肤都是可以接受的。然尔,在行事之前一定要非常非常的有根据。纠正无礼的言论与开始一场毫无意义的口水战仅一线之隔,黑客们自己莽撞地越线的情况并不鲜见。如果你是新手或外来者,避开这种莽撞的机会并不高。如果你想得到的是信息而不是消磨时光,这时最好不要把手放在键盘上以免冒险。</p><p>(有些人断言很多黑客都有轻度的自闭症或阿斯伯格综合症,缺少用于润滑人类社会“正常”交往所需的脑电路。这既可能是真也可能是假。如果你自己不是黑客,兴许你认为我们脑袋有问题还能帮助你应付我们的古怪行为。只管这么干好了,我们不在乎。我们 喜欢 现在这个样子,并且一般都对病号标记有站得住脚的怀疑。)</p><p>在下一节,我们会谈到另一个问题,当 你 行为不当时会受到的“冒犯”。</p><h3 id="别象失败者那样反应">别象失败者那样反应<a class="header-anchor" href="#别象失败者那样反应"></a></h3><p>在黑客社区的论坛中有那么几次你可能会搞砸──以本文描述或类似的方式。你会被示众是如何搞砸的,也许言语中还会带点颜色。</p><p>这种事发生以后,你能做的最糟糕的事莫过于哀嚎你的遭遇、宣称被口头攻击、要求道歉、高声尖叫、憋闷气、威胁诉诸法律、向其雇主报怨、忘了关马桶盖等等。相反,你该这样去做:</p><p>熬过去,这很正常。事实上,它是有益健康与恰当的。</p><p>社区的标准不会自己维持,它们是通过参与者积极而 公开 地执行来维持的。不要哭嚎所有的批评都应该通过私下的邮件传送,这不是事情运作的方式。当有人评论你的一个说法有误或者提出不同看法时,坚持声称受到个人攻击也毫无益处,这些都是失败者的态度。</p><p>也有其它的黑客论坛,受过高礼节要求的误导,禁止参与者张贴任何对别人帖子挑毛病的消息,并声称“如果你不想帮助用户就闭嘴”。有思路的参与者纷纷离开的结果只会使它们变成了毫无意义的唠叨与无用的技术论坛。</p><p>是夸张的“友谊”(以上述方式)还是有用?挑一个。</p><p>记着:当黑客说你搞砸了,并且(无论多么刺耳地)告诉你别再这样做时,他正在为关心你和他的社区而行动。对他而言,不理你并将你从他的生活中滤除要容易得多。如果你无法做到感谢,至少要有点尊严,别大声哀嚎,也别因为自己是个有戏剧性超级敏感的灵魂和自以为有资格的新来者,就指望别人象对待脆弱的洋娃娃那样对你。</p><p>有时候,即使你没有搞砸(或者只是别人想象你搞砸了), 有些人也会无缘无故地攻击你本人。在这种情况下,报怨倒是 真的 会把问题搞砸。</p><p>这些找茬者要么是毫无办法但自以为是专家的不中用家伙,要么就是测试你是否真会搞砸的心理专家。其它读者要么不理睬,要么用自己的方式对付他们。这些找茬者在给自己找麻烦,这点你不用操心。</p><p>也别让自己卷入口水战,大多数口水战最好不要理睬──当然,是在你核实它们只是口水战、没有指出你搞砸的地方,而且没有巧妙地将问题真正的答案藏于其中之后(这也是可能的)。</p><h3 id="提问禁忌">提问禁忌<a class="header-anchor" href="#提问禁忌"></a></h3><p>下面是些典型的愚蠢问题和黑客不回答它们时的想法。</p><p>问:我到哪可以找到某程序或 X 资源?</p><p>问:我怎样用 X 做 Y?</p><p>问:如何配置我的 shell 提示?</p><p>问:我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 文档转为 TeX 格式吗?</p><p>问:我的{程序、配置、SQL 语句}不运行了</p><p>问:我的视窗电脑出问题了,你能帮忙吗?</p><p>问:我的程序不运行了,我认为系统工具X有问题</p><p>问:我安装 Linux 或 X 遇到困难,你能帮忙吗?</p><p>问:我如何才能破解超级用户口令/盗取通道操作员的特权/查看某人的电子邮件?</p><hr><p>问:</p><blockquote><p>我到哪可以找到某程序或 X 资源?</p></blockquote><p>答:</p><blockquote><p>在我找到它的同样地方,笨旦──在网页搜索引擎上。上帝啊,难道还有人不知道如何使用 谷歌 吗?</p></blockquote><p>问:</p><blockquote><p>我怎样用 X 做 Y?</p></blockquote><p>答:</p><blockquote><p>如果你想解决的是 Y,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对要解决的 Y 问题糊涂,还被特定形势禁锢了思维。等他们把问题弄好再说。</p></blockquote><p>问:</p><blockquote><p>如何配置我的 shell 提示?</p></blockquote><p>答:</p><blockquote><p>如果你有足够的智慧提这个问题,你也该有足够的智慧去 “读读该死的手册”(RTFM),然后自己去找出来。</p></blockquote><p>问:</p><blockquote><p>我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 文档转为 TeX 格式吗?</p></blockquote><p>答:</p><blockquote><p>试试就知道了。如果你试过,你既知道了答案,又不用浪费我的时间了。</p></blockquote><p>问:</p><blockquote><p>我的{程序、配置、SQL 语句}不运行了</p></blockquote><p>答:</p><blockquote><p>这不是一个问题,我也没有兴趣去猜你有什么问题──我有更要紧的事要做。看到这种东西,我的反应一般如下:</p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>你还有什么补充吗?</p></li><li class="lvl-2"><p>噢,太糟了,希望你能搞定。</p></li><li class="lvl-2"><p>这跟我究竟有什么关系?</p></li></ul><p>问:</p><blockquote><p>我的视窗电脑出问题了,你能帮忙吗?</p></blockquote><p>答:</p><blockquote><p>是的,把视窗垃圾删了,装个象 Linux 或 BSD 的开源操作系统吧。</p></blockquote><p>注意:如果程序有官方的视窗版或者与视窗有交互(如 Samba),你 可以 问与视窗相关的问题,只是别对问题是由视窗操作系统而不是程序本身造成的回复感到惊讶,因为视窗一般来说太差,这种说法一般都成立。</p><p>问:</p><blockquote><p>我的程序不运行了,我认为系统工具 X 有问题</p></blockquote><p>答:</p><blockquote><p>你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与库文件有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文档作后盾。</p></blockquote><p>问:</p><blockquote><p>我安装 Linux 或 X 遇到困难,你能帮忙吗?</p></blockquote><p>答:</p><blockquote><p>不行,我需要亲手操作你的电脑才能帮你排错,去向当地的 Linux 用户组寻求方便的帮助(你可以在 这里 找到用户组列表)</p></blockquote><p>注意:如果安装问题与某 Linux 发行版有关,在针对 它 的邮件列表、论坛或本地用户组织中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 “linux”和 所有 被怀疑的硬件 [作关键词] 仔细搜索。</p><p>问:</p><blockquote><p>我如何才能破解超级用户口令/盗取通道操作员的特权/查看某人的电子邮件?</p></blockquote><p>答:</p><blockquote><p>想做这种事情说明你是个卑劣的家伙,想让黑客教你做这种事情说明你是个白痴。</p></blockquote><h4 id="好问题与坏问题">好问题与坏问题<a class="header-anchor" href="#好问题与坏问题"></a></h4><p>最后,我将通过举例来演示提问的智慧。同样的问题两种提法,一种愚蠢,另一种明智。</p><p>愚蠢:我在哪能找到关于 Foonly Flurbamatic 设备的东西?</p><blockquote><p>这个问题在乞求得到 “搜搜该死的网络”(STFW) 式的回复。</p></blockquote><p>明智: 我用谷歌搜索过“Foonly Flurbamatic 2600”,但没有找到什么有用的,有谁知道在哪能找到这种设备的编程信息?</p><blockquote><p>这个人已经搜索过网络了,而且听起来他可能真的遇到了问题。</p></blockquote><p>愚蠢: 我不能编译某项目的源代码,它为什么这么破?</p><blockquote><p>提问者假设是别人搞砸了,太自大了。</p></blockquote><p>明智: 某项目的源代码不能在某 Linux 6.2 版下编译。我读了常见问题文档,但其中没有与某 Linux 相关的内容。这是编译时的记录,我做错了什么吗?</p><blockquote><p>提问者已经指明了运行环境,读了常见问题文档(FAQ),列出了错误,也没有假设问题是别人的过错,这家伙值得注意。</p></blockquote><p>愚蠢: 我的主板有问题,谁能帮我?</p><blockquote><p>某黑客对此的反应可能是:“是的,还需要帮你拍背和换尿布吗?”,然后是敲下删除键。</p></blockquote><p>明智: 我在 S2464 主板上试过 X、Y 和 Z,当它们都失败后,又试了 A、B 和 C。注意我试 C 时的奇怪症状,显然某某东西正在做某某事情,这不是期望的行为。通常在 Athlon MP 主板上导致某某事情的原因是什么?有谁知道我还能再试点什么以确定问题?</p><blockquote><p>相反地,这个人看来值得回答。他或她展现了解决问题的能力而不是坐等天上掉馅饼。</p></blockquote><p>在最后那个问题中,注意“给我一个回答”与“请帮我看看我还能再做点什么测试以得到启发”之间细微但重要的差别。</p><p>事实上,最后那个问题基本上源于 2001 年 8 月 Linux 内核邮件列表(lkml)上的真实事件,是我(Eric)当时提了那个问题,我发现 Tyan S2462 主板有神秘的死机现象,邮件列表成员给我提供了解决此问题的关键信息。</p><p>通过这种提问方式,我给了别人可以咀嚼玩味的东西。我设法使之对参与者既轻松又有吸引力,也表明了对同行能力的尊敬并邀请他们与我一起协商。通过告诉他们我已经走过的弯路,我还表明了对他们宝贵时间的尊重。</p><p>事后,当我感谢大家并评论这次良好的经历时,一个 Linux 内核邮件列表的成员谈到,他认为我得到答案并不是因为我的名字挂在列表上,而只是因为我正确的提问方式。</p><p>黑客们在某种方面是非常不留情面的精英分子。我想在这事上他是对的,如果我 表现得 象个不劳而获的寄生虫,不管我是谁都会被忽略或斥责。他建议将整个事件作为对其它人提问的指导,这直接导致了本文的编写。</p><h3 id="如果得不到回答">如果得不到回答<a class="header-anchor" href="#如果得不到回答"></a></h3><p>如果得不到回答,请不要认为我们不想帮你,有时只是因为被问到的小组成员的确不知道答案。没有回复不等于不被理睬,当然必须承认从外面很难看出两者的差别。</p><p>一般而言,直接将问题再张贴一次不好,这会被视为毫无意义的骚扰。耐心一点,知道你问题答案的人可能生活在不同的时区,有可能正在睡觉,也有可能你的问题一开始就没有组织好。</p><p>还有其它资源可以寻求帮助,通常是在一些面向新手的资源中。</p><p>有许多在线与本地的用户组织,虽然它们自己不编写任何软件,但是对软件很热心。这些用户组通常因互助和帮助新手而形成。</p><p>还有众多大小商业公司提供签约支持服务,别因为要付点钱才有支持就感到沮丧!毕竟,如果你车子的汽缸垫烧了,你多半还得花钱找个修理店把它弄好。即使软件没花你一分钱,你总不能指望服务支持都是免费的。</p><p>象 Linux 这样流行的软件,每个开发者至少有一万个以上的用户,一个人不可能应付这么多用户的服务要求。记住,即使你必须付费才能得到支持,也比你还得额外花钱买软件要少得多(而且对封闭源代码软件的服务支持与开源软件相比通常还要贵一点,也要差一点)。</p><h3 id="如何更好地回答">如何更好地回答<a class="header-anchor" href="#如何更好地回答"></a></h3><p>态度和善一点。问题带来的压力常使人显得无礼或愚蠢,其实并不是这样。</p><p>对初犯者私下回复。 对那些坦诚犯错之人没有必要当众羞辱,一个真正的新手也许连怎么搜索或在哪找 FAQ 都不知道。</p><p>如果你不确定,一定要说出来! 一个听起来权威的错误回复比没有还要糟,别因为听起来象个专家好玩就给别人乱指路。要谦虚和诚实,给提问者与同行都树个好榜样。</p><p>如果帮不了忙,别妨碍。 不要在具体步骤上开玩笑,那样也许会毁了用户的安装──有些可怜的呆瓜会把它当成真的指令。</p><p>探索性的反问以引出更多的细节。 如果你做得好,提问者可以学到点东西──你也可以。试试将很差的问题转变成好问题,别忘了我们都曾是新手。</p><p>尽管对那些懒虫报怨一声“读读该死的手册”(RTFM)是正当的,指出文档的位置(即使只是建议做个谷歌关键词搜索)会更好</p><p>如果你决意回答,给出好的答案。 当别人正在用错误的工具或方法时别建议笨拙的权宜之计,应推荐更好的工具,重新组织问题。</p><p>请回答真正的问题!如果提问者已经做了自己该做的研究,并且说明尝试过<code> X,Y,Z,A,B 与 C</code> 都没有得到想要的結果,那么回复 <code>试试 A 或 B</code> 或者给出一个内容为 <code>试一下 X,Y,Z,A,B 或 C</code> 的链接将极其无益!</p><p>帮助你的社区从中学习。当回复一个好问题时,问问自己 <code>如何修改相关文件或 FAQ 文档以免再次解答同样的问题?</code>,接着再向文档维护者发一份补丁。</p><p>如果你是在研究一番后才做出的回答,展现你的技巧而不是直接端出结果。毕竟“授人以鱼,不如授人以渔”。</p><h3 id="相关资源">相关资源<a class="header-anchor" href="#相关资源"></a></h3><p>如果需要个人电脑、Unix 和互联网如何工作的基础知识,参阅 <a href="http://en.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/">Unix 和互联网工作的基本原理</a>。</p><p>当你发布软件或补丁时,试着按 <a href="http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html">软件发布实践</a> 操作。</p><h3 id="鸣谢">鸣谢<a class="header-anchor" href="#鸣谢"></a></h3><p>伊夫林.米切尔(Evelyn Mitchell)贡献了一些愚蠢问题例子并启发了编写<code>如何更好地回答问题</code>这一节,米哈伊尔.罗门迪克(Mikhail Ramendik)贡献了一些特别有价值的建议和改进。</p>]]></content>
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
<categories>
|
|
127
|
+
|
|
128
|
+
<category> 转载 </category>
|
|
129
|
+
|
|
130
|
+
</categories>
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
<tags>
|
|
134
|
+
|
|
135
|
+
<tag> GitHub </tag>
|
|
136
|
+
|
|
137
|
+
<tag> 转载 </tag>
|
|
138
|
+
|
|
139
|
+
<tag> 学习 </tag>
|
|
140
|
+
|
|
141
|
+
</tags>
|
|
142
|
+
|
|
143
|
+
</entry>
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
<entry>
|
|
148
|
+
<title>03_转载-中文文案排版指北</title>
|
|
149
|
+
<link href="/posts/3e42a4ef.html"/>
|
|
150
|
+
<url>/posts/3e42a4ef.html</url>
|
|
151
|
+
|
|
152
|
+
<content type="html"><![CDATA[<p>原文:<a href="https://github.com/sparanoid/chinese-copywriting-guidelines/blob/master/README.zh-Hans.md#%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%88%E6%8E%92%E7%89%88%E6%8C%87%E5%8C%97">https://github.com/sparanoid/chinese-copywriting-guidelines</a></p><p>统一中文文案、排版的相关用法,降低团队成员之间的沟通成本,增强网站气质。</p><h2 id="空格">空格<a class="header-anchor" href="#空格"></a></h2><blockquote><p>「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。</p><p>与大家共勉之。」——<a href="https://github.com/vinta/pangu.js">vinta/paranoid-auto-spacing</a></p></blockquote><h3 id="中英文之间需要增加空格">中英文之间需要增加空格<a class="header-anchor" href="#中英文之间需要增加空格"></a></h3><p>正确:</p><blockquote><p>在 LeanCloud 上,数据存储是围绕 <code>AVObject</code> 进行的。</p></blockquote><p>错误:</p><blockquote><p>在LeanCloud上,数据存储是围绕<code>AVObject</code>进行的。</p><p>在 LeanCloud上,数据存储是围绕<code>AVObject</code> 进行的。</p></blockquote><p>完整的正确用法:</p><blockquote><p>在 LeanCloud 上,数据存储是围绕 <code>AVObject</code> 进行的。每个 <code>AVObject</code> 都包含了与 JSON 兼容的 key-value 对应的数据。数据是 schema-free 的,你不需要在每个 <code>AVObject</code> 上提前指定存在哪些键,只要直接设定对应的 key-value 即可。</p></blockquote><p>例外:「豆瓣FM」等产品名词,按照官方所定义的格式书写。</p><h3 id="中文与数字之间需要增加空格">中文与数字之间需要增加空格<a class="header-anchor" href="#中文与数字之间需要增加空格"></a></h3><p>正确:</p><blockquote><p>今天出去买菜花了 5000 元。</p></blockquote><p>错误:</p><blockquote><p>今天出去买菜花了 5000元。</p><p>今天出去买菜花了5000元。</p></blockquote><h3 id="数字与单位之间需要增加空格">数字与单位之间需要增加空格<a class="header-anchor" href="#数字与单位之间需要增加空格"></a></h3><p>正确:</p><blockquote><p>我家的光纤入屋宽带有 10 Gbps,SSD 一共有 20 TB</p></blockquote><p>错误:</p><blockquote><p>我家的光纤入屋宽带有 10Gbps,SSD 一共有 20TB</p></blockquote><p>例外:度数/百分比与数字之间不需要增加空格:</p><p>正确:</p><blockquote><p>角度为 90° 的角,就是直角。</p><p>新 MacBook Pro 有 15% 的 CPU 性能提升。</p></blockquote><p>错误:</p><blockquote><p>角度为 90 ° 的角,就是直角。</p><p>新 MacBook Pro 有 15 % 的 CPU 性能提升。</p></blockquote><h3 id="全角标点与其他字符之间不加空格">全角标点与其他字符之间不加空格<a class="header-anchor" href="#全角标点与其他字符之间不加空格"></a></h3><p>正确:</p><blockquote><p>刚刚买了一部 iPhone,好开心!</p></blockquote><p>错误:</p><blockquote><p>刚刚买了一部 iPhone ,好开心!</p><p>刚刚买了一部 iPhone, 好开心!</p></blockquote><h3 id="用-text-spacing-来挽救?">用 <code>text-spacing</code> 来挽救?<a class="header-anchor" href="#用-text-spacing-来挽救?"></a></h3><p>CSS Text Module Level 4 的 <a href="https://www.w3.org/TR/css-text-4/#text-spacing-property"><code>text-spacing</code></a> 和 Microsoft 的 <a href="https://msdn.microsoft.com/library/ms531164(v=vs.85).aspx"><code>-ms-text-autospace</code></a> 可以实现自动为中英文之间增加空白。不过目前并未普及,另外在其他应用场景,例如 macOS、iOS、Windows 等用户界面目前并不存在这个特性,所以请继续保持随手加空格的习惯。</p><h2 id="标点符号">标点符号<a class="header-anchor" href="#标点符号"></a></h2><h3 id="不重复使用标点符号">不重复使用标点符号<a class="header-anchor" href="#不重复使用标点符号"></a></h3><p>虽然中国大陆的标点符号用法允许重复使用标点符号,但是这么做会破坏句子的美观性。</p><p>正确:</p><blockquote><p>德国队竟然战胜了巴西队!</p><p>她竟然对你说「喵」?!</p></blockquote><p>错误:</p><blockquote><p>德国队竟然战胜了巴西队!!</p><p>德国队竟然战胜了巴西队!!!!!!!!</p><p>她竟然对你说「喵」??!!</p><p>她竟然对你说「喵」?!?!??!!</p></blockquote><h2 id="全角和半角">全角和半角<a class="header-anchor" href="#全角和半角"></a></h2><p>不明白什么是全角(全形)与半角(半形)符号?请查看维基百科条目『<a href="https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2">全角和半角</a>』。</p><h3 id="使用全角中文标点">使用全角中文标点<a class="header-anchor" href="#使用全角中文标点"></a></h3><p>正确:</p><blockquote><p>嗨!你知道嘛?今天前台的小妹跟我说「喵」了哎!</p><p>核磁共振成像(NMRI)是什么原理都不知道?JFGI!</p></blockquote><p>错误:</p><blockquote><p>嗨! 你知道嘛? 今天前台的小妹跟我说 “喵” 了哎!</p><p>嗨!你知道嘛?今天前台的小妹跟我说"喵"了哎!</p><p>核磁共振成像 (NMRI) 是什么原理都不知道? JFGI!</p><p>核磁共振成像(NMRI)是什么原理都不知道?JFGI!</p></blockquote><p>例外:中文句子内夹有英文书籍名、报刊名时,不应借用中文书名号,应以英文斜体表示。</p><h3 id="数字使用半角字符">数字使用半角字符<a class="header-anchor" href="#数字使用半角字符"></a></h3><p>正确:</p><blockquote><p>这个蛋糕只卖 1000 元。</p></blockquote><p>错误:</p><blockquote><p>这个蛋糕只卖 1000 元。</p></blockquote><p>例外:在设计稿、宣传海报中如出现极少量数字的情形时,为方便文字对齐,是可以使用全角数字的。</p><h3 id="遇到完整的英文整句、特殊名词,其内容使用半角标点">遇到完整的英文整句、特殊名词,其内容使用半角标点<a class="header-anchor" href="#遇到完整的英文整句、特殊名词,其内容使用半角标点"></a></h3><p>正确:</p><blockquote><p>乔布斯那句话是怎么说的?「Stay hungry, stay foolish.」</p><p>推荐你阅读 <em>Hackers & Painters: Big Ideas from the Computer Age</em>,非常地有趣。</p></blockquote><p>错误:</p><blockquote><p>乔布斯那句话是怎么说的?「Stay hungry,stay foolish。」</p><p>推荐你阅读《Hackers&Painters:Big Ideas from the Computer Age》,非常的有趣。</p></blockquote><h2 id="名词">名词<a class="header-anchor" href="#名词"></a></h2><h3 id="专有名词使用正确的大小写">专有名词使用正确的大小写<a class="header-anchor" href="#专有名词使用正确的大小写"></a></h3><p>大小写相关用法原属于英文书写范畴,不属于本 wiki 讨论内容,在这里只对部分易错用法进行简述。</p><p>正确:</p><blockquote><p>使用 GitHub 登录</p><p>我们的客户有 GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。</p></blockquote><p>错误:</p><blockquote><p>使用 github 登录</p><p>使用 GITHUB 登录</p><p>使用 Github 登录</p><p>使用 gitHub 登录</p><p>使用 gイんĤЦ8 登录</p><p>我们的客户有 github、foursquare、microsoft corporation、google、facebook, inc.。</p><p>我们的客户有 GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。</p><p>我们的客户有 Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。</p><p>我们的客户有 gitHub、fourSquare、microSoft Corporation、google、faceBook, Inc.。</p><p>我们的客户有 gイんĤЦ8、キouЯƧquムгє、๓เςг๏ร๏Ŧt ς๏гק๏гคtเ๏ภn、900913、ƒ4ᄃëв๏๏к, IПᄃ.。</p></blockquote><p>注意:当网页中需要配合整体视觉风格而出现全部大写/小写的情形,HTML 中请使用标淮的大小写规范进行书写;并通过 <code>text-transform: uppercase;</code>/<code>text-transform: lowercase;</code> 对表现形式进行定义。</p><h3 id="不要使用不地道的缩写">不要使用不地道的缩写<a class="header-anchor" href="#不要使用不地道的缩写"></a></h3><p>正确:</p><blockquote><p>我们需要一位熟悉 TypeScript、HTML5,至少理解一种框架(如 React、Next.js)的前端开发者。</p></blockquote><p>错误:</p><blockquote><p>我们需要一位熟悉 Ts、h5,至少理解一种框架(如 RJS、nextjs)的 FED。</p></blockquote><h2 id="争议">争议<a class="header-anchor" href="#争议"></a></h2><p>以下用法略带有个人色彩,即:无论是否遵循下述规则,从语法的角度来讲都是<strong>正确</strong>的。</p><h3 id="链接之间增加空格">链接之间增加空格<a class="header-anchor" href="#链接之间增加空格"></a></h3><p>用法:</p><blockquote><p>请 <a href="#">提交一个 issue</a> 并分配给相关同事。</p><p>访问我们网站的最新动态,请 <a href="#">点击这里</a> 进行订阅!</p></blockquote><p>对比用法:</p><blockquote><p>请<a href="#">提交一个 issue</a>并分配给相关同事。</p><p>访问我们网站的最新动态,请<a href="#">点击这里</a>进行订阅!</p></blockquote><h3 id="简体中文使用直角引号">简体中文使用直角引号<a class="header-anchor" href="#简体中文使用直角引号"></a></h3><p>用法:</p><blockquote><p>「老师,『有条不紊』的『紊』是什么意思?」</p></blockquote><p>对比用法:</p><blockquote><p>“老师,‘有条不紊’的‘紊’是什么意思?”</p></blockquote><h2 id="工具">工具<a class="header-anchor" href="#工具"></a></h2><table><thead><tr><th>仓库</th><th>系列</th><th>语言</th></tr></thead><tbody><tr><td><a href="https://github.com/vinta/pangu.js">pangu.js</a></td><td rowspan="9">pangu</td><td>JavaScript</td></tr><tr><td><a href="https://github.com/vinta/pangu">pangu-go</a></td><td>Go</td></tr><tr><td><a href="https://github.com/vinta/pangu.java">pangu.java</a></td><td>Java</td></tr><tr><td><a href="https://github.com/vinta/pangu.py">pangu.py</a></td><td>Python</td></tr><tr><td><a href="https://github.com/dlackty/pangu.rb">pangu.rb</a></td><td>Ruby</td></tr><tr><td><a href="https://github.com/cchlorine/pangu.php">pangu.php</a></td><td>PHP</td></tr><tr><td><a href="https://github.com/hotoo/pangu.vim">pangu.vim</a></td><td>Vim</td></tr><tr><td><a href="https://github.com/serkodev/vue-pangu">vue-pangu</a></td><td>Vue.js (Web Converter)</td></tr><tr><td><a href="https://plugins.jetbrains.com/plugin/19665-pangu">intellij-pangu</a></td><td>Intellij Platform Plugin</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect">autocorrect</a></td><td rowspan="9">autocorrect</td><td>Rust, WASM, CLI tool</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect/tree/main/autocorrect-node">autocorrect-node</a></td><td>Node.js</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect/tree/main/autocorrect-py">autocorrect-py</a></td><td>Python</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect/tree/main/autocorrect-rb">autocorrect-rb</a></td><td>Ruby</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect/tree/main/autocorrect-java">autocorrect-java</a></td><td>Java</td></tr><tr><td><a href="https://github.com/longbridgeapp/autocorrect">autocorrect-go</a></td><td>Go</td></tr><tr><td><a href="https://github.com/NauxLiu/auto-correct">autocorrect-php</a></td><td>PHP</td></tr><tr><td><a href="https://marketplace.visualstudio.com/items?itemName=huacnlee.autocorrect">autocorrect-vscode</a></td><td>VS Code Extension</td></tr><tr><td><a href="https://plugins.jetbrains.com/plugin/20244-autocorrect">autocorrect-idea-plugin</a></td><td>Intellij Platform Plugin</td></tr><tr><td><a href="https://github.com/jxlwqq/chinese-typesetting">jxlwqq/chinese-typesetting</a></td><td rowspan="6">other</td><td>PHP</td></tr><tr><td><a href="https://github.com/sparanoid/space-lover">sparanoid/space-lover</a></td><td>PHP (WordPress)</td></tr><tr><td><a href="https://github.com/sparanoid/grunt-auto-spacing">sparanoid/grunt-auto-spacing</a></td><td>Node.js (Grunt)</td></tr><tr><td><a href="https://github.com/hjiang/scripts/blob/master/add-space-between-latin-and-cjk">hjiang/scripts/add-space-between-latin-and-cjk</a></td><td rowspan="3">Python</td></tr><tr><td><a href="https://github.com/hustcc/hint">hustcc/hint</a></td></tr><tr><td><a href="https://github.com/n0vad3v/Tekorrect">n0vad3v/Tekorrect</a></td></tr></tbody></table><h2 id="谁在这样做?">谁在这样做?<a class="header-anchor" href="#谁在这样做?"></a></h2><table><thead><tr><th>网站</th><th>文案</th><th>UGC</th></tr></thead><tbody><tr><td><a href="https://www.apple.com/cn/">Apple 中国</a></td><td rowspan="11">是</td><td rowspan="7">N/A</td></tr><tr><td><a href="https://www.apple.com/hk/">Apple 香港</a></td></tr><tr><td><a href="https://www.apple.com/tw/">Apple 台湾</a></td></tr></tr></tr></tr></tr><tr><td><a href="https://www.v2ex.com/">V2EX</a></td><td>是</td></tr><tr><td><a href="https://apple4us.com/">Apple4us</a></td><td>N/A</td></tr><tr><td><a href="https://ruby-china.org/">Ruby China</a></td><td>是</td></tr><tr><td><a href="https://sspai.com/">少数派</a></td><td>N/A</td></tr></tbody></table><h2 id="参考文献">参考文献<a class="header-anchor" href="#参考文献"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><a href="https://www.thoughtco.com/guidelines-for-using-capital-letters-1691724">Guidelines for Using Capital Letters - ThoughtCo.</a></p></li><li class="lvl-2"><p><a href="https://en.wikipedia.org/wiki/Letter_case">Letter case - Wikipedia</a></p></li><li class="lvl-2"><p><a href="https://en.oxforddictionaries.com/grammar/punctuation">Punctuation - Oxford Dictionaries</a></p></li><li class="lvl-2"><p><a href="https://owl.english.purdue.edu/owl/section/1/6/">Punctuation - The Purdue OWL</a></p></li><li class="lvl-2"><p><a href="https://www.wikihow.com/Use-English-Punctuation-Correctly">How to Use English Punctuation Correctly - wikiHow</a></p></li><li class="lvl-2"><p><a href="https://zh.opensuse.org/index.php?title=Help:%E6%A0%BC%E5%BC%8F">格式 - openSUSE</a></p></li><li class="lvl-2"><p><a href="https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2">全形和半形 - 维基百科</a></p></li><li class="lvl-2"><p><a href="https://zh.wikipedia.org/wiki/%E5%BC%95%E8%99%9F">引号 - 维基百科</a></p></li><li class="lvl-2"><p><a href="https://zh.wikipedia.org/wiki/%E7%96%91%E5%95%8F%E9%A9%9A%E5%98%86%E8%99%9F">疑问惊叹号 - 维基百科</a></p></li></ul><h2 id="Forks">Forks<a class="header-anchor" href="#Forks"></a></h2><p>衍生项目的用法可能与本项目存在差异。</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/mzlogin/chinese-copywriting-guidelines">mzlogin/chinese-copywriting-guidelines</a></p></li></ul>]]></content>
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
<categories>
|
|
156
|
+
|
|
157
|
+
<category> 转载 </category>
|
|
158
|
+
|
|
159
|
+
</categories>
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
<tags>
|
|
163
|
+
|
|
164
|
+
<tag> GitHub </tag>
|
|
165
|
+
|
|
166
|
+
<tag> 转载 </tag>
|
|
167
|
+
|
|
168
|
+
<tag> 学习 </tag>
|
|
169
|
+
|
|
170
|
+
</tags>
|
|
171
|
+
|
|
172
|
+
</entry>
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
|
|
6
176
|
<entry>
|
|
7
177
|
<title>11_Hexo-GitHub Actions 自动部署博客</title>
|
|
8
178
|
<link href="/posts/8b765f7a.html"/>
|
|
@@ -315,7 +485,7 @@
|
|
|
315
485
|
<link href="/posts/3ffec809.html"/>
|
|
316
486
|
<url>/posts/3ffec809.html</url>
|
|
317
487
|
|
|
318
|
-
<content type="html"><![CDATA[<h2 id="2023-02-06-更新">2023/02/06 更新<a class="header-anchor" href="#2023-02-06-更新"></a></h2><p>VSCode 集成了 <code>某路径下的文件批量替换指定内容</code> 的功能,更方便</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202302061839251.png" alt="image-20230206183933193" style="zoom:50%;" /><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://www.jsdelivr.com/">jsd</a> 失效之后,博主使用了新的图床方案,需将文章的原 jsd 图片链接替换为新的图片地址</p><p>这类脚本在网上有很多,都很推荐,如</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p></li><li class="lvl-2"><p><a href="https://blog.zhheo.com/p/369dbf41.html">张洪Heo:用 Python 批量替换 md 文件内容</a></p></li><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/7a5857a0.html">Justlovesmile:如何自动下载、压缩并批量替换文章中的外链图片</a></p></li></ul><h2 id="2-脚本内容">2. 脚本内容<a class="header-anchor" href="#2-脚本内容"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p><p>脚本采用递归的方式,遍历 43~46 行 目录下的所有文件,进行批量替换</p><p>说明:</p><ol><li class="lvl-3"><p>根据自身情况修改 43~46 行 需遍历的目录;修改 47、48 行 需要替换的内容</p></li><li class="lvl-3"><p>脚本第 24 行 限制了只筛选出 Markdown 类型的文本文件进行修改,如需修改其他类型的文本文件 需自行更改后缀进行匹配</p></li><li class="lvl-3"><p>执行前请先备份源文件,以防出错后无法还原</p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">'/'</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">'.*\.md$'</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i 's/old_str/new_str/'</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"r"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"w"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = 'E:/code_zone/.history/20220831_blog/source/_posts/'</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-butterfly/source/_posts/'</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-
|
|
488
|
+
<content type="html"><![CDATA[<h2 id="2023-02-06-更新">2023/02/06 更新<a class="header-anchor" href="#2023-02-06-更新"></a></h2><p>VSCode 集成了 <code>某路径下的文件批量替换指定内容</code> 的功能,更方便</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202302061839251.png" alt="image-20230206183933193" style="zoom:50%;" /><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://www.jsdelivr.com/">jsd</a> 失效之后,博主使用了新的图床方案,需将文章的原 jsd 图片链接替换为新的图片地址</p><p>这类脚本在网上有很多,都很推荐,如</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p></li><li class="lvl-2"><p><a href="https://blog.zhheo.com/p/369dbf41.html">张洪Heo:用 Python 批量替换 md 文件内容</a></p></li><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/7a5857a0.html">Justlovesmile:如何自动下载、压缩并批量替换文章中的外链图片</a></p></li></ul><h2 id="2-脚本内容">2. 脚本内容<a class="header-anchor" href="#2-脚本内容"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p><p>脚本采用递归的方式,遍历 43~46 行 目录下的所有文件,进行批量替换</p><p>说明:</p><ol><li class="lvl-3"><p>根据自身情况修改 43~46 行 需遍历的目录;修改 47、48 行 需要替换的内容</p></li><li class="lvl-3"><p>脚本第 24 行 限制了只筛选出 Markdown 类型的文本文件进行修改,如需修改其他类型的文本文件 需自行更改后缀进行匹配</p></li><li class="lvl-3"><p>执行前请先备份源文件,以防出错后无法还原</p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">'/'</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">'.*\.md$'</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i 's/old_str/new_str/'</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"r"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"w"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = 'E:/code_zone/.history/20220831_blog/source/_posts/'</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-butterfly/source/_posts/'</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elujenuvet/image/'</span></span><br><span class="line">new_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elujenuvet/image/'</span></span><br><span class="line"></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"{} done {}"</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="3-参考文章">3. 参考文章<a class="header-anchor" href="#3-参考文章"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p>]]></content>
|
|
319
489
|
|
|
320
490
|
|
|
321
491
|
<categories>
|
|
@@ -871,7 +1041,7 @@
|
|
|
871
1041
|
<link href="/posts/63259.html"/>
|
|
872
1042
|
<url>/posts/63259.html</url>
|
|
873
1043
|
|
|
874
|
-
<content type="html"><![CDATA[<h2 id="一-前言">一. 前言<a class="header-anchor" href="#一-前言"></a></h2><p>因 <a href="https://www.jsdelivr.com/">https://www.jsdelivr.com/</a> 失效,博主打算将 GitHub 托管的图床备份到其他平台。</p><p>网上看到 <a href="https://github.com/lsky-org/lsky-pro">兰空图床</a> 萌生了自建图床的念头,搭建环境要求 PHP >= 8.0.2,于是打算编译安装 PHP。</p><p>最终因服务器配置太低(1核2G)编译失败而放弃。转而投身之前已经搭建好环境的又拍云平台。</p><p>博文内容:<code>PHP-CentOS8.2 编译安装 PHP8.1.10</code> + <code>编写GitHub图床迁移至又拍云的脚本(ftp)</code> + <code>编写批量修改文章内容的脚本</code></p><h2 id="二-正文">二. 正文<a class="header-anchor" href="#二-正文"></a></h2><h3 id="2-1❤-CentOS8-2-编译安装-PHP8-1-10">2.1❤ CentOS8.2 编译安装 PHP8.1.10<a class="header-anchor" href="#2-1❤-CentOS8-2-编译安装-PHP8-1-10"></a></h3><p><strong>2.1.1</strong> PHP8 和 oniguruma 源码下载并上传至服务器 /mnt 目录</p><p><a href="https://www.php.net/distributions/php-8.1.10.tar.gz">https://www.php.net/distributions/php-8.1.10.tar.gz</a></p><p><a href="https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4">https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解压</span></span><br><span class="line">tar xzf oniguruma-6.9.4.tar.gz</span><br><span class="line">tar xzf php-8.1.10.tar.gz</span><br></pre></td></tr></table></figure><p><strong>2.1.2</strong> 安装 PHP8 依赖包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 2 安装 PHP8 依赖包</span></span><br><span class="line">yum -y install autoconf freetype gd libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel net-snmp-devel libjpeg-devel php-ldap openldap-devel openldap-clients freetype-devel gmp-devel libzip libzip-devel sqlite-devel automake libtool</span><br></pre></td></tr></table></figure><p><strong>2.1.3</strong> 编译 PHP8 依赖包 oniguruma</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 3.1 生成 configure</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/oniguruma-6.9.4</span><br><span class="line">./autogen.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.2 生成编译配置文件</span></span><br><span class="line">./configure --prefix=/usr</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.3 编译并安装</span></span><br><span class="line">make && make install</span><br></pre></td></tr></table></figure><p><strong>2.1.4</strong> 编译 PHP8 主包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 4.1 生成编译配置文件</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/php-8.1.10</span><br><span class="line">./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-opcache --with-pcre-jit --enable-gd --with-jpeg --with-freetype --with-gettext --with-curl --with-openssl --enable-sockets --enable-mbstring --enable-xml --with-zip --with-zlib --with-snmp --with-mhash --enable-ftp --enable-bcmath --enable-soap --enable-shmop --enable-sysvsem --enable-pcntl --with-gmp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4.2 编译并安装</span></span><br><span class="line">make && make install</span><br></pre></td></tr></table></figure><p>因为配置过低,编译失败。</p><p><strong>2.1.5</strong> 编译安装后目录</p><p>/usr/local/php</p><p><strong>参考</strong></p><p><a href="https://www.bilibili.com/read/cv9248283/">https://www.bilibili.com/read/cv9248283/</a></p><p><a href="https://www.bilibili.com/video/BV13U4y1T7VS">https://www.bilibili.com/video/BV13U4y1T7VS</a></p><h3 id="2-2-基于-FTP-将GitHub图床迁移至又拍云">2.2 基于 FTP 将GitHub图床迁移至又拍云<a class="header-anchor" href="#2-2-基于-FTP-将GitHub图床迁移至又拍云"></a></h3><p><strong>参考</strong></p><p><a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">官方视频教程 - 创建存储服务和使用 FTP 上传</a>可以得到用户名和密码</p><p>默认已经完成了又拍云云存储服务的申请 + 绑定自定义域名 <a href="https://help.upyun.com/knowledge-base/quick_start/">https://help.upyun.com/knowledge-base/quick_start/</a></p><p><strong>2.2.1</strong> 编写 Python 脚本 实现批量</p><p>源码来自<a href="http://blog.csdn.net/ouyang_peng/article/details/79271113">http://blog.csdn.net/ouyang_peng/article/details/79271113</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cmath <span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> ftplib <span class="keyword">import</span> FTP</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyFTP</span>:</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> ftp自动下载、自动上传脚本,可以递归目录操作</span></span><br><span class="line"><span class="string"> 作者:欧阳鹏</span></span><br><span class="line"><span class="string"> 博客地址:http://blog.csdn.net/ouyang_peng/article/details/79271113</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host, port=<span class="number">21</span></span>):</span><br><span class="line"> <span class="string">""" 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> host:ip地址</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> port:端口号</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="comment"># print("__init__()---> host = %s ,port = %s" % (host, port))</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.host = host</span><br><span class="line"> <span class="variable language_">self</span>.port = port</span><br><span class="line"> <span class="variable language_">self</span>.ftp = FTP()</span><br><span class="line"> <span class="comment"># 重新设置下编码方式</span></span><br><span class="line"> <span class="comment">#self.ftp.encoding = 'gbk'</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.encoding = <span class="string">'utf8'</span></span><br><span class="line"> <span class="comment"># 获取脚本路径</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__))</span><br><span class="line"> <span class="variable language_">self</span>.log_file = <span class="built_in">open</span>(path + <span class="string">"/log.txt"</span>, <span class="string">"a"</span>, encoding=<span class="string">'utf-8'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>):</span><br><span class="line"> <span class="string">""" 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> username: 用户名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> password: 密码</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> timeout = <span class="number">60</span></span><br><span class="line"> socket.setdefaulttimeout(timeout)</span><br><span class="line"> <span class="comment"># 0主动模式 1 #被动模式</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.set_pasv(<span class="literal">True</span>)</span><br><span class="line"> <span class="comment"># 打开调试级别2,显示详细信息</span></span><br><span class="line"> <span class="comment"># self.ftp.set_debuglevel(2)</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'开始尝试连接到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.connect(<span class="variable language_">self</span>.host, <span class="variable language_">self</span>.port)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'成功连接到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'开始尝试登录到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.login(username, password)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'成功登录到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="variable language_">self</span>.ftp.welcome)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.deal_error(<span class="string">"FTP 连接或登录失败 ,错误描述为:%s"</span> % err)</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">is_same_size</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""判断远程文件和本地文件大小是否一致</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> remote_file_size = <span class="variable language_">self</span>.ftp.size(remote_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print("is_same_size() 错误描述为:%s" % err)</span></span><br><span class="line"> remote_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> local_file_size = os.path.getsize(local_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print("is_same_size() 错误描述为:%s" % err)</span></span><br><span class="line"> local_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'local_file_size:%d , remote_file_size:%d'</span> % (local_file_size, remote_file_size))</span><br><span class="line"> <span class="keyword">if</span> remote_file_size == local_file_size:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""从ftp下载文件</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"download_file()---> local_path = %s ,remote_path = %s"</span> % (local_file, remote_file))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'%s 文件大小相同,无需下载'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'>>>>>>>>>>>>下载文件 %s ... ...'</span> % local_file)</span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">'wb'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.retrbinary(<span class="string">'RETR %s'</span> % remote_file, file_handler.write, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'下载文件出错,出现异常:%s '</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">"""从远程目录下载多个文件到本地目录</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file_tree()---> local_path = %s ,remote_path = %s"</span> % (local_path, remote_path))</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'远程目录%s不存在,继续...'</span> % remote_path + <span class="string">" ,具体错误描述为:%s"</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'本地目录%s不存在,先创建本地目录'</span> % local_path)</span><br><span class="line"> os.makedirs(local_path)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'切换至目录: %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"> <span class="comment"># 方法回调</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.<span class="built_in">dir</span>(<span class="variable language_">self</span>.get_file_list)</span><br><span class="line"></span><br><span class="line"> remote_names = <span class="variable language_">self</span>.file_list</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'远程目录 列表: %s'</span> % remote_names)</span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> remote_names:</span><br><span class="line"> file_type = item[<span class="number">0</span>]</span><br><span class="line"> file_name = item[<span class="number">1</span>]</span><br><span class="line"> local = os.path.join(local_path, file_name)</span><br><span class="line"> <span class="keyword">if</span> file_type == <span class="string">'d'</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file_tree()---> 下载目录: %s"</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file_tree(local, file_name)</span><br><span class="line"> <span class="keyword">elif</span> file_type == <span class="string">'-'</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file()---> 下载文件: %s"</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file(local, file_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">".."</span>)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'返回上层目录 %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""从本地上传文件到ftp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(local_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'%s 不存在'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'跳过相等的文件: %s'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">'rb'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.storbinary(<span class="string">'STOR %s'</span> % remote_file, file_handler, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'上传: %s'</span> % local_file + <span class="string">"成功!"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">"""从本地上传目录下多个文件到ftp</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'本地目录 %s 不存在'</span> % local_path)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'切换至远程目录: %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> local_name_list = os.listdir(local_path)</span><br><span class="line"> <span class="keyword">for</span> local_name <span class="keyword">in</span> local_name_list:</span><br><span class="line"> src = os.path.join(local_path, local_name)</span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(src):</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.mkd(local_name)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"目录已存在 %s ,具体错误描述为:%s"</span> % (local_name, err))</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"upload_file_tree()---> 上传目录: %s"</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file_tree(src, local_name)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"upload_file_tree()---> 上传文件: %s"</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file(src, local_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">".."</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">close</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="string">""" 退出ftp</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"close()---> FTP退出"</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.quit()</span><br><span class="line"> <span class="variable language_">self</span>.log_file.close()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">debug_print</span>(<span class="params">self, s</span>):</span><br><span class="line"> <span class="string">""" 打印日志</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.write_log(s)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">deal_error</span>(<span class="params">self, e</span>):</span><br><span class="line"> <span class="string">""" 处理错误异常</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> e:异常</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> log_str = <span class="string">'发生错误: %s'</span> % e</span><br><span class="line"> <span class="variable language_">self</span>.write_log(log_str)</span><br><span class="line"> sys.exit()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">write_log</span>(<span class="params">self, log_str</span>):</span><br><span class="line"> <span class="string">""" 记录日志</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> log_str:日志</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> time_now = time.localtime()</span><br><span class="line"> date_now = time.strftime(<span class="string">'%Y-%m-%d'</span>, time_now)</span><br><span class="line"> format_log_str = <span class="string">"%s ---> %s \n "</span> % (date_now, log_str)</span><br><span class="line"> <span class="built_in">print</span>(format_log_str)</span><br><span class="line"> <span class="variable language_">self</span>.log_file.write(format_log_str)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_list</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">""" 获取文件列表</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> file_arr = <span class="variable language_">self</span>.get_file_name(line)</span><br><span class="line"> <span class="comment"># 去除 . 和 ..</span></span><br><span class="line"> <span class="keyword">if</span> file_arr[<span class="number">1</span>] <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">'.'</span>, <span class="string">'..'</span>]:</span><br><span class="line"> <span class="variable language_">self</span>.file_list.append(file_arr)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_name</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">""" 获取文件名</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> pos = line.rfind(<span class="string">':'</span>)</span><br><span class="line"> <span class="keyword">while</span> (line[pos] != <span class="string">' '</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> (line[pos] == <span class="string">' '</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> file_arr = [line[<span class="number">0</span>], line[pos:]]</span><br><span class="line"> <span class="keyword">return</span> file_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line"> <span class="comment"># 清除日志</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__)) <span class="comment"># 脚本路径</span></span><br><span class="line"> <span class="keyword">if</span> os.path.exists(path + <span class="string">'/log.txt'</span>):</span><br><span class="line"> log_file = path + <span class="string">'/log.txt '</span><span class="keyword">if</span> os.sep == <span class="string">"/"</span> <span class="keyword">else</span> path + <span class="string">'\\'</span> + <span class="string">'log.txt'</span></span><br><span class="line"> subprocess.Popen(<span class="string">f'rm -rf <span class="subst">{log_file}</span>'</span>, shell=<span class="literal">True</span>)</span><br><span class="line"> time.sleep(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> my_ftp = MyFTP(<span class="string">"xxx.ftp.upyun.com"</span>)</span><br><span class="line"> my_ftp.login(<span class="string">"xxx/xxx"</span>, <span class="string">"xxx"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.download_file("E:/code_zone/image_bed/image/wallpaper/1.jpg", "/image/wallpaper/1.jpg")</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.upload_file("G:/ftp_test/Release/XTCLauncher.apk", "/App/AutoUpload/ouyangpeng/I12/Release/XTCLauncher.apk")</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载目录</span></span><br><span class="line"> <span class="comment"># image.cpen.top/image/ → 本地 E:/code_zone/image_bed/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">"\\"</span>:</span><br><span class="line"> my_ftp.download_file_tree(<span class="string">"E:/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>)</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">"/"</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.download_file_tree(<span class="string">"/root/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传目录</span></span><br><span class="line"> <span class="comment"># 本地 E:/code_zone/image_bed/image/ → image.cpen.top/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">"\\"</span>: <span class="comment"># Windows</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">"E:/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">"/"</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">"/root/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"><span class="comment"># python3 /root/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.2.2</strong> 说明</p><p><code>my_ftp.login("用户名xxx/xxx", "密码xxx")</code> 参考 <a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">https://techs.upyun.com/videos/cdnpage/creating_storage.html</a></p><p>后期又将脚本传到云服务器上,通过计划任务,每15分钟同步,保持 GitHub 与又拍云图床一致</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># root @ CentOS in ~ [18:05:59]</span></span><br><span class="line">$ crontab -l</span><br><span class="line">*/15 * * * * <span class="built_in">cd</span> /root/code_zone/image_bed/; git pull; python3 /root/code_zone/tools/python-ftp/ftp.py; bash git.sh</span><br></pre></td></tr></table></figure><p>迁移好图床后,博客中调用图片资源时 浏览器自动 http 跳 https,因为没有证书导致图片失效,于是又申请了 ssl 证书,上传至又拍云。</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220910180219146.png" alt=""></p></blockquote><h3 id="2-3-编写批量修改文章内容的脚本">2.3 编写批量修改文章内容的脚本<a class="header-anchor" href="#2-3-编写批量修改文章内容的脚本"></a></h3><p>源码参考<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">https://blog.csdn.net/qq_38150250/article/details/118026219</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">'/'</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">'.*\.md$'</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i 's/old_str/new_str/'</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"r"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"w"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = 'E:/code_zone/.history/20220831_blog/source/_posts/'</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-butterfly/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-diary/source/_posts/'</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fkahftbvxh/image/'</span></span><br><span class="line">new_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fkahftbvxh/image/'</span></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"{} done {}"</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.3.1</strong> 说明</p><p><code>search</code>函数指定文件类型为 .md,可获得文章的完整路径;</p><p><code>path_list</code>列表存放需要修改的文章父目录路径,可以递归查询子目录;</p><p><code>old_str</code>需要替换的内容</p><p><code>new_str</code>新内容</p>]]></content>
|
|
1044
|
+
<content type="html"><![CDATA[<h2 id="一-前言">一. 前言<a class="header-anchor" href="#一-前言"></a></h2><p>因 <a href="https://www.jsdelivr.com/">https://www.jsdelivr.com/</a> 失效,博主打算将 GitHub 托管的图床备份到其他平台。</p><p>网上看到 <a href="https://github.com/lsky-org/lsky-pro">兰空图床</a> 萌生了自建图床的念头,搭建环境要求 PHP >= 8.0.2,于是打算编译安装 PHP。</p><p>最终因服务器配置太低(1核2G)编译失败而放弃。转而投身之前已经搭建好环境的又拍云平台。</p><p>博文内容:<code>PHP-CentOS8.2 编译安装 PHP8.1.10</code> + <code>编写GitHub图床迁移至又拍云的脚本(ftp)</code> + <code>编写批量修改文章内容的脚本</code></p><h2 id="二-正文">二. 正文<a class="header-anchor" href="#二-正文"></a></h2><h3 id="2-1❤-CentOS8-2-编译安装-PHP8-1-10">2.1❤ CentOS8.2 编译安装 PHP8.1.10<a class="header-anchor" href="#2-1❤-CentOS8-2-编译安装-PHP8-1-10"></a></h3><p><strong>2.1.1</strong> PHP8 和 oniguruma 源码下载并上传至服务器 /mnt 目录</p><p><a href="https://www.php.net/distributions/php-8.1.10.tar.gz">https://www.php.net/distributions/php-8.1.10.tar.gz</a></p><p><a href="https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4">https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解压</span></span><br><span class="line">tar xzf oniguruma-6.9.4.tar.gz</span><br><span class="line">tar xzf php-8.1.10.tar.gz</span><br></pre></td></tr></table></figure><p><strong>2.1.2</strong> 安装 PHP8 依赖包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 2 安装 PHP8 依赖包</span></span><br><span class="line">yum -y install autoconf freetype gd libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel net-snmp-devel libjpeg-devel php-ldap openldap-devel openldap-clients freetype-devel gmp-devel libzip libzip-devel sqlite-devel automake libtool</span><br></pre></td></tr></table></figure><p><strong>2.1.3</strong> 编译 PHP8 依赖包 oniguruma</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 3.1 生成 configure</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/oniguruma-6.9.4</span><br><span class="line">./autogen.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.2 生成编译配置文件</span></span><br><span class="line">./configure --prefix=/usr</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.3 编译并安装</span></span><br><span class="line">make && make install</span><br></pre></td></tr></table></figure><p><strong>2.1.4</strong> 编译 PHP8 主包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 4.1 生成编译配置文件</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/php-8.1.10</span><br><span class="line">./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-opcache --with-pcre-jit --enable-gd --with-jpeg --with-freetype --with-gettext --with-curl --with-openssl --enable-sockets --enable-mbstring --enable-xml --with-zip --with-zlib --with-snmp --with-mhash --enable-ftp --enable-bcmath --enable-soap --enable-shmop --enable-sysvsem --enable-pcntl --with-gmp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4.2 编译并安装</span></span><br><span class="line">make && make install</span><br></pre></td></tr></table></figure><p>因为配置过低,编译失败。</p><p><strong>2.1.5</strong> 编译安装后目录</p><p>/usr/local/php</p><p><strong>参考</strong></p><p><a href="https://www.bilibili.com/read/cv9248283/">https://www.bilibili.com/read/cv9248283/</a></p><p><a href="https://www.bilibili.com/video/BV13U4y1T7VS">https://www.bilibili.com/video/BV13U4y1T7VS</a></p><h3 id="2-2-基于-FTP-将GitHub图床迁移至又拍云">2.2 基于 FTP 将GitHub图床迁移至又拍云<a class="header-anchor" href="#2-2-基于-FTP-将GitHub图床迁移至又拍云"></a></h3><p><strong>参考</strong></p><p><a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">官方视频教程 - 创建存储服务和使用 FTP 上传</a>可以得到用户名和密码</p><p>默认已经完成了又拍云云存储服务的申请 + 绑定自定义域名 <a href="https://help.upyun.com/knowledge-base/quick_start/">https://help.upyun.com/knowledge-base/quick_start/</a></p><p><strong>2.2.1</strong> 编写 Python 脚本 实现批量</p><p>源码来自<a href="http://blog.csdn.net/ouyang_peng/article/details/79271113">http://blog.csdn.net/ouyang_peng/article/details/79271113</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cmath <span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> ftplib <span class="keyword">import</span> FTP</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyFTP</span>:</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> ftp自动下载、自动上传脚本,可以递归目录操作</span></span><br><span class="line"><span class="string"> 作者:欧阳鹏</span></span><br><span class="line"><span class="string"> 博客地址:http://blog.csdn.net/ouyang_peng/article/details/79271113</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host, port=<span class="number">21</span></span>):</span><br><span class="line"> <span class="string">""" 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> host:ip地址</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> port:端口号</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="comment"># print("__init__()---> host = %s ,port = %s" % (host, port))</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.host = host</span><br><span class="line"> <span class="variable language_">self</span>.port = port</span><br><span class="line"> <span class="variable language_">self</span>.ftp = FTP()</span><br><span class="line"> <span class="comment"># 重新设置下编码方式</span></span><br><span class="line"> <span class="comment">#self.ftp.encoding = 'gbk'</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.encoding = <span class="string">'utf8'</span></span><br><span class="line"> <span class="comment"># 获取脚本路径</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__))</span><br><span class="line"> <span class="variable language_">self</span>.log_file = <span class="built_in">open</span>(path + <span class="string">"/log.txt"</span>, <span class="string">"a"</span>, encoding=<span class="string">'utf-8'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>):</span><br><span class="line"> <span class="string">""" 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> username: 用户名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> password: 密码</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> timeout = <span class="number">60</span></span><br><span class="line"> socket.setdefaulttimeout(timeout)</span><br><span class="line"> <span class="comment"># 0主动模式 1 #被动模式</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.set_pasv(<span class="literal">True</span>)</span><br><span class="line"> <span class="comment"># 打开调试级别2,显示详细信息</span></span><br><span class="line"> <span class="comment"># self.ftp.set_debuglevel(2)</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'开始尝试连接到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.connect(<span class="variable language_">self</span>.host, <span class="variable language_">self</span>.port)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'成功连接到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'开始尝试登录到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.login(username, password)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'成功登录到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="variable language_">self</span>.ftp.welcome)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.deal_error(<span class="string">"FTP 连接或登录失败 ,错误描述为:%s"</span> % err)</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">is_same_size</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""判断远程文件和本地文件大小是否一致</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> remote_file_size = <span class="variable language_">self</span>.ftp.size(remote_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print("is_same_size() 错误描述为:%s" % err)</span></span><br><span class="line"> remote_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> local_file_size = os.path.getsize(local_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print("is_same_size() 错误描述为:%s" % err)</span></span><br><span class="line"> local_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'local_file_size:%d , remote_file_size:%d'</span> % (local_file_size, remote_file_size))</span><br><span class="line"> <span class="keyword">if</span> remote_file_size == local_file_size:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""从ftp下载文件</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"download_file()---> local_path = %s ,remote_path = %s"</span> % (local_file, remote_file))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'%s 文件大小相同,无需下载'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'>>>>>>>>>>>>下载文件 %s ... ...'</span> % local_file)</span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">'wb'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.retrbinary(<span class="string">'RETR %s'</span> % remote_file, file_handler.write, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'下载文件出错,出现异常:%s '</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">"""从远程目录下载多个文件到本地目录</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file_tree()---> local_path = %s ,remote_path = %s"</span> % (local_path, remote_path))</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'远程目录%s不存在,继续...'</span> % remote_path + <span class="string">" ,具体错误描述为:%s"</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'本地目录%s不存在,先创建本地目录'</span> % local_path)</span><br><span class="line"> os.makedirs(local_path)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'切换至目录: %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"> <span class="comment"># 方法回调</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.<span class="built_in">dir</span>(<span class="variable language_">self</span>.get_file_list)</span><br><span class="line"></span><br><span class="line"> remote_names = <span class="variable language_">self</span>.file_list</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'远程目录 列表: %s'</span> % remote_names)</span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> remote_names:</span><br><span class="line"> file_type = item[<span class="number">0</span>]</span><br><span class="line"> file_name = item[<span class="number">1</span>]</span><br><span class="line"> local = os.path.join(local_path, file_name)</span><br><span class="line"> <span class="keyword">if</span> file_type == <span class="string">'d'</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file_tree()---> 下载目录: %s"</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file_tree(local, file_name)</span><br><span class="line"> <span class="keyword">elif</span> file_type == <span class="string">'-'</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file()---> 下载文件: %s"</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file(local, file_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">".."</span>)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'返回上层目录 %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""从本地上传文件到ftp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(local_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'%s 不存在'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'跳过相等的文件: %s'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">'rb'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.storbinary(<span class="string">'STOR %s'</span> % remote_file, file_handler, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'上传: %s'</span> % local_file + <span class="string">"成功!"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">"""从本地上传目录下多个文件到ftp</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'本地目录 %s 不存在'</span> % local_path)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'切换至远程目录: %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> local_name_list = os.listdir(local_path)</span><br><span class="line"> <span class="keyword">for</span> local_name <span class="keyword">in</span> local_name_list:</span><br><span class="line"> src = os.path.join(local_path, local_name)</span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(src):</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.mkd(local_name)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"目录已存在 %s ,具体错误描述为:%s"</span> % (local_name, err))</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"upload_file_tree()---> 上传目录: %s"</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file_tree(src, local_name)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"upload_file_tree()---> 上传文件: %s"</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file(src, local_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">".."</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">close</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="string">""" 退出ftp</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"close()---> FTP退出"</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.quit()</span><br><span class="line"> <span class="variable language_">self</span>.log_file.close()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">debug_print</span>(<span class="params">self, s</span>):</span><br><span class="line"> <span class="string">""" 打印日志</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.write_log(s)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">deal_error</span>(<span class="params">self, e</span>):</span><br><span class="line"> <span class="string">""" 处理错误异常</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> e:异常</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> log_str = <span class="string">'发生错误: %s'</span> % e</span><br><span class="line"> <span class="variable language_">self</span>.write_log(log_str)</span><br><span class="line"> sys.exit()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">write_log</span>(<span class="params">self, log_str</span>):</span><br><span class="line"> <span class="string">""" 记录日志</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> log_str:日志</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> time_now = time.localtime()</span><br><span class="line"> date_now = time.strftime(<span class="string">'%Y-%m-%d'</span>, time_now)</span><br><span class="line"> format_log_str = <span class="string">"%s ---> %s \n "</span> % (date_now, log_str)</span><br><span class="line"> <span class="built_in">print</span>(format_log_str)</span><br><span class="line"> <span class="variable language_">self</span>.log_file.write(format_log_str)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_list</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">""" 获取文件列表</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> file_arr = <span class="variable language_">self</span>.get_file_name(line)</span><br><span class="line"> <span class="comment"># 去除 . 和 ..</span></span><br><span class="line"> <span class="keyword">if</span> file_arr[<span class="number">1</span>] <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">'.'</span>, <span class="string">'..'</span>]:</span><br><span class="line"> <span class="variable language_">self</span>.file_list.append(file_arr)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_name</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">""" 获取文件名</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> pos = line.rfind(<span class="string">':'</span>)</span><br><span class="line"> <span class="keyword">while</span> (line[pos] != <span class="string">' '</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> (line[pos] == <span class="string">' '</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> file_arr = [line[<span class="number">0</span>], line[pos:]]</span><br><span class="line"> <span class="keyword">return</span> file_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line"> <span class="comment"># 清除日志</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__)) <span class="comment"># 脚本路径</span></span><br><span class="line"> <span class="keyword">if</span> os.path.exists(path + <span class="string">'/log.txt'</span>):</span><br><span class="line"> log_file = path + <span class="string">'/log.txt '</span><span class="keyword">if</span> os.sep == <span class="string">"/"</span> <span class="keyword">else</span> path + <span class="string">'\\'</span> + <span class="string">'log.txt'</span></span><br><span class="line"> subprocess.Popen(<span class="string">f'rm -rf <span class="subst">{log_file}</span>'</span>, shell=<span class="literal">True</span>)</span><br><span class="line"> time.sleep(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> my_ftp = MyFTP(<span class="string">"xxx.ftp.upyun.com"</span>)</span><br><span class="line"> my_ftp.login(<span class="string">"xxx/xxx"</span>, <span class="string">"xxx"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.download_file("E:/code_zone/image_bed/image/wallpaper/1.jpg", "/image/wallpaper/1.jpg")</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.upload_file("G:/ftp_test/Release/XTCLauncher.apk", "/App/AutoUpload/ouyangpeng/I12/Release/XTCLauncher.apk")</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载目录</span></span><br><span class="line"> <span class="comment"># image.cpen.top/image/ → 本地 E:/code_zone/image_bed/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">"\\"</span>:</span><br><span class="line"> my_ftp.download_file_tree(<span class="string">"E:/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>)</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">"/"</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.download_file_tree(<span class="string">"/root/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传目录</span></span><br><span class="line"> <span class="comment"># 本地 E:/code_zone/image_bed/image/ → image.cpen.top/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">"\\"</span>: <span class="comment"># Windows</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">"E:/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">"/"</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">"/root/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"><span class="comment"># python3 /root/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.2.2</strong> 说明</p><p><code>my_ftp.login("用户名xxx/xxx", "密码xxx")</code> 参考 <a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">https://techs.upyun.com/videos/cdnpage/creating_storage.html</a></p><p>后期又将脚本传到云服务器上,通过计划任务,每15分钟同步,保持 GitHub 与又拍云图床一致</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># root @ CentOS in ~ [18:05:59]</span></span><br><span class="line">$ crontab -l</span><br><span class="line">*/15 * * * * <span class="built_in">cd</span> /root/code_zone/image_bed/; git pull; python3 /root/code_zone/tools/python-ftp/ftp.py; bash git.sh</span><br></pre></td></tr></table></figure><p>迁移好图床后,博客中调用图片资源时 浏览器自动 http 跳 https,因为没有证书导致图片失效,于是又申请了 ssl 证书,上传至又拍云。</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220910180219146.png" alt=""></p></blockquote><h3 id="2-3-编写批量修改文章内容的脚本">2.3 编写批量修改文章内容的脚本<a class="header-anchor" href="#2-3-编写批量修改文章内容的脚本"></a></h3><p>源码参考<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">https://blog.csdn.net/qq_38150250/article/details/118026219</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">'/'</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">'.*\.md$'</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i 's/old_str/new_str/'</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"r"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"w"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = 'E:/code_zone/.history/20220831_blog/source/_posts/'</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-butterfly/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-diary/source/_posts/'</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elujenuvet/image/'</span></span><br><span class="line">new_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elujenuvet/image/'</span></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"{} done {}"</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.3.1</strong> 说明</p><p><code>search</code>函数指定文件类型为 .md,可获得文章的完整路径;</p><p><code>path_list</code>列表存放需要修改的文章父目录路径,可以递归查询子目录;</p><p><code>old_str</code>需要替换的内容</p><p><code>new_str</code>新内容</p>]]></content>
|
|
875
1045
|
|
|
876
1046
|
|
|
877
1047
|
<categories>
|
|
@@ -1373,7 +1543,7 @@
|
|
|
1373
1543
|
<link href="/posts/8236.html"/>
|
|
1374
1544
|
<url>/posts/8236.html</url>
|
|
1375
1545
|
|
|
1376
|
-
<content type="html"><![CDATA[<h1 id="Hexo-搭建私人博客">Hexo 搭建私人博客<a class="header-anchor" href="#Hexo-搭建私人博客"></a></h1><h2 id="一-介绍">一. 介绍<a class="header-anchor" href="#一-介绍"></a></h2><h3 id="1-1-Hexo">1.1 Hexo<a class="header-anchor" href="#1-1-Hexo"></a></h3><blockquote><p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 <a href="http://daringfireball.net/projects/markdown/">Markdown</a>(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。<a href="https://hexo.io">Hexo 官网</a></p></blockquote><h3 id="1-2-Pure-主题">1.2 Pure 主题<a class="header-anchor" href="#1-2-Pure-主题"></a></h3><p><a href="https://github.com/cofess/hexo-theme-pure">https://github.com/cofess/hexo-theme-pure</a></p><p><a href="https://blog.cofess.com/">https://blog.cofess.com/</a></p><hr><h2 id="二-参考">二. 参考<a class="header-anchor" href="#二-参考"></a></h2><p>Hexo 官网<a href="https://hexo.io/zh-cn/docs/index.html">https://hexo.io/zh-cn/docs/index.html</a></p><p>Pure 项目地址<a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md</a></p><h3 id="搭建-魔改">搭建 & 魔改<a class="header-anchor" href="#搭建-魔改"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">Pure 项目中文文档</a></p></li><li class="lvl-2"><p><a href="https://hwame.top/20200520/hello-hexo-setup-deploy.html">https://hwame.top</a></p></li><li class="lvl-2"><p><a href="https://blog.cofess.com/2017/11/01/hexo-blog-theme-pure-usage-description.html">作者: Hexo博客主题pure使用说明</a></p></li><li class="lvl-2"><p><a href="https://www.cnblogs.com/zzk31/p/14062887.html">https://www.cnblogs.com/zzk31/p/14062887.html</a></p></li><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_42983502/article/details/106745567">https://blog.csdn.net/qq_42983502/article/details/106745567</a></p></li><li class="lvl-2"><p>gitalk</p><ul class="lvl-2"><li class="lvl-4"><a href="https://www.jianshu.com/p/b1161eb3f848">https://www.jianshu.com/p/b1161eb3f848</a></li><li class="lvl-4"><a href="https://cors-anywhere.herokuapp.com/corsdemo">https://cors-anywhere.herokuapp.com/corsdemo</a></li><li class="lvl-4"><a href="https://www.cnblogs.com/qisi007/p/13731562.html">https://www.cnblogs.com/qisi007/p/13731562.html</a></li><li class="lvl-4"><a href="https://www.jianshu.com/p/02fc71f3633f">https://www.jianshu.com/p/02fc71f3633f</a></li></ul></li></ul><hr><h2 id="三-命令">三. 命令<a class="header-anchor" href="#三-命令"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean ; hexo g ; hexo d ; hexo s</span><br></pre></td></tr></table></figure><hr><h2 id="四-评论-收录">四. 评论 & 收录<a class="header-anchor" href="#四-评论-收录"></a></h2><p>Valine 评论<a href="https://www.leancloud.cn/">https://www.leancloud.cn/</a></p><p>Valine 评论<a href="https://www.leancloud.app/">https://www.leancloud.app/</a>国外站点,国内账号受限,域名没白嫖成功,可能是这个原因 → <a href="https://forum.leancloud.cn/t/2022-8/25408">https://forum.leancloud.cn/t/2022-8/25408</a></p><p>谷歌收录<a href="">https://search.google.com/search-console</a></p><p>百度收录<a href="https://ziyuan.baidu.com">https://ziyuan.baidu.com</a></p><p>MD5 在线加密<a href="https://md5jiami.bmcx.com/">https://md5jiami.bmcx.com/</a>评论区通过密文,识别博主身份</p><hr><h2 id="五-相关路径">五. 相关路径<a class="header-anchor" href="#五-相关路径"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[<span class="symbol">文章路径</span>]: </span><br><span class="line"><span class="link">\source\_posts</span></span><br><span class="line">[<span class="symbol">站点配置文件</span>]: </span><br><span class="line"><span class="link">\_config.yml</span></span><br><span class="line">[<span class="symbol">主题配置文件</span>]: </span><br><span class="line"><span class="link">\themes\pure\_config.yml"关于、个人介绍、公告"</span></span><br><span class="line">[<span class="symbol">友链文件</span>]: </span><br><span class="line"><span class="link">\source\_data\links.yml</span></span><br><span class="line">[<span class="symbol">语言</span>]: </span><br><span class="line"><span class="link">\themes\pure\languages</span></span><br><span class="line">[<span class="symbol">左下角运行时间</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_common\footer.ejs"时间、版权"</span></span><br><span class="line">[<span class="symbol">评论角色配置</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_script\_comment\valine.ejs</span></span><br><span class="line">[<span class="symbol">css样式</span>]:</span><br><span class="line"><span class="link">\themes\pure\source\css\style.css</span></span><br><span class="line">[<span class="symbol">搜索栏限制</span>]: </span><br><span class="line"><span class="link">\themes\pure\source\js\insight.js"160行"</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-内容样例">六. 内容样例<a class="header-anchor" href="#六-内容样例"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Test</span><br><span class="line">date: 2022-08-28 00:09:00</span><br><span class="line">updated: 2022-08-28 00:09:01</span><br><span class="line">thumbnail: https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fkahftbvxh/image/test.png</span><br><span class="line">tags:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">category:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">toc: true</span><br><span class="line"><span class="section">top: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">描述<!-- more --></span><br></pre></td></tr></table></figure><h3 id="文章指定多个-category">文章指定多个 category<a class="header-anchor" href="#文章指定多个-category"></a></h3><blockquote><p>多个分类</p><p>如果我们的要求是将文章同时分到两个或者多个不同的类目下呢?官方给出的方法是:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">categories:</span><br><span class="line"> - [Sports]</span><br><span class="line"> - [Baseball]</span><br></pre></td></tr></table></figure><p>参考文章:<a href="https://www.jianshu.com/p/4438c417611e">Hexo 一篇文章多个 categories https://www.jianshu.com/p/4438c417611e</a></p></blockquote><hr><h2 id="七-自定义">七. 自定义<a class="header-anchor" href="#七-自定义"></a></h2><h3 id="7-1-搜索框索引突破-5">7.1 搜索框索引突破 5<a class="header-anchor" href="#7-1-搜索框索引突破-5"></a></h3><ol><li class="lvl-3"><p><code>F12</code> 定位到搜索框的 类选择器 为 ins-section-header</p></li><li class="lvl-3"><p>grep,定位到配置文件为 <code>\themes\pure\source\js\insight.js</code></p></li><li class="lvl-3"><p>Ctrl + F,搜索 5,定位到第 160 行,修改限制</p></li></ol><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075511578.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075224471.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075722865.png" alt=""></p></blockquote><h3 id="7-2-左侧头像链接,target-修改为-self">7.2 左侧头像链接,target 修改为 _self<a class="header-anchor" href="#7-2-左侧头像链接,target-修改为-self"></a></h3><p>a 标签,修改 target: ‘_blank’ → ‘_self’</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080811356.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080916410.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080945424.png" alt=""></p></blockquote><hr><h3 id="7-3-文章目录,一级标题不跳转">7.3 文章目录,一级标题不跳转<a class="header-anchor" href="#7-3-文章目录,一级标题不跳转"></a></h3><p>有时发现一级标题不会跳转</p><p><s>配置文件<code>\node_modules\hexo\lib\plugins\helper\toc.js</code></s></p><p><s>更新下 <code>\node_modules\hexo\lib\plugins\helper\toc.js</code> 文件,又正常了。时灵时不灵的。。。</s></p><p><s>参考<a href="https://hwame.top/20200520/hello-hexo-troubleshooting.html#3-%E5%A6%82%E4%BD%95%E5%8F%96%E6%B6%88%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E7%9A%84%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7">https://hwame.top/如何取消文章目录的自动编号</a></s></p><p>修改 “.\node_modules\hexo-renderer-markdown-it\index.js” level 为 1</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906033013691.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>参考文章:</p><p><a href="https://blog.csdn.net/Fosu_Chenai/article/details/111192850">https://blog.csdn.net/Fosu_Chenai/article/details/111192850 评论</a></p></li></ul><hr><h3 id="7-4-滚动条加粗-加小箭头">7.4 滚动条加粗 + 加小箭头<a class="header-anchor" href="#7-4-滚动条加粗-加小箭头"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>修改 css 样式,路径 <code>.\hexo-source\themes\pure\source\css\style.css</code></p><ol><li class="lvl-5"><code>Ctlrl + F</code> 定位 <code>scrollbar</code>;</li><li class="lvl-5">调高 <code>height</code>,使代码框 右拉滚动条加粗;</li><li class="lvl-5">右侧下拉条变粗;</li></ol><blockquote><p><strong>7.4.1 代码框加粗</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * scrollbar</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">15px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">14px</span>;# 调高</span><br><span class="line"> <span class="attribute">background</span>: transparent;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164700329.png" alt=""></p><p><strong>7.4.2 右侧下拉条变粗 + 添加小箭头</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * 滚动条箭头</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">::-webkit-scrollbar-button {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">0px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">4px</span>;</span><br><span class="line"> <span class="attribute">display</span>: block; </span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#c3c3c3</span>;</span><br><span class="line">}</span><br><span class="line">::-webkit-scrollbar {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">5px</span> solid white;</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-thumb {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#b0b0b0</span>;</span><br><span class="line"> <span class="attribute">background-clip</span>: padding-box;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">0.05em</span> solid <span class="number">#eeeeee</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-track {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Buttons */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line"> <span class="attribute">display</span>: block;</span><br><span class="line"> <span class="attribute">border-style</span>: solid;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">13px</span>;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Up */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement {</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">0px</span> <span class="number">8px</span> <span class="number">8px</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#555555</span> transparent;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement:hover {</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#777777</span> transparent;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Down */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:increment {</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">8px</span> <span class="number">8px</span> <span class="number">0</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#555555</span> transparent transparent transparent;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:vertical:single-button:increment:hover {</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#777777</span> transparent transparent transparent;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164914382.png" alt=""></p></blockquote></li></ul><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="http://www.qianduanheidong.com/blog/article/27901/a1c9346c7830d6ffa3f2/">右侧下拉条新增箭头</a></p></li><li class="lvl-2"><p><a href="https://www.php.cn/css-tutorial-475268.html">:-webkit-scrollbar 滚动条整体部分 https://www.php.cn/css-tutorial-475268.html</a></p></li></ul><h3 id="7-5-Valine-评论框添加一言">7.5 Valine 评论框添加一言<a class="header-anchor" href="#7-5-Valine-评论框添加一言"></a></h3><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a></p></li></ul><p>偶然看到的文章,然后自己就加了这个功能。</p><ul class="lvl-0"><li class="lvl-2"><p>路径:<code>.\themes\pure\layout\_script\_comment\valine.ejs</code>;</p></li><li class="lvl-2"><p>加到最后 <code></script></code> 标签之前;c=j 请求获得网易云的句子,开始网抑云吧;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fetch('https://v1.hitokoto.cn/?c=j')</span><br><span class="line">.then(response => response.json())</span><br><span class="line">.then(data => {</span><br><span class="line"> document.getElementById("veditor").setAttribute("placeholder",data.hitokoto+"__"+data.from);</span><br><span class="line">})</span><br><span class="line">.catch(console.error)</span><br></pre></td></tr></table></figure></li></ul><blockquote><p>修改方法:</p><ol><li class="lvl-3"><p>找到博客对应添加valine的位置,例如Ayer主题的位于hexo\themes\ayer\layout_partial\post\valine.ejs</p></li><li class="lvl-3"><p>在内部添加一段代码:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><script type="text/javascript"></span><br><span class="line"> fetch('https://v1.hitokoto.cn')</span><br><span class="line"> .then(response => response.json())</span><br><span class="line"> .then(data => {</span><br><span class="line"> document.getElementById("veditor").setAttribute("placeholder",data.hitokoto+"__"+data.from);</span><br><span class="line"> })</span><br><span class="line"> .catch(console.error)</span><br><span class="line"></script></span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>Api接口说明:<br>(1)<a href="https://v1.hitokoto.cn/">https://v1.hitokoto.cn/</a> (从7种分类中随机抽取)<br>(2)<a href="https://v1.hitokoto.cn/?c=b">https://v1.hitokoto.cn/?c=b</a> (请求获得一个分类是漫画的句子)<br>参数说明<br>a动画<br>b漫画<br>c游戏<br>d文学<br>e原创<br>f来自网络<br>g其他<br>h影视<br>i诗词<br>j网易云<br>k哲学<br>l抖机灵<br>其他作为动画类型处理<br>可选择多个分类,例如: ?c=a&c=c</p></li></ol><p>(3)<a href="https://v1.hitokoto.cn/?c=f&encode=text">https://v1.hitokoto.cn/?c=f&encode=text</a> (请求获得一个来自网络的句子,并以纯文本格式输出)</p><ol start="4"><li class="lvl-3"><p>返回的格式说明<br>返回参数名称描述<br>id一言标识<br>hitokoto一言正文。编码方式 unicode。使用 utf-8。<br>type类型<br>from一言的出处<br>from_who一言的作者<br>creator添加者<br>creator_uid添加者用户标识<br>reviewer审核员标识<br>uuid一言唯一标识;可以链接到 <a href="https://hitokoto.cn?uuid=%5Buuid%5D">https://hitokoto.cn?uuid=[uuid]</a> 查看这个一言的完整信息<br>commit_from提交方式<br>created_at添加时间<br>length句子长度<br>例如:返回的data,通过data.hitokoto获取句子正文</p></li></ol><p>作者: Justlovesmile<br>链接: <a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a><br>来源: Justlovesmile’s BLOG<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p></blockquote><p>PS:这位大佬的博客真好看~~</p><h3 id="7-6-左侧-归档、分类-改为默认收起">7.6 左侧 归档、分类 改为默认收起<a class="header-anchor" href="#7-6-左侧-归档、分类-改为默认收起"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>默认是展开的</p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203849607.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203907981.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>修改以下文件,改为收起状态。如图</p><ul class="lvl-2"><li class="lvl-4">style=“height: 0px” 应该可以不用写,收起状态默认就是 0 ~~</li></ul></li></ul><blockquote><p><code>.\themes\pure\layout\categories.ejs</code></p><p><code>.\themes\pure\layout\_partial\archive.ejs</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203746673.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203807739.png" alt=""></p></blockquote><hr><h2 id="八-未解决的小需求">八. 未解决的小需求<a class="header-anchor" href="#八-未解决的小需求"></a></h2><ol><li class="lvl-3"><p>(已解决,#7.3)一级目录,右侧导航栏 有时跳转失败;</p></li><li class="lvl-3"><p>Valine 评论系统,下面的评论 被@后,未显示 @信息,而别人的是成功的;</p><blockquote><p>我的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171817579.png" alt=""></p><p>其他大佬的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171912131.png" alt=""></p></blockquote></li><li class="lvl-3"><p>引用时 使用 #,会被导航目录误认为 一级标题;</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172133945.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172316157.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)生成在 /public 目录的静态文件都被压缩了,<s>我看别人的没被压缩,不清楚啥原因。</s> 因为配置了这个 <a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md#%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md 博客优化</a> 压缩了文件</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901175404486.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)文章内部一级、二级…标题左侧无锚点</p><blockquote><p>理想效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906034109271.png" alt=""></p><p><s>似乎是环境配置问题,我用虚拟机推送静态文件,就有显示;用真实 win机 推送 就没有锚点,重装 git 也没显示(可能不是 git 的问题)。。。</s></p><p>因为压缩了静态文件,全部注释 <code>hexo-neat</code> 配置。<br>参考<br><a href="https://github.com/cofess/hexo-theme-pure#hexo-neat">https://github.com/cofess/hexo-theme-pure#hexo-neat</a><br><a href="https://github.com/rozbo/hexo-neat#options">https://github.com/rozbo/hexo-neat#options</a></p></blockquote></li></ol><p>无伤大雅,<s>我一般一级标题写的是文章标题</s>;评论区也就是个摆设;<s>静态文件被压缩,可能别人还觉得我是故意,嘿</s>~~</p><p>最后总结:魔改要适量,太费时 还得不到提升,不如多看几个前端视频 多写几篇文章。。。</p><hr>]]></content>
|
|
1546
|
+
<content type="html"><![CDATA[<h1 id="Hexo-搭建私人博客">Hexo 搭建私人博客<a class="header-anchor" href="#Hexo-搭建私人博客"></a></h1><h2 id="一-介绍">一. 介绍<a class="header-anchor" href="#一-介绍"></a></h2><h3 id="1-1-Hexo">1.1 Hexo<a class="header-anchor" href="#1-1-Hexo"></a></h3><blockquote><p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 <a href="http://daringfireball.net/projects/markdown/">Markdown</a>(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。<a href="https://hexo.io">Hexo 官网</a></p></blockquote><h3 id="1-2-Pure-主题">1.2 Pure 主题<a class="header-anchor" href="#1-2-Pure-主题"></a></h3><p><a href="https://github.com/cofess/hexo-theme-pure">https://github.com/cofess/hexo-theme-pure</a></p><p><a href="https://blog.cofess.com/">https://blog.cofess.com/</a></p><hr><h2 id="二-参考">二. 参考<a class="header-anchor" href="#二-参考"></a></h2><p>Hexo 官网<a href="https://hexo.io/zh-cn/docs/index.html">https://hexo.io/zh-cn/docs/index.html</a></p><p>Pure 项目地址<a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md</a></p><h3 id="搭建-魔改">搭建 & 魔改<a class="header-anchor" href="#搭建-魔改"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">Pure 项目中文文档</a></p></li><li class="lvl-2"><p><a href="https://hwame.top/20200520/hello-hexo-setup-deploy.html">https://hwame.top</a></p></li><li class="lvl-2"><p><a href="https://blog.cofess.com/2017/11/01/hexo-blog-theme-pure-usage-description.html">作者: Hexo博客主题pure使用说明</a></p></li><li class="lvl-2"><p><a href="https://www.cnblogs.com/zzk31/p/14062887.html">https://www.cnblogs.com/zzk31/p/14062887.html</a></p></li><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_42983502/article/details/106745567">https://blog.csdn.net/qq_42983502/article/details/106745567</a></p></li><li class="lvl-2"><p>gitalk</p><ul class="lvl-2"><li class="lvl-4"><a href="https://www.jianshu.com/p/b1161eb3f848">https://www.jianshu.com/p/b1161eb3f848</a></li><li class="lvl-4"><a href="https://cors-anywhere.herokuapp.com/corsdemo">https://cors-anywhere.herokuapp.com/corsdemo</a></li><li class="lvl-4"><a href="https://www.cnblogs.com/qisi007/p/13731562.html">https://www.cnblogs.com/qisi007/p/13731562.html</a></li><li class="lvl-4"><a href="https://www.jianshu.com/p/02fc71f3633f">https://www.jianshu.com/p/02fc71f3633f</a></li></ul></li></ul><hr><h2 id="三-命令">三. 命令<a class="header-anchor" href="#三-命令"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean ; hexo g ; hexo d ; hexo s</span><br></pre></td></tr></table></figure><hr><h2 id="四-评论-收录">四. 评论 & 收录<a class="header-anchor" href="#四-评论-收录"></a></h2><p>Valine 评论<a href="https://www.leancloud.cn/">https://www.leancloud.cn/</a></p><p>Valine 评论<a href="https://www.leancloud.app/">https://www.leancloud.app/</a>国外站点,国内账号受限,域名没白嫖成功,可能是这个原因 → <a href="https://forum.leancloud.cn/t/2022-8/25408">https://forum.leancloud.cn/t/2022-8/25408</a></p><p>谷歌收录<a href="">https://search.google.com/search-console</a></p><p>百度收录<a href="https://ziyuan.baidu.com">https://ziyuan.baidu.com</a></p><p>MD5 在线加密<a href="https://md5jiami.bmcx.com/">https://md5jiami.bmcx.com/</a>评论区通过密文,识别博主身份</p><hr><h2 id="五-相关路径">五. 相关路径<a class="header-anchor" href="#五-相关路径"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[<span class="symbol">文章路径</span>]: </span><br><span class="line"><span class="link">\source\_posts</span></span><br><span class="line">[<span class="symbol">站点配置文件</span>]: </span><br><span class="line"><span class="link">\_config.yml</span></span><br><span class="line">[<span class="symbol">主题配置文件</span>]: </span><br><span class="line"><span class="link">\themes\pure\_config.yml"关于、个人介绍、公告"</span></span><br><span class="line">[<span class="symbol">友链文件</span>]: </span><br><span class="line"><span class="link">\source\_data\links.yml</span></span><br><span class="line">[<span class="symbol">语言</span>]: </span><br><span class="line"><span class="link">\themes\pure\languages</span></span><br><span class="line">[<span class="symbol">左下角运行时间</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_common\footer.ejs"时间、版权"</span></span><br><span class="line">[<span class="symbol">评论角色配置</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_script\_comment\valine.ejs</span></span><br><span class="line">[<span class="symbol">css样式</span>]:</span><br><span class="line"><span class="link">\themes\pure\source\css\style.css</span></span><br><span class="line">[<span class="symbol">搜索栏限制</span>]: </span><br><span class="line"><span class="link">\themes\pure\source\js\insight.js"160行"</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-内容样例">六. 内容样例<a class="header-anchor" href="#六-内容样例"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Test</span><br><span class="line">date: 2022-08-28 00:09:00</span><br><span class="line">updated: 2022-08-28 00:09:01</span><br><span class="line">thumbnail: https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elujenuvet/image/test.png</span><br><span class="line">tags:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">category:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">toc: true</span><br><span class="line"><span class="section">top: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">描述<!-- more --></span><br></pre></td></tr></table></figure><h3 id="文章指定多个-category">文章指定多个 category<a class="header-anchor" href="#文章指定多个-category"></a></h3><blockquote><p>多个分类</p><p>如果我们的要求是将文章同时分到两个或者多个不同的类目下呢?官方给出的方法是:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">categories:</span><br><span class="line"> - [Sports]</span><br><span class="line"> - [Baseball]</span><br></pre></td></tr></table></figure><p>参考文章:<a href="https://www.jianshu.com/p/4438c417611e">Hexo 一篇文章多个 categories https://www.jianshu.com/p/4438c417611e</a></p></blockquote><hr><h2 id="七-自定义">七. 自定义<a class="header-anchor" href="#七-自定义"></a></h2><h3 id="7-1-搜索框索引突破-5">7.1 搜索框索引突破 5<a class="header-anchor" href="#7-1-搜索框索引突破-5"></a></h3><ol><li class="lvl-3"><p><code>F12</code> 定位到搜索框的 类选择器 为 ins-section-header</p></li><li class="lvl-3"><p>grep,定位到配置文件为 <code>\themes\pure\source\js\insight.js</code></p></li><li class="lvl-3"><p>Ctrl + F,搜索 5,定位到第 160 行,修改限制</p></li></ol><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075511578.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075224471.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075722865.png" alt=""></p></blockquote><h3 id="7-2-左侧头像链接,target-修改为-self">7.2 左侧头像链接,target 修改为 _self<a class="header-anchor" href="#7-2-左侧头像链接,target-修改为-self"></a></h3><p>a 标签,修改 target: ‘_blank’ → ‘_self’</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080811356.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080916410.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080945424.png" alt=""></p></blockquote><hr><h3 id="7-3-文章目录,一级标题不跳转">7.3 文章目录,一级标题不跳转<a class="header-anchor" href="#7-3-文章目录,一级标题不跳转"></a></h3><p>有时发现一级标题不会跳转</p><p><s>配置文件<code>\node_modules\hexo\lib\plugins\helper\toc.js</code></s></p><p><s>更新下 <code>\node_modules\hexo\lib\plugins\helper\toc.js</code> 文件,又正常了。时灵时不灵的。。。</s></p><p><s>参考<a href="https://hwame.top/20200520/hello-hexo-troubleshooting.html#3-%E5%A6%82%E4%BD%95%E5%8F%96%E6%B6%88%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E7%9A%84%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7">https://hwame.top/如何取消文章目录的自动编号</a></s></p><p>修改 “.\node_modules\hexo-renderer-markdown-it\index.js” level 为 1</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906033013691.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>参考文章:</p><p><a href="https://blog.csdn.net/Fosu_Chenai/article/details/111192850">https://blog.csdn.net/Fosu_Chenai/article/details/111192850 评论</a></p></li></ul><hr><h3 id="7-4-滚动条加粗-加小箭头">7.4 滚动条加粗 + 加小箭头<a class="header-anchor" href="#7-4-滚动条加粗-加小箭头"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>修改 css 样式,路径 <code>.\hexo-source\themes\pure\source\css\style.css</code></p><ol><li class="lvl-5"><code>Ctlrl + F</code> 定位 <code>scrollbar</code>;</li><li class="lvl-5">调高 <code>height</code>,使代码框 右拉滚动条加粗;</li><li class="lvl-5">右侧下拉条变粗;</li></ol><blockquote><p><strong>7.4.1 代码框加粗</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * scrollbar</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">15px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">14px</span>;# 调高</span><br><span class="line"> <span class="attribute">background</span>: transparent;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164700329.png" alt=""></p><p><strong>7.4.2 右侧下拉条变粗 + 添加小箭头</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * 滚动条箭头</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">::-webkit-scrollbar-button {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">0px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">4px</span>;</span><br><span class="line"> <span class="attribute">display</span>: block; </span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#c3c3c3</span>;</span><br><span class="line">}</span><br><span class="line">::-webkit-scrollbar {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">5px</span> solid white;</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-thumb {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#b0b0b0</span>;</span><br><span class="line"> <span class="attribute">background-clip</span>: padding-box;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">0.05em</span> solid <span class="number">#eeeeee</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-track {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Buttons */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line"> <span class="attribute">display</span>: block;</span><br><span class="line"> <span class="attribute">border-style</span>: solid;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">13px</span>;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Up */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement {</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">0px</span> <span class="number">8px</span> <span class="number">8px</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#555555</span> transparent;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement:hover {</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#777777</span> transparent;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Down */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:increment {</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">8px</span> <span class="number">8px</span> <span class="number">0</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#555555</span> transparent transparent transparent;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:vertical:single-button:increment:hover {</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#777777</span> transparent transparent transparent;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164914382.png" alt=""></p></blockquote></li></ul><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="http://www.qianduanheidong.com/blog/article/27901/a1c9346c7830d6ffa3f2/">右侧下拉条新增箭头</a></p></li><li class="lvl-2"><p><a href="https://www.php.cn/css-tutorial-475268.html">:-webkit-scrollbar 滚动条整体部分 https://www.php.cn/css-tutorial-475268.html</a></p></li></ul><h3 id="7-5-Valine-评论框添加一言">7.5 Valine 评论框添加一言<a class="header-anchor" href="#7-5-Valine-评论框添加一言"></a></h3><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a></p></li></ul><p>偶然看到的文章,然后自己就加了这个功能。</p><ul class="lvl-0"><li class="lvl-2"><p>路径:<code>.\themes\pure\layout\_script\_comment\valine.ejs</code>;</p></li><li class="lvl-2"><p>加到最后 <code></script></code> 标签之前;c=j 请求获得网易云的句子,开始网抑云吧;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fetch('https://v1.hitokoto.cn/?c=j')</span><br><span class="line">.then(response => response.json())</span><br><span class="line">.then(data => {</span><br><span class="line"> document.getElementById("veditor").setAttribute("placeholder",data.hitokoto+"__"+data.from);</span><br><span class="line">})</span><br><span class="line">.catch(console.error)</span><br></pre></td></tr></table></figure></li></ul><blockquote><p>修改方法:</p><ol><li class="lvl-3"><p>找到博客对应添加valine的位置,例如Ayer主题的位于hexo\themes\ayer\layout_partial\post\valine.ejs</p></li><li class="lvl-3"><p>在内部添加一段代码:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><script type="text/javascript"></span><br><span class="line"> fetch('https://v1.hitokoto.cn')</span><br><span class="line"> .then(response => response.json())</span><br><span class="line"> .then(data => {</span><br><span class="line"> document.getElementById("veditor").setAttribute("placeholder",data.hitokoto+"__"+data.from);</span><br><span class="line"> })</span><br><span class="line"> .catch(console.error)</span><br><span class="line"></script></span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>Api接口说明:<br>(1)<a href="https://v1.hitokoto.cn/">https://v1.hitokoto.cn/</a> (从7种分类中随机抽取)<br>(2)<a href="https://v1.hitokoto.cn/?c=b">https://v1.hitokoto.cn/?c=b</a> (请求获得一个分类是漫画的句子)<br>参数说明<br>a动画<br>b漫画<br>c游戏<br>d文学<br>e原创<br>f来自网络<br>g其他<br>h影视<br>i诗词<br>j网易云<br>k哲学<br>l抖机灵<br>其他作为动画类型处理<br>可选择多个分类,例如: ?c=a&c=c</p></li></ol><p>(3)<a href="https://v1.hitokoto.cn/?c=f&encode=text">https://v1.hitokoto.cn/?c=f&encode=text</a> (请求获得一个来自网络的句子,并以纯文本格式输出)</p><ol start="4"><li class="lvl-3"><p>返回的格式说明<br>返回参数名称描述<br>id一言标识<br>hitokoto一言正文。编码方式 unicode。使用 utf-8。<br>type类型<br>from一言的出处<br>from_who一言的作者<br>creator添加者<br>creator_uid添加者用户标识<br>reviewer审核员标识<br>uuid一言唯一标识;可以链接到 <a href="https://hitokoto.cn?uuid=%5Buuid%5D">https://hitokoto.cn?uuid=[uuid]</a> 查看这个一言的完整信息<br>commit_from提交方式<br>created_at添加时间<br>length句子长度<br>例如:返回的data,通过data.hitokoto获取句子正文</p></li></ol><p>作者: Justlovesmile<br>链接: <a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a><br>来源: Justlovesmile’s BLOG<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p></blockquote><p>PS:这位大佬的博客真好看~~</p><h3 id="7-6-左侧-归档、分类-改为默认收起">7.6 左侧 归档、分类 改为默认收起<a class="header-anchor" href="#7-6-左侧-归档、分类-改为默认收起"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>默认是展开的</p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203849607.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203907981.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>修改以下文件,改为收起状态。如图</p><ul class="lvl-2"><li class="lvl-4">style=“height: 0px” 应该可以不用写,收起状态默认就是 0 ~~</li></ul></li></ul><blockquote><p><code>.\themes\pure\layout\categories.ejs</code></p><p><code>.\themes\pure\layout\_partial\archive.ejs</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203746673.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203807739.png" alt=""></p></blockquote><hr><h2 id="八-未解决的小需求">八. 未解决的小需求<a class="header-anchor" href="#八-未解决的小需求"></a></h2><ol><li class="lvl-3"><p>(已解决,#7.3)一级目录,右侧导航栏 有时跳转失败;</p></li><li class="lvl-3"><p>Valine 评论系统,下面的评论 被@后,未显示 @信息,而别人的是成功的;</p><blockquote><p>我的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171817579.png" alt=""></p><p>其他大佬的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171912131.png" alt=""></p></blockquote></li><li class="lvl-3"><p>引用时 使用 #,会被导航目录误认为 一级标题;</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172133945.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172316157.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)生成在 /public 目录的静态文件都被压缩了,<s>我看别人的没被压缩,不清楚啥原因。</s> 因为配置了这个 <a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md#%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md 博客优化</a> 压缩了文件</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901175404486.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)文章内部一级、二级…标题左侧无锚点</p><blockquote><p>理想效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906034109271.png" alt=""></p><p><s>似乎是环境配置问题,我用虚拟机推送静态文件,就有显示;用真实 win机 推送 就没有锚点,重装 git 也没显示(可能不是 git 的问题)。。。</s></p><p>因为压缩了静态文件,全部注释 <code>hexo-neat</code> 配置。<br>参考<br><a href="https://github.com/cofess/hexo-theme-pure#hexo-neat">https://github.com/cofess/hexo-theme-pure#hexo-neat</a><br><a href="https://github.com/rozbo/hexo-neat#options">https://github.com/rozbo/hexo-neat#options</a></p></blockquote></li></ol><p>无伤大雅,<s>我一般一级标题写的是文章标题</s>;评论区也就是个摆设;<s>静态文件被压缩,可能别人还觉得我是故意,嘿</s>~~</p><p>最后总结:魔改要适量,太费时 还得不到提升,不如多看几个前端视频 多写几篇文章。。。</p><hr>]]></content>
|
|
1377
1547
|
|
|
1378
1548
|
|
|
1379
1549
|
<categories>
|