<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>个人技术学习</title>
  
  
  <link href="https://kobeyoung81.cn/atom.xml" rel="self"/>
  
  <link href="https://kobeyoung81.cn/"/>
  <updated>2026-05-09T10:11:12.000Z</updated>
  <id>https://kobeyoung81.cn/</id>
  
  <author>
    <name>kobeyoung81</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>如何读论文</title>
    <link href="https://kobeyoung81.cn/2022/09/08/how2readpapers/"/>
    <id>https://kobeyoung81.cn/2022/09/08/how2readpapers/</id>
    <published>2022-09-08T17:05:30.000Z</published>
    <updated>2026-05-09T10:11:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>如果一些从业人员在机器学习领域的专业化方面很有天赋，这对他们来说是非常有利的。例如，具备计算机视觉领域的通才知识是值得赞赏的，但具备关键技术（如姿态估计）方面的专业知识和技能将更能吸引在该领域寻找从业人员的公司和组织。</p><p>下面以姿态估计主题为例，指导如何阅读与主题相关的研究论文。</p><h2 id="1、-收集针对主题的资源集。资源形式可包括：研究论文、Medium文章、博文、视频、GitHub库等。"><a href="#1、-收集针对主题的资源集。资源形式可包括：研究论文、Medium文章、博文、视频、GitHub库等。" class="headerlink" title="1、 收集针对主题的资源集。资源形式可包括：研究论文、Medium文章、博文、视频、GitHub库等。"></a>1、 收集针对主题的资源集。资源形式可包括：研究论文、Medium文章、博文、视频、GitHub库等。</h2><p>谷歌搜索“姿态估计”，将显示包含主题相关信息的一流资源。第一步的目标是整理所有相关资源，如YouTube视频、实施文档以及研究论文。在这一阶段，收集自己认为重要的资源，没有数量限制，但是请确保为有用的论文、视频和文章创建一个“候选名单”。</p><h2 id="2、-深入挖掘自己认为与主题相关的资源。记录对于每个候选资源的理解，这一点至关重要。吴恩达建议根据自己对资源的理解程度绘制一个表格，如下所示。"><a href="#2、-深入挖掘自己认为与主题相关的资源。记录对于每个候选资源的理解，这一点至关重要。吴恩达建议根据自己对资源的理解程度绘制一个表格，如下所示。" class="headerlink" title="2、 深入挖掘自己认为与主题相关的资源。记录对于每个候选资源的理解，这一点至关重要。吴恩达建议根据自己对资源的理解程度绘制一个表格，如下所示。"></a>2、 深入挖掘自己认为与主题相关的资源。记录对于每个候选资源的理解，这一点至关重要。吴恩达建议根据自己对资源的理解程度绘制一个表格，如下所示。</h2><p><img src="https://img-blog.csdnimg.cn/img_convert/3d54cc4a7ff3b6fd42b29e4f14a4fc82.png" alt="这是图片"></p><p> Richmond Alake创建的资源理解等级表</p><p>添加到列表中的每篇文章至少要浏览10-20%内容，以确保在已标识的资源中了解到足够多的介绍性内容，并能准确地评估其相关性。</p><p>对于已标识更具相关性的论文/资源，建议更深一步理解。最后得到一些自己完全理解的合适资源。</p><p>你可能会问自己：“阅读多少论文/资源才够？”</p><p>笔者也不知道答案，但是吴恩达知道。</p><p>据吴恩达说，理解5-20篇论文即可展现出对主题的基本理解，也许足以推动技术的实施。</p><p>阅读50-100篇论文可以很好的理解该领域。</p><p>在浏览资源并提取重要信息后，表格可能变成这样：</p><p><img src="https://img-blog.csdnimg.cn/img_convert/74907ace404fecafef21e16ca565ab67.png" alt="这是图片"><br>Richmond Alake创建的资源理解等级表（更新后）</p><h2 id="3、-这是笔者观察到的一个快速技巧，在理解研究论文时很有用。该步骤是进行结构性注释，用自己的话总结论文中的关键发现、结果和技术。"><a href="#3、-这是笔者观察到的一个快速技巧，在理解研究论文时很有用。该步骤是进行结构性注释，用自己的话总结论文中的关键发现、结果和技术。" class="headerlink" title="3、 这是笔者观察到的一个快速技巧，在理解研究论文时很有用。该步骤是进行结构性注释，用自己的话总结论文中的关键发现、结果和技术。"></a>3、 这是笔者观察到的一个快速技巧，在理解研究论文时很有用。该步骤是进行结构性注释，用自己的话总结论文中的关键发现、结果和技术。</h2><p>下列步骤将集中于如何阅读一篇研究论文。</p><p>阅读一篇研究论文</p><p>只通读一遍论文内容不能实现理解的目的。吴恩达认为，一次性从头到尾逐字阅读一篇论文并非形成理解的最佳方式。</p><p>要想很好的理解内容，至少要将论文通读三遍。</p><p>4、 第一遍，阅读文中以下部分：题目、摘要和图片。</p><p>5、 第二遍，先阅读以下部分：引言、结论、图片（再次阅览），然后浏览论文剩余部分。</p><p>论文的引言和结论部分包含了对文章总体内容清晰简明的介绍和对发现的总结。这几节通常只提供包括关键信息，而无补充信息。作为读者，这是有益的，因为能抓到阅读论文其他部分所需的关键信息。</p><p>6、 第三遍，阅读全文，但是跳过所有陌生复杂的数学计算或技术公式。还可跳过不理解或不熟悉的术语和技术。</p><p>7、 对某个领域进行深入研究的论文可以多阅读几遍。这些额外遍数将主要专注在对文中数学、技术以及陌生术语的理解。</p><p>对于那些通常出于信息和工程目的阅读研究论文的人，深入研究可能是非常耗时的，特别是在还有20篇论文要阅读的时候。</p><p>笔者通过介绍LeNet卷积神经网络的原始论文来展开本文的介绍过程，并总结了笔记中的关键内容，然后将其转换为一系列Medium文章。</p><h2 id="问自己一些问题"><a href="#问自己一些问题" class="headerlink" title="问自己一些问题"></a>问自己一些问题</h2><p>吴恩达提出一套在阅读论文时询问自己的问题。这些问题通常会令读者明白论文中的关键信息。笔者通常使用如下问题，以防止自己偏离理解重要信息的目标。</p><p>问题如下：</p><p>1、描述论文作者旨在实现，或已经实现的成果。</p><p>2、如果论文介绍了一个新方法/技术，它的关键要素是什么？</p><p>3、文中哪些内容对你有用？</p><p>4、你还想了解什么？</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;如果一些从业人员在机器学习领域的专业化方面很有天赋，这对他们来说是非常有利的。例如，具备计算机视觉领域的通才知识是值得赞赏的，但具备关键技术（如姿态估计）方面的专业知识和技能将更能吸引在该领域寻找从业人员的公司和组织。&lt;/p&gt;
