<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>All Posts - 个人博客-自用</title>
        <link>http://localhost:1313/posts/</link>
        <description>All Posts | 个人博客-自用</description>
        <generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Thu, 22 Feb 2024 19:32:24 &#43;0800</lastBuildDate><atom:link href="http://localhost:1313/posts/" rel="self" type="application/rss+xml" /><item>
    <title>Acme.sh申请免费ssl证书</title>
    <link>http://localhost:1313/posts/acme.sh%E7%94%B3%E8%AF%B7%E5%85%8D%E8%B4%B9ssl%E8%AF%81%E4%B9%A6/</link>
    <pubDate>Thu, 22 Feb 2024 19:32:24 &#43;0800</pubDate>
    <author>Captain</author>
    <guid>http://localhost:1313/posts/acme.sh%E7%94%B3%E8%AF%B7%E5%85%8D%E8%B4%B9ssl%E8%AF%81%E4%B9%A6/</guid>
    <description><![CDATA[<p><strong>acme.sh</strong> 实现了 <code>acme</code> 协议, 可以从 letsencrypt 生成免费的证书.</p>
<p>主要步骤:</p>
<ol>
<li>安装 <strong>acme.sh</strong></li>
<li>生成证书</li>
<li>copy 证书到 nginx/apache 或者其他服务</li>
<li>更新证书</li>
<li>更新 <strong>acme.sh</strong></li>
<li>出错怎么办, 如何调试</li>
</ol>
<p>下面详细介绍.</p>
<h1 id="1-安装acmesh">1. 安装 acme.sh</h1>
<p>安装很简单, 一个命令:</p>]]></description>
</item>
<item>
    <title>通过实例理解Web应用用户密码存储方案</title>
    <link>http://localhost:1313/posts/%E9%80%9A%E8%BF%87%E5%AE%9E%E4%BE%8B%E7%90%86%E8%A7%A3web%E5%BA%94%E7%94%A8%E7%94%A8%E6%88%B7%E5%AF%86%E7%A0%81%E5%AD%98%E5%82%A8%E6%96%B9%E6%A1%88/</link>
    <pubDate>Tue, 23 Jan 2024 18:21:18 &#43;0800</pubDate>
    <author>Captain</author>
    <guid>http://localhost:1313/posts/%E9%80%9A%E8%BF%87%E5%AE%9E%E4%BE%8B%E7%90%86%E8%A7%A3web%E5%BA%94%E7%94%A8%E7%94%A8%E6%88%B7%E5%AF%86%E7%A0%81%E5%AD%98%E5%82%A8%E6%96%B9%E6%A1%88/</guid>
    <description><![CDATA[<h2 id="1-web应用用户密码存储的重要性">1. Web应用用户密码存储的重要性</h2>
<p>用户密码是访问Web应用的关键，它直接关乎到用户账号和应用数据的安全。</p>
<p>如果用户密码被泄露或破解，将导致严重后果。后果最轻的算是某个用户或某少数用户的账号被盗用了，用户将失去对账号的控制。盗用账号后，攻击者可以获取该用户的私密信息，或进行额外的攻击；如果用户在多个应用重复使用同一密码，那么后果将进一步严重，用户的一系列账号都将受到安全威胁；更为严重的是Web应用存储用户账号信息的数据库被攻破(俗称“脱库”)，攻击者会拿到存储的全部用户账号信息等，如果用户密码存储不当，攻击者可以很容易破译所有用户的密码，并基于这些密码信息做进一步的攻击。</p>]]></description>
</item>
<item>
    <title>Docker部署Redis集群及集群伸缩</title>
    <link>http://localhost:1313/posts/docker%E9%83%A8%E7%BD%B2redis%E9%9B%86%E7%BE%A4%E5%8F%8A%E9%9B%86%E7%BE%A4%E4%BC%B8%E7%BC%A9/</link>
    <pubDate>Tue, 03 Oct 2023 11:19:25 &#43;0800</pubDate>
    <author>Captain</author>
    <guid>http://localhost:1313/posts/docker%E9%83%A8%E7%BD%B2redis%E9%9B%86%E7%BE%A4%E5%8F%8A%E9%9B%86%E7%BE%A4%E4%BC%B8%E7%BC%A9/</guid>
    <description><![CDATA[<h1 id="1-docker部署redis集群及集群伸缩">1. Docker部署Redis集群及集群伸缩</h1>
<h2 id="11-创建6个data目录">1.1. 创建6个data目录</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">1</span> mkdir /mnt/data/6381
</span></span><span class="line"><span class="cl"><span class="m">2</span> mkdir /mnt/data/6382
</span></span><span class="line"><span class="cl"><span class="m">3</span> mkdir /mnt/data/6383
</span></span><span class="line"><span class="cl"><span class="m">4</span> mkdir /mnt/data/6384
</span></span><span class="line"><span class="cl"><span class="m">5</span> mkdir /mnt/data/6385
</span></span><span class="line"><span class="cl"><span class="m">6</span> mkdir /mnt/data/6386
</span></span></code></pre></div><h2 id="12-官网下载最新的redis包">1.2. 官网下载最新的redis包</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">1</span> wget http://download.redis.io/releases/redis-6.0.6.tar.gz
</span></span></code></pre></div><h2 id="13-docker拉取对应的redis镜像">1.3. docker拉取对应的redis镜像</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">1</span> docker pull redis:6.0.6
</span></span></code></pre></div><h2 id="14-修改配置文件">1.4. 修改配置文件</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">1</span> <span class="o">[</span>root@localhost ~<span class="o">]</span><span class="c1"># cp redis-6.0.6/redis.conf /mnt/redis.conf</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span> <span class="o">[</span>root@localhost ~<span class="o">]</span><span class="c1"># vim /mnt/redis.conf</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span> <span class="c1"># bind 127.0.0.1 &#34;注释bind 127.0.0.1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span> protected-mode no   <span class="c1">#&#34;将 protected-mode yes 改为 protected-mode no &#34;</span>
</span></span><span class="line"><span class="cl"><span class="m">5</span> <span class="c1"># daemonize yes  &#34;注释daemonize yes, 或改为no&#34;</span>
</span></span><span class="line"><span class="cl"><span class="m">6</span> cluster-enabled yes <span class="c1">#&#34;启用集群配置&#34;</span>
</span></span><span class="line"><span class="cl"><span class="m">7</span> cluster-config-file nodes-6381.conf <span class="c1">#&#34;节点配置文件&#34;</span>
</span></span><span class="line"><span class="cl"><span class="m">8</span> cluster-node-timeout <span class="m">5000</span> <span class="c1"># &#34;节点通信超时时间5s&#34;</span>
</span></span></code></pre></div><h2 id="15-启动6台redis容器">1.5. 启动6台redis容器</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">1</span> docker run -p 6381:6379 --name redis01 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6381:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
</span></span><span class="line"><span class="cl"><span class="m">2</span> docker run -p 6382:6379 --name redis02 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6382:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
</span></span><span class="line"><span class="cl"><span class="m">3</span> docker run -p 6383:6379 --name redis03 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6383:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
</span></span><span class="line"><span class="cl"><span class="m">4</span> docker run -p 6384:6379 --name redis04 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6384:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
</span></span><span class="line"><span class="cl"><span class="m">5</span> docker run -p 6385:6379 --name redis05 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6385:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
</span></span><span class="line"><span class="cl"><span class="m">6</span> docker run -p 6386:6379 --name redis06 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6386:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
</span></span></code></pre></div><h2 id="16-查看各容器ip">1.6. 查看各容器IP</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"> <span class="m">1</span> <span class="o">[</span>root@localhost ~<span class="o">]</span><span class="c1"># docker inspect redis01 | grep &#34;172.17&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="m">2</span> 172.172.0.2
</span></span><span class="line"><span class="cl"> <span class="m">3</span> <span class="o">[</span>root@localhost ~<span class="o">]</span><span class="c1"># docker inspect redis02 | grep &#34;172.17&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="m">4</span> 172.172.0.3
</span></span><span class="line"><span class="cl"> <span class="m">5</span> <span class="o">[</span>root@localhost ~<span class="o">]</span><span class="c1"># docker inspect redis03 | grep &#34;172.17&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="m">6</span> 172.172.0.4
</span></span><span class="line"><span class="cl"> <span class="m">7</span> <span class="o">[</span>root@localhost ~<span class="o">]</span><span class="c1"># docker inspect redis04 | grep &#34;172.17&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="m">8</span> 172.172.0.5
</span></span><span class="line"><span class="cl"> <span class="m">9</span> <span class="o">[</span>root@localhost ~<span class="o">]</span><span class="c1"># docker inspect redis05 | grep &#34;172.17&#34;</span>
</span></span><span class="line"><span class="cl"><span class="m">10</span> 172.172.0.6
</span></span><span class="line"><span class="cl"><span class="m">11</span> <span class="o">[</span>root@localhost ~<span class="o">]</span><span class="c1"># docker inspect redis06 | grep &#34;172.17&#34;</span>
</span></span><span class="line"><span class="cl"><span class="m">12</span> 172.172.0.7
</span></span></code></pre></div><h2 id="17-进入任一容器配置集群遇yes敲yes">1.7. 进入任一容器配置集群(遇yes敲yes)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">1</span> redis-cli --cluster create 172.17.0.2:6379 172.17.0.3:6379 172.17.0.4:6379 172.17.0.5:6379 172.17.0.6:6379 172.17.0.7:6379  --cluster-replicas <span class="m">1</span>
</span></span></code></pre></div><h2 id="18-查看集群信息">1.8. 查看集群信息</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">1</span> root@d5fb8214a10a:/data# cat nodes-6379.conf 
</span></span><span class="line"><span class="cl"><span class="m">2</span> 748eb947ae5ac0c721740870ad44cb356a4b0ca5 172.17.0.4:6379@16379 master - <span class="m">0</span> <span class="m">1598101846000</span> <span class="m">3</span> connected 10923-16383
</span></span><span class="line"><span class="cl"><span class="m">3</span> 8e986c400c6b0d47064ee2fbf7a391574042dbc4 172.17.0.6:6379@16379 slave 092994cf7044995d41a876370af56c97894adea0 <span class="m">0</span> <span class="m">1598101846000</span> <span class="m">1</span> connected
</span></span><span class="line"><span class="cl"><span class="m">4</span> df1c66d381237ed63a6a6045c84942b7a7f9df9 172.17.0.5:6379@16379 slave 748eb947ae5ac0c721740870ad44cb356a4b0ca5 <span class="m">0</span> <span class="m">1598101847085</span> <span class="m">3</span> connected
</span></span><span class="line"><span class="cl"><span class="m">5</span> 092994cf7044995d41a876370af56c97894adea0 172.17.0.2:6379@16379 myself,master - <span class="m">0</span> <span class="m">1598101844000</span> <span class="m">1</span> connected 0-5460
</span></span><span class="line"><span class="cl"><span class="m">6</span> 220fba07c2e345c8aa4578e8bb3b45451377d335 172.17.0.7:6379@16379 slave bb02a3720ff638ea7edb147580e9ffa1dce29726 <span class="m">0</span> <span class="m">1598101845000</span> <span class="m">2</span> connected
</span></span><span class="line"><span class="cl"><span class="m">7</span> bb02a3720ff638ea7edb147580e9ffa1dce29726 172.17.0.3:6379@16379 master - <span class="m">0</span> <span class="m">1598101846077</span> <span class="m">2</span> connected 5461-10922
</span></span><span class="line"><span class="cl"><span class="m">8</span> vars currentEpoch <span class="m">6</span> lastVoteEpoch <span class="m">0</span>
</span></span></code></pre></div><h2 id="19-集群取存测试">1.9. 集群取存测试</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">1</span> 172.17.0.2:6379&gt;cluster nodes      <span class="c1"># 查看本机信息</span>
</span></span><span class="line"><span class="cl"><span class="m">2</span> 172.17.0.2:6379&gt;cluster info       <span class="c1"># 查看集群信息</span>
</span></span><span class="line"><span class="cl"><span class="m">3</span> 172.17.0.2:6379&gt;set lan golang     <span class="c1"># master插入数据(可能会报错,叫我们去别的实例存)</span>
</span></span><span class="line"><span class="cl"><span class="m">4</span> 172.17.0.3:6379&gt;get lan            <span class="c1"># node查询数据</span>
</span></span><span class="line"><span class="cl"><span class="m">5</span> <span class="o">(</span>error<span class="o">)</span> MOVED <span class="m">5798</span> 172.17.0.2:6379 <span class="c1"># 告诉我们该数据在172.17.0.2上</span>
</span></span><span class="line"><span class="cl"><span class="m">6</span> 172.17.0.5:6386&gt; keys *            <span class="c1"># 查键          </span>
</span></span><span class="line"><span class="cl"><span class="m">7</span> 1<span class="o">)</span> <span class="s2">&#34;lan&#34;</span>
</span></span></code></pre></div><blockquote>
<p><strong>解决(error) MOVED问题</strong></p>]]></description>
</item>
<item>
    <title>Golang常用库之UUID</title>
    <link>http://localhost:1313/posts/golang%E5%B8%B8%E7%94%A8%E5%BA%93%E4%B9%8Buuid/</link>
    <pubDate>Sun, 13 Aug 2023 21:22:45 &#43;0800</pubDate>
    <author>Captain</author>
    <guid>http://localhost:1313/posts/golang%E5%B8%B8%E7%94%A8%E5%BA%93%E4%B9%8Buuid/</guid>
    <description><![CDATA[<h2 id="1-什么是uuid">1. 什么是UUID？</h2>
<p>通用唯一标识符 (UUID) 是一种特定形式的标识符，在大多数实际用途中可以安全地认为是唯一的。两个正确生成的 UUID 相同的可能性几乎可以忽略不计，即使它们是由不同的各方在两个不同的环境中创建的。这就是为什么说 UUID 是普遍唯一的。</p>]]></description>
</item>
<item>
    <title>Ansible Playbook快速部署一主多从MySQL集群</title>
    <link>http://localhost:1313/posts/ansible-mysql/</link>
    <pubDate>Mon, 07 Aug 2023 13:49:05 &#43;0800</pubDate>
    <author>captain</author>
    <guid>http://localhost:1313/posts/ansible-mysql/</guid>
    <description><![CDATA[<ul>
<li><a href="#1-%e9%83%a8%e7%bd%b2%e7%9b%ae%e6%a0%87" rel="">1. 部署目标</a></li>
<li><a href="#2-%e9%83%a8%e7%bd%b2%e6%b8%85%e5%8d%95%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84" rel="">2. 部署清单目录结构</a></li>
<li><a href="#3-%e4%b8%bb%e6%9c%ba%e6%b8%85%e5%8d%95" rel="">3. 主机清单</a></li>
<li><a href="#4-%e5%a3%b0%e6%98%8e%e5%8f%98%e9%87%8f" rel="">4. 声明变量</a></li>
<li><a href="#5-%e4%ba%a4%e4%ba%92%e5%bc%8f%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" rel="">5. 交互式配置文件</a></li>
<li><a href="#6-%e9%83%a8%e7%bd%b2%e6%b8%85%e5%8d%95" rel="">6. 部署清单</a></li>
<li><a href="#7-mysql%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" rel="">7. MySQL配置文件</a></li>
<li><a href="#8-%e9%83%a8%e7%bd%b2" rel="">8. 部署</a></li>
<li><a href="#9-%e9%aa%8c%e8%af%81" rel="">9. 验证</a>
<ul>
<li><a href="#91-%e7%99%bb%e5%bd%95%e8%8a%82%e7%82%b9%e6%9f%a5%e7%9c%8b%e7%8a%b6%e6%80%81" rel="">9.1. 登录节点查看状态</a></li>
<li><a href="#92-%e4%b8%bb%e8%8a%82%e7%82%b9%e5%bb%ba%e5%ba%93%e4%bb%8e%e8%8a%82%e7%82%b9%e6%9f%a5%e7%9c%8b%e5%90%8c%e6%ad%a5%e6%ad%a3%e5%b8%b8" rel="">9.2. 主节点建库，从节点查看同步正常</a></li>
</ul>
</li>
</ul>]]></description>
</item>
<item>
    <title>Dockerfile操作指令</title>
    <link>http://localhost:1313/posts/dockerfile%E6%93%8D%E4%BD%9C%E6%8C%87%E4%BB%A4/</link>
    <pubDate>Thu, 06 Jul 2023 21:12:45 &#43;0800</pubDate>
    <author>Captain</author>
    <guid>http://localhost:1313/posts/dockerfile%E6%93%8D%E4%BD%9C%E6%8C%87%E4%BB%A4/</guid>
    <description><![CDATA[<h1 id="1-dockerfile介绍">1. DockerFile介绍</h1>
<p>dockerfile是用来构建dokcer镜像的文件!命令参数脚本! 通过以下脚本可以生成镜像，镜像是一层一层的，脚本一个个的命令，每个命令都是一层！</p>]]></description>
</item>
<item>
    <title>Docker基于Alpine构建SSH服务</title>
    <link>http://localhost:1313/posts/docker%E5%9F%BA%E4%BA%8Ealpine%E6%9E%84%E5%BB%BAssh%E6%9C%8D%E5%8A%A1/</link>
    <pubDate>Sun, 02 Jul 2023 18:21:42 &#43;0800</pubDate>
    <author>Captain</author>
    <guid>http://localhost:1313/posts/docker%E5%9F%BA%E4%BA%8Ealpine%E6%9E%84%E5%BB%BAssh%E6%9C%8D%E5%8A%A1/</guid>
    <description><![CDATA[<h1 id="1-ssh-secure-shell-简介">1. SSH （Secure Shell） 简介</h1>
<p>SSH是最为常见的远程连接协议，其是可以帮助我们在互联网中使用Shell 的程序和协议。SSH 为我们在互联网中传递对服务器的操作，并对服务器返回的结果进行加密，以确保远程操作服务器时的安全；对服务器的远程操作，Shell程序比必然是输入指令和展示结果最有效的工具，每一位开发者或多或少都会对Shell程序有所了解；对于为运维人员，使用Shell程序更是家常便饭，对服务器的所有操作，以及查看监测服务器的状态都需要通过Shell程序。</p>]]></description>
</item>
<item>
    <title>hugo插件之代码块拷贝插件</title>
    <link>http://localhost:1313/posts/hugo%E6%8F%92%E4%BB%B6%E4%B9%8B%E4%BB%A3%E7%A0%81%E5%9D%97%E6%8B%B7%E8%B4%9D%E6%8F%92%E4%BB%B6/</link>
    <pubDate>Sat, 06 May 2023 17:20:22 &#43;0800</pubDate>
    <author>Captain</author>
    <guid>http://localhost:1313/posts/hugo%E6%8F%92%E4%BB%B6%E4%B9%8B%E4%BB%A3%E7%A0%81%E5%9D%97%E6%8B%B7%E8%B4%9D%E6%8F%92%E4%BB%B6/</guid>
    <description><![CDATA[<h3 id="1-添加按钮">1. 添加按钮</h3>
<p>我们通过检查博客内容页面发现，hugo生成的每个代码块格式如下：</p>
<p>没有语法突出显示的代码块具有相同的结构，但周围没有 <code>&lt;div class=highlight&gt;</code> 。为了考虑到这两种情况，我选择了作为<code>&lt;pre&gt;</code>元素下面的<code>&lt;code&gt;</code>子元素。</p>]]></description>
</item>
<item>
    <title>golang图片处理库image基本操作</title>
    <link>http://localhost:1313/posts/golang%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86%E5%BA%93image%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/</link>
    <pubDate>Sun, 05 Mar 2023 13:15:48 &#43;0800</pubDate>
    <author>Captain</author>
    <guid>http://localhost:1313/posts/golang%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86%E5%BA%93image%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/</guid>
    <description><![CDATA[<h1 id="1-基本操作">1. 基本操作</h1>
<p>图片的基本读取与保存。</p>
<h1 id="2-读取">2. 读取</h1>
<p>图片读取和文件读取类似，需要先获取流：</p>
<ul>
<li>注册图片的解码器（如：jpg则import _ “image/jpeg”, png则import _ “image/png”）</li>
<li>通过os.open打开文件获取流；</li>
<li>通过image.Decode解码流，获取图片；</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"> <span class="m">1i</span><span class="nx">mport</span> <span class="nx">_</span> <span class="s">&#34;image/jpeg&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="mi">2</span><span class="kd">func</span> <span class="nf">readPic</span><span class="p">()</span> <span class="nx">image</span><span class="p">.</span><span class="nx">Image</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="mi">3</span>    <span class="nx">f</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Open</span><span class="p">(</span><span class="s">&#34;C:\\hatAndSunglass.jpg&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="mi">4</span>    <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="mi">5</span>        <span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="mi">6</span>    <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="mi">7</span>    <span class="k">defer</span> <span class="nx">f</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="mi">8</span>
</span></span><span class="line"><span class="cl"> <span class="mi">9</span>    <span class="nx">img</span><span class="p">,</span> <span class="nx">fmtName</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">image</span><span class="p">.</span><span class="nf">Decode</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="mi">10</span>    <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="mi">11</span>        <span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="mi">12</span>    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="mi">13</span>    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Name: %v, Bounds: %+v, Color: %+v&#34;</span><span class="p">,</span> <span class="nx">fmtName</span><span class="p">,</span> <span class="nx">img</span><span class="p">.</span><span class="nf">Bounds</span><span class="p">(),</span> <span class="nx">img</span><span class="p">.</span><span class="nf">ColorModel</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="mi">14</span>
</span></span><span class="line"><span class="cl"><span class="mi">15</span>    <span class="k">return</span> <span class="nx">img</span>
</span></span><span class="line"><span class="cl"><span class="mi">16</span><span class="p">}</span>
</span></span></code></pre></div><p>解码后返回的第一个参数为Image接口：</p>]]></description>
</item>
<item>
    <title>Linux 笔记整理</title>
    <link>http://localhost:1313/posts/linux-%E7%AC%94%E8%AE%B0%E6%95%B4%E7%90%86/</link>
    <pubDate>Mon, 12 Dec 2022 18:56:18 &#43;0800</pubDate>
    <author>Captain</author>
    <guid>http://localhost:1313/posts/linux-%E7%AC%94%E8%AE%B0%E6%95%B4%E7%90%86/</guid>
    <description><![CDATA[<h2 id="1-linux-常见目录">1. Linux 常见目录</h2>
<table>
  <thead>
      <tr>
          <th style="text-align: left">目录</th>
          <th style="text-align: left">用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">/</td>
          <td style="text-align: left">根目录，通常不储存文件</td>
      </tr>
      <tr>
          <td style="text-align: left">/bin</td>
          <td style="text-align: left">二进制目录，存放用户级 GNU 工具</td>
      </tr>
      <tr>
          <td style="text-align: left">/boot</td>
          <td style="text-align: left">启动目录，存放启动文件</td>
      </tr>
      <tr>
          <td style="text-align: left">/dev</td>
          <td style="text-align: left">设备目录</td>
      </tr>
      <tr>
          <td style="text-align: left">/etc</td>
          <td style="text-align: left">系统配置文件目录</td>
      </tr>
      <tr>
          <td style="text-align: left">/home</td>
          <td style="text-align: left">主目录，Linux 在这里创建用户目录</td>
      </tr>
      <tr>
          <td style="text-align: left">/lib</td>
          <td style="text-align: left">库目录，存放系统和应用程序的库文件</td>
      </tr>
      <tr>
          <td style="text-align: left">/media</td>
          <td style="text-align: left">媒体目录，可移动媒体设备的常用挂载点</td>
      </tr>
      <tr>
          <td style="text-align: left">/mnt</td>
          <td style="text-align: left">挂在目录，另一个常用挂载点</td>
      </tr>
      <tr>
          <td style="text-align: left">/opt</td>
          <td style="text-align: left">可选目录，常用于存放第三方软件包和数据文件</td>
      </tr>
      <tr>
          <td style="text-align: left">/root</td>
          <td style="text-align: left">root 用户的主目录</td>
      </tr>
      <tr>
          <td style="text-align: left">/sbin</td>
          <td style="text-align: left">系统二进制目录，存放 GNU 管理员级工具</td>
      </tr>
      <tr>
          <td style="text-align: left">/run</td>
          <td style="text-align: left">运行目录，存放系统运作时的运行时数据</td>
      </tr>
      <tr>
          <td style="text-align: left">/proc</td>
          <td style="text-align: left">进程目录，存放现有硬件和当前进程的相关信息</td>
      </tr>
      <tr>
          <td style="text-align: left">/srv</td>
          <td style="text-align: left">服务目录，存放本地服务的相关文件</td>
      </tr>
      <tr>
          <td style="text-align: left">/sys</td>
          <td style="text-align: left">系统目录，存放系统硬件信息的相关文件</td>
      </tr>
      <tr>
          <td style="text-align: left">/tmp</td>
          <td style="text-align: left">临时目录，可以在该目录中创建删除临时工作文件</td>
      </tr>
      <tr>
          <td style="text-align: left">/usr</td>
          <td style="text-align: left">用户二进制目录</td>
      </tr>
      <tr>
          <td style="text-align: left">/var</td>
          <td style="text-align: left">可变目录</td>
      </tr>
  </tbody>
</table>
<h2 id="2-常用命令">2. 常用命令</h2>
<ul>
<li><code>pwd</code>：显示 shell 会话当前目录。<code>.</code> 表示当前目录，<code>..</code> 表示当前文件目录的父目录。</li>
<li><code>man</code>：查看手册。</li>
<li><code>cd destination</code>：切换目录。</li>
<li><code>ls</code>：显示当前目录下的文件和目录。
<ul>
<li><code>-F</code>：区分文件和目录，目录文件名后会添加<code>/</code>。</li>
<li><code>-a</code>：将隐藏文件和普通文件及目录一起显示出来。</li>
<li><code>-R</code>：递归选项。列出当前目录下包含的子目录中的文件。</li>
<li><code>-l</code>：产生长列表格式的输出，包含了目录中每个文件的相关信息：文件类型，权限，硬链接总数，属主的用户名，组名，大小，上次修改时间，文件名或目录名。</li>
<li><code>-i</code>：查看文件或目录的 inode 编号。</li>
<li><code>--time=atime</code>：显示访问时间。</li>
</ul>
</li>
<li>文件扩展匹配：使用通配符。
<ul>
<li><code>?</code>：代表一个字符。</li>
<li><code>*</code>：代表零个或多个字符。</li>
<li><code>[]</code>：表示一个字符位置并给出多个可能的选择，也可以指定范围。</li>
<li><code>!</code>：将不需要的内容排除。</li>
</ul>
</li>
<li><code>touch</code>：创建空文件，或改变文件修改时间。
<ul>
<li><code>-a</code>：改变访问时间。</li>
</ul>
</li>
<li><code>cp source destination</code>：复制文件。
<ul>
<li><code>-i</code>：强制 shell 询问是否需要覆盖已有文件。</li>
<li><code>-R</code>：递归地复制整个目录的内容。</li>
</ul>
</li>
<li><code>ln -s</code>：创建符号链接。
<ul>
<li><code>ln</code>：创建硬链接。</li>
<li>符号链接是一个实实在在的文件，它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件，彼此的内容并不相同。</li>
<li>硬链接会创建独立的虚拟文件，其中包含了原始文件的信息和位置。但是它们从根本上而言是同一个文件。引用硬链接等同于引用了源文件。</li>
</ul>
</li>
<li><code>mv</code>：移动或重命名文件和目录。重命名、移动不改变 inode 编号和时间戳。
<ul>
<li><code>-i</code>：命令试图覆盖已有文件时得到提示。</li>
</ul>
</li>
<li><code>rm</code>：删除。
<ul>
<li><code>-i</code>：确认提示。</li>
<li><code>-f</code>：强制删除。</li>
<li><code>-r</code>：向下进入目录。</li>
</ul>
</li>
<li><code>mkdir</code>：创建目录。
<ul>
<li><code>-p</code>：同时创建多个目录和子目录。</li>
<li><code>rmdir</code>：只删除空目录。</li>
</ul>
</li>
<li><code>file</code>：查看目录、文件类型和字符编码。</li>
<li><code>cat</code>：显示文本文件中所有数据。
<ul>
<li><code>-n</code>：给所有行加上行号。</li>
<li><code>-b</code>：给有文本的行加上行号。</li>
<li><code>-T</code>:用 <code>^I</code> 替换文中制表符。</li>
</ul>
</li>
<li><code>more</code>：显示文本文件中的内容，但会在显示每页数据之后停下来。
<ul>
<li><code>less</code>：<code>more</code> 的升级。</li>
</ul>
</li>
<li><code>tail</code>：显示文件最后几行内容。默认显示文件的末尾 10 行。
<ul>
<li><code>-n</code>：修改所显示的行数。</li>
<li><code>-f</code>：在其他进程使用该文件时查看文件的内容，这是实时监测系统日志的绝妙方式。</li>
</ul>
</li>
<li><code>head</code>：显示文件开头内容，默认显示前 10 行。
<ul>
<li><code>-n</code>：修改所显示的行数。</li>
</ul>
</li>
<li><code>ps</code>：默认显示运行在当前控制台下的属于当前用户的进程。</li>
<li><code>top</code>：实时显示进程信息。</li>
<li><code>kill PID</code>：结束进程，必须为进程的属主或为 root 用户，只支持 PID。
<ul>
<li><code>killall</code>：支持进程名。</li>
</ul>
</li>
<li><code>mount -t type device directory</code>：挂载媒体设备。
<ul>
<li>默认输出当前系统上挂在的设备列表。</li>
<li><code>umount</code>：卸载设备。</li>
</ul>
</li>
<li><code>df</code>：查看所有挂载磁盘使用情况。
<ul>
<li><code>-h</code>：按用户易读的形式显示。</li>
</ul>
</li>
<li><code>du</code>：显示某个特定目录（默认情况是当前目录）的磁盘使用情况。
<ul>
<li><code>-c</code>：显示所有已列出文件总的大小。</li>
<li><code>-h</code>：按用户易读的形式显示。</li>
</ul>
</li>
<li><code>sort</code>：按会话指定的默认语言的排序规则对文本文件中的数据进行排序。
<ul>
<li><code>-n</code>：把数字识别成数字而不是字符，并且按值排序。</li>
<li><code>-M</code>：按月排序。</li>
<li><code>-t</code>：指定字段分隔符。</li>
<li><code>-k</code>：指定排序的字段。</li>
<li><code>-r</code>：将结构按降序输出。</li>
</ul>
</li>
<li><code>grep [options] pattern [file]</code>：搜索数据。
<ul>
<li><code>-v</code>：反向搜索，输出不匹配该模式的行。</li>
<li><code>-n</code>：显示匹配模式的行所在的行号。</li>
<li><code>-c</code>：显示有多少行含有匹配的模式。</li>
<li><code>-e</code>：指定多个匹配模式。</li>
</ul>
</li>
<li><code>gzip</code>：压缩文件
<ul>
<li><code>gzcat</code>：查看压缩过的文本文件的内容。</li>
<li><code>gunzip</code>：解压文件。</li>
</ul>
</li>
<li><code>tar function [option] object</code>：归档数据。
<ul>
<li><code>-cvf</code>：创建一个归档文件。</li>
<li><code>-tf</code>：列出内容。</li>
<li><code>-xvf</code>：提取内容。</li>
<li><code>tar -zxvf filename.tgz</code>：解压 .tgz</li>
</ul>
</li>
<li><code>jobs</code>：显示出当前运行在后台模式中的所有用户的进程。
<ul>
<li><code>-l</code>：显示命令的 PID。</li>
</ul>
</li>
<li><code>history</code>：查看最近使用过的命令列表。
<ul>
<li><code>-a</code>：将命令历史记录强制写入 <code>.bash_history</code> 文件。</li>
</ul>
</li>
<li><code>alias -p</code>：查看一些常用命令的别名。</li>
<li><code>env</code> / <code>printenv</code> 查看全局变量，<code>printenv</code> 也可以查看个别环境变量。</li>
<li><code>useradd</code>：添加新用户
<ul>
<li><code>-D</code>：查看默认值。</li>
<li><code>-m</code>：创建 HOME目录。</li>
</ul>
</li>
<li><code>userdel</code>：删除用户信息，不删除文件。
<ul>
<li><code>-r</code>：删除用户的 HOME目录以及邮件目录。</li>
</ul>
</li>
<li><code>usermod</code>：修改用户帐户的字段。
<ul>
<li><code>-l</code>：修改用户账户的登录名。</li>
<li><code>-L</code>：锁定账户。</li>
<li><code>-p</code>：修改账户的密码。</li>
<li><code>-U</code>：解除锁定。</li>
</ul>
</li>
<li><code>passwd</code>：修改密码。
<ul>
<li><code>-e</code>：强制用户下次登录时修改密码。</li>
</ul>
</li>
</ul>
<h2 id="3-文件权限">3. 文件权限</h2>
<h3 id="31-文件权限符">3.1. 文件权限符</h3>
<p>举例说明：</p>]]></description>
</item>
</channel>
</rss>
