<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>自留地</title>
  
  <subtitle>瞎哔哔.....</subtitle>
  <link href="https://nsdont.tech/atom.xml" rel="self"/>
  
  <link href="https://nsdont.tech/"/>
  <updated>2025-10-10T04:48:46.758Z</updated>
  <id>https://nsdont.tech/</id>
  
  <author>
    <name>NSDont</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Mac 微信聊天记录迁移到外置 SSD</title>
    <link href="https://nsdont.tech/2025/09/08/Mac-%E5%BE%AE%E4%BF%A1%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%95%E8%BF%81%E7%A7%BB%E5%88%B0%E5%A4%96%E7%BD%AE-SSD/"/>
    <id>https://nsdont.tech/2025/09/08/Mac-%E5%BE%AE%E4%BF%A1%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%95%E8%BF%81%E7%A7%BB%E5%88%B0%E5%A4%96%E7%BD%AE-SSD/</id>
    <published>2025-09-08T08:27:51.000Z</published>
    <updated>2025-10-10T04:48:46.758Z</updated>
    
    <content type="html"><![CDATA[<h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><ol><li>我的 MBP 只有 500GB, 多年用下来多余空间已经不足, 时不时就只有几 GB</li><li>我买了个 2 TB 的 SSD 做外置硬盘(尿袋), 每天插着用</li></ol><h1 id="发现微信占用了将近-50-GB"><a href="#发现微信占用了将近-50-GB" class="headerlink" title="发现微信占用了将近 50 GB"></a>发现微信占用了将近 50 GB</h1><p>今天用 <code>DaisyDisk</code> 分析磁盘使用时, 发现微信占用了快 50 GB.<br><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2025/09/08/17573215584116.jpg"><br>决定把迁移到 SSD 上, 因为动了沙盒环境, 微信迁移稍微麻烦一点, 上代码</p><p>注意: 先停止微信</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><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将整个文件夹复制走</span></span><br><span class="line"><span class="built_in">cp</span> /Users/apple/Library/Containers/com.tencent.xinWeChat/Data/Documents /Volumes/Store/local/wechat/Documents</span><br><span class="line"></span><br><span class="line"><span class="comment"># 备份一下</span></span><br><span class="line"><span class="built_in">mv</span> /Users/apple/Library/Containers/com.tencent.xinWeChat/Data/Documents /Users/apple/Library/Containers/com.tencent.xinWeChat/Data/Documents_backup</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建软链接</span></span><br><span class="line"><span class="built_in">ln</span> -s /Volumes/Store/local/wechat/Documents <span class="variable">$HOME</span>/Library/Containers/com.tencent.xinWeChat/Data</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重新签名一下</span></span><br><span class="line"><span class="comment"># 如果出现升级微信之后, 无法打开引起的情况, 在执行签名就可以了</span></span><br><span class="line"><span class="comment"># update by: 20251010</span></span><br><span class="line">sudo codesign --sign - --force --deep /Applications/WeChat.app</span><br></pre></td></tr></table></figure><p>这时候就可以启动 wechat 了, 无痛迁移, 无影响就可以把 <code>Users/apple/Library/Containers/com.tencent.xinWeChat/Data/Documents_backup</code> 删除了.</p><p>对了, 需要允许一下微信反问外置硬盘</p><p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2025/09/08/17573219230948.jpg"></p><h2 id="我的微信版本"><a href="#我的微信版本" class="headerlink" title="我的微信版本"></a>我的微信版本</h2><p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2025/09/08/17573218863355.jpg"></p><h1 id="最后的最后"><a href="#最后的最后" class="headerlink" title="最后的最后"></a>最后的最后</h1><p>附上我目前使用的一个脚本, 将目前 macOS 常用缓存等文件夹搬家到 SSD 里</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><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置目标目录</span></span><br><span class="line">TARGET_DIR=<span class="string">&quot;/Volumes/Store/local&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 预设要移动的文件夹列表</span></span><br><span class="line"><span class="comment"># 格式为: FOLDERS_TO_MOVE[&quot;&lt;source_path&gt;&quot;]=&quot;&lt;destination_name&gt;&quot;</span></span><br><span class="line"><span class="comment"># 如果 &lt;destination_name&gt; 为空, 则使用 source_path 的 basename</span></span><br><span class="line"><span class="built_in">declare</span> -A FOLDERS_TO_MOVE</span><br><span class="line">FOLDERS_TO_MOVE=(</span><br><span class="line">  [<span class="string">&quot;<span class="variable">$HOME</span>/.pyenv&quot;</span>]=<span class="string">&quot;&quot;</span></span><br><span class="line">  [<span class="string">&quot;<span class="variable">$HOME</span>/.ollama&quot;</span>]=<span class="string">&quot;&quot;</span></span><br><span class="line">  [<span class="string">&quot;<span class="variable">$HOME</span>/.npm&quot;</span>]=<span class="string">&quot;&quot;</span></span><br><span class="line">  [<span class="string">&quot;<span class="variable">$HOME</span>/.m2&quot;</span>]=<span class="string">&quot;&quot;</span></span><br><span class="line">  [<span class="string">&quot;<span class="variable">$HOME</span>/.gradle&quot;</span>]=<span class="string">&quot;&quot;</span></span><br><span class="line">  [<span class="string">&quot;<span class="variable">$HOME</span>/.cargo&quot;</span>]=<span class="string">&quot;&quot;</span></span><br><span class="line">  [<span class="string">&quot;<span class="variable">$HOME</span>/Downloads/images&quot;</span>]=<span class="string">&quot;&quot;</span></span><br><span class="line">  [<span class="string">&quot;<span class="variable">$HOME</span>/Downloads/lark&quot;</span>]=<span class="string">&quot;&quot;</span></span><br><span class="line">  [<span class="string">&quot;<span class="variable">$HOME</span>/Library/Containers/com.tencent.xinWeChat/Data/Documents&quot;</span>]=<span class="string">&quot;wechat/Documents&quot;</span></span><br><span class="line">  <span class="comment"># [&quot;$HOME/.go&quot;]=&quot;&quot;</span></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"># 创建目标目录（如果不存在）</span></span><br><span class="line"><span class="built_in">mkdir</span> -p <span class="string">&quot;<span class="variable">$TARGET_DIR</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 日志函数</span></span><br><span class="line"><span class="function"><span class="title">log</span></span>() &#123;</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;[<span class="subst">$(date &#x27;+%Y-%m-%d %H:%M:%S&#x27;)</span>] <span class="variable">$1</span>&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 为每个文件夹创建软链接</span></span><br><span class="line"><span class="keyword">for</span> folder <span class="keyword">in</span> <span class="string">&quot;<span class="variable">$&#123;!FOLDERS_TO_MOVE[@]&#125;</span>&quot;</span>; <span class="keyword">do</span></span><br><span class="line">  dest_name=<span class="string">&quot;<span class="variable">$&#123;FOLDERS_TO_MOVE[$folder]&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 如果 dest_name 为空, 使用默认行为</span></span><br><span class="line">  <span class="keyword">if</span> [ -z <span class="string">&quot;<span class="variable">$dest_name</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">    dest_name=$(<span class="built_in">basename</span> <span class="string">&quot;<span class="variable">$folder</span>&quot;</span>)</span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 目标路径</span></span><br><span class="line">  target_path=<span class="string">&quot;<span class="variable">$TARGET_DIR</span>/<span class="variable">$dest_name</span>&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 检查原始文件夹是否存在</span></span><br><span class="line">  <span class="keyword">if</span> [ ! -d <span class="string">&quot;<span class="variable">$folder</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">log</span> <span class="string">&quot;警告: 文件夹 <span class="variable">$folder</span> 不存在，跳过&quot;</span></span><br><span class="line">    <span class="built_in">continue</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 检查目标位置是否已存在</span></span><br><span class="line">  <span class="keyword">if</span> [ -e <span class="string">&quot;<span class="variable">$target_path</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">log</span> <span class="string">&quot;警告: 目标位置 <span class="variable">$target_path</span> 已存在，跳过&quot;</span></span><br><span class="line">    <span class="built_in">continue</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 检查原始位置是否已经是软链接</span></span><br><span class="line">  <span class="keyword">if</span> [ -L <span class="string">&quot;<span class="variable">$folder</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">log</span> <span class="string">&quot;警告: <span class="variable">$folder</span> 已经是软链接，跳过&quot;</span></span><br><span class="line">    <span class="built_in">continue</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 创建目标路径的父目录 (如果需要)</span></span><br><span class="line">  <span class="built_in">mkdir</span> -p <span class="string">&quot;<span class="subst">$(dirname <span class="string">&quot;<span class="variable">$target_path</span>&quot;</span>)</span>&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 移动文件夹到目标位置</span></span><br><span class="line">  <span class="built_in">log</span> <span class="string">&quot;移动 <span class="variable">$folder</span> 到 <span class="variable">$target_path</span>&quot;</span></span><br><span class="line">  <span class="built_in">mv</span> <span class="string">&quot;<span class="variable">$folder</span>&quot;</span> <span class="string">&quot;<span class="variable">$target_path</span>&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 检查移动是否成功</span></span><br><span class="line">  <span class="keyword">if</span> [ $? -ne 0 ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">log</span> <span class="string">&quot;错误: 无法移动 <span class="variable">$folder</span> 到 <span class="variable">$target_path</span>&quot;</span></span><br><span class="line">    <span class="built_in">continue</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 创建软链接</span></span><br><span class="line">  <span class="built_in">log</span> <span class="string">&quot;创建从 <span class="variable">$target_path</span> 到 <span class="variable">$folder</span> 的软链接&quot;</span></span><br><span class="line">  <span class="built_in">ln</span> -s <span class="string">&quot;<span class="variable">$target_path</span>&quot;</span> <span class="string">&quot;<span class="variable">$folder</span>&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 检查链接是否创建成功</span></span><br><span class="line">  <span class="keyword">if</span> [ $? -ne 0 ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">log</span> <span class="string">&quot;错误: 无法创建从 <span class="variable">$target_path</span> 到 <span class="variable">$folder</span> 的软链接&quot;</span></span><br><span class="line">    <span class="comment"># 尝试恢复原始文件夹</span></span><br><span class="line">    <span class="built_in">mv</span> <span class="string">&quot;<span class="variable">$target_path</span>&quot;</span> <span class="string">&quot;<span class="variable">$folder</span>&quot;</span></span><br><span class="line">    <span class="built_in">log</span> <span class="string">&quot;已尝试恢复原始文件夹&quot;</span></span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">    <span class="built_in">log</span> <span class="string">&quot;成功: <span class="variable">$folder</span> 已移动并创建软链接&quot;</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">log</span> <span class="string">&quot;操作完成&quot;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;我的 MBP 只有 500GB, 多年用下来多余空间已经不足, 时不时就只有几 GB&lt;/li&gt;
&lt;li&gt;我买了个 2 TB 的 </summary>
      
    
    
    
    
    <category term="macOS" scheme="https://nsdont.tech/tags/macOS/"/>
    
    <category term="SSD" scheme="https://nsdont.tech/tags/SSD/"/>
    
    <category term="微信" scheme="https://nsdont.tech/tags/%E5%BE%AE%E4%BF%A1/"/>
    
    <category term="尿袋" scheme="https://nsdont.tech/tags/%E5%B0%BF%E8%A2%8B/"/>
    
  </entry>
  
  <entry>
    <title>M 系列 Mac 如何拉取运行非 ARM 架构的镜像</title>
    <link href="https://nsdont.tech/2025/04/23/M-%E7%B3%BB%E5%88%97-Mac-%E5%A6%82%E4%BD%95%E6%8B%89%E5%8F%96%E8%BF%90%E8%A1%8C%E9%9D%9E-ARM-%E6%9E%B6%E6%9E%84%E7%9A%84%E9%95%9C%E5%83%8F/"/>
    <id>https://nsdont.tech/2025/04/23/M-%E7%B3%BB%E5%88%97-Mac-%E5%A6%82%E4%BD%95%E6%8B%89%E5%8F%96%E8%BF%90%E8%A1%8C%E9%9D%9E-ARM-%E6%9E%B6%E6%9E%84%E7%9A%84%E9%95%9C%E5%83%8F/</id>
    <published>2025-04-23T08:10:55.000Z</published>
    <updated>2025-04-23T16:15:34.846Z</updated>
    
    <content type="html"><![CDATA[<h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><ol><li>我想运行一个镜像，发现他没有对应 arm 架构镜像，只有 linux&#x2F;amd64, <img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2025/04/23/SCR-20250423-ojsj.png" alt="案例"></li><li>群晖上的 docker 无法拉取镜像，需要在本地拉取镜像，然后上传到群晖里</li></ol><h1 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h1><h2 id="如何运行和拉取非-ARM-架构镜像"><a href="#如何运行和拉取非-ARM-架构镜像" class="headerlink" title="如何运行和拉取非 ARM 架构镜像"></a>如何运行和拉取非 ARM 架构镜像</h2><h3 id="直接运行-AMD-的镜像"><a href="#直接运行-AMD-的镜像" class="headerlink" title="直接运行 AMD 的镜像"></a>直接运行 AMD 的镜像</h3><p>报错如下</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 vitess/lite:mysql84</span><br><span class="line">WARNING: The requested image<span class="string">&#x27;s platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested</span></span><br></pre></td></tr></table></figure><h3 id="通过-Rosetta-运行-AMD-镜像"><a href="#通过-Rosetta-运行-AMD-镜像" class="headerlink" title="通过 Rosetta 运行 AMD 镜像"></a>通过 Rosetta 运行 AMD 镜像</h3><blockquote><p>我们需要使用 OrbStack (优势 -&gt; 远比 Docker for Mac 资源占用低)</p></blockquote><ol><li>开启使用 Rosetta 运行 intel <img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2025/04/23/SCR-20250423-oxnw.png" alt="OrbStack 配置"></li><li>运行时指定架构 -&gt; <code>docker run --platform linux/amd64 vitess/lite:mysql84</code></li></ol><h2 id="在本地拉取镜像，然后上传到群晖里"><a href="#在本地拉取镜像，然后上传到群晖里" class="headerlink" title="在本地拉取镜像，然后上传到群晖里"></a>在本地拉取镜像，然后上传到群晖里</h2><p>直接放脚本</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"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">set</span> -e</span><br><span class="line"><span class="built_in">set</span> -x</span><br><span class="line"></span><br><span class="line">image_name=<span class="variable">$1</span></span><br><span class="line">nas_ip=<span class="string">&quot;192.168.100.123&quot;</span></span><br><span class="line"></span><br><span class="line">docker pull --platform linux/amd64 <span class="variable">$image_name</span></span><br><span class="line"><span class="built_in">mkdir</span> -p ~/Downloads/temp_images</span><br><span class="line">docker save <span class="variable">$image_name</span> | gzip &gt; ~/Downloads/temp_images/temp_image.tgz</span><br><span class="line">scp ~/Downloads/temp_images/temp_image.tgz <span class="variable">$nas_ip</span>:~/temp_image.tgz</span><br><span class="line">ssh <span class="variable">$nas_ip</span> <span class="string">&quot;ls -l ~/temp_image.tgz; gunzip -c ~/temp_image.tgz | /usr/bin/docker load&quot;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;我想运行一个镜像，发现他没有对应 arm 架构镜像，只有 linux&amp;#x2F;amd64, &lt;img src=&quot;https:/</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>Spring Boot @Valid 未生效排查清单</title>
    <link href="https://nsdont.tech/2024/04/26/SpringBoot-Valid-%E6%9C%AA%E7%94%9F%E6%95%88%E6%8E%92%E6%9F%A5/"/>
    <id>https://nsdont.tech/2024/04/26/SpringBoot-Valid-%E6%9C%AA%E7%94%9F%E6%95%88%E6%8E%92%E6%9F%A5/</id>
    <published>2024-04-26T07:18:00.000Z</published>
    <updated>2024-04-26T07:37:03.883Z</updated>
    
    <content type="html"><![CDATA[<h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><p>这篇文章主要给大家介绍了关于 Spring Boot 中 @Valid 注解不生效的排查清单。</p><span id="more"></span><h1 id="可能一：依赖配置"><a href="#可能一：依赖配置" class="headerlink" title="可能一：依赖配置"></a>可能一：依赖配置</h1><p>一开始使用了 <code>spring-boot-starter-validation</code>，升级之后无效了，可能是缺少了 <code>hibernate-validator</code> 依赖。原因是 <code>Spring Boot</code> 2.3 之后，官方就移除了其中包含的 <code>hibernate-validator</code> 依赖。</p><p>需要手动增加下面的依赖</p><figure class="highlight xml"><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="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.hibernate.validator<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>hibernate-validator<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>6.1.5.Final<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><h1 id="可能二：嵌套对象"><a href="#可能二：嵌套对象" class="headerlink" title="可能二：嵌套对象"></a>可能二：嵌套对象</h1><p>如果是嵌套对象的话，里面的对象还要添加 @Valid注解，有问题的代码案例如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Operation(summary = &quot;我是 swagger api 接口说明&quot;)</span></span><br><span class="line"><span class="meta">@PostMapping(&quot;/frontapi/v1/foo&quot;)</span></span><br><span class="line"><span class="keyword">public</span> StandardHttpResponse&lt;String&gt; <span class="title function_">update</span><span class="params">(</span></span><br><span class="line"><span class="params">      <span class="meta">@Valid</span> <span class="meta">@RequestBody</span> CommonListRequest&lt;UpdateRequest&gt; request)</span> &#123;</span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CommonListRequest</span>&lt;T&gt; &#123;</span><br><span class="line"></span><br><span class="line">  <span class="meta">@NotEmpty</span></span><br><span class="line">  <span class="meta">@Schema(description = &quot;业务数据&quot;)</span></span><br><span class="line">  <span class="meta">@Size(min = 1, max = 1000)</span></span><br><span class="line">  <span class="keyword">private</span> List&lt;T&gt; data;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">UpdateRequest</span> &#123;</span><br><span class="line">  <span class="meta">@NotEmpty</span></span><br><span class="line">  <span class="meta">@Schema(description = &quot;配置&quot;, example = &quot;&#123;&#125;&quot;)</span></span><br><span class="line">  <span class="keyword">private</span> String flowConfigWithNode;</span><br><span class="line">&#125;</span><br><span class="line"></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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 模拟 flowConfigWithNode key 填错，无报错</span></span><br><span class="line">curl -X <span class="string">&quot;POST&quot;</span> <span class="string">&quot;http://127.0.0.1:8080/frontapi/v1/foo&quot;</span> \</span><br><span class="line">     -H <span class="string">&#x27;Content-Type: application/json&#x27;</span> \</span><br><span class="line">     -d $<span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">  &quot;data&quot;: [</span></span><br><span class="line"><span class="string">    &#123;</span></span><br><span class="line"><span class="string">      &quot;flowConfigWithNodes&quot;: &quot;&#123;&#125;&quot;</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">  ]</span></span><br><span class="line"><span class="string">&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 模拟 data key 填错，有报错</span></span><br><span class="line">curl -X <span class="string">&quot;POST&quot;</span> <span class="string">&quot;http://127.0.0.1:8080/frontapi/v1/foo&quot;</span> \</span><br><span class="line">     -H <span class="string">&#x27;Content-Type: application/json&#x27;</span> \</span><br><span class="line">     -d $<span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">  &quot;dataa: [</span></span><br><span class="line"><span class="string">    &#123;</span></span><br><span class="line"><span class="string">      &quot;flowConfigWithNode&quot;: &quot;&#123;&#125;&quot;</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">  ]</span></span><br><span class="line"><span class="string">&#125;&#x27;</span></span><br></pre></td></tr></table></figure><p>正确的代码, 调整 <code>CommonListRequest</code> 即可，在 data 属性上增加 <code>@Valid</code> 注解即可。</p><figure class="highlight java"><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="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CommonListRequest</span>&lt;T&gt; &#123;</span><br><span class="line"></span><br><span class="line">  <span class="meta">@Valid</span></span><br><span class="line">  <span class="meta">@NotNull</span></span><br><span class="line">  <span class="meta">@Schema(description = &quot;业务数据&quot;)</span></span><br><span class="line">  <span class="meta">@Size(min = 1, max = 1000)</span></span><br><span class="line">  <span class="keyword">private</span> List&lt;T&gt; data;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h1&gt;&lt;p&gt;这篇文章主要给大家介绍了关于 Spring Boot 中 @Valid 注解不生效的排查清单。&lt;/p&gt;</summary>
    
    
    
    <category term="Java" scheme="https://nsdont.tech/categories/Java/"/>
    
    
    <category term="SpringBoot" scheme="https://nsdont.tech/tags/SpringBoot/"/>
    
    <category term="Validator" scheme="https://nsdont.tech/tags/Validator/"/>
    
  </entry>
  
  <entry>
    <title>Wireshark 如何抓取数据并分析</title>
    <link href="https://nsdont.tech/2019/09/17/Wireshark_%E6%8A%93%E5%8F%96%E6%95%B0%E6%8D%AE/"/>
    <id>https://nsdont.tech/2019/09/17/Wireshark_%E6%8A%93%E5%8F%96%E6%95%B0%E6%8D%AE/</id>
    <published>2019-09-17T13:53:23.000Z</published>
    <updated>2024-04-26T07:09:05.920Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、如何使用-tcpdump-抓取数据"><a href="#一、如何使用-tcpdump-抓取数据" class="headerlink" title="一、如何使用 tcpdump 抓取数据"></a>一、如何使用 tcpdump 抓取数据</h2><p>我们使用 <code>tcpdump</code> 来进行抓取数据。<br>下面是一个命令案例：</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">tcpdump -i &lt;net_name&gt; host &lt;ip&gt; -w &lt;ip&gt;.pcap</span><br></pre></td></tr></table></figure><span id="more"></span><p>首先，net_name 是执行命令所在机器的网卡名称，一般来说使用 ip a, ifconfig 之类的命令获取，如下图就是使用 ifconfig 的返回结果，我们可以看到 <code>10.1.1.14</code> 对应的网卡名称是 <code>eth0</code>。<br><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/15687291476608.jpg"></p><p>接着就是 <code>ip</code>，<code>ip</code> 就是与当前机器有网络交互的机器<code>ip</code>。比如有一台机器 <code>10.1.1.15</code> 开放了 <code>80</code> 端口的服务，我们想要抓取 <code>10.1.1.14</code> 访问 <code>10.1.1.15</code> 的 80 所产生的数据，就执行下面的命令</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">tcpdump -i eth0 host 10.1.1.14 -w 10.1.1.14.pcap</span><br></pre></td></tr></table></figure><h2 id="二、使用-Wireshark-进行数据分析"><a href="#二、使用-Wireshark-进行数据分析" class="headerlink" title="二、使用 Wireshark 进行数据分析"></a>二、使用 Wireshark 进行数据分析</h2><p>使用 Wireshark 打开上面得到 10.1.1.14.pcap 文件</p><h3 id="通过-url-来过滤"><a href="#通过-url-来过滤" class="headerlink" title="通过 url 来过滤"></a>通过 url 来过滤</h3><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">http.request.full_uri contains &quot;users&quot;</span><br></pre></td></tr></table></figure><h3 id="通过-http-body-来过滤"><a href="#通过-http-body-来过滤" class="headerlink" title="通过 http body 来过滤"></a>通过 http body 来过滤</h3><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">tcp contains &quot;username&quot;</span><br></pre></td></tr></table></figure><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/Wireshark_Display_Filters.pdf">过滤器案例手册</a></li></ol>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;一、如何使用-tcpdump-抓取数据&quot;&gt;&lt;a href=&quot;#一、如何使用-tcpdump-抓取数据&quot; class=&quot;headerlink&quot; title=&quot;一、如何使用 tcpdump 抓取数据&quot;&gt;&lt;/a&gt;一、如何使用 tcpdump 抓取数据&lt;/h2&gt;&lt;p&gt;我们使用 &lt;code&gt;tcpdump&lt;/code&gt; 来进行抓取数据。&lt;br&gt;下面是一个命令案例：&lt;/p&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;tcpdump -i &amp;lt;net_name&amp;gt; host &amp;lt;ip&amp;gt; -w &amp;lt;ip&amp;gt;.pcap&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="Network" scheme="https://nsdont.tech/categories/Network/"/>
    
    
    <category term="Wireshark" scheme="https://nsdont.tech/tags/Wireshark/"/>
    
  </entry>
  
  <entry>
    <title>Python 3 拯救 python</title>
    <link href="https://nsdont.tech/2016/07/19/Python-3-%E6%8B%AF%E6%95%91-python/"/>
    <id>https://nsdont.tech/2016/07/19/Python-3-%E6%8B%AF%E6%95%91-python/</id>
    <published>2016-07-19T01:35:11.000Z</published>
    <updated>2024-04-26T07:10:11.025Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>翻译自：<a href="https://medium.com/@opinionbreaker/python-3-can-revive-python-2a7af4788b10#.2a0ao5xj6">https://medium.com/@opinionbreaker/python-3-can-revive-python-2a7af4788b10#.2a0ao5xj6</a></p></blockquote><p>我阅读了 certain Stephen A 的一篇<a href="http://blog.thezerobit.com/2014/05/25/python-3-is-killing-python.html">文章</a>. 讲解了 “Python 3 是如何杀死 Python”.</p><p>他有一些可信的理由，但是我不同意 Python 3 会杀死 Python, 尽管现在 Python 的局面并不好.</p><hr><span id="more"></span><p>“但也许每一次的危机都是一次机会”，一段用烂的座右铭.</p><p><strong>也许 Python 3 能使 Python 浴火重生.</strong></p><p>你看，这不仅仅是 Python 2 向 Python 3 迁移的问题. 我们现在并不是 2005 年, 并且新的程序员并没有与任一个版本的 Python 留下深刻印象. 当然, 有很多 Python 功能，但话又说回来, Java 的工作机会更多. 还有以前有许多 Perl 工作, 现在我并没有听到他们做的很好. 我不是在讨论工作的数量或者 GitHub 的仓库数量. 我想说的是占有率和激情, 我知道这些都有点主观, 但是我感觉 Python 在这两个方面有所缺乏但为时未晚.</p><p>比如，我们看到很多人从 Python 转向 Go.</p><p>同样，他们也不是很多, 但他们相当直接 (包括创业公司开发团队在博客上面发布更换整个技术栈), 还有人有一定的影响力 (令人惊讶的有罗勃·派克, 谁能预估有多少人从 C&#x2F;C++ 转向 Go).</p><hr><p>Python 面临着来自各方面的竞争. 有些竞争出现在 Python 的热门领域 (例如新的异步项目, 更喜欢使用 Go 而不是 Twisted, Rails 依旧统治着 Web 框架), 与效仿者竞争特定领域 (例如 Julia 在科学计算), 还有综合力竞争(Clojure, Groovy, Javascript, Dart, 等等).</p><hr><p>因此，这是我关于 Python 3 的看法. 一个简单的方法:</p><p><strong>让它引人注目.</strong></p><p>Python 3 已经不兼容 Python2 了. 不喜欢 Python 3 都成群结队的迁移走了, 所以新增一些不兼容的修改不仅不会伤害到它, 还会使它更好.</p><p>认真的说，如果 Python3 有足够诱人的新特性, 更多的用户会迁移到这里 (至少对于新的项目来说), 还有更多的人会将 Python 2 的项目或库移植过来. 最后, 据我看来, Python 3 足以吸引那些目前未使用 Python 的人.</p><hr><p>在你看来, Python 3 是一个无聊的更新.</p><p>当然, 它使语言更加连贯和修复了一些长期存在的问题和苦恼. 但它并没有做好充足的准备. 话又说回来, Python3 的横向兼容和路线图做的更好和严禁. 哎, Javascript 如果没有在那个时候流行起来. YouTube 就不会存在了. 这是很早以前的事情了.</p><p>现在比如合适的闭包, 变量不变性, 好的异步构思, 等等, 这些是现在的黑客优先考虑的功能.</p><hr><p>不提将来, 长话短说; 这里有一些事情可能让今天的黑客对 Python 3 感兴趣。拿我来<br>说，这些事情引起了我的兴趣:</p><hr><ol><li><p>移除GIL. 或者提供一个更好的异步构思. 也许有可能 Guido 提出 PEP 3156. 类似 Go 的 Channel 这种原语也不错.</p></li><li><p>加速 Python. 认真的说, 如果 Javascript 可能变得更快, CPython 也可以变得更快. 或者 PyPy 成熟到可以成熟到替换它 (应该只有这一个). 如果需要花大价钱或 Lars Bak 可以这么做, 开始动起来把 — 我会作出贡献. 各个大公司也将做出贡献. 会不会是 Dropbox 将会花大代价将 Python 在 LLVM 上面重构?</p></li><li><p>添加更多类型. 那么, 新加入的类型. 让你可以用它来加速一些代码的运行 (就像 Cython),  或提供注解和帮助类型检查(就像 Dart). 给标准库的每一个方法、类都加上类型注解.</p></li><li><p>修改标准库. 让一个团队一起去修改长期的问题, 提高修改速度和修复错误. 提高自己的 API, 然后提供简单、漂亮、常用的接口 (比如 requests vs urllib) 一起加入到标准库里面, 使用命名空间区别. 可以很容易地切换（也许还包括一些自动化工具）。</p></li><li><p>重构 REPL. 现在已经是 2014 年了. 将 REPL 以现代的方式重做. 添加一些颜色. 从 IPython 学习. 做成 Client&#x2F;Server 的形式, 让 IDE 和编辑器更好的嵌入它.</p></li></ol><hr><p>因此, Python 3 的开发人员, 利用好你们的时间. 好了, 没有太多的时间. 也许, 3 - 4年. 我们已经等了 10 年的 ES6, 我们等它花一半的时间, 然后为你服务.</p><p>它现在并没有让任何人将 Python 3 用到各种地方, 所以需要一定的机会, 打破现在的局面, 尽早发布和交付. 让社区热闹起来.</p><p>你看，Python 3 不是真的杀了 Python. 但是有可能从现在把它拯救出来。</p><hr><p>附：你怎么看？你能想到的东西，另外，你有想到额外的事情可以使 Python 3 中更诱人吗？或者有什么新的特性让你饥渴难耐？</p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;翻译自：&lt;a href=&quot;https://medium.com/@opinionbreaker/python-3-can-revive-python-2a7af4788b10#.2a0ao5xj6&quot;&gt;https://medium.com/@opinionbreaker/python-3-can-revive-python-2a7af4788b10#.2a0ao5xj6&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我阅读了 certain Stephen A 的一篇&lt;a href=&quot;http://blog.thezerobit.com/2014/05/25/python-3-is-killing-python.html&quot;&gt;文章&lt;/a&gt;. 讲解了 “Python 3 是如何杀死 Python”.&lt;/p&gt;
&lt;p&gt;他有一些可信的理由，但是我不同意 Python 3 会杀死 Python, 尽管现在 Python 的局面并不好.&lt;/p&gt;
&lt;hr&gt;</summary>
    
    
    
    <category term="Python" scheme="https://nsdont.tech/categories/Python/"/>
    
    
  </entry>
  
  <entry>
    <title>[Tips] Git 忽略目录里的文件但不忽略目录的办法</title>
    <link href="https://nsdont.tech/2016/05/06/Tips-Git-%E5%BF%BD%E7%95%A5%E7%9B%AE%E5%BD%95%E9%87%8C%E7%9A%84%E6%96%87%E4%BB%B6%E4%BD%86%E4%B8%8D%E5%BF%BD%E7%95%A5%E7%9B%AE%E5%BD%95%E7%9A%84%E5%8A%9E%E6%B3%95/"/>
    <id>https://nsdont.tech/2016/05/06/Tips-Git-%E5%BF%BD%E7%95%A5%E7%9B%AE%E5%BD%95%E9%87%8C%E7%9A%84%E6%96%87%E4%BB%B6%E4%BD%86%E4%B8%8D%E5%BF%BD%E7%95%A5%E7%9B%AE%E5%BD%95%E7%9A%84%E5%8A%9E%E6%B3%95/</id>
    <published>2016-05-06T09:15:15.000Z</published>
    <updated>2024-04-26T07:09:20.874Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>我在开发时候遇到一个问题，关于图片上传接口, 默认情况下，Python 代码是不会自动创建文件的，如果想要把图片保存到某个目录下面，需要事先检查是否有这个目录结构，否则就会报错。<br>但是纠结的那颗心，我😭拒绝写检查文件夹是否存在的代码。</p><p>所以有了这篇文章。</p><span id="more"></span><h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><p>长话短说，我发现了简单两个方法来达到我的目的。</p><h3 id="方法一：巧妙的修改配置文件"><a href="#方法一：巧妙的修改配置文件" class="headerlink" title="方法一：巧妙的修改配置文件"></a>方法一：巧妙的修改配置文件</h3><p>gitignore 的用法可以看下面的链接，放出我的 gitignore 配置文件。</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">media/*.*</span><br><span class="line">media/images/*.*</span><br><span class="line">media/avatar/*.*</span><br></pre></td></tr></table></figure><p><code>*.*</code> 代表要忽略 <code>a.b</code> 这种形式的文件，然后我们在 media，media&#x2F;images, media&#x2F;avatar 下面都加上 .gitkeep 这个文件，这样子我们就可以把这个三个文件夹都添加到 git 里面了。</p><p>注：这里的 .gitkeep 也可以是别的文件名，比如 .iwantit、.iloveyou, 我使用 gitkeep, 纯属个人喜好。 </p><h3 id="方法二：强制提交"><a href="#方法二：强制提交" class="headerlink" title="方法二：强制提交"></a>方法二：强制提交</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">media/</span><br></pre></td></tr></table></figure><p>代表忽略 <code>media</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">git add -f media/.gitkeep</span><br><span class="line">git add -f media/images/.gitkeep</span><br><span class="line">git add -f media/avatar/.gitkeep</span><br></pre></td></tr></table></figure><p>done.</p><p>记得 commit。</p><h2 id="相关链接"><a href="#相关链接" class="headerlink" title="相关链接"></a>相关链接</h2><p><a href="http://www.jianshu.com/p/a078cf2fd9b0">【git】.gitignore用法 - 简书</a></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h2&gt;&lt;p&gt;我在开发时候遇到一个问题，关于图片上传接口, 默认情况下，Python 代码是不会自动创建文件的，如果想要把图片保存到某个目录下面，需要事先检查是否有这个目录结构，否则就会报错。&lt;br&gt;但是纠结的那颗心，我😭拒绝写检查文件夹是否存在的代码。&lt;/p&gt;
&lt;p&gt;所以有了这篇文章。&lt;/p&gt;</summary>
    
    
    
    <category term="Cheat" scheme="https://nsdont.tech/categories/Cheat/"/>
    
    
    <category term="Git" scheme="https://nsdont.tech/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>Select2 如何实现多选</title>
    <link href="https://nsdont.tech/2016/05/06/select2-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E9%80%89/"/>
    <id>https://nsdont.tech/2016/05/06/select2-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E9%80%89/</id>
    <published>2016-05-06T08:41:22.000Z</published>
    <updated>2024-04-26T07:09:26.458Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>Selete2 默认不支持多选。</p></blockquote><h2 id="先看成果："><a href="#先看成果：" class="headerlink" title="先看成果："></a>先看成果：</h2><p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/select2mulitchoicedemo.gif" alt="演示图"></p><span id="more"></span><h2 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h2><p>监控两个事件( select, unselect)，覆写显示结果 ( templateResult )。</p><ol><li>选中某个元素，就会创建一个同样内容的 option。</li></ol><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></pre></td><td class="code"><pre><span class="line">$eventSelect.<span class="title function_">on</span>(<span class="string">&quot;select2:select&quot;</span>, <span class="keyword">function</span> (<span class="params">e</span>) &#123; </span><br><span class="line">  $eventSelect.<span class="title function_">append</span>(<span class="string">&#x27;&lt;option value=&quot;&#x27;</span>+e.<span class="property">params</span>.<span class="property">data</span>.<span class="property">text</span>+<span class="string">&#x27;&quot;&gt;&#x27;</span> +e.<span class="property">params</span>.<span class="property">data</span>.<span class="property">text</span> + <span class="string">&#x27;&lt;/option&gt;&#x27;</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><ol start="2"><li>在 templateResult 显示具体的元素时，检查 <code>obj.element.selected</code>, 如果为 true, 就直接不显示。</li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">formatResultData</span> (data) &#123;</span><br><span class="line">  <span class="keyword">if</span> (!data.<span class="property">id</span>) <span class="keyword">return</span> data.<span class="property">text</span>;</span><br><span class="line">  <span class="keyword">if</span> (data.<span class="property">element</span>.<span class="property">selected</span>) <span class="keyword">return</span></span><br><span class="line">  <span class="keyword">return</span> data.<span class="property">text</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">$eventSelect.<span class="title function_">select2</span>(&#123;</span><br><span class="line">  <span class="attr">templateResult</span>: formatResultData,</span><br><span class="line">  <span class="attr">tags</span>: <span class="literal">true</span>&#125;</span><br><span class="line">);</span><br></pre></td></tr></table></figure><ol start="3"><li>取消选中某个元素时，就直接删除该 option。</li></ol><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></pre></td><td class="code"><pre><span class="line">$eventSelect.<span class="title function_">on</span>(<span class="string">&quot;select2:unselect&quot;</span>, <span class="keyword">function</span> (<span class="params">e</span>) &#123; </span><br><span class="line">  e.<span class="property">params</span>.<span class="property">data</span>.<span class="property">element</span>.<span class="title function_">remove</span>();</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="最终的代码"><a href="#最终的代码" class="headerlink" title="最终的代码"></a>最终的代码</h2><p><a href="https://jsfiddle.net/nsdont/pu6yhbxy/4/">jsfiddle 代码</a></p><h2 id="相关链接"><a href="#相关链接" class="headerlink" title="相关链接"></a>相关链接</h2><p><a href="https://select2.github.io/examples.html#events">官方 event 事件文档</a><br><a href="https://github.com/select2/select2/issues/3341">how to allow duplicate selections · Issue #3341 · select2&#x2F;select2</a></p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;Selete2 默认不支持多选。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;先看成果：&quot;&gt;&lt;a href=&quot;#先看成果：&quot; class=&quot;headerlink&quot; title=&quot;先看成果：&quot;&gt;&lt;/a&gt;先看成果：&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/select2mulitchoicedemo.gif&quot; alt=&quot;演示图&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="FrontEnd" scheme="https://nsdont.tech/categories/FrontEnd/"/>
    
    
    <category term="Select2" scheme="https://nsdont.tech/tags/Select2/"/>
    
  </entry>
  
  <entry>
    <title>[译] 如何在 Hacker News 上发布文章</title>
    <link href="https://nsdont.tech/2016/03/29/%E8%AF%91-%E5%A6%82%E4%BD%95%E5%9C%A8-Hacker-News-%E4%B8%8A%E5%8F%91%E5%B8%83%E6%96%87%E7%AB%A0/"/>
    <id>https://nsdont.tech/2016/03/29/%E8%AF%91-%E5%A6%82%E4%BD%95%E5%9C%A8-Hacker-News-%E4%B8%8A%E5%8F%91%E5%B8%83%E6%96%87%E7%AB%A0/</id>
    <published>2016-03-29T07:48:50.000Z</published>
    <updated>2024-04-26T07:09:14.397Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>翻译自: <a href="https://wiredcraft.com/blog/how-to-post-on-hacker-news/">https://wiredcraft.com/blog/how-to-post-on-hacker-news/</a></p></blockquote><p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/hackernews.png" alt="hacker-news"></p><p>当我们为 <a href="http://devo.ps/">devo.ps</a> 和 <a href="https://wiredcraft.com/">Wiredcraft</a> 的部分产品工作时, 我创建了一份内部的市场营销指南（我们现在公开了）。指南里面的某一条建议被我们发布到 Hacker News 上。有几个朋友让我把整篇指南分享出来，所以我决定要把它发布在博客里。<br> <span id="more"></span><br>请注意这些都是我们在18月以前做的，我们现在已经改变了。不管怎么说，请看这里：</p><ul><li><strong>在美国时间早上 8 点钟发布</strong>。如果错过了这个机会（最晚 8点20分），那就等一天或者一周时间。</li><li><strong>每周三发布</strong>。周末发布更容易上头条，但那是周三是 HN 的流量高峰（更容易被更多人看到）。</li><li><strong>有一个好的标题</strong>。这意味更容易被人记住，使用大写和尽可能的使用俚语（举个例子，’sh*t’ 如果出现在标题里，能让话题保持更好活跃度。）</li><li><strong>有观点输出</strong>。对某事强烈的意见将有足于增加读者的阅读量和讨论量，更容易被赞。</li><li><strong>与 HN 主题 相关联</strong>。HN 是黑客和企业家组成的社区，所以无论是一篇关于创业、技术或者与其相关联的生活信息都会引起这群人的兴趣。</li><li>现在有一对规则关于 HN 上点赞的规则：<ul><li><strong>一个 IP 地址只能点一次赞</strong>。这意味者我们在一个 IP 地址下面点赞（比如同一个办公室，同一家咖啡厅）, 将不被统计。我们应该使用不同的 IP 来进行点赞。</li><li><strong>直接用链接打开文章是不能点赞的</strong>。比如后面的这个链接（<a href="http://news.ycombinator.com/item?id=5200847%EF%BC%89">http://news.ycombinator.com/item?id=5200847）</a>, 直接用这个链接打开页面，将不能点赞。只能从<a href="http://news.ycombinator.com/newest">最新信息页</a>和<a href="http://news.ycombinator.com/">首页</a>找到相应文章进入，才能点赞。</li></ul></li><li>了解下面几个规则，你就知道如何在 HN 上进行有准备的文章发布了：<ul><li>准备标题和原始链接，不要使用短链接。</li><li>在提交完成，就分享要 HN 的最新文章页面（<a href="http://news.ycombinator.com/newest%EF%BC%89%E5%88%86%E4%BA%AB%E5%88%B0%E7%A4%BE%E4%BA%A4%E7%BD%91%E7%BB%9C">http://news.ycombinator.com/newest）分享到社交网络</a>(Twitter, GTalk), 使用聊天工具呼叫你的朋友来点赞。<code>修改</code>：多次实践后，我不推荐这样做了。HN 会识别出这种行为（如果你的朋友都给你点赞）从而禁止点赞.</li><li>如果你上了头条，修改你之前分享出去的链接，改为首页（<a href="http://news.ycombinator.com/%EF%BC%89">http://news.ycombinator.com/）</a>.</li><li>如果你的团队要集体点赞，就要使用无关联的设备或者网络。(比如使用手机或者在家里点赞)</li></ul></li></ul><p>HN 并不关心你的文档来自哪里或者你是谁，它只关心你被点赞的速度。如果头条上面其它的文章点赞数不高，那你并不需要拿到很多点赞数就能上头条。从这里开始，就会像滚雪球一样快速积累起来。</p><p>但是，要注意，这只是一个<code>临时的提升</code>, 您可能会在一天内看到成干上万的游客浏览这篇文章。但是，很会就会消失，转化率也非常糟糕。</p><h2 id="相关资源"><a href="#相关资源" class="headerlink" title="相关资源"></a>相关资源</h2><ul><li><a href="https://wiredcraft.com/blog/how-to-post-on-hacker-news/">如何上 Hacker News 的头条（1 天 4 条链接）</a></li><li><a href="http://alexstechthoughts.com/post/29406022580/how-to-get-on-the-frontpage-of-hacker-news">如何获得 Hacker News 的头条</a></li><li><a href="http://hnpickup.appspot.com/">HNPickup</a> 提供了一些 HN 的活跃指标以及如何获得推荐,</li></ul>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;翻译自: &lt;a href=&quot;https://wiredcraft.com/blog/how-to-post-on-hacker-news/&quot;&gt;https://wiredcraft.com/blog/how-to-post-on-hacker-news/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/hackernews.png&quot; alt=&quot;hacker-news&quot;&gt;&lt;/p&gt;
&lt;p&gt;当我们为 &lt;a href=&quot;http://devo.ps/&quot;&gt;devo.ps&lt;/a&gt; 和 &lt;a href=&quot;https://wiredcraft.com/&quot;&gt;Wiredcraft&lt;/a&gt; 的部分产品工作时, 我创建了一份内部的市场营销指南（我们现在公开了）。指南里面的某一条建议被我们发布到 Hacker News 上。有几个朋友让我把整篇指南分享出来，所以我决定要把它发布在博客里。&lt;br&gt;</summary>
    
    
    
    <category term="Translate" scheme="https://nsdont.tech/categories/Translate/"/>
    
    
    <category term="Hacker News" scheme="https://nsdont.tech/tags/Hacker-News/"/>
    
  </entry>
  
  <entry>
    <title>Gitlab Runner Register</title>
    <link href="https://nsdont.tech/2016/01/10/Gitlab-Runner-Register/"/>
    <id>https://nsdont.tech/2016/01/10/Gitlab-Runner-Register/</id>
    <published>2016-01-10T08:06:01.000Z</published>
    <updated>2024-04-26T07:09:52.124Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>背景描述：适用于自建https证书，GitLab Runner 在注册基于自建 https 证书的 GitLab server 时会遇到一些证书问题，这里提供了一种解决方案。</p></blockquote><span id="more"></span><h2 id="生成证书"><a href="#生成证书" class="headerlink" title="生成证书"></a>生成证书</h2><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">sudo openssl genrsa -out &quot;/etc/gitlab/ssl/gitlab.key&quot; 2048</span><br><span class="line">sudo openssl req -new -key &quot;/etc/gitlab/ssl/gitlab.key&quot; -out &quot;/etc/gitlab/ssl/gitlab.csr&quot;</span><br><span class="line">sudo openssl x509 -req -days 3650 -in &quot;/etc/gitlab/ssl/gitlab.csr&quot; -signkey &quot;/etc/gitlab/ssl/gitlab.key&quot;  -out &quot;/etc/gitlab/ssl/gitlab.crt&quot;</span><br></pre></td></tr></table></figure><p><code>注意：填写证书信息的时候，一定要填写域名！！！</code></p><h2 id="配置-GitLab-runner-服务器"><a href="#配置-GitLab-runner-服务器" class="headerlink" title="配置 GitLab runner 服务器"></a>配置 GitLab runner 服务器</h2><p>如何安装 GitLab runner ，我就不进行相关介绍了，请看<a href="https://gitlab.com/gitlab-org/gitlab-ci-multi-runner#installation">官方文档</a>。</p><p>详细步骤：</p><ol><li>修改 <code>/etc/hosts</code>, 如果已经给 GitLab server 配置了域名，这一步可以跳过，没有配置的话，就需要将ip映射到相应的域名（注：这里的域名就是上一段<code>生成证书</code>里面提到的填写证书信息时域名）</li><li>将之前生成的 gitlab.crt 填充到 &#x2F;etc&#x2F;ssl&#x2F;certs&#x2F;ca-bundle.crt 文件底部。(注：不同发行版的crt文件可能不一样)</li></ol><h2 id="案例"><a href="#案例" class="headerlink" title="案例"></a>案例</h2><p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/14523953683977.jpg" alt="案例"></p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;背景描述：适用于自建https证书，GitLab Runner 在注册基于自建 https 证书的 GitLab server 时会遇到一些证书问题，这里提供了一种解决方案。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="DevOps" scheme="https://nsdont.tech/categories/DevOps/"/>
    
    
    <category term="GitLab" scheme="https://nsdont.tech/tags/GitLab/"/>
    
    <category term="CI" scheme="https://nsdont.tech/tags/CI/"/>
    
  </entry>
  
  <entry>
    <title>Nginx and Php 最小化安装(CentOS)</title>
    <link href="https://nsdont.tech/2013/11/26/Nginx-and-Php-%E6%9C%80%E5%B0%8F%E5%8C%96%E5%AE%89%E8%A3%85-CentOS/"/>
    <id>https://nsdont.tech/2013/11/26/Nginx-and-Php-%E6%9C%80%E5%B0%8F%E5%8C%96%E5%AE%89%E8%A3%85-CentOS/</id>
    <published>2013-11-26T08:33:12.000Z</published>
    <updated>2024-04-26T07:10:36.231Z</updated>
    
    <content type="html"><![CDATA[<h2 id="下载相关的文件"><a href="#下载相关的文件" class="headerlink" title="下载相关的文件"></a>下载相关的文件</h2><ol><li><a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/">pcre-8.21.tar.bz2</a></li><li><a href="http://nginx.org/">nginx-1.4.1.tar.gz</a></li><li><a href="http://php.net/downloads.php">php-5.3.27</a></li></ol><span id="more"></span><h2 id="PCRE"><a href="#PCRE" class="headerlink" title="PCRE"></a>PCRE</h2><p>系统自带的PCRE版本太低了.所以需要卸载重装。<br>第一步：查看PCRE的版本</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">$ rpm -qa | grep pcre</span><br></pre></td></tr></table></figure><p>第二步：保留以前的libpcre.so.0，没有这个无法重装PCRE的</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 cp /lib/libpcre.so.0 /lib/libpcre.so.0.back</span><br></pre></td></tr></table></figure><p>第三步：卸载PCRE</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 rpm -e --nodeps pcre-7.8-4.el6.i686 #这里的这个7.8-4.el6.i686-是我这里版本，要根据自己电脑修改</span><br></pre></td></tr></table></figure><p>第四步：安装新的PCRE</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">$ tar -xj -f pcre-8.21.tar.gz</span><br><span class="line">$ cd pcre-8.21</span><br><span class="line">$ sudo mv /lib/libpcre.so.0.back /lib/libpcre.so.0</span><br><span class="line">$ ./configure</span><br><span class="line">$ make</span><br><span class="line">$ sudo make install</span><br></pre></td></tr></table></figure><h2 id="Nginx"><a href="#Nginx" class="headerlink" title="Nginx"></a>Nginx</h2><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">$ ./configure --prefix=/usr/local/nginx</span><br><span class="line">$ make</span><br><span class="line">$ sudo make install</span><br><span class="line">$ sudo /usr/local/nginx/sbin/nginx</span><br></pre></td></tr></table></figure><h3 id="配置-开启PHP支持"><a href="#配置-开启PHP支持" class="headerlink" title="配置, 开启PHP支持"></a>配置, 开启PHP支持</h3><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 vim /usr/local/nginx/conf/nginx.conf</span><br></pre></td></tr></table></figure><p>增加PHP主页</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">location / &#123;</span><br><span class="line">root html;</span><br><span class="line">index index.html index.php index.htm;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>开启PHP支持</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">location ~ \.php$ &#123;</span><br><span class="line">root html;</span><br><span class="line">fastcgi_pass 127.0.0.1:9000;</span><br><span class="line">fastcgi_index index.php;</span><br><span class="line">fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;</span><br><span class="line">include fastcgi_params;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意这里的fastcgi_pass 和 fastcgi_param的”&#x2F;var&#x2F;www”, fastcgi_pass是nginx请求到php的端口，而”&#x2F;var&#x2F;www”就是项目的存放路径</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 /usr/local/nginx/sbin/nginx</span><br></pre></td></tr></table></figure><p>在浏览器输入<a href="https://127.0.0.1就可以查看nginx的欢迎信息了/">https://127.0.0.1就可以查看Nginx的欢迎信息了</a></p><h2 id="PHP"><a href="#PHP" class="headerlink" title="PHP"></a>PHP</h2><p>这里是最小化安装，所以就不配置什么插件了<br>Nginx 与 PHP的通信需要使用 PHP-FPM，在php5.3.3以后，PHP-FPM以及集成到了php，如果要使用的话，在编译的时候，加一句–enable-fpm</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">$ sudo ./configure --prefix=/usr/local/php --enable-fpm</span><br><span class="line">$ sudo make</span><br><span class="line">$ sudo make test</span><br><span class="line">$ sudo make install</span><br></pre></td></tr></table></figure><h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ sudo cd /usr/local/php</span><br><span class="line">$ cp etc/php-fpm.conf.default etc/php-fpm.conf</span><br><span class="line">$ sudo vim etc/php-fpm.conf</span><br><span class="line">$ 找到[global]，去掉&quot;;pid = run/php-fpm.pid&quot;的注释</span><br></pre></td></tr></table></figure><h2 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h2><p>我们之前提到了”&#x2F;var&#x2F;www”，我们在这里新建一个php文件，来测试环境是否搭建成功</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 vim /var/www/info.php</span><br></pre></td></tr></table></figure><p>info.php</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?</span> <span class="keyword">echo</span> <span class="title function_ invoke__">phpinfo</span>(); <span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ sudo /usr/local/nginx/sbin/nginx</span><br><span class="line">$ sudo /usr/local/php/sbin/php-fpm</span><br></pre></td></tr></table></figure><h2 id="编写快速启动和关闭的nginx与php脚本"><a href="#编写快速启动和关闭的nginx与php脚本" class="headerlink" title="编写快速启动和关闭的nginx与php脚本"></a>编写快速启动和关闭的nginx与php脚本</h2><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></pre></td><td class="code"><pre><span class="line">$ sudo vim /etc/init.d/php-fpm</span><br><span class="line">$ sudo chmod +x /etc/init.d/php-fpm</span><br><span class="line">$ sudo /sbin/chkconfig php-fpm on</span><br><span class="line">$ sudo /sbin/chkconfig --list php-fpm</span><br></pre></td></tr></table></figure><p>成功的话<br>就可以看到好几个 on<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">$ sudo /etc/init.d/php-fpm stop</span><br><span class="line">$ sudo /etc/init.d/php-fpm start</span><br><span class="line">$ sudo /etc/init.d/php-fpm restart</span><br></pre></td></tr></table></figure><p>php-fpm 脚本</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><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></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line">#</span><br><span class="line"># Startup script for the PHP-FPM server.</span><br><span class="line">#</span><br><span class="line"># chkconfig: 345 85 15</span><br><span class="line"># description: PHP is an HTML-embedded scripting language</span><br><span class="line"># processname: php-fpm</span><br><span class="line"># config: /usr/local/php/etc/php.ini</span><br><span class="line"></span><br><span class="line"># Source function library.</span><br><span class="line">. /etc/rc.d/init.d/functions</span><br><span class="line"></span><br><span class="line">PHP_PATH=/usr/local</span><br><span class="line">DESC=&quot;php-fpm daemon&quot;</span><br><span class="line">NAME=php-fpm</span><br><span class="line"># php-fpm路径</span><br><span class="line">DAEMON=$PHP_PATH/php/sbin/$NAME</span><br><span class="line"># 配置文件路径</span><br><span class="line">CONFIGFILE=$PHP_PATH/php/etc/php-fpm.conf</span><br><span class="line"># PID文件路径(在php-fpm.conf设置)</span><br><span class="line">PIDFILE=$PHP_PATH/php/var/run/$NAME.pid</span><br><span class="line">SCRIPTNAME=/etc/init.d/$NAME</span><br><span class="line"></span><br><span class="line"># Gracefully exit if the package has been removed.</span><br><span class="line">test -x $DAEMON || exit 0</span><br><span class="line"></span><br><span class="line">rh_start() &#123;</span><br><span class="line">$DAEMON -y $CONFIGFILE || echo -n &quot; already running&quot;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">rh_stop() &#123;</span><br><span class="line">kill -QUIT `cat $PIDFILE` || echo -n &quot; not running&quot;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">rh_reload() &#123;</span><br><span class="line">kill -HUP `cat $PIDFILE` || echo -n &quot; can&#x27;t reload&quot;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">case &quot;$1&quot; in</span><br><span class="line">start)</span><br><span class="line">echo -n &quot;Starting $DESC: $NAME&quot;</span><br><span class="line">rh_start</span><br><span class="line">echo &quot;.&quot;</span><br><span class="line">;;</span><br><span class="line">stop)</span><br><span class="line">echo -n &quot;Stopping $DESC: $NAME&quot;</span><br><span class="line">rh_stop</span><br><span class="line">echo &quot;.&quot;</span><br><span class="line">;;</span><br><span class="line">reload)</span><br><span class="line">echo -n &quot;Reloading $DESC configuration...&quot;</span><br><span class="line">rh_reload</span><br><span class="line">echo &quot;reloaded.&quot;</span><br><span class="line">;;</span><br><span class="line">restart)</span><br><span class="line">echo -n &quot;Restarting $DESC: $NAME&quot;</span><br><span class="line">rh_stop</span><br><span class="line">sleep 1</span><br><span class="line">rh_start</span><br><span class="line">echo &quot;.&quot;</span><br><span class="line">;;</span><br><span class="line">*)</span><br><span class="line">echo &quot;Usage: $SCRIPTNAME &#123;start|stop|restart|reload&#125;&quot; &gt;&amp;2</span><br><span class="line">exit 3</span><br><span class="line">;;</span><br><span class="line">esac</span><br><span class="line">exit 0</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line">#</span><br><span class="line">#chkconfig: - 85 15</span><br><span class="line">#description: Nginx is a World Wide Web server.</span><br><span class="line">#processname: nginx</span><br><span class="line"></span><br><span class="line">nginx=/usr/local/nginx/sbin/nginx</span><br><span class="line">conf=/usr/local/nginx/conf/nginx.conf</span><br><span class="line"></span><br><span class="line">case $1 in</span><br><span class="line">start)</span><br><span class="line">echo -n &quot;Starting Nginx&quot;</span><br><span class="line">$nginx -c $conf</span><br><span class="line">echo &quot; done&quot;</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">stop)</span><br><span class="line">echo -n &quot;Stopping Nginx&quot;</span><br><span class="line">killall -9 nginx</span><br><span class="line">echo &quot; done&quot;</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">test)</span><br><span class="line">$nginx -t -c $conf</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">reload)</span><br><span class="line">echo -n &quot;Reloading Nginx&quot;</span><br><span class="line">ps auxww | grep nginx | grep master | awk &#x27;&#123;print $2&#125;&#x27; | xargs kill -HUP</span><br><span class="line">echo &quot; done&quot;</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">restart)</span><br><span class="line">$0 stop</span><br><span class="line">$0 start</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">show)</span><br><span class="line">ps -aux|grep nginx</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">*)</span><br><span class="line">echo -n &quot;Usage: $0 &#123;start|restart|reload|stop|test|show&#125;&quot;</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">esac</span><br></pre></td></tr></table></figure>]]></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;ol&gt;
&lt;li&gt;&lt;a href=&quot;ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/&quot;&gt;pcre-8.21.tar.bz2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nginx.org/&quot;&gt;nginx-1.4.1.tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://php.net/downloads.php&quot;&gt;php-5.3.27&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="Linux" scheme="https://nsdont.tech/categories/Linux/"/>
    
    
    <category term="Nginx" scheme="https://nsdont.tech/tags/Nginx/"/>
    
    <category term="CentOS" scheme="https://nsdont.tech/tags/CentOS/"/>
    
  </entry>
  
  <entry>
    <title>Django 本地化</title>
    <link href="https://nsdont.tech/2013/09/12/django-%E6%9C%AC%E5%9C%B0%E5%8C%96/"/>
    <id>https://nsdont.tech/2013/09/12/django-%E6%9C%AC%E5%9C%B0%E5%8C%96/</id>
    <published>2013-09-12T06:00:21.000Z</published>
    <updated>2024-04-26T07:09:55.809Z</updated>
    
    <content type="html"><![CDATA[<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>简单的说，就是三步走。<br>1.在 Python 代码和模板中插入待翻译的字符串。<br>2.建立并修改语言文件<br>3.激活</p><p>在这里，使用 autocomplete_light 来进行案例讲解，拿我们上次遇见的问题来讲解。</p><span id="more"></span><h2 id="如何指定待翻译字符串"><a href="#如何指定待翻译字符串" class="headerlink" title="如何指定待翻译字符串"></a>如何指定待翻译字符串</h2><h3 id="在-Python-代码中"><a href="#在-Python-代码中" class="headerlink" title="在 Python 代码中:"></a>在 Python 代码中:</h3><p>代码详见 <a href="https://github.com/yourlabs/django-autocomplete-light/blob/00b3a1d6ff3fea55b55962d13eb86563220b5a7a/autocomplete_light%2Fautocomplete%2Fbase.py#L107">autocomplete_light&#x2F;autocomplete&#x2F;base.py 107行</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">html = self.empty_html_format % _(<span class="string">&#x27;no matches found&#x27;</span>).capitalize()</span><br></pre></td></tr></table></figure><p>在这里的 _ 就表示这国际化的意思<br>见 该文件第3行</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.utils.translation <span class="keyword">import</span> ugettext_lazy <span class="keyword">as</span> _）</span><br></pre></td></tr></table></figure><p>使用函数 <code>ugettext()</code> 来指定一个翻译字符串。<br>作为惯例，使用短别名 <code>_</code> 来引入这个函数以节省键入时间.<br>使用 <code>django.utils.translation.gettext_lazy()</code> 函数，<br>使得其中的值只有在访问时才会被翻译，而不是在 <code>gettext_lazy()</code> 被调用时翻译。</p><h3 id="在模板中"><a href="#在模板中" class="headerlink" title="在模板中:"></a>在模板中:</h3><p>Django 模板使用两种模板标签，且语法格式与 Python 代码有些许不同。<br>为了使得模板访问到标签，需要将下列代码放在模板最前面。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% load i18n %&#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></pre></td><td class="code"><pre><span class="line">&lt;title&gt;&#123;% trans &quot;This is the title.&quot; %&#125;&lt;/title&gt;</span><br><span class="line">&lt;title&gt;&#123;% trans myvar %&#125;&lt;/title&gt;</span><br></pre></td></tr></table></figure><p>在一个带 <code>trans</code> 的字符串中，混进一个模板变量是不可能的。如<br>果你的译文要求字符串带有变量(占位符 placeholders)，请使用 blocktrans ：</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">&#123;% blocktrans %&#125;This string will have &#123;&#123; value &#125;&#125; inside.&#123;% endblocktrans %&#125;</span><br></pre></td></tr></table></figure><h2 id="如何创建语言文件"><a href="#如何创建语言文件" class="headerlink" title="如何创建语言文件"></a>如何创建语言文件</h2><p>你需要建立一个 <code>locale</code> 文件夹来放置语言文件.<br>如果没有这个文件夹，使用创建命令就会报错<br>locale 可以放在子 app 的文件里（如 autocomplete）, 也可以放在总的文件夹（project）下面，<br>两者有着不同意义，就是查询的先后顺序，优先查询 app 里的 locale 文件夹</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">django-admin.py makemessages -l zh\_CN</span><br></pre></td></tr></table></figure><p>这个命令就是建立语言文件，有一个条件，就是当前目录有 locale 文件夹</p><p>在这里看下这个文件 autocomplete_light&#x2F;locale&#x2F;zh_CN&#x2F;LC_MESSAGES&#x2F;django.po</p><h3 id="激活"><a href="#激活" class="headerlink" title="激活"></a>激活</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">django-admin.py compilemessages</span><br></pre></td></tr></table></figure><p>当你编辑完语言文件后，要使用这条命令，让语言文件生效</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;简单的说，就是三步走。&lt;br&gt;1.在 Python 代码和模板中插入待翻译的字符串。&lt;br&gt;2.建立并修改语言文件&lt;br&gt;3.激活&lt;/p&gt;
&lt;p&gt;在这里，使用 autocomplete_light 来进行案例讲解，拿我们上次遇见的问题来讲解。&lt;/p&gt;</summary>
    
    
    
    <category term="Python" scheme="https://nsdont.tech/categories/Python/"/>
    
    
    <category term="Django" scheme="https://nsdont.tech/tags/Django/"/>
    
    <category term="I18N" scheme="https://nsdont.tech/tags/I18N/"/>
    
  </entry>
  
</feed>
