<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>八九天</title>
  
  
  <link href="http://blog.whwtf.com/atom.xml" rel="self"/>
  
  <link href="http://blog.whwtf.com/"/>
  <updated>2021-06-05T02:57:06.141Z</updated>
  <id>http://blog.whwtf.com/</id>
  
  <author>
    <name>Whwtf</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>部署 Code-Server，随时随地 VsCode</title>
    <link href="http://blog.whwtf.com/Programing/deploy-code-server.html"/>
    <id>http://blog.whwtf.com/Programing/deploy-code-server.html</id>
    <published>2021-06-05T02:22:20.000Z</published>
    <updated>2021-06-05T02:57:06.141Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://github.com/cdr/code-server">Code-Server</a> 是一个可以在远程服务器上运行 VS Code 的工具。拥有与 VS Code 完全相同的界面和使用方法。</p><p><img src="https://gitee.com/whwtf/upic/raw/master/uPic/codee.jpeg"></p><p>将其部署在远程服务器上，就可以通过 Edge、Chrome 等浏览器在任何设备上运用完全一致的环境进行写作与开发，一切计算都在服务器上进行，不用考虑终端设备的性能。</p><p>在<a href="https://github.com/cdr/code-server/releases">Releases</a>页面找到相应的 rpm 或者 deb 软件包下载并上传到远程服务器（也可以直接在服务器上使用 wget 等工具直接下载）并安装。</p><p>然后，创建 ～/.config/code-server/config.yaml 文件，内容如下：</p><figure class="highlight plain"><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">bind-addr: 0.0.0.0:8999        #远程访问的端口</span><br><span class="line">auth: password</span><br><span class="line">password: xxxxxxxxx            #访问时登陆的密码</span><br><span class="line">cert: true                     #启用https，不然有些功能限制使用</span><br></pre></td></tr></table></figure><p>编辑 /lib/systemd/system/code-server@.service 文件，内容修改如下：</p><figure class="highlight plain"><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">[Unit]</span><br><span class="line">Description&#x3D;code-server</span><br><span class="line">After&#x3D;network.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type&#x3D;exec</span><br><span class="line">ExecStart&#x3D;&#x2F;usr&#x2F;bin&#x2F;code-server --cert 公钥 --cert-key 私钥</span><br><span class="line">ExecReload&#x3D;&#x2F;usr&#x2F;bin&#x2F;code-server --cert 公钥 --cert-key 私钥</span><br><span class="line">Restart&#x3D;always</span><br><span class="line">User&#x3D;%i</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy&#x3D;default.target</span><br></pre></td></tr></table></figure><p>保存退出后，执行如下命令：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl enable --now code-server@username    #username替换成当前登陆用户名</span><br></pre></td></tr></table></figure><p>之后，就可以在浏览器中使用 https://服务器ip:设定的端口 的形式来访问 code-server 了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/cdr/code-server&quot;&gt;Code-Server&lt;/a&gt; 是一个可以在远程服务器上运行 VS Code 的工具。拥有与 VS Code 完全相同的界面和使用方法。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https:</summary>
      
    
    
    
    <category term="Programing" scheme="http://blog.whwtf.com/categories/Programing/"/>
    
    
    <category term="Code-Server" scheme="http://blog.whwtf.com/tags/Code-Server/"/>
    
  </entry>
  
  <entry>
    <title>在树莓派上操作 rgbLED 显示不同颜色</title>
    <link href="http://blog.whwtf.com/Linux/SomePi/rpi-rgbled.html"/>
    <id>http://blog.whwtf.com/Linux/SomePi/rpi-rgbled.html</id>
    <published>2021-04-15T03:52:17.000Z</published>
    <updated>2021-04-15T03:53:39.277Z</updated>
    
    <content type="html"><![CDATA[<p>常见的 rgbLED 有四根引脚，一个 GND，另外三个分别是红绿蓝三色控制脚。通常由输入的电压不同来显示不同的颜色。但是树莓派的 GPIO 输出的是数字信号，这里可以用编程的方式来模拟电压的变化。<br>树莓派上用 PWM（脉宽调制）方法来实现，这是一种对模拟信号电平进行数字编码的方法。PWM 可以简单理解为，通过可控频率的高低电平切换来实现模拟电压变化的方法。</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">import RPi.GPIO as GPIO</span><br><span class="line">import time</span><br><span class="line"></span><br><span class="line">R, G, B &#x3D; 20, 16, 21</span><br><span class="line"></span><br><span class="line">GPIO.setwarnings(False)</span><br><span class="line">GPIO.setmode(GPIO.BCM)</span><br><span class="line"></span><br><span class="line">GPIO.setup(R, GPIO.OUT)</span><br><span class="line">GPIO.setup(G, GPIO.OUT)</span><br><span class="line">GPIO.setup(B, GPIO.OUT)</span><br><span class="line"></span><br><span class="line">pwmR &#x3D; GPIO.PWM(R, 70)    </span><br><span class="line">pwmG &#x3D; GPIO.PWM(G, 70)</span><br><span class="line">pwmB &#x3D; GPIO.PWM(B, 70)</span><br><span class="line"></span><br><span class="line">pwmR.start(0)</span><br><span class="line">pwmG.start(0)</span><br><span class="line">pwmB.start(0)</span><br><span class="line"></span><br><span class="line">try:</span><br><span class="line">    t &#x3D; 0.5</span><br><span class="line">    while True:</span><br><span class="line">        </span><br><span class="line">        </span><br><span class="line">        </span><br><span class="line">        pwmR.ChangeDutyCycle(100)</span><br><span class="line">        pwmG.ChangeDutyCycle(0)</span><br><span class="line">        pwmB.ChangeDutyCycle(0)</span><br><span class="line">        time.sleep(t)</span><br><span class="line">         </span><br><span class="line">        </span><br><span class="line">        pwmR.ChangeDutyCycle(0)</span><br><span class="line">        pwmG.ChangeDutyCycle(100)</span><br><span class="line">        pwmB.ChangeDutyCycle(0)</span><br><span class="line">        time.sleep(t)</span><br><span class="line">         </span><br><span class="line">        </span><br><span class="line">        pwmR.ChangeDutyCycle(0)</span><br><span class="line">        pwmG.ChangeDutyCycle(0)</span><br><span class="line">        pwmB.ChangeDutyCycle(100)</span><br><span class="line">        time.sleep(t)</span><br><span class="line">         </span><br><span class="line">        </span><br><span class="line">        pwmR.ChangeDutyCycle(100)</span><br><span class="line">        pwmG.ChangeDutyCycle(100)</span><br><span class="line">        pwmB.ChangeDutyCycle(0)</span><br><span class="line">        time.sleep(t)</span><br><span class="line">         </span><br><span class="line">        </span><br><span class="line">        pwmR.ChangeDutyCycle(100)</span><br><span class="line">        pwmG.ChangeDutyCycle(0)</span><br><span class="line">        pwmB.ChangeDutyCycle(100)</span><br><span class="line">        time.sleep(t)</span><br><span class="line">         </span><br><span class="line">        </span><br><span class="line">        pwmR.ChangeDutyCycle(0)</span><br><span class="line">        pwmG.ChangeDutyCycle(100)</span><br><span class="line">        pwmB.ChangeDutyCycle(100)</span><br><span class="line">        time.sleep(t)</span><br><span class="line">         </span><br><span class="line">        </span><br><span class="line">        pwmR.ChangeDutyCycle(100)</span><br><span class="line">        pwmG.ChangeDutyCycle(100)</span><br><span class="line">        pwmB.ChangeDutyCycle(100)</span><br><span class="line">        time.sleep(t)</span><br><span class="line"></span><br><span class="line">        </span><br><span class="line">        for r in range(0, 101, 20):</span><br><span class="line">            pwmR.ChangeDutyCycle(r)</span><br><span class="line">            for g in range(0, 101, 20):</span><br><span class="line">                pwmG.ChangeDutyCycle(g)</span><br><span class="line">                for b in range(0, 101, 20):</span><br><span class="line">                    pwmB.ChangeDutyCycle(b)</span><br><span class="line">                    time.sleep(0.05)</span><br><span class="line"></span><br><span class="line">except KeyboardInterrupt:</span><br><span class="line">    pass</span><br><span class="line"></span><br><span class="line">pwmR.stop()</span><br><span class="line">pwmG.stop()</span><br><span class="line">pwmB.stop()</span><br><span class="line"></span><br><span class="line">GPIO.cleanup()</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;常见的 rgbLED 有四根引脚，一个 GND，另外三个分别是红绿蓝三色控制脚。通常由输入的电压不同来显示不同的颜色。但是树莓派的 GPIO 输出的是数字信号，这里可以用编程的方式来模拟电压的变化。&lt;br&gt;树莓派上用 PWM（脉宽调制）方法来实现，这是一种对模拟信号电平进行</summary>
      
    
    
    
    <category term="Linux" scheme="http://blog.whwtf.com/categories/Linux/"/>
    
    <category term="SomePi" scheme="http://blog.whwtf.com/categories/Linux/SomePi/"/>
    
    
    <category term="RaspberryPi" scheme="http://blog.whwtf.com/tags/RaspberryPi/"/>
    
    <category term="rgbLED" scheme="http://blog.whwtf.com/tags/rgbLED/"/>
    
  </entry>
  
  <entry>
    <title>在树莓派上操作 TM1637 主控的四位数码管</title>
    <link href="http://blog.whwtf.com/Linux/SomePi/rpi-tm1637.html"/>
    <id>http://blog.whwtf.com/Linux/SomePi/rpi-tm1637.html</id>
    <published>2021-04-15T03:49:29.000Z</published>
    <updated>2021-04-15T03:54:02.939Z</updated>
    
    <content type="html"><![CDATA[<p><strong>TM1637</strong> 驱动的数码管操作简单，只需要 DIO（串行数据）和 CLK（时钟控制）两个引脚就可以工作，3.3V 和 5V 电压都可以。<br>在 <a href="https://github.com/">GitHub</a> 上已经有先贤写好了控制模块，拿过来用就可以了，应用最多的就是 <a href="https://github.com/whwtf/python-learning/blob/master/tm1637.py">tm1637.py</a>。</p><p>在使用的时候，当然首先就是：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">import tm1637</span><br></pre></td></tr></table></figure><p>唯一需要注意的是这个模块当中 <strong>显示内容的传递是通过列表（list）来进行的</strong> 。简单使用如下：</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">import RPi.GPIO as GPIO</span><br><span class="line">import time</span><br><span class="line">import tm1637</span><br><span class="line"></span><br><span class="line">CLK &#x3D; 21      </span><br><span class="line">DIO  &#x3D; 20     </span><br><span class="line">GPIO.setmode(GPIO.BCM)</span><br><span class="line">GPIO.setwarnings(False)    </span><br><span class="line"></span><br><span class="line">d &#x3D; tm1637.TM1637(CLK, DATA)    </span><br><span class="line">d.showDoublePoint(1)    </span><br><span class="line">d.showData([5,6,7,9])   </span><br><span class="line"></span><br><span class="line">GPIO.cleanup()</span><br></pre></td></tr></table></figure><p>其他进阶应用无非就是通过不通方法改变列表的内容来实现应用的目的，比方说一个 <strong>数字时钟</strong> ：</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">import tm1637</span><br><span class="line">import RPi.GPIO as GPIO</span><br><span class="line">import time</span><br><span class="line"></span><br><span class="line">CLK &#x3D; 21</span><br><span class="line">DATA  &#x3D; 20</span><br><span class="line">GPIO.setmode(GPIO.BCM)</span><br><span class="line">GPIO.setwarnings(False)</span><br><span class="line"></span><br><span class="line">HHMMFORMAT &#x3D; &#39;%H:%M&#39;    </span><br><span class="line"></span><br><span class="line">digital1637 &#x3D; tm1637.TM1637(CLK, DATA)</span><br><span class="line">digital1637.showDoublePoint(1)</span><br><span class="line"></span><br><span class="line">while(True):</span><br><span class="line">    timenow &#x3D; time.strftime(&#39;%Y-%m-%d %H:%M&#39;,time.localtime(time.time()))</span><br><span class="line">    curTime &#x3D; time.strftime(HHMMFORMAT, time.localtime(time.time()))</span><br><span class="line">        if(curTime !&#x3D; lastTime):</span><br><span class="line">            </span><br><span class="line">            timer &#x3D; time.localtime()</span><br><span class="line">            number &#x3D; [timer.tm_hour&#x2F;&#x2F;10, timer.tm_hour%10, timer.tm_min&#x2F;&#x2F;10, timer.tm_min%10]</span><br><span class="line">            digital1637.showData(number)</span><br><span class="line">            lastTime &#x3D; curTime</span><br><span class="line">        </span><br><span class="line"></span><br><span class="line">    time.sleep(0.1)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">GPIO.cleanup()</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;TM1637&lt;/strong&gt; 驱动的数码管操作简单，只需要 DIO（串行数据）和 CLK（时钟控制）两个引脚就可以工作，3.3V 和 5V 电压都可以。&lt;br&gt;在 &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; 上已经有先</summary>
      
    
    
    
    <category term="Linux" scheme="http://blog.whwtf.com/categories/Linux/"/>
    
    <category term="SomePi" scheme="http://blog.whwtf.com/categories/Linux/SomePi/"/>
    
    
    <category term="RaspberryPi" scheme="http://blog.whwtf.com/tags/RaspberryPi/"/>
    
    <category term="TM-1637" scheme="http://blog.whwtf.com/tags/TM-1637/"/>
    
  </entry>
  
  <entry>
    <title>Linux 终端增强（通过 zsh 与 oh-my-zsh）</title>
    <link href="http://blog.whwtf.com/uncategorized/tem-zsh.html"/>
    <id>http://blog.whwtf.com/uncategorized/tem-zsh.html</id>
    <published>2021-04-15T03:45:12.000Z</published>
    <updated>2021-04-15T03:48:10.269Z</updated>
    
    <content type="html"><![CDATA[<p>本文适用于 Debian 系 Linux，MacOS 同样可以。<br>首先安装 <a href="https://www.zsh.org/">zsh</a> （<a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH">这里</a>有详细说明）：</p><figure class="highlight plain"><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 apt update</span><br><span class="line">sudo apt install zsh</span><br></pre></td></tr></table></figure><p>然后，将 zsh 设置为系统默认终端：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chsh -s $(which zsh)</span><br></pre></td></tr></table></figure><p>接下来安装 <a href="https://raw.github.com/ohmyzsh/ohmyzsh/">oh-my-zsh</a>，这是 zsh 的终极扩展和配置工具：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sh -c &quot;$(wget https:&#x2F;&#x2F;raw.github.com&#x2F;ohmyzsh&#x2F;ohmyzsh&#x2F;master&#x2F;tools&#x2F;install.sh -O -)&quot;</span><br></pre></td></tr></table></figure><p>oh-my-zsh 的美丽外观得益于其自带的许多主题，但是其中很多需要 <a href="https://github.com/powerline/fonts">Poweline-fonts</a>，所以海需要安装：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install fonts-powerline</span><br></pre></td></tr></table></figure><p>现在可以通过修改 on-my-zsh 的配置文件来选择一个喜欢的主题了（<a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Themes">这里</a>有内置所有主题的预览）：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nano ~&#x2F;.zshrc</span><br></pre></td></tr></table></figure><p>找到主题定义这一行，是这样的：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ZSH_THEME&#x3D;&quot;agnoster&quot;  # agnoster是个人喜欢的</span><br></pre></td></tr></table></figure><p>oh-my-zsh 同样支持非常多的插件来扩展功能，同样在. zshrc 配置文件中：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nano ~&#x2F;.zshrc</span><br></pre></td></tr></table></figure><p>找到：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">plugins&#x3D;(git)  # 默认只启用了git插件</span><br></pre></td></tr></table></figure><p><a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins">这里</a>有所有插件列表及介绍。<br>还有一些功能插件不是内置的，需要手动安装。<br>1、zsh-syntax-highlighting，让 zsh 拥有了语法高亮功能</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install zsh-syntax-highlighting</span><br></pre></td></tr></table></figure><p>然后修改配置文件，在末尾增加一行：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">source &#x2F;usr&#x2F;share&#x2F;zsh-syntax-highlighting&#x2F;zsh-syntax-highlighting.zsh</span><br></pre></td></tr></table></figure><p>2、zsh-autosuggestions，记录曾经输入过的命令，方便重复输入：</p><figure class="highlight plain"><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">git clone https:&#x2F;&#x2F;github.com&#x2F;zsh-users&#x2F;zsh-autosuggestions.git</span><br><span class="line">sudo cp -r zsh-autosuggestions &#x2F;usr&#x2F;share&#x2F;</span><br></pre></td></tr></table></figure><p>修改配置文件，在末尾添加：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">source &#x2F;usr&#x2F;share&#x2F;zsh-autosuggestions&#x2F;zsh-autosuggestions.zsh</span><br></pre></td></tr></table></figure><p>大功告成，现在退出终端，注销用户然后重新登录，就可以打开增强之后的终端了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;本文适用于 Debian 系 Linux，MacOS 同样可以。&lt;br&gt;首先安装 &lt;a href=&quot;https://www.zsh.org/&quot;&gt;zsh&lt;/a&gt; （&lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Install</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>MySql基础学习</title>
    <link href="http://blog.whwtf.com/Programing/DataBase/mysql-base.html"/>
    <id>http://blog.whwtf.com/Programing/DataBase/mysql-base.html</id>
    <published>2021-04-15T03:39:06.000Z</published>
    <updated>2021-04-15T03:43:38.363Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-MySQL-简介"><a href="#1-MySQL-简介" class="headerlink" title="1. MySQL 简介"></a>1. MySQL 简介</h1><hr><h3 id="1-1-什么是数据库-？"><a href="#1-1-什么是数据库-？" class="headerlink" title="1.1 什么是数据库 ？"></a>1.1 什么是数据库 ？</h3><p>数据库（_Database_）是按照数据结构来组织、存储和管理数据的仓库，它产生于距今六十多年前，随着信息技术和市场的发展，特别是二十世纪九十年代以后，数据管理不再仅仅是存储和管理数据，而转变成用户所需要的各种数据管理的方式。数据库有很多种类型，从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。</p><p>主流的数据库有：sqlserver，mysql，Oracle、SQLite、Access、MS SQL Server 等，本文主要讲述的是 MySQL 。</p><p>MySQL 是一种开放源代码的关系型数据库管理系统（RDBMS），MySQL 数据库系统使用最常用的数据库管理语言–结构化查询语言（SQL）进行数据库管理。在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System，关系数据库管理系统) 应用软件之一。</p><h3 id="1-2-数据库管理是干什么用的？"><a href="#1-2-数据库管理是干什么用的？" class="headerlink" title="1.2 数据库管理是干什么用的？"></a>1.2 数据库管理是干什么用的？</h3><ul><li>  a. 将数据保存到文件或内存</li><li>  b. 接收特定的命令，然后对文件进行相应的操作</li></ul><p>PS：如果有了以上管理系统，无须自己再去创建文件和文件夹，而是直接传递 命令 给上述软件，让其来进行文件操作，他们统称为数据库管理系统（DBMS，Database Management System）</p><h1 id="2-MySQL-安装"><a href="#2-MySQL-安装" class="headerlink" title="2. MySQL 安装"></a>2. MySQL 安装</h1><hr><h3 id="2-1-安装"><a href="#2-1-安装" class="headerlink" title="2.1 安装"></a>2.1 安装</h3><figure class="highlight plain"><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">$sudo apt-get update</span><br><span class="line">$sudo apt-get install mysql-server</span><br><span class="line">$sudo apt isntall mysql-client</span><br><span class="line">$sudo apt install libmysqlclient-dev</span><br><span class="line">$sudo mysql_secure_installation  #运行安全脚本，设置 root 密码</span><br></pre></td></tr></table></figure><h3 id="2-2-允许远程连接"><a href="#2-2-允许远程连接" class="headerlink" title="2.2 允许远程连接"></a>2.2 允许远程连接</h3><p>修改配置文件 mysqld.cnf <code>$sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf</code> 将 <code>bind-address = 127.0.0.1</code> 注释掉。 连接数据库 <code>mysql -u root -p</code> 执行授权命令：</p><figure class="highlight plain"><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">grant all on *.* to root@&#39;%&#39; identified by &#39;PASSWORD&#39; with grant option;</span><br><span class="line">flush privileges;</span><br></pre></td></tr></table></figure><p>退出 MySQL，重启 MySQL 服务： <code>service mysql restart</code></p><h1 id="3-MySQL-操作"><a href="#3-MySQL-操作" class="headerlink" title="3. MySQL 操作"></a>3. MySQL 操作</h1><hr><h3 id="3-1-连接数据库"><a href="#3-1-连接数据库" class="headerlink" title="3.1 连接数据库"></a>3.1 连接数据库</h3><p><code>mysql -u user -p</code></p><p>退出连接：</p><p><code>QUIT</code> 或者 Ctrl+D</p><h3 id="3-2-查看、创建、使用数据库"><a href="#3-2-查看、创建、使用数据库" class="headerlink" title="3.2 查看、创建、使用数据库"></a>3.2 查看、创建、使用数据库</h3><ul><li>查看数据库:  <code>show databases;</code></li><li>默认数据库：<ul><li>  <em>mysql</em> - 用户权限相关数据</li><li>  <em>test</em> - 用于用户测试数据</li><li>  <em>information_schema</em> - MySQL 本身架构相关数据</li></ul></li><li>创建数据库:  <code>create database db_NAME DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</code></li><li>使用数据库:  <code>use db_NAME;</code></li><li>显示当前使用的数据库中所有表：  <code>SHOW TABLES;</code></li></ul><h3 id="3-3-用户管理"><a href="#3-3-用户管理" class="headerlink" title="3.3 用户管理"></a>3.3 用户管理</h3><ul><li>创建用户  <code>create user &#39;user_NAME&#39;@&#39;ip_ADDRESS&#39; identified by &#39;password&#39;;</code></li><li>删除用户  <code>drop user &#39;user_NAME&#39;@&#39;ip_ADDRESS&#39;;</code></li><li>修改用户  <code>rename user &#39;user_NAME&#39;@&#39;ip_ADDRESS&#39;; to &#39;new_USER&#39;@&#39;ip_ADDRESS&#39;;</code></li><li>修改密码  <code>set password for &#39;user_NAME&#39;@&#39;ip_ADDRESS&#39; = Password(&#39;new_PASSWORD&#39;);</code></li><li>  <em>注：用户权限相关数据保存在 mysql 数据库的 user 表中，所以也可以直接对其进行操作（不建议）</em></li></ul><h3 id="3-4-权限管理"><a href="#3-4-权限管理" class="headerlink" title="3.4 权限管理"></a>3.4 权限管理</h3><h4 id="3-4-1-MySQL-用户权限列表："><a href="#3-4-1-MySQL-用户权限列表：" class="headerlink" title="3.4.1 MySQL 用户权限列表："></a>3.4.1 MySQL 用户权限列表：</h4><table><thead><tr><th>权限</th><th>说明</th></tr></thead><tbody><tr><td>Select</td><td>可以进行 SELECT 查询</td></tr><tr><td>Insert</td><td>可以进行 INSERT 插入</td></tr><tr><td>Update</td><td>可以进行 UPDATE 修改数据</td></tr><tr><td>Delete</td><td>可以进行 DELETE 删除数据</td></tr><tr><td>Create</td><td>可以创建新的数据库和表</td></tr><tr><td>Drop</td><td>可以删除现有数据库和表</td></tr><tr><td>Reload</td><td>可以执行刷新和重新加载 MySQL 所用各种内部缓存的特定命令，包括日志、权限、主机、查询和表</td></tr><tr><td>Shutdown</td><td>可以关闭 MySQL 服务器</td></tr><tr><td>Process</td><td>可以通过 SHOW PROCESSLIST 命令查看其他用户的进程</td></tr><tr><td>File</td><td>可以执行 SELECT INTO OUTFILE 和 LOAD DATA INFILE 命令</td></tr><tr><td>Grant</td><td>可以将已经授予给该用户自己的权限再授予其他用户</td></tr><tr><td>References</td><td>目前没有作用</td></tr><tr><td>Index</td><td>可以创建和删除表索引</td></tr><tr><td>Alter</td><td>可以重命名和修改表结构</td></tr><tr><td>Show_db</td><td>可以查看服务器上所有数据库的名字</td></tr><tr><td>Super</td><td>可以执行某些强大的管理功能，例如通过 KILL 命令删除用户进程，使用 SET GLOBAL 修改全局 MySQL 变量，执行关于复制和日志的各种命令</td></tr><tr><td>Create_tmp_table</td><td>可以创建临时表</td></tr><tr><td>Lock_tables</td><td>可以使用 LOCK TABLES 命令阻止对表的访问 / 修改</td></tr><tr><td>Execute</td><td>可以执行存储过程</td></tr><tr><td>Repl_slave</td><td>可以读取用于维护复制数据库环境的二进制日志文件</td></tr><tr><td>Repl_client</td><td>可以确定复制从服务器和主服务器的位置</td></tr><tr><td>Create_view</td><td>可以创建视图</td></tr><tr><td>Show_view</td><td>可以查看视图或了解视图如何执行</td></tr><tr><td>Create_routine</td><td>可以更改或放弃存储过程和函数</td></tr><tr><td>Alter_routine</td><td>可以修改或删除存储函数及函数</td></tr><tr><td>Create_user</td><td>可以执行 CREATE USER 创建新的 MySQL 账户</td></tr><tr><td>Event</td><td>可以创建、修改和删除事件</td></tr><tr><td>Trigger</td><td>可以创建和删除触发器</td></tr></tbody></table><h4 id="3-4-2-MySQL-数据库权限用法："><a href="#3-4-2-MySQL-数据库权限用法：" class="headerlink" title="3.4.2 MySQL 数据库权限用法："></a>3.4.2 MySQL 数据库权限用法：</h4><table><thead><tr><th>方法</th><th>说明</th></tr></thead><tbody><tr><td>数据库名.*</td><td>数据库中的所有内容</td></tr><tr><td>数据库名. 表名</td><td>指定数据库中的某张表</td></tr><tr><td>数据库名. 存储过程</td><td>指定数据库中的存储过程</td></tr><tr><td>* . *</td><td>所有数据库的所有内容</td></tr></tbody></table><h4 id="3-4-3-MySQL-对于用户和-IP-的限制方法："><a href="#3-4-3-MySQL-对于用户和-IP-的限制方法：" class="headerlink" title="3.4.3 MySQL 对于用户和 IP 的限制方法："></a>3.4.3 MySQL 对于用户和 IP 的限制方法：</h4><table><thead><tr><th>方法</th><th>说明</th></tr></thead><tbody><tr><td>用户名 @IP 地址</td><td>用户只能在改 IP 下才能访问</td></tr><tr><td>用户名 @192.168.1.%</td><td>用户只能在改 IP 段下才能访问 (通配符 % 表示任意)</td></tr><tr><td>用户名 @%</td><td>用户可以再任意 IP 下访问 (默认 IP 地址为 %)</td></tr></tbody></table><h4 id="3-4-4-权限控制"><a href="#3-4-4-权限控制" class="headerlink" title="3.4.4 权限控制"></a>3.4.4 权限控制</h4><ul><li>查看用户的权限：  <code>show grants for &#39;user_NAME&#39;@&#39;ip_ADDRESS&#39;;</code></li><li>授权  <code>grant 权限 on 数据库.表 to &#39;user_NAME&#39;@&#39;ip_ADDRESS&#39;;</code></li><li>取消授权  <code>revoke 权限 on 数据库.表 from &#39;用户名&#39;@&#39;IP地址&#39;;</code></li></ul><h1 id="4-MySQL-表操作"><a href="#4-MySQL-表操作" class="headerlink" title="4. MySQL 表操作"></a>4. MySQL 表操作</h1><hr><h3 id="4-1-查看表"><a href="#4-1-查看表" class="headerlink" title="4.1 查看表"></a>4.1 查看表</h3><ul><li>  <code>show tables; # 查看数据库全部表</code></li><li>  <code>select * from 表名; # 查看表所有内容</code></li></ul><h3 id="4-2-创建表"><a href="#4-2-创建表" class="headerlink" title="4.2 创建表"></a>4.2 创建表</h3><figure class="highlight plain"><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">create  table 表名(</span><br><span class="line">   列名  类型  是否可以为空 是否自动增长(可选)，</span><br><span class="line">   列名  类型  是否可以为空，</span><br><span class="line">   指定主键</span><br><span class="line">)ENGINE&#x3D;InnoDB  DEFAULT  CHARSET&#x3D;utf8；</span><br></pre></td></tr></table></figure><p>例：</p><figure class="highlight plain"><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">CREATE TABLE &#96;tab_NAME&#96;(</span><br><span class="line"> &#96;nid&#96; int(11) NOT NULL auto_increment,</span><br><span class="line"> &#96;name&#96; varchar(255) NOT NULL,</span><br><span class="line"> &#96;email&#96; varchar(255),</span><br><span class="line"> PRIMARY KEY(&#96;nid&#96;)</span><br><span class="line">)ENGINE&#x3D;InnoDB DEFAULT CHARSET&#x3D;utf8;</span><br></pre></td></tr></table></figure><ul><li>_注_：<ul><li>  默认值，创建列时可以指定默认值，当插入数据时如果未主动设置，则自动添加默认值。</li><li>  自增 (auto_increment)，如果为某列设置自增列，插入数据时无需设置此列，默认将自增（表中只能有一个自增列）注意：对于自增列，必须是索引（含主键），对于自增可以设置步长和起始值。</li><li>  主键，一种特殊的唯一索引，不允许有空值，如果主键使用单个列，则它的值必须唯一，如果是多列，则其组合必须唯一。</li></ul></li></ul><h3 id="4-3-删除表"><a href="#4-3-删除表" class="headerlink" title="4.3 删除表"></a>4.3 删除表</h3><p><code>drop table table_NAME;</code></p><h3 id="4-4-清空表内容"><a href="#4-4-清空表内容" class="headerlink" title="4.4 清空表内容"></a>4.4 清空表内容</h3><figure class="highlight plain"><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">delete from table_NAME;</span><br><span class="line">truncate table table_NAME;</span><br></pre></td></tr></table></figure><h3 id="4-5-修改表"><a href="#4-5-修改表" class="headerlink" title="4.5 修改表"></a>4.5 修改表</h3><ul><li>添加列：  <code>alter table 表名 add 列名 类型;</code></li><li>删除列：  <code>alter table 表名 drop column 列名;</code></li><li>修改列：<ul><li>  <code>alter table table_NAME modify column 列名 类型;</code></li><li>  <code>alter table table_NAME change 原列名 新列名 类型;</code></li></ul></li><li>添加主键：  <code>alter table table_NAME add primary key(列名);</code></li></ul><h3 id="4-6-基本数据类型"><a href="#4-6-基本数据类型" class="headerlink" title="4.6 基本数据类型"></a>4.6 基本数据类型</h3><p>MySQL 中定义数据字段的类型对数据库的优化是非常重要的。 MySQL 支持多种类型，大致可以分为三类：数值、日期 / 时间和字符串 (字符) 类型。</p><h4 id="4-6-1-数值类型"><a href="#4-6-1-数值类型" class="headerlink" title="4.6.1 数值类型"></a>4.6.1 数值类型</h4><p>MySQL 支持所有标准 SQL 数值数据类型。 这些类型包括严格数值数据类型 (INTEGER、SMALLINT、DECIMAL 和 NUMERIC)，以及近似数值数据类型 (FLOAT、REAL 和 DOUBLE PRECISION)。</p><p>关键字 INT 是 INTEGER 的同义词，关键字 DEC 是 DECIMAL 的同义词。<br>BIT 数据类型保存位字段值，并且支持 MyISAM、MEMORY、InnoDB 和 BDB 表。</p><p>作为 SQL 标准的扩展，MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下面的表显示了需要的每个整数类型的存储和范围。</p><table><thead><tr><th>类型</th><th>大小</th><th>范围（有符号）</th><th>范围（无符号）</th><th>用途</th></tr></thead><tbody><tr><td>TINYINT</td><td>1 字节</td><td>(-128，127)</td><td>(0，255)</td><td>小整数值</td></tr><tr><td>SMALLINT</td><td>2 字节</td><td>(-32 768，32 767)</td><td>(0，65 535)</td><td>大整数值</td></tr><tr><td>MEDIUMINT</td><td>3 字节</td><td>(-8 388 608，8 388 607)</td><td>(0，16 777 215)</td><td>大整数值</td></tr><tr><td>INT 或 INTEGER</td><td>4 字节</td><td>(-2 147 483 648，2 147 483 647)</td><td>(0，4 294 967 295)</td><td>大整数值</td></tr><tr><td>BIGINT</td><td>8 字节</td><td>(-9 233 372 036 854 775 808，9 223 372 036 854 775 807)</td><td>(0，18 446 744 073 709 551 615)</td><td>极大整数值</td></tr><tr><td>FLOAT</td><td>4 字节</td><td>(-3.402 823 466 E+38，-1.175 494 351 E-38)，0，(1.175 494 351 E-38，3.402 823 466 351 E+38)</td><td>0，(1.175 494 351 E-38，3.402 823 466 E+38)</td><td>单精度浮点数值</td></tr><tr><td>DOUBLE</td><td>8 字节</td><td>(-1.797 693 134 862 315 7 E+308，-2.225 073 858 507 201 4 E-308)，0，(2.225 073 858 507 201 4 E-308，1.797 693 134 862 315 7 E+308)</td><td>0，(2.225 073 858 507 201 4 E-308，1.797 693 134 862 315 7 E+308)</td><td>双精度浮点数值</td></tr><tr><td>DECIMAL</td><td>对 DECIMAL(M,D) ，如果 M&gt;D，为 M+2 否则为 D+2</td><td>依赖于 M 和 D 的值</td><td>依赖于 M 和 D 的值</td><td>小数值</td></tr></tbody></table><h4 id="4-6-2-日期和时间类型"><a href="#4-6-2-日期和时间类型" class="headerlink" title="4.6.2 日期和时间类型"></a>4.6.2 日期和时间类型</h4><p>表示时间值的日期和时间类型为 DATETIME、DATE、TIMESTAMP、TIME 和 YEAR。 每个时间类型有一个有效值范围和一个 “零” 值，当指定不合法的 MySQL 不能表示的值时使用 “零” 值。</p><table><thead><tr><th>类型</th><th>大小 (字节)</th><th>范围</th><th>格式</th><th>用途</th></tr></thead><tbody><tr><td>DATE</td><td>3</td><td>1000-01-01/9999-12-31</td><td>YYYY-MM-DD</td><td>日期值</td></tr><tr><td>TIME</td><td>3</td><td>'-838:59:59'/'838:59:59'</td><td>HH:MM:SS</td><td>时间值或持续时间</td></tr><tr><td>YEAR</td><td>1</td><td>1901/2155</td><td>YYYY</td><td>年份值</td></tr><tr><td>DATETIME</td><td>8</td><td>1000-01-01 00:00:00/9999-12-31 23:59:59</td><td>YYYY-MM-DD HH:MM:SS</td><td>混合日期和时间值</td></tr><tr><td>TIMESTAMP</td><td>4</td><td>1970-01-01 00:00:00/2038 结束时间是第 <strong>2147483647</strong> 秒，北京时间 <strong>2038-1-19 11:14:07</strong>，格林尼治时间 2038 年 1 月 19 日 凌晨 03:14:07</td><td>YYYYMMDD HHMMSS</td><td>混合日期和时间值，时间戳</td></tr></tbody></table><h4 id="4-6-3-字符串类型"><a href="#4-6-3-字符串类型" class="headerlink" title="4.6.3 字符串类型"></a>4.6.3 字符串类型</h4><p>字符串类型指 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。</p><table><thead><tr><th>类型</th><th>大小</th><th>用途</th></tr></thead><tbody><tr><td>CHAR</td><td>0-255 字节</td><td>定长字符串</td></tr><tr><td>VARCHAR</td><td>0-65535 字节</td><td>变长字符串</td></tr><tr><td>TINYBLOB</td><td>0-255 字节</td><td>不超过 255 个字符的二进制字符串</td></tr><tr><td>TINYTEXT</td><td>0-255 字节</td><td>短文本字符串</td></tr><tr><td>BLOB</td><td>0-65 535 字节</td><td>二进制形式的长文本数据</td></tr><tr><td>TEXT</td><td>0-65 535 字节</td><td>长文本数据</td></tr><tr><td>MEDIUMBLOB</td><td>0-16 777 215 字节</td><td>二进制形式的中等长度文本数据</td></tr><tr><td>MEDIUMTEXT</td><td>0-16 777 215 字节</td><td>中等长度文本数据</td></tr><tr><td>LONGBLOB</td><td>0-4 294 967 295 字节</td><td>二进制形式的极大文本数据</td></tr><tr><td>LONGTEXT</td><td>0-4 294 967 295 字节</td><td>极大文本数据</td></tr></tbody></table><p>CHAR 和 VARCHAR 类型类似，但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。<br>BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR，不同的是它们包含二进制字符串而不要非二进制字符串。也就是说，它们包含字节字符串而不是字符字符串。这说明它们没有字符集，并且排序和比较基于列值字节的数值值。</p><p>BLOB 是一个二进制大对象，可以容纳可变数量的数据。有 4 种 BLOB 类型：TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。</p><p>有 4 种 TEXT 类型：TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型，可存储的最大长度不同，可根据实际情况选择。</p><h1 id="5-MySQL-表内容操作"><a href="#5-MySQL-表内容操作" class="headerlink" title="5 MySQL 表内容操作"></a>5 MySQL 表内容操作</h1><hr><h3 id="5-1-增加内容"><a href="#5-1-增加内容" class="headerlink" title="5.1 增加内容"></a>5.1 增加内容</h3><ul><li>  <code>insert into table_NAME(列名,列名...) values (值,值,...)；</code></li><li>  <code>insert into table_NAME(列名,列名...) values (值,值,...),(值,值,值...)；</code></li><li>  <code>insert into table_NAME(列名,列名...) select (列名,列名...) from table_NAME；</code></li><li>  例： <code>insert into table_NAME(name,email) values(&#39;wh&#39;,&#39;wh@gmail.com&#39;);</code></li></ul><h3 id="5-2-删除内容"><a href="#5-2-删除内容" class="headerlink" title="5.2 删除内容"></a>5.2 删除内容</h3><ul><li>  <code>delete from table_NAME; # 删除table_NAME表里全部数据</code></li><li>  <code>delete from table_NAME where id＝1; # 删除 ID =1 那一行数据</code></li><li>  <code>delete from table_NAME where id＝1 and name＝&#39;wh&#39;; # 删除 ID =1 并且 name=&#39;wh&#39; 那一行数据</code></li></ul><h3 id="5-3-更改内容"><a href="#5-3-更改内容" class="headerlink" title="5.3 更改内容"></a>5.3 更改内容</h3><p><code>update table_NAME set name＝&#39;wh&#39; where id=1;</code></p><h3 id="5-4-查询内容"><a href="#5-4-查询内容" class="headerlink" title="5.4 查询内容"></a>5.4 查询内容</h3><ul><li>  <code>select * from table_NAME;</code></li><li>  <code>select * from table_NAME where id &gt; 1;</code></li><li>  <code>select nid,name,gender as gg from table_NAME where id &gt; 1;</code></li></ul><p>例：</p><ul><li>a. 条件判断 where<ul><li>  <code>select * from table_NAME where id &gt; 1 and name != &#39;wh&#39; and num = 12;</code></li><li>  <code>select * from table_NAME where id between 5 and 16;</code></li><li>  <code>select * from table_NAME where id in (11,22,33);</code></li><li>  <code>select * from table_NAME where id not in (11,22,33);</code></li><li>  <code>select * from table_NAME where id in (select nid from table_NAME);</code></li></ul></li><li>b. 通配符 like<ul><li>  <code>select * from table_NAME where name like &#39;www%&#39;; # www开头的所有（多个字符串）</code></li><li>  <code>select * from table_NAME where name like &#39;www_&#39;; # zhang开头的所有（一个字符）</code></li></ul></li><li>c. 限制 limit<ul><li>  <code>select * from table_NAME limit 5; # 前5行</code></li><li>  <code>select * from table_NAME limit 4,5; # 从第4行开始的5行</code></li><li>  <code>select * from table_NAME limit 5 offset 4; # 从第4行开始的5行</code></li></ul></li><li>d. 排序 asc、desc<ul><li>  <code>select * from table_NAME order by nid asc; # 根据 nid 从小到大排列</code></li><li>  <code>select * from table_NAME order by nid desc; # 根据 nid 从大到小排列</code></li><li>  <code>select * from table_NAME order by nid desc,nid1 asc; # 根据 nid 从大到小排列，如果相同则按 nid1 从小到大排序</code></li></ul></li><li>e. 分组 group by<ul><li>  <code>select num from table_NAME group by num;</code></li><li>  <code>select num,nid from table_NAME group by num,nid;</code></li><li>  <code>select num,nid from table_NAME where nid &gt; 10 group by num,nid order nid desc;</code></li><li>  <code>select num,nid,count(*),sum(score),max(score),min(score) from table_NAME group by num,nid;</code></li><li>  <code>select num from table_NAME group by num having max(id) &gt; 10;</code></li><li>  注意：group by 必须在 where 之后，order by 之前</li></ul></li></ul><p>本文部分内容来源与 <a href="http://www.magedu.com/">“马哥教育”</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;1-MySQL-简介&quot;&gt;&lt;a href=&quot;#1-MySQL-简介&quot; class=&quot;headerlink&quot; title=&quot;1. MySQL 简介&quot;&gt;&lt;/a&gt;1. MySQL 简介&lt;/h1&gt;&lt;hr&gt;
&lt;h3 id=&quot;1-1-什么是数据库-？&quot;&gt;&lt;a href=&quot;#1-</summary>
      
    
    
    
    <category term="Programing" scheme="http://blog.whwtf.com/categories/Programing/"/>
    
    <category term="DataBase" scheme="http://blog.whwtf.com/categories/Programing/DataBase/"/>
    
    
    <category term="MySQL" scheme="http://blog.whwtf.com/tags/MySQL/"/>
    
  </entry>
  
  <entry>
    <title>用 Pipenv 建立与管理 Python 虚拟环境</title>
    <link href="http://blog.whwtf.com/Programing/Python/pipenv-env.html"/>
    <id>http://blog.whwtf.com/Programing/Python/pipenv-env.html</id>
    <published>2021-04-15T03:32:59.000Z</published>
    <updated>2021-04-15T03:43:07.968Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、什么是-pipenv"><a href="#一、什么是-pipenv" class="headerlink" title="一、什么是 pipenv"></a><a href="##%E4%B8%80%E3%80%81%E4%BB%80%E4%B9%88%E6%98%AF-pipenv" title="一、什么是 pipenv"></a>一、什么是 pipenv</h2><p>pipenv 主要包含了 Pipfile、pip、requests 和 virtualenv。Pipfile 是新型依赖管理文件，用于替代过于简陋的 requirements.txt 文件。<br>在 pipenv 管理下，一个项目对应一个 Pipfile，包含项目所使用的环境，依赖名称及版本，支持开发环境与正式环境区分。默认提供 default 和 development 区分。用 Pipfile.lock 提供版本锁定支持 。</p><h2 id="二、使用方法"><a href="#二、使用方法" class="headerlink" title="二、使用方法"></a><a href="##%E4%BA%8C%E3%80%81%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95" title="二、使用方法"></a>二、使用方法</h2><ul><li>安装  <figure class="highlight plain"><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">$pip3 install pipenv</span><br><span class="line">#python3</span><br></pre></td></tr></table></figure></li><li>环境创建<br>  新建一个存放当环境的文件夹 project1，并进入该文件夹  <figure class="highlight plain"><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">$pipenv --three</span><br><span class="line">#使用当前系统的Python3创建环境</span><br><span class="line">##$pipenv --python 3.6</span><br><span class="line">#指定某一Python版本创建环境</span><br></pre></td></tr></table></figure>  这会在当前文件夹建立一个 Pipfile，指定 pip 源，创建环境解释器及依赖包的位置。</li><li>安装依赖包  <figure class="highlight plain"><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">$pipenv install django</span><br><span class="line">##$pipenv install --dev django        #安装依赖包，但只在在Dev环境中关联</span><br><span class="line">##$pipenv install django&#x3D;&#x3D;1.11        #指定版本安装</span><br></pre></td></tr></table></figure>  安装依赖包放入环境文件夹并记录在 pipfile 中</li><li>卸载依赖包  <figure class="highlight plain"><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">$pipenv uninstall django</span><br><span class="line">##$pipenv uninstall --all        #卸载所有已安装包</span><br></pre></td></tr></table></figure></li><li>运行程序 有两种方式运行程序<br>  1、直接运行  <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$pipenv run python3 project1.py</span><br></pre></td></tr></table></figure>  2、启动虚拟环境运行  <figure class="highlight plain"><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">$pipenv shell      #启动虚拟环境</span><br><span class="line">$python3 project1.py</span><br><span class="line">$exit              #退出虚拟环境</span><br></pre></td></tr></table></figure></li><li>重建环境 在新设备中，通过 git clong 了项目文件并经过 pipenv 初始化后，可以执行：  <figure class="highlight plain"><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">$pipenv install</span><br><span class="line">##$pipenv install -dev        #安装所有依赖包，包含Dev版本</span><br></pre></td></tr></table></figure>  来重建虚拟环境，pipenv 会根据文件夹中的 pipfile 自动选择 Python 版本，依赖包的安装及版本。</li></ul><h2 id="三、其他功能"><a href="#三、其他功能" class="headerlink" title="三、其他功能"></a><a href="##%E4%B8%89%E3%80%81%E5%85%B6%E4%BB%96%E5%8A%9F%E8%83%BD" title="三、其他功能"></a>三、其他功能</h2><figure class="highlight plain"><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">$pipenv --where        #显示目录信息</span><br><span class="line">$pipenv --venv         #显示虚拟环境信息</span><br><span class="line">$pipenv --py           #显示Python解释器信息</span><br><span class="line">$pipenv graph          #查看目前安装的库及其版本</span><br><span class="line">$pipenv check          #检查安全漏洞</span><br></pre></td></tr></table></figure><ul><li>使用 pipenv install 安装依赖包时默认用的国外源，速度慢，可改成国内源。 修改 pipfile 中 url 参数的值，比如改成以下其中一条：  <figure class="highlight plain"><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">url &#x3D; &quot;https:&#x2F;&#x2F;pypi.tuna.tsinghua.edu.cn&#x2F;simple&quot;</span><br><span class="line">url &#x3D; &quot;http:&#x2F;&#x2F;mirrors.aliyun.com&#x2F;pypi&#x2F;simple&#x2F;&quot;</span><br><span class="line">url &#x3D; &quot;https:&#x2F;&#x2F;pypi.mirrors.ustc.edu.cn&#x2F;simple&#x2F;&quot;</span><br><span class="line">url &#x3D; &quot;http:&#x2F;&#x2F;pypi.douban.com&#x2F;simple&#x2F;&quot;</span><br><span class="line">url &#x3D; &quot;https:&#x2F;&#x2F;pypi.tuna.tsinghua.edu.cn&#x2F;simple&#x2F;&quot;</span><br><span class="line">url &#x3D; &quot;http:&#x2F;&#x2F;pypi.mirrors.ustc.edu.cn&#x2F;simple&#x2F;&quot;</span><br></pre></td></tr></table></figure></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一、什么是-pipenv&quot;&gt;&lt;a href=&quot;#一、什么是-pipenv&quot; class=&quot;headerlink&quot; title=&quot;一、什么是 pipenv&quot;&gt;&lt;/a&gt;&lt;a href=&quot;##%E4%B8%80%E3%80%81%E4%BB%80%E4%B9%88%E6</summary>
      
    
    
    
    <category term="Programing" scheme="http://blog.whwtf.com/categories/Programing/"/>
    
    <category term="Python" scheme="http://blog.whwtf.com/categories/Programing/Python/"/>
    
    
    <category term="Python" scheme="http://blog.whwtf.com/tags/Python/"/>
    
    <category term="Pipenv" scheme="http://blog.whwtf.com/tags/Pipenv/"/>
    
  </entry>
  
  <entry>
    <title>Armbian 安装并改为国内软件源</title>
    <link href="http://blog.whwtf.com/Linux/SomePi/armbiansource.html"/>
    <id>http://blog.whwtf.com/Linux/SomePi/armbiansource.html</id>
    <published>2021-04-14T03:17:54.000Z</published>
    <updated>2021-04-14T03:50:37.717Z</updated>
    
    <content type="html"><![CDATA[<p>Armbian是 <a href="https://www.armbian.com/">@armbian.com</a>] 专为RaspberryPi、NanaoPi、RockPi……这类使用arm soc的微小计算机/开发板编译制作的操作系统。运行稳定，功能强大。内置armbian-config配置程序，可以方便的对系统进行设置和安装一些第三方软件。<br><img src="https://gitee.com/whwtf/upic/raw/master/uPic/armbian-config2020-09-25.png"><br><img src="https://gitee.com/whwtf/upic/raw/master/uPic/soft2020-09-25.png"></p><h2 id="Armbian安装"><a href="#Armbian安装" class="headerlink" title="Armbian安装"></a>Armbian安装</h2><p>从 <a href="https://www.armbian.com/">armbian官网</a> 下载对应的系统镜像文件，用烧卡软件写入到TF卡中。个人认为 <strong><a href="https://www.balena.io/etcher">Etcher</a></strong> 比较好用。<br><img src="https://gitee.com/whwtf/upic/raw/master/uPic/etcher2020-09-25.png"><br>插入卡，通电，等待几分钟就可以SSH连接了。第一次用 root@1234 登录，首次进入系统需要更改root密码，新建用户。然后重启，用新建的用户登录，使用命令</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo armbian-config</span><br></pre></td></tr></table></figure><p>对系统进行设置和按需安装第三方软件。</p><h2 id="更改apt源为国内"><a href="#更改apt源为国内" class="headerlink" title="更改apt源为国内"></a>更改apt源为国内</h2><p><a href="https://www.armbian.com/">Armbian</a> 默认软件源为 <a href="https://www.debian.org/">Debian</a> 官方的，使用起来速度比较慢，可以更改为国内源加快更新及安装速度。<br>国内Linux源有很多，通常使用 <a href="https://mirrors.tuna.tsinghua.edu.cn/">清华大学</a> 的，有详细的使用文档，还有各种系统的国内下载镜像，很方便。<br>首先：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo apt install apt-transport-https ca-certificates</span><br></pre></td></tr></table></figure><p><a href="https://www.armbian.com/">Armbian</a> 更改源的时候需要改两个地方：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo nano &#x2F;etc&#x2F;apt&#x2F;sources.list</span><br></pre></td></tr></table></figure><p>将里面内容全部注释掉，添加：</p><figure class="highlight plain"><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"># 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释，“buster”根据版本更改。</span><br><span class="line">deb https:&#x2F;&#x2F;mirrors.tuna.tsinghua.edu.cn&#x2F;debian&#x2F; buster main contrib non-free</span><br><span class="line"># deb-src https:&#x2F;&#x2F;mirrors.tuna.tsinghua.edu.cn&#x2F;debian&#x2F; buster main contrib non-free</span><br><span class="line">deb https:&#x2F;&#x2F;mirrors.tuna.tsinghua.edu.cn&#x2F;debian&#x2F; buster-updates main contrib non-free</span><br><span class="line"># deb-src https:&#x2F;&#x2F;mirrors.tuna.tsinghua.edu.cn&#x2F;debian&#x2F; buster-updates main contrib non-free</span><br><span class="line">deb https:&#x2F;&#x2F;mirrors.tuna.tsinghua.edu.cn&#x2F;debian&#x2F; buster-backports main contrib non-free</span><br><span class="line"># deb-src https:&#x2F;&#x2F;mirrors.tuna.tsinghua.edu.cn&#x2F;debian&#x2F; buster-backports main contrib non-free</span><br><span class="line">deb https:&#x2F;&#x2F;mirrors.tuna.tsinghua.edu.cn&#x2F;debian-security buster&#x2F;updates main contrib non-free</span><br><span class="line"># deb-src https:&#x2F;&#x2F;mirrors.tuna.tsinghua.edu.cn&#x2F;debian-security buster&#x2F;updates main contrib non-free</span><br></pre></td></tr></table></figure><p>然后还有一个地方需要更改，是Armbian自身的内容更新源</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo nano &#x2F;etc&#x2F;apt&#x2F;sources.list.d&#x2F;armbian.list</span><br></pre></td></tr></table></figure><p>注释掉原来内容，添加：</p><figure class="highlight plain"><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">“buster”根据版本更改</span><br><span class="line">deb http:&#x2F;&#x2F;mirrors.tuna.tsinghua.edu.cn&#x2F;armbian&#x2F; buster main buster-utils buster-desktop</span><br></pre></td></tr></table></figure><p>之后就可以愉快的</p><figure class="highlight plain"><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 apt update</span><br><span class="line">$ sudo apt upgrade</span><br><span class="line">or</span><br><span class="line">$ sudo apt dist-upgrade</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Armbian是 &lt;a href=&quot;https://www.armbian.com/&quot;&gt;@armbian.com&lt;/a&gt;] 专为RaspberryPi、NanaoPi、RockPi……这类使用arm soc的微小计算机/开发板编译制作的操作系统。运行稳定，功能强大。内置ar</summary>
      
    
    
    
    <category term="Linux" scheme="http://blog.whwtf.com/categories/Linux/"/>
    
    <category term="SomePi" scheme="http://blog.whwtf.com/categories/Linux/SomePi/"/>
    
    
    <category term="Armbian" scheme="http://blog.whwtf.com/tags/Armbian/"/>
    
  </entry>
  
</feed>