&lt;p&gt;下面以姿态估计主题为例，指导如何阅读与主</summary>
      
    
    
    
    
    <category term="研究" scheme="https://kobeyoung81.cn/tags/%E7%A0%94%E7%A9%B6/"/>
    
    <category term="论文" scheme="https://kobeyoung81.cn/tags/%E8%AE%BA%E6%96%87/"/>
    
  </entry>
  
  <entry>
    <title>使用Certbot申请Let&#39;s Encrypt SSL证书并设置自动更新</title>
    <link href="https://kobeyoung81.cn/2022/08/23/certbot/"/>
    <id>https://kobeyoung81.cn/2022/08/23/certbot/</id>
    <published>2022-08-23T09:44:56.000Z</published>
    <updated>2026-05-09T10:11:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>Certbot可以非常简便的从Let’s Encrypt申请免费SSL证书，同时也提供了很多种不同机制。由于笔者网站采用了docker容器化的Nginx部署方式，所以没有办法直接使用Certbot内置插件进行证书的自动更新。后来经过试验，确定采用webroot方式的ACME认证，可以做到证书申请和自动更新。同时网站（Nginx）不需要停机维护。</p><h3 id="1-Nginx配置域名ACME"><a href="#1-Nginx配置域名ACME" class="headerlink" title="1. Nginx配置域名ACME"></a>1. Nginx配置域名ACME</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><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></pre></td><td class="code"><pre><span class="line">load_module /usr/lib/nginx/modules/ngx_stream_module.so;</span><br><span class="line">pid /home/path/nginx.pid;</span><br><span class="line">worker_processes auto;</span><br><span class="line">events &#123;</span><br><span class="line">    worker_connections  1024;</span><br><span class="line">    accept_mutex on;</span><br><span class="line">  &#125;</span><br><span class="line">error_log /var/log/nginx/error.log;</span><br><span class="line">http &#123;</span><br><span class="line">  include mime.types;</span><br><span class="line">  default_type application/octet-stream;</span><br><span class="line">  server &#123;</span><br><span class="line">    server_name www.xxx.com;</span><br><span class="line">    listen 443 ssl http2;</span><br><span class="line">    ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;</span><br><span class="line">    ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;</span><br><span class="line">    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;</span><br><span class="line">    listen 80;</span><br><span class="line">    include /home/webpath/letsencrypt-acme-challenge.conf;</span><br><span class="line">    if ($scheme = http) &#123;</span><br><span class="line">      return 301 https://$host:443$request_uri;</span><br><span class="line">      &#125;</span><br><span class="line">    location / &#123;</span><br><span class="line">      proxy_pass http://localhost:3000/;</span><br><span class="line">      proxy_set_header Host $host;</span><br><span class="line">      proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">      proxy_set_header X-Forwarded-Host $http_host;</span><br><span class="line">      proxy_set_header X-Forwarded-Port $server_port;</span><br><span class="line">      proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</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">listen 80;</span><br><span class="line">include /home/path/letsencrypt-acme-challenge.conf;</span><br><span class="line">if ($scheme = http) &#123;</span><br><span class="line">  return 301 https://$host:443$request_uri;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>第一行设置监听80端口（HTTP默认端口，ACME验证需要使用）；第二行设置ACME路径；第三行设置其他正常HTTP请求跳转HTTPS。</p><p>letsencrypt-acme-challenge.conf内容如下：</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></pre></td><td class="code"><pre><span class="line">location ^~ /.well-known/acme-challenge/ &#123;</span><br><span class="line">    default_type &quot;text/plain&quot;;</span><br><span class="line">    root         /home/nginxWebUI;</span><br><span class="line">    break;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">location = /.well-known/acme-challenge/ &#123;</span><br><span class="line">    return 404;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="2-使用Certbot申请证书"><a href="#2-使用Certbot申请证书" class="headerlink" title="2. 使用Certbot申请证书"></a>2. 使用Certbot申请证书</h2><p>Certbot的安装方式不再赘述，网上有很多。</p><p>安装完成之后，使用命令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo certbot certonly --webroot -w /home/webpath -d www.xxx.cn -d xxx.cn</span><br></pre></td></tr></table></figure><p>使用了<code>--webroot</code>子命令后需要使用<code>-w</code>参数指定网站路径，笔者由于使用了docker版的nginx，并将用户/home某目录挂载到了容器中的网站路径下，所以跟一般nginx默认路径不同。请注意要将letsencrypt-acme-challenge.conf文件放在对应路径下。</p><p>每一个子域名可以使用<code>-d</code>参数来指定，当前子域名个数限制为每周最多申请50个。具体请见Let’s Encrypt官网。</p><h3 id="3-使用申请好的证书"><a href="#3-使用申请好的证书" class="headerlink" title="3. 使用申请好的证书"></a>3. 使用申请好的证书</h3><p>在第一段中的Nginx配置中有如下几行：</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></pre></td><td class="code"><pre><span class="line">listen 443 ssl http2;</span><br><span class="line">ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;</span><br><span class="line">ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;</span><br><span class="line">ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;</span><br></pre></td></tr></table></figure><p>中间证书的路径需要改成对应的证书路径。</p><h3 id="4-更新证书"><a href="#4-更新证书" class="headerlink" title="4. 更新证书"></a>4. 更新证书</h3><p>直接运行命令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo certbot renew</span><br></pre></td></tr></table></figure><p>会自动更新所有证书，可以将上述语句放入crontab中，目前证书有效期为90天。</p><p>证书更新后nginx需要reload。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Certbot可以非常简便的从Let’s Encrypt申请免费SSL证书，同时也提供了很多种不同机制。由于笔者网站采用了docker容器化的Nginx部署方式，所以没有办法直接使用Certbot内置插件进行证书的自动更新。后来经过试验，确定采用webroot方式的ACME</summary>
      
    
    
    
    <category term="基础设施" scheme="https://kobeyoung81.cn/categories/%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD/"/>
    
    
    <category term="基础设施" scheme="https://kobeyoung81.cn/tags/%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD/"/>
    
    <category term="SSL" scheme="https://kobeyoung81.cn/tags/SSL/"/>
    
    <category term="HTTPS" scheme="https://kobeyoung81.cn/tags/HTTPS/"/>
    
  </entry>
  
  <entry>
    <title>使用DNS申请Letsencrpt通配符证书</title>
    <link href="https://kobeyoung81.cn/2021/11/29/ssl/"/>
    <id>https://kobeyoung81.cn/2021/11/29/ssl/</id>
    <published>2021-11-29T16:48:10.000Z</published>
    <updated>2026-05-09T10:11:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>Let’s Encrypt 宣布 ACME v2 正式支持通配符证书，并将继续清除 Web 上采用 HTTPS 的障碍，让每个网站轻松获取管理证书。下面我们一起来学习下吧！</p><p>配置环境：<br>　　操作系统：Ubuntu 18.04 LTS<br>　　配置域名：kobeyoung81.cn</p><p>具体步骤</p><h2 id="1、获取certbot"><a href="#1、获取certbot" class="headerlink" title="1、获取certbot"></a>1、获取certbot</h2><p>不同的操作系统对于certbot的安装方式不尽相同，我这里直接使用了官方源中的包。</p><h2 id="2、开始申请证书"><a href="#2、开始申请证书" class="headerlink" title="2、开始申请证书"></a>2、开始申请证书</h2><p>sudo certbot -d “*.kobeyoung81.cn” –manual –preferred-challenges dns-01 certonly</p><h2 id="3、根据提示设置ACME-TXT"><a href="#3、根据提示设置ACME-TXT" class="headerlink" title="3、根据提示设置ACME TXT"></a>3、根据提示设置ACME TXT</h2><p>在DNS服务商解析规则中增加TXT类型的解析，域名是_acme-challenge.kobeyoung81.cn，值按照certbot提示输入</p><h2 id="4、生成证书"><a href="#4、生成证书" class="headerlink" title="4、生成证书"></a>4、生成证书</h2><p>回车后成功生成证书</p><p>简单！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Let’s Encrypt 宣布 ACME v2 正式支持通配符证书，并将继续清除 Web 上采用 HTTPS 的障碍，让每个网站轻松获取管理证书。下面我们一起来学习下吧！&lt;/p&gt;
&lt;p&gt;配置环境：&lt;br&gt;　　操作系统：Ubuntu 18.04 LTS&lt;br&gt;　　配置域名：</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>使用runlike复制容器运行命令</title>
    <link href="https://kobeyoung81.cn/2021/11/17/runlike/"/>
    <id>https://kobeyoung81.cn/2021/11/17/runlike/</id>
    <published>2021-11-17T08:20:01.000Z</published>
    <updated>2026-05-09T10:11:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>我们在使用docker的过程中经常会遇到需要创建一个与已经存在的容器相同或相似的新容器实例。通过一些图形界面管理工具（例如Portainer），可以很方便的复制或更新一个已有容器。但是当我们没有安装相应的管理工具，或没有办法通过网页进行管理的时候，则需要一个命令行的工具，来提取已经存在容器的创建参数了。docker inspect相对来说过于详细，而且需要人为将相关的参数抓出来，比较麻烦。有热心开发人员开源了脚本工具runlike，可以帮助我们提取docker run命令。</p><h2 id="runlike使用"><a href="#runlike使用" class="headerlink" title="runlike使用"></a>runlike使用</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">runlike &lt;container-name&gt;</span><br></pre></td></tr></table></figure><p>增加参数 <code>-p</code> 可以输出经过美化的命令，例如</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><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">$ runlike -p redis</span><br><span class="line"></span><br><span class="line">docker run \</span><br><span class="line">    --name=redis \</span><br><span class="line">    -e <span class="string">&quot;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&quot;</span> \</span><br><span class="line">    -e <span class="string">&quot;REDIS_VERSION=2.8.9&quot;</span> \</span><br><span class="line">    -e <span class="string">&quot;REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-2.8.9.tar.gz&quot;</span> \</span><br><span class="line">    -e <span class="string">&quot;REDIS_DOWNLOAD_SHA1=003ccdc175816e0a751919cf508f1318e54aac1e&quot;</span> \</span><br><span class="line">    -p 0.0.0.0:6379:6379/tcp \</span><br><span class="line">    --detach=<span class="literal">true</span> \</span><br><span class="line">    myrepo/redis:7860c450dbee9878d5215595b390b9be8fa94c89 \</span><br><span class="line">    redis-server --slaveof 172.31.17.84 6379</span><br></pre></td></tr></table></figure><h2 id="runlike安装"><a href="#runlike安装" class="headerlink" title="runlike安装"></a>runlike安装</h2><p>本节介绍如何不安装运行runlike( :-P )。<br>runlike 已经被制成了docker镜像: assaflavie/runlike.<br>直接运行：</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">docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \</span><br><span class="line">    assaflavie/runlike YOUR-CONTAINER</span><br></pre></td></tr></table></figure><p>也可以将下列同义词放入 ~/.profile 或 ~/.bashrc</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"><span class="built_in">alias</span> runlike=<span class="string">&quot;docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike&quot;</span></span><br></pre></td></tr></table></figure><p>然后就可以直接使用本地命令行:</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">runlike YOUR-CONTAINER</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;我们在使用docker的过程中经常会遇到需要创建一个与已经存在的容器相同或相似的新容器实例。通过一些图形界面管理工具（例如Portainer），可以很方便的复制或更新一个已有容器。但是当我们没有安装相应的管理工具，或没有办法通过网页进行管理的时候，则需要一个命令行的工具，来</summary>
      
    
    
    
    <category term="基础设施" scheme="https://kobeyoung81.cn/categories/%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD/"/>
    
    
    <category term="基础设施" scheme="https://kobeyoung81.cn/tags/%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD/"/>
    
    <category term="docker" scheme="https://kobeyoung81.cn/tags/docker/"/>
    
  </entry>
  
  <entry>
    <title>RESTFul API URL 命名规范和最佳实践</title>
    <link href="https://kobeyoung81.cn/2021/09/30/restful-convention/"/>
    <id>https://kobeyoung81.cn/2021/09/30/restful-convention/</id>
    <published>2021-09-30T11:18:51.000Z</published>
    <updated>2026-05-09T10:11:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>本文收集整理了RESTFul API URL 命名规范和最佳实践，用于指导后续开发工作。</p><h2 id="RESTFul简述"><a href="#RESTFul简述" class="headerlink" title="RESTFul简述"></a>RESTFul简述</h2><p>REST 是 “表现层状态转移（Representational state transfer）”的缩写。</p><p>它意味着我们不会将真的对象通过网络发送给另一方，而只会传输对象的表现层状态。而表现层状态通常是通过JSON、XML、HTML或者文本等其他格式传输的。</p><p>我们通过使用无状态协议和标准REST操作（比如GET, HEAD, POST, PUT, PATCH, DELETE, CONNECT, OPTIONS 和 TRACE）来创建高性能、可靠的微服务或API。</p><h2 id="资源为核心"><a href="#资源为核心" class="headerlink" title="资源为核心"></a>资源为核心</h2><p>所有的REST原则和架构都以<strong>资源（Resource）</strong>为核心。通过一系列架构风格定义了创建API/服务/微服务的范例。<br>任何一个REST URI都应该遵循一套语义规则、准确定义资源位置，使得其他人可以通过网络访问该资源。<br>下面是一些最佳实践。</p><h2 id="URL-结构-及-API-URL-命名规范"><a href="#URL-结构-及-API-URL-命名规范" class="headerlink" title="URL 结构 及 API URL 命名规范"></a>URL 结构 及 API URL 命名规范</h2><h3 id="URL-要有较高的可读性"><a href="#URL-要有较高的可读性" class="headerlink" title="URL 要有较高的可读性"></a>URL 要有较高的可读性</h3><p>好的URL具有统一性，能够让大家很容易发现和理解</p><p>下面是一个比较好的 URL 示例:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://api.thecodebuzz.com/v1.0/orders/&#123;order-id&#125;</span><br></pre></td></tr></table></figure><p>下面是一个不太友好的 URL 示例:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://api.thecodebuzz.com/GetOrder/OMS/BDS/&#123;order-id&#125;</span><br></pre></td></tr></table></figure><p>我们接下来详细分析一下URL的命名。</p><h3 id="URL中应使用名词，避免使用CURD等动词"><a href="#URL中应使用名词，避免使用CURD等动词" class="headerlink" title="URL中应使用名词，避免使用CURD等动词"></a>URL中应使用名词，避免使用CURD等动词</h3><p>URL应该只包含名词而不应该使用向GetData、UpdateData这样的动词。</p><p>不建议采用的URL:</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">https://api.thecodebuzz.com/v1.0/GetOrders/&#123;order-id&#125;</span><br><span class="line"></span><br><span class="line">https://api.thecodebuzz.com/v1.0/DeleteOrders/&#123;order-id&#125;</span><br></pre></td></tr></table></figure><p>推荐的URL：</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">https://api.thecodebuzz.com/v1.0/orders/&#123;order-id&#125;</span><br><span class="line"></span><br><span class="line">https://api.thecodebuzz.com/v1.0/orders/&#123;order-id&#125;</span><br></pre></td></tr></table></figure><p>请注意上面的推荐的例子中，查询订单和删除订单的URL是一样的。这是因为这两个URL都操作了同一个资源，而查询和删除的操作是通过标准REST操作来区分的，如果我们使用curl程序来调用接口，那么查询、修改和删除操作的命令如下所示：</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">curl GET https://api.thecodebuzz.com/v1.0/orders/123</span><br><span class="line"></span><br><span class="line">curl PUT https://api.thecodebuzz.com/v1.0/orders/123</span><br><span class="line"></span><br><span class="line">curl DELETE https://api.thecodebuzz.com/v1.0/orders/123</span><br></pre></td></tr></table></figure><h3 id="使用名词复数"><a href="#使用名词复数" class="headerlink" title="使用名词复数"></a>使用名词复数</h3><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">https://api.thecodebuzz.com/v1.0/orders/&#123;order-id&#125;</span><br><span class="line"></span><br><span class="line">https://api.thecodebuzz.com/v1.0/payments/&#123;pay-id&#125;</span><br></pre></td></tr></table></figure><h3 id="URL中使用短横线"><a href="#URL中使用短横线" class="headerlink" title="URL中使用短横线 (-)"></a>URL中使用短横线 (-)</h3><p>与下划线等其他分隔符相比，短横线（-）更能提升可读性。如果遇到较长的名字，请使用短横。<br>示例：</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">https://api.thecodebuzz.com/v1.0/books-management/north-america/orders/&#123;order-id&#125;</span><br><span class="line"></span><br><span class="line">https://api.thecodebuzz.com/v1.0/books-management/north-america/payments/&#123;payment-id&#125;</span><br></pre></td></tr></table></figure><h3 id="URL中不应使用下划线"><a href="#URL中不应使用下划线" class="headerlink" title="URL中不应使用下划线(_)"></a>URL中不应使用下划线(_)</h3><p>下划线可读性不佳，经常跟其他行混淆；</p><p>一些DNS不支持含有下划线的URL；</p><p>为了避免不必要的冲突，如果遇到较长的名字，请使用短横线。</p><p>不建议的URL：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://api.thecodebuzz.com/v1.0/books_management/north_america/orders/&#123;order-id&#125;</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></pre></td><td class="code"><pre><span class="line">https://api.thecodebuzz.com/v1.0/books-management/north-america/orders/&#123;order-id&#125;</span><br></pre></td></tr></table></figure><h3 id="API-URL-长度限制"><a href="#API-URL-长度限制" class="headerlink" title="API URL 长度限制"></a>API URL 长度限制</h3><p>As per RFC 7230,<br>按照RFC 7230的要求，</p><blockquote><p>HTTP请求中不存在预先定义的长度上限。[…] 服务器收到超过预期长度上限的请求必须回复“414(URI Too Long)”状态码。</p></blockquote><p>另一方面，现有部分服务确实无法处理超过2048个字符长度的URL。</p><p>URL长度超长通常伴随着含有较多参数的HTTP GET方法出现，需要引起注意。</p><h2 id="更多示例"><a href="#更多示例" class="headerlink" title="更多示例"></a>更多示例</h2><h3 id="HTTP-GET"><a href="#HTTP-GET" class="headerlink" title="HTTP GET"></a>HTTP GET</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">//获取所有书籍</span><br><span class="line">HTTP GET  http://api.thecodebuzz.com/books-agencies/agencies/books</span><br><span class="line"></span><br><span class="line">//获取某一出版社的书籍</span><br><span class="line">HTTP GET  http://api.thecodebuzz.com/books-agencies/agencies/&#123;agency-id&#125;/books</span><br><span class="line"></span><br><span class="line">//获取某一出版社的特定书籍</span><br><span class="line">HTTP GET  http://api.thecodebuzz.com/books-agencies/agencies/&#123;agency-id&#125;/books/&#123;book-id&#125;</span><br></pre></td></tr></table></figure><h3 id="HTTP-POST"><a href="#HTTP-POST" class="headerlink" title="HTTP POST"></a>HTTP POST</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//新增一本书</span><br><span class="line">http://api.thecodebuzz.com/books-agencies/agencies/books  </span><br></pre></td></tr></table></figure><h3 id="HTTP-PUT"><a href="#HTTP-PUT" class="headerlink" title="HTTP PUT"></a>HTTP PUT</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//更新所有出版社的某一本书</span><br><span class="line">HTTP PUT http://api.thecodebuzz.com/books-agencies/agencies/books/&#123;book-id&#125; </span><br></pre></td></tr></table></figure><h3 id="HTTP-DELETE"><a href="#HTTP-DELETE" class="headerlink" title="HTTP DELETE"></a>HTTP DELETE</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//删除所有出版社的同一本书</span><br><span class="line">HTTP DELETE http://api.thecodebuzz.com/books-agencies/agencies/books/&#123;book-id&#125;  </span><br><span class="line">//删除指定出版社的指定书籍</span><br><span class="line">HTTP DELETE http://api.thecodebuzz.com/books-agencies/agencies/&#123;agency-id&#125;/books/&#123;book-id&#125;  </span><br></pre></td></tr></table></figure><p>上面示例中的命名都遵循了通用的规范，可以很容易的用来构建新的RESTFul服务。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>资源是REST理念、标准和架构的核心。基于REST的URI应该遵循相应的语义规则和标准来标识API中的资源。亲爱的读者如果有任何的问题，欢迎在下方留言。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;本文收集整理了RESTFul API URL 命名规范和最佳实践，用于指导后续开发工作。&lt;/p&gt;
&lt;h2 id=&quot;RESTFul简述&quot;&gt;&lt;a href=&quot;#RESTFul简述&quot; class=&quot;headerlink&quot; title=&quot;RESTFul简述&quot;&gt;&lt;/a&gt;RESTFul</summary>
      
    
    
    
    <category term="开发规范" scheme="https://kobeyoung81.cn/categories/%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/"/>
    
    
    <category term="RESTFul" scheme="https://kobeyoung81.cn/tags/RESTFul/"/>
    
    <category term="规范" scheme="https://kobeyoung81.cn/tags/%E8%A7%84%E8%8C%83/"/>
    
  </entry>
  
  <entry>
    <title>node-sass 离线安装方法</title>
    <link href="https://kobeyoung81.cn/2021/09/24/nodesass/"/>
    <id>https://kobeyoung81.cn/2021/09/24/nodesass/</id>
    <published>2021-09-24T09:01:11.000Z</published>
    <updated>2026-05-09T10:11:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>由于公司内部网络不能联网，前端开发人员需要使用node-sass，安装过程非常痛苦。其中走了如下几个弯路：</p><h4 id="1-尝试安装npm-install-windows-build-tools。"><a href="#1-尝试安装npm-install-windows-build-tools。" class="headerlink" title="1. 尝试安装npm install windows-build-tools。"></a>1. 尝试安装npm install windows-build-tools。</h4><p>这个没有走通，原因是可以联网的机器是一台Linux机器，扑街。</p><h4 id="2-尝试手动安装BuildTools和Python。"><a href="#2-尝试手动安装BuildTools和Python。" class="headerlink" title="2. 尝试手动安装BuildTools和Python。"></a>2. 尝试手动安装BuildTools和Python。</h4><p>安装成功了，然后按照node-sass和node-gyp页面上的说明进行了尝试，编译失败，报错大致如下：</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">error MSB4019: The imported project &quot;E:\Microsoft.Cpp.Default.props&quot; was not found. Confirm that the path in the &lt;Import&gt; declaration is correct, and that the file exists on disk.</span><br><span class="line">error MSB4019: 未找到导入的项目&quot;E:\Microsoft.Cpp.Default.props&quot;。请确认&lt;Import&gt;声明中的路径正确，且磁盘上存在该文件。</span><br></pre></td></tr></table></figure><p>再次扑街。</p><h2 id="正确姿势"><a href="#正确姿势" class="headerlink" title="正确姿势"></a>正确姿势</h2><h4 id="3-直接为安装脚本提供二进制文件"><a href="#3-直接为安装脚本提供二进制文件" class="headerlink" title="3. 直接为安装脚本提供二进制文件"></a>3. 直接为安装脚本提供二进制文件</h4><p>其实事情的缘起就是node-sass在安装时的一个脚本install.js在断网状态无法获取相应编译好的二进制。然后安装脚本就展开了通过源码进行编译的作死行为。</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">&gt; node-sass@4.6.1 install /src/node_modules/node-sass</span><br><span class="line">&gt; node scripts/install.js</span><br><span class="line"></span><br><span class="line">Downloading binary from https://github.com/sass/node-sass/releas…</span><br><span class="line">Cannot download &quot;https://github.com/sass/node-sass/releas…&quot;:</span><br><span class="line"></span><br><span class="line">HTTP error 404 Not Found</span><br></pre></td></tr></table></figure><p>经过查看相应的安装脚本scripts/install.js后，发现在lib/extensions.js中有这么一段注释：</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><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></pre></td><td class="code"><pre><span class="line">/**</span><br><span class="line"> * Determine the URL to fetch binary file from.</span><br><span class="line"> * By default fetch from the node-sass distribution</span><br><span class="line"> * site on GitHub.</span><br><span class="line"> *</span><br><span class="line"> * The default URL can be overridden using</span><br><span class="line"> * the environment variable SASS_BINARY_SITE,</span><br><span class="line"> * .npmrc variable sass_binary_site or</span><br><span class="line"> * or a command line option --sass-binary-site:</span><br><span class="line"> *</span><br><span class="line"> *   node scripts/install.js --sass-binary-site http://example.com/</span><br><span class="line"> *</span><br><span class="line"> * The URL should to the mirror of the repository</span><br><span class="line"> * laid out as follows:</span><br><span class="line"> *</span><br><span class="line"> * SASS_BINARY_SITE/</span><br><span class="line"> *</span><br><span class="line"> *  v3.0.0</span><br><span class="line"> *  v3.0.0/freebsd-x64-14_binding.node</span><br><span class="line"> *  ....</span><br><span class="line"> *  v3.0.0</span><br><span class="line"> *  v3.0.0/freebsd-ia32-11_binding.node</span><br><span class="line"> *  v3.0.0/freebsd-x64-42_binding.node</span><br><span class="line"> *  ... etc. for all supported versions and platforms</span><br><span class="line"> *</span><br><span class="line"> * @api public</span><br><span class="line"> */</span><br><span class="line"></span><br><span class="line">function getBinaryUrl() &#123;</span><br><span class="line">........</span><br></pre></td></tr></table></figure><p>原来可以通过设置环境变量覆盖默认的github下载路径，刚好手边就有现成的http服务器，将相应的xxx_binding.node文件扔上去，然后在要安装node-sass机器上设置SASS_BINARY_SITE环境变量就可以了。</p><p>注意：如果http文件服务器是 <a href="">http://XXX.XXX.XX:8080/YYY</a>，则设置 SASS_BINARY_SITE=<a href="">http://XXX.XXX.XX:8080/YYY</a> 。接下来需要在相应目录下创建<strong>版本号文件夹</strong>，然后将相应的XXX_binding.node放上去。完整的下载路径应该类似于 <a href="">http://XXX.XXX.XX:8080/YYY/v4.14.1/win32-x64-83_binding.node</a>。</p><p>之后正常安装npm install node-sass即可。总算搞定了。</p><p>除过设置SASS_BINARY_SITE环境变量，还可以指定二进制的存放位置，将文件直接放在那个路径中即可。我心累了，请大家自行查看<a href="https://github.com/sass/node-sass/blob/master/lib/extensions.js">https://github.com/sass/node-sass/blob/master/lib/extensions.js</a> 文件。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;由于公司内部网络不能联网，前端开发人员需要使用node-sass，安装过程非常痛苦。其中走了如下几个弯路：&lt;/p&gt;
&lt;h4 id=&quot;1-尝试安装npm-install-windows-build-tools。&quot;&gt;&lt;a href=&quot;#1-尝试安装npm-install-win</summary>
      
    
    
    
    <category term="开发环境" scheme="https://kobeyoung81.cn/categories/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="node" scheme="https://kobeyoung81.cn/tags/node/"/>
    
    <category term="离线安装" scheme="https://kobeyoung81.cn/tags/%E7%A6%BB%E7%BA%BF%E5%AE%89%E8%A3%85/"/>
    
  </entry>
  
  <entry>
    <title>使用Goproxy解决golang.org模块无法下载的问题</title>
    <link href="https://kobeyoung81.cn/2021/09/24/goproxy/"/>
    <id>https://kobeyoung81.cn/2021/09/24/goproxy/</id>
    <published>2021-09-24T08:55:56.000Z</published>
    <updated>2026-05-09T10:11:12.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>Goproxy 中国完全实现了 Go 的模块代理协议。并且它是一个由中国备受信赖的云服务提供商七牛云支持的非营利性项目。目标是为中国和世界上其他地方的 Gopher 们提供一个免费的、可靠的、持续在线的且经过 CDN 加速的模块代理。</p><p>愉快地编码吧，Gopher 们！;-)</p><h2 id="用法"><a href="#用法" class="headerlink" title="用法"></a>用法</h2><h3 id="macOS-或-Linux"><a href="#macOS-或-Linux" class="headerlink" title="macOS 或 Linux"></a>macOS 或 Linux</h3><p>打开你的终端并执行：</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">$ <span class="built_in">export</span> GOPROXY=https://goproxy.cn</span><br></pre></td></tr></table></figure><p>或者</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">$ <span class="built_in">echo</span> <span class="string">&quot;GOPROXY=https://goproxy.cn&quot;</span> &gt;&gt; ~/.profile &amp;&amp; <span class="built_in">source</span> ~/.profile</span><br></pre></td></tr></table></figure><p>完成。</p><h3 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h3><p>打开你的 PowerShell 并执行：</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">C:\&gt; <span class="variable">$env</span>:GOPROXY = <span class="string">&quot;https://goproxy.cn&quot;</span></span><br></pre></td></tr></table></figure><p>或者</p><ol><li><p>打开“开始”并搜索“env”</p></li><li><p>选择“编辑系统环境变量”</p></li><li><p>点击“环境变量…”按钮</p></li><li><p>在“&lt;你的用户名&gt; 的用户变量”章节下（上半部分）</p></li><li><p>点击“新建…”按钮</p></li><li><p>选择“变量名”输入框并输入“GOPROXY”</p></li><li><p>选择“变量值”输入框并输入“<a href="https://goproxy.cn”/">https://goproxy.cn”</a></p></li><li><p>点击“确定”按钮</p></li></ol><p>重启命令行或者PowerShell</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; class=&quot;headerlink&quot; title=&quot;简介&quot;&gt;&lt;/a&gt;简介&lt;/h2&gt;&lt;p&gt;Goproxy 中国完全实现了 Go 的模块代理协议。并且它是一个由中国备受信赖的云服务提供商七牛云支持的非营利性项目。目标是为中国和世界上</summary>
      
    
    
    
    <category term="开发环境" scheme="https://kobeyoung81.cn/categories/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="golang" scheme="https://kobeyoung81.cn/tags/golang/"/>
    
  </entry>
  
  <entry>
    <title>你好世界</title>
    <link href="https://kobeyoung81.cn/2021/09/23/hello-world/"/>
    <id>https://kobeyoung81.cn/2021/09/23/hello-world/</id>
    <published>2021-09-23T08:55:56.000Z</published>
    <updated>2026-05-09T10:11:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>欢迎大家来到我的技术学习小站.</p><h2 id="请多指教！"><a href="#请多指教！" class="headerlink" title="请多指教！"></a>请多指教！</h2>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;欢迎大家来到我的技术学习小站.&lt;/p&gt;
&lt;h2 id=&quot;请多指教！&quot;&gt;&lt;a href=&quot;#请多指教！&quot; class=&quot;headerlink&quot; title=&quot;请多指教！&quot;&gt;&lt;/a&gt;请多指教！&lt;/h2&gt;</summary>
      
    
    
    
    <category term="开发环境" scheme="https://kobeyoung81.cn/categories/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/"/>
    
    
  </entry>
  
</feed>
