<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>靛青</title>
  
  <subtitle>青，取之于藍而青于藍。</subtitle>
  <link href="https://c-xuan.com/atom.xml" rel="self"/>
  
  <link href="https://c-xuan.com/"/>
  <updated>2019-04-05T05:40:29.000Z</updated>
  <id>https://c-xuan.com/</id>
  
  <author>
    <name>c-xuan</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Jupyter notebook/nteract/Atom中配置scala交互式编程环境</title>
    <link href="https://c-xuan.com/2019/04/05/20190405001_atom_scala/"/>
    <id>https://c-xuan.com/2019/04/05/20190405001_atom_scala/</id>
    <published>2019-04-05T05:40:29.000Z</published>
    <updated>2019-04-05T05:40:29.000Z</updated>
    
    <content type="html"><![CDATA[<p>Jupyter notebook是一款学习和科研的神奇，相信很多小伙伴已经利用它在学术科研、研究开发的道路上收获了便捷易用、可视直观的优点。大部分时候我们都是Jupyter notebook中编写python脚本，其实，可以额外安装相关语言的Kernel，让Jupyter notebook支持交互式执行相关语言代码，本文中介绍配置运行Scala代码的过程。</p><span id="more"></span><h3 id="前提条件"><a href="#前提条件" class="headerlink" title="前提条件"></a>前提条件</h3><ul><li>安装<a href="https://www.scala-lang.org/download/">Scala</a>,找到<code>Other ways to install Scala</code>，选择<code>Download the Scala binaries for windows</code>，因为我是Windows 10环境，安装<code>scala-2.12.8.msi</code></li><li>安装有<a href="https://www.anaconda.com/">Anaconda</a></li><li>安装有<a href="https://atom.io/">Atom</a>,Atom中安装了<a href="https://nteract.gitbooks.io/hydrogen/">Hydrogen</a>插件</li></ul><h3 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h3><h4 id="安装scala-kernel"><a href="#安装scala-kernel" class="headerlink" title="安装scala kernel"></a>安装scala kernel</h4><p>在电脑硬盘根目录创建文件夹<code>almond</code>,比如我的是<code>G:\almond</code>，进入文件夹。</p><p>按住<code>shift</code>单击鼠标右键，选择<code>在此处打开Powershell窗口</code>。</p><p>在命令行中依次执行如下命令</p><figure class="highlight elixir"><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">set SCALA_VERSION=<span class="number">2.12</span>.<span class="number">8</span></span><br><span class="line">set ALMOND_VERSION=0.<span class="number">4.0</span></span><br><span class="line">　　　</span><br><span class="line">bitsadmin /transfer downloadCoursierCli <span class="symbol">https:</span>/<span class="regexp">/git.io/coursier</span>-cli <span class="string">&quot;%cd%\coursier&quot;</span></span><br><span class="line">bitsadmin /transfer downloadCoursierBat <span class="symbol">https:</span>/<span class="regexp">/git.io/coursier</span>-bat <span class="string">&quot;%cd%\coursier.bat&quot;</span></span><br><span class="line">　　　</span><br><span class="line">.\coursier bootstrap -r jitpack -i user -I <span class="symbol">user:</span><span class="symbol">sh.almond:</span>scala-kernel-api_%SCALA_VERSION%<span class="symbol">:%ALMOND_VERSION%</span> <span class="symbol">sh.almond:</span>scala-kernel_%SCALA_VERSION%<span class="symbol">:%ALMOND_VERSION%</span> -o almond</span><br><span class="line">　　　</span><br><span class="line">.\almond --install</span><br></pre></td></tr></table></figure><p>上述命令会在文件夹中下载这样几个文件：</p><figure class="highlight mipsasm"><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">almond</span><br><span class="line">almond.<span class="keyword">bat</span></span><br><span class="line"><span class="keyword">coursier</span></span><br><span class="line"><span class="keyword">coursier.bat</span></span><br></pre></td></tr></table></figure><p>最后提示scala-kernel成功就可以。</p><p>打开Anaconda Prompt,输入<code>jupyter kernelspec list</code>，看到已经出现scala内核了。</p><figure class="highlight taggerscript"><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">(base) C:<span class="symbol">\U</span>sers<span class="symbol">\A</span>dministrator&gt;jupyter kernelspec list</span><br><span class="line">Available kernels:</span><br><span class="line">  scala       C:<span class="symbol">\U</span>sers<span class="symbol">\A</span>dministrator<span class="symbol">\A</span>ppData<span class="symbol">\R</span>oaming<span class="symbol">\j</span>upyter<span class="symbol">\k</span>ernels<span class="symbol">\s</span>cala</span><br><span class="line">  python3     E:<span class="symbol">\P</span>rogramData<span class="symbol">\A</span>naconda3<span class="symbol">\s</span>hare<span class="symbol">\j</span>upyter<span class="symbol">\k</span>ernels<span class="symbol">\p</span>ython3</span><br><span class="line">  anaconda    C:<span class="symbol">\P</span>rogramData<span class="symbol">\j</span>upyter<span class="symbol">\k</span>ernels<span class="symbol">\a</span>naconda</span><br></pre></td></tr></table></figure><h4 id="安装language-scala"><a href="#安装language-scala" class="headerlink" title="安装language-scala"></a>安装language-scala</h4><p>Atom中，进入设置界面，在安装插件界面中搜索<code>scala</code>，选择安装<code>language-scala</code>.</p><h4 id="运行代码"><a href="#运行代码" class="headerlink" title="运行代码"></a>运行代码</h4><p>创建scala为扩展名的文件，在每一行代码上按<code>shift+回车</code>键执行代码，可以看到代码后面有运行结果了。</p><center><img src="/img/posts/20190405001-01.png" alt="scala"></img></center><p>如果打开Jupyter Notebook,可以看到新建中出现Scala选项。</p><center><img src="/img/posts/20190405001-02.png" alt="scala"></img></center><p>在Notebook中就可以像写Python一样进行交互运行代码了。</p><center><img src="/img/posts/20190405001-03.png" alt="scala"></img></center><p>如果使用<a href="https://nteract.io/">nteract</a>,也是可以执行的，<a href="/2019/02/21/20190221001_nteract/">类Jupyter notebook编辑器桌面版nteract</a></p><center><img src="/img/posts/20190405001-04.png" alt="scala"></img></center><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><p><a href="https://almond.sh/docs/quick-start-install">https://almond.sh/docs/quick-start-install</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Jupyter notebook是一款学习和科研的神奇，相信很多小伙伴已经利用它在学术科研、研究开发的道路上收获了便捷易用、可视直观的优点。大部分时候我们都是Jupyter notebook中编写python脚本，其实，可以额外安装相关语言的Kernel，让Jupyter notebook支持交互式执行相关语言代码，本文中介绍配置运行Scala代码的过程。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="Atom" scheme="https://c-xuan.com/tags/Atom/"/>
    
    <category term="Scala" scheme="https://c-xuan.com/tags/Scala/"/>
    
  </entry>
  
  <entry>
    <title>PDI设计转换任务</title>
    <link href="https://c-xuan.com/2019/03/27/20190327001_pdi_case/"/>
    <id>https://c-xuan.com/2019/03/27/20190327001_pdi_case/</id>
    <published>2019-03-27T15:36:28.000Z</published>
    <updated>2019-03-27T15:36:28.000Z</updated>
    
    <content type="html"><![CDATA[<p>Pentaho Data Integration(PDI),Kettle是PDI以前的名称.在2006年Kettle加入了开源的BI组织Pentaho,正式命名为PDI, 加入Pentaho后Kettle的发展越来越快了，并有越来越多的人开始关注它了.PDI(Kettle)是一款开源的、元数据驱动的ETL (数据的抽取、转换、加载)工具,是开源 ETL 工具里功能比较强大的一个.PDI<a href="https://community.hitachivantara.com/docs/DOC-1009855">官网</a>,最新版本为8.2.</p><p>本例用到的组件：生成随机数，增加常量，计算器，过滤记录，分组，记录关联，Excel输出。</p><span id="more"></span><h3 id="实现功能"><a href="#实现功能" class="headerlink" title="实现功能"></a>实现功能</h3><p>随机生成100个随机数，随机数取值于[0，100）之间，计算小于等于50的随机数个数和大于50的随机数个数。并把这两个统计数字放在数据库表的一行的两列中，即输出的结果有一行，一行包括两列，每列是一个统计值。</p><h3 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h3><p>我使用的PDI版本为7.1.</p><h4 id="新建转换"><a href="#新建转换" class="headerlink" title="新建转换"></a>新建转换</h4><p>打开PDI中的<code>Spoon.bat</code>进入转换设计器。<code>文件-&gt;新建-&gt;转换</code>新建空白的抓换任务。<code>Ctrl+s</code>先保存名为<code>test.ktr</code>的文件。</p><h4 id="生成随机数"><a href="#生成随机数" class="headerlink" title="生成随机数"></a>生成随机数</h4><p><code>步骤-&gt;输入</code>中拖入<code>生成随机数</code>组件，双击组件，添加一行，名称为<code>rand_num</code>，类型为<code>随机数字</code>。</p><center><img src="/img/posts/20190327001-01.png" alt="PDI设计任务"></img></center><p>在组件上右键，选择<code>改变开始复制的数量</code>，因为生成100个随机数，所以输入100，但是没看到确定之类的按钮(坑爹)，直接回车就可以了。之后在组件左上角出现<code>x100</code>的标志。</p><center><img src="/img/posts/20190327001-02.png" alt="PDI设计任务"></img></center><h4 id="增加常量"><a href="#增加常量" class="headerlink" title="增加常量"></a>增加常量</h4><p><code>步骤-&gt;转换</code>中拖入<code>增加常量</code>组件，双击组件，增加两个常量。multi值设置为100，因为生成的随机数是0-1范围的，后面会将随机数x100得到一个0-100的随机整数。standard设置为50，我们将随机数分开计数是以50为分界点。</p><p>鼠标放在<code>随机数</code>组件上，按住<code>Shift</code>键，按下鼠标左键拉出一根连线到<code>增加常量</code>组件上。</p><center><img src="/img/posts/20190327001-03.png" alt="PDI设计任务"></img></center><h4 id="计算器"><a href="#计算器" class="headerlink" title="计算器"></a>计算器</h4><p><code>步骤-&gt;转换</code>中拖入<code>计算器</code>组件，双击组件，增加一个新字段，计算方式为<code>A * B</code>，分别用生成的随机数乘上multi值。</p><center><img src="/img/posts/20190327001-04.png" alt="PDI设计任务"></img></center><h4 id="分组记录"><a href="#分组记录" class="headerlink" title="分组记录"></a>分组记录</h4><p><code>步骤-&gt;流程</code>中拖入<code>过滤记录</code>组件，<code>步骤-&gt;统计</code>中拖入两个<code>分组</code>组件，过滤记录连接到分组上，连接的时候回弹出<code>Result is true</code>和<code>Result is false</code>选项。</p><center><img src="/img/posts/20190327001-05.png" alt="PDI设计任务"></img></center><p>双击过滤记录组件，添加条件。</p><center><img src="/img/posts/20190327001-06.png" alt="PDI设计任务"></img></center><p>双击设置第一个分组，计算大于等于50的个数。</p><center><img src="/img/posts/20190327001-07.png" alt="PDI设计任务"></img></center><p>双击设置第二个分组，计算小于50的个数。</p><center><img src="/img/posts/20190327001-08.png" alt="PDI设计任务"></img></center><h4 id="结果输出"><a href="#结果输出" class="headerlink" title="结果输出"></a>结果输出</h4><p><code>步骤-&gt;连接</code>中拖入<code>记录关联(笛卡尔输出)</code>组件，因为我们直接将分组结果放在一行输出，直接笛卡尔连接即可。</p><p><code>步骤-&gt;输出</code>中拖入<code>Excel输出</code>组件，记录关联组件指向Excel输出。双击<code>Excel输出</code>组件，文件名中设置为<code>$&#123;output_dir&#125;/result</code>,其中，<code>$&#123;output_dir&#125;</code>是个变量，稍后设置。result是输出文件名。</p><center><img src="/img/posts/20190327001-09.png" alt="PDI设计任务"></img></center><p>字段页中可以获取要输出的字段，也可以不设置，默认输出所有字段。</p><center><img src="/img/posts/20190327001-10.png" alt="PDI设计任务"></img></center><p>Spoon设计器中<code>编辑-&gt;设置环境变量</code>，会出现我们在Excel中用到的变量，值设置为<code>../mywork</code>,因为默认的输出目录是Spoon.bat所在目录，我们在上层目录中新建一个mywork文件夹。</p><center><img src="/img/posts/20190327001-11.png" alt="PDI设计任务"></img></center><p>再拖入一个<code>Excel输出</code>组件，从<code>计算器</code>组件指向该组件，添加连线时会弹出选项，选择<code>复制</code>。这步的目的是将计算器计算出的结果保存一个。</p><center><img src="/img/posts/20190327001-12.png" alt="PDI设计任务"></img></center><p>双击该组件，文件名中设置为<code>$&#123;output_dir&#125;/data</code>.</p><center><img src="/img/posts/20190327001-13.png" alt="PDI设计任务"></img></center><h3 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h3><p>至此，所有步骤已完成。</p><center><img src="/img/posts/20190327001-14.png" alt="PDI设计任务"></img></center><p>点击上部按钮中第一个<code>运行这个转换</code>，弹出执行转换对话框，直接点击启动，可以看到下部面板中的运行日志，运行完成后查看结果Excel中已经输出相应结果。</p><center><img src="/img/posts/20190327001-15.png" alt="PDI设计任务"></img></center>]]></content>
    
    
    <summary type="html">&lt;p&gt;Pentaho Data Integration(PDI),Kettle是PDI以前的名称.在2006年Kettle加入了开源的BI组织Pentaho,正式命名为PDI, 加入Pentaho后Kettle的发展越来越快了，并有越来越多的人开始关注它了.PDI(Kettle)是一款开源的、元数据驱动的ETL (数据的抽取、转换、加载)工具,是开源 ETL 工具里功能比较强大的一个.PDI&lt;a href=&quot;https://community.hitachivantara.com/docs/DOC-1009855&quot;&gt;官网&lt;/a&gt;,最新版本为8.2.&lt;/p&gt;
&lt;p&gt;本例用到的组件：生成随机数，增加常量，计算器，过滤记录，分组，记录关联，Excel输出。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="数据仓库" scheme="https://c-xuan.com/tags/%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93/"/>
    
    <category term="PDI" scheme="https://c-xuan.com/tags/PDI/"/>
    
    <category term="kettle" scheme="https://c-xuan.com/tags/kettle/"/>
    
    <category term="ETL" scheme="https://c-xuan.com/tags/ETL/"/>
    
  </entry>
  
  <entry>
    <title>Python日期时间操作总结</title>
    <link href="https://c-xuan.com/2019/03/26/20190326001_python_datetime/"/>
    <id>https://c-xuan.com/2019/03/26/20190326001_python_datetime/</id>
    <published>2019-03-26T15:36:28.000Z</published>
    <updated>2019-03-26T15:36:28.000Z</updated>
    
    <content type="html"><![CDATA[<p>本文主要介绍Ptyhon 3中datetime, time模块相关函数用法及常用操作。datetime模块主要是用来表示日期的，就是我们常说的年月日时分秒，time模块主要侧重点在时分秒。</p><span id="more"></span><h3 id="时间相关概念"><a href="#时间相关概念" class="headerlink" title="时间相关概念"></a>时间相关概念</h3><h4 id="epoch"><a href="#epoch" class="headerlink" title="epoch"></a>epoch</h4><p>假设我们要将时间表示成毫秒数，比方说1000000毫秒，那有一个问题必须解决，这个1000000毫秒的起点是什么时间，也就是我们的时间基准点是什么时间？好比我说你身高1.8米，那这个身高是指相对于你站立的地面说的。这个时间基准点就是epoch，在Unix系统中，这个基准点就是1970年1月1日0点整那个时间点。</p><h4 id="GMT-UTC"><a href="#GMT-UTC" class="headerlink" title="GMT, UTC"></a>GMT, UTC</h4><p>上面我们说epoch表示1970年的起始点，那这个1970年又是相对于哪个基准时间呢？一般来说，就是相对于格林尼治时间，也叫做GMT(Greenwich Mean Time)时间，还叫做UTC(Coordinated Universal Time)，为啥一个时间基准有两个名字？历史上，先有的GMT,后有的UTC.UTC是我们现在用的时间标准，GMT是老的时间计量标准。UTC是根据原子钟来计算时间，而GMT是根据地球的自转和公转来计算时间。所以，可以认为UTC是真正的基准时间，GMT相对UTC的偏差为0。在实际中，我们的计算机中有一个硬件模块RCT，里面会实时记录UTC 时间，该模块有单独的电池供电，即使关机也不影响。有了epoch这个时间基准，又有了UTC这个基准的基准，我们就可以精确地表示一个时间了。</p><h4 id="DST-tzoneDST-tzone"><a href="#DST-tzoneDST-tzone" class="headerlink" title="DST, tzoneDST, tzone"></a>DST, tzoneDST, tzone</h4><p>尽管我们已经可以精确地表示一个时间，很多情况下，我们还是要根据地区实际情况对时间进行一个调整，最常见的就是时区，tzone，相信大家都比较熟悉。此时，当我们说5点5分这个时间时，还需加上是哪个时区的5点5分才能精确说明一个时间。另外一个对时间做出调整的就是DST.DST 全称是Daylight Saving Time，是说，为了充分利用日光，减少用电，人为地对时间做出一个调整，这取决于不同国家和地区的政策法规。比如说，假设你冬天7点天亮起床，但夏天6点天亮，那么在夏天到来时人为将时间加1个小时，这样就可以让你还是觉得7点起床，但实际上是提前一个小时了。</p><h3 id="time模块"><a href="#time模块" class="headerlink" title="time模块"></a>time模块</h3><h4 id="获取时间"><a href="#获取时间" class="headerlink" title="获取时间"></a>获取时间</h4><p><code>time()</code>方法获取当前时间距离epoch的秒数，用的是UTC时间，这个函数没有参数。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> time</span><br><span class="line">t = time.time()</span><br><span class="line"><span class="comment">#结果：1553614051.5006864</span></span><br></pre></td></tr></table></figure><h4 id="时间转换"><a href="#时间转换" class="headerlink" title="时间转换"></a>时间转换</h4><p>将上面的秒数转换为年月日时分秒的形式，可以用<code>time. gmtime()</code>，<code>time.localtime()</code>方法。两个函数返回的都是struct_time类的实例。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">time.gmtime()</span><br><span class="line"><span class="comment">#结果：time.struct_time(tm_year=2019, tm_mon=3, tm_mday=26, tm_hour=15, tm_min=35, tm_sec=9, tm_wday=1, tm_yday=85, tm_isdst=0)</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">time.localtime()</span><br><span class="line"><span class="comment">#结果：time.struct_time(tm_year=2019, tm_mon=3, tm_mday=26, tm_hour=23, tm_min=37, tm_sec=15, tm_wday=1, tm_yday=85, tm_isdst=0)</span></span><br></pre></td></tr></table></figure><p>如果要将上述元组形式的时间转换成秒数，可以用<code>time.mktime()</code>方法。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">now_struct = time.localtime()</span><br><span class="line">time.mktime(now_struct)</span><br><span class="line"><span class="comment">#结果：1553615106.0</span></span><br></pre></td></tr></table></figure><p>将时间的元组转换为字符串形式，可以用<code>time.strftime()</code>,将特定格式的时间转成时间元组格式用<code>time.strptime()</code>方法。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">time.strftime(<span class="string">&quot;%Y-%m-%d %H:%M:%S&quot;</span>, time.localtime()) </span><br><span class="line">time.strftime(<span class="string">&quot;%Y-%m-%d %H:%M:%S&quot;</span>) <span class="comment">#等效，默认是当前时间</span></span><br><span class="line"><span class="comment">#结果：&#x27;2019-03-26 23:52:32&#x27;</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">time.strptime(<span class="string">&#x27;2019-03-26 11:56:21&#x27;</span>,<span class="string">&#x27;%Y-%m-%d %H:%M:%S&#x27;</span>)</span><br><span class="line"><span class="comment">#结果：time.struct_time(tm_year=2019, tm_mon=3, tm_mday=26, tm_hour=11, tm_min=56, tm_sec=21, tm_wday=1, tm_yday=85, tm_isdst=-1)</span></span><br></pre></td></tr></table></figure><p><code>time.asctime()</code>、<code>time.ctime()</code>方法则会将时间转换为标准24字符的字符串，前者参数是时间元组，后者参数是秒数。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">now_struct = time.localtime()</span><br><span class="line">time.asctime(now_struct)</span><br><span class="line"><span class="comment">#结果：&#x27;Wed Mar 27 00:03:07 2019&#x27;</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">time.ctime(time.time())</span><br><span class="line"><span class="comment">#结果：&#x27;Wed Mar 27 00:03:07 2019&#x27;</span></span><br></pre></td></tr></table></figure><p>下图可以比较清楚的描述时间秒数、时间元组、字符串之间的转换关系。</p><center><img src="/img/posts/20190326001-01.png" alt="time时间转换"></img></center><h3 id="datetime模块"><a href="#datetime模块" class="headerlink" title="datetime模块"></a>datetime模块</h3><p><code>time</code>模块解决了时间的获取和表示，<code>datetime</code>模块则进一步解决了快速获取并操作时间中的年月日时分秒信息的能力。<br>简单说，该模块核心的类就三个，date类表示年月日，time类表示时分秒毫秒，这里不要和time模块搞混淆了。请记住一点，date中是没有时区信息的。</p><h4 id="对象创建"><a href="#对象创建" class="headerlink" title="对象创建"></a>对象创建</h4><p>常用<code>datetime.today()</code>、<code>datetime.now()</code>方法创建当前时区的对象。<code>datetime.fromtimestamp()</code>方法接收秒数参数。如果要获得utc的datetime对象，使用datetime. utcfromtimestamp()、datetime. utcnow()方法。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"><span class="comment">#</span></span><br><span class="line">datetime.datetime.fromtimestamp(time.time())</span><br><span class="line"><span class="comment">#</span></span><br><span class="line">datetime.datetime.today()</span><br><span class="line">datetime.datetime.now()</span><br><span class="line"><span class="comment">#结果：datetime.datetime(2019, 3, 27, 0, 9, 18, 312810)</span></span><br><span class="line"></span><br><span class="line">datetime.datetime. utcnow()</span><br><span class="line"><span class="comment">#结果：datetime.datetime(2019, 3, 26, 16, 12, 22, 71628)</span></span><br></pre></td></tr></table></figure><p>以特定格式字符串创建，使用<code>datetime.strptime()</code>方法。给定时间元组也可以创建datetime对象。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">datetime.datetime.strptime(<span class="string">&#x27;2015-6-1 18:19:59&#x27;</span>,<span class="string">&#x27;%Y-%m-%d %H:%M:%S&#x27;</span>)</span><br><span class="line"><span class="comment">#结果：datetime.datetime(2015, 6, 1, 18, 19, 59)</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">datetime.datetime(<span class="number">2015</span>, <span class="number">4</span>, <span class="number">19</span>, <span class="number">12</span>, <span class="number">20</span>)</span><br><span class="line"><span class="comment">#结果：datetime.datetime(2015, 4, 19, 12, 20)</span></span><br></pre></td></tr></table></figure><h4 id="格式转换"><a href="#格式转换" class="headerlink" title="格式转换"></a>格式转换</h4><p>datetime对象转换为时间戳。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">dt = datetime.datetime.now()</span><br><span class="line">dt.timestamp()</span><br><span class="line"><span class="comment">#结果：1553617278.690061</span></span><br></pre></td></tr></table></figure><p>datetime对象转换为字符串。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">dt = datetime.datetime.now()</span><br><span class="line">datetime.datetime.strftime(dt,<span class="string">&#x27;%Y-%m-%d %H:%M:%S&#x27;</span>)</span><br><span class="line"><span class="comment">#结果：&#x27;2019-03-27 00:24:01&#x27;</span></span><br></pre></td></tr></table></figure><p>datetime对象转换为time时间元组。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">dt = datetime.datetime.now()</span><br><span class="line">time.localtime(dt.timestamp())</span><br><span class="line"><span class="comment">#结果：time.struct_time(tm_year=2019, tm_mon=3, tm_mday=27, tm_hour=0, tm_min=28, tm_sec=51, tm_wday=2, tm_yday=86, tm_isdst=0)</span></span><br></pre></td></tr></table></figure><h3 id="日期计算"><a href="#日期计算" class="headerlink" title="日期计算"></a>日期计算</h3><p>基于某日期，向前或向后计算某段时间后的日期。</p><figure class="highlight stylus"><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="selector-tag">dt</span> = datetime<span class="selector-class">.datetime</span><span class="selector-class">.now</span>() #当前日期</span><br><span class="line"><span class="selector-tag">dt</span> = datetime<span class="selector-class">.datetime</span><span class="selector-class">.now</span>()</span><br><span class="line"><span class="selector-tag">dt</span> - datetime<span class="selector-class">.timedelta</span>(days=<span class="number">1</span>) #当前日期向前减一天</span><br><span class="line"><span class="selector-tag">dt</span> + datetime<span class="selector-class">.timedelta</span>(days=<span class="number">1</span>) #当前日期向后加一天</span><br><span class="line"><span class="selector-tag">dt</span> + datetime<span class="selector-class">.timedelta</span>(days=<span class="number">11</span>,hours=<span class="number">3</span>,minutes=<span class="number">20</span>) #当前日期向后推<span class="number">11</span>天<span class="number">3</span>小时<span class="number">20</span>分</span><br></pre></td></tr></table></figure><p>计算两个日期的时间差</p><figure class="highlight livecodeserver"><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="built_in">start</span> = datetime.datetime.strptime(<span class="string">&#x27;2015-6-1 18:19:59&#x27;</span>,<span class="string">&#x27;%Y-%m-%d %H:%M:%S&#x27;</span>)</span><br><span class="line"><span class="function"><span class="keyword">end</span> = <span class="title">datetime</span>.<span class="title">datetime</span>.<span class="title">now</span>()</span></span><br><span class="line">dlt = <span class="keyword">end</span>-<span class="built_in">start</span></span><br><span class="line">dlt.days <span class="comment">#相差天数</span></span><br><span class="line">dlt.<span class="built_in">seconds</span> <span class="comment">#相差秒数</span></span><br></pre></td></tr></table></figure><p>以下函数实现计算自从某一时间到当前时间经过了多少年，多少天，多少秒。</p><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">def cal_time_past(start_time = <span class="string">&#x27;2016-08-12 05:10:45&#x27;</span>):</span><br><span class="line">    now_str = time.strftime(<span class="string">&quot;%Y-%m-%d %H:%M:%S&quot;</span>) <span class="comment">#当前时间字符串</span></span><br><span class="line">    now_obj = datetime.datetime.now() <span class="comment">#当前时间datetime对象</span></span><br><span class="line">    years_end = now_str[:<span class="number">4</span>]+start_time[<span class="number">4</span>:] <span class="comment">#开始时间年份替换为当年</span></span><br><span class="line">    <span class="keyword">if</span> now_str &gt;= years_end:</span><br><span class="line">        ynum = <span class="keyword">int</span>(years_end[:<span class="number">4</span>])-<span class="keyword">int</span>(start_time[<span class="number">0</span>:<span class="number">4</span>]) <span class="comment">#过了几个整年</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        ynum = <span class="keyword">int</span>(years_end[:<span class="number">4</span>])-<span class="keyword">int</span>(start_time[<span class="number">0</span>:<span class="number">4</span>])-<span class="number">1</span> <span class="comment">#最后不满一年</span></span><br><span class="line">        years_end = str(<span class="keyword">int</span>(years_end[:<span class="number">4</span>])-<span class="number">1</span>)+years_end[<span class="number">4</span>:]</span><br><span class="line">    years_end_obj = datetime.datetime.strptime(years_end,<span class="string">&#x27;%Y-%m-%d %H:%M:%S&#x27;</span>)</span><br><span class="line">    delta = now_obj-years_end_obj</span><br><span class="line">    dnum = delta.days <span class="comment">#去掉整年后过去的天数 </span></span><br><span class="line">    hnum = <span class="keyword">int</span>(delta.seconds/<span class="number">3600</span>) <span class="comment">#过去的小时数</span></span><br><span class="line">    mnum = <span class="keyword">int</span>((delta.seconds-<span class="number">3600</span>*hnum)/<span class="number">60</span>) <span class="comment">#过去的分钟数</span></span><br><span class="line">    snum = delta.seconds-<span class="number">3600</span>*hnum-<span class="number">60</span>*mnum <span class="comment">#过去的描述</span></span><br><span class="line">    <span class="keyword">print</span>(<span class="string">&quot;%d年%d天%d小时%d分%d秒&quot;</span> % (ynum,dnum,hnum,mnum,snum))</span><br><span class="line"><span class="comment">#</span></span><br><span class="line">cal_time_past(<span class="string">&#x27;1990-04-18 04:18:00&#x27;</span>)</span><br><span class="line"><span class="comment">#结果：28年342天20小时38分21秒</span></span><br></pre></td></tr></table></figure><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://www.jianshu.com/p/a035a564b248">https://www.jianshu.com/p/a035a564b248</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文主要介绍Ptyhon 3中datetime, time模块相关函数用法及常用操作。datetime模块主要是用来表示日期的，就是我们常说的年月日时分秒，time模块主要侧重点在时分秒。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="Python" scheme="https://c-xuan.com/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>【Python 3 基础】字典dict创建方法及常用操作</title>
    <link href="https://c-xuan.com/2019/03/13/20190313001_python_dict/"/>
    <id>https://c-xuan.com/2019/03/13/20190313001_python_dict/</id>
    <published>2019-03-13T10:41:12.000Z</published>
    <updated>2019-03-13T10:41:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>本文主要介绍Ptyhon 3中字典创建方法，以及字典排序，合并等常用操作。</p><span id="more"></span><h3 id="创建字典方法"><a href="#创建字典方法" class="headerlink" title="创建字典方法"></a>创建字典方法</h3><h4 id="方式"><a href="#方式" class="headerlink" title="{} 方式"></a>{} 方式</h4><figure class="highlight python"><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">dict1 = &#123;&#125; <span class="comment">#创建空字典</span></span><br><span class="line">dict2 = &#123;<span class="string">&#x27;a&#x27;</span>:<span class="number">11</span>,<span class="string">&#x27;b&#x27;</span>:<span class="number">12</span>&#125; <span class="comment">#创建含有值得字典</span></span><br></pre></td></tr></table></figure><h4 id="dict-函数-方式"><a href="#dict-函数-方式" class="headerlink" title="dict()函数 方式"></a>dict()函数 方式</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">dict3 = <span class="built_in">dict</span>() <span class="comment">#创建空字典</span></span><br><span class="line">dict4 = <span class="built_in">dict</span>(a=<span class="string">&#x27;11&#x27;</span>,b=<span class="string">&#x27;ddd&#x27;</span>,c=<span class="string">&#x27;ssss&#x27;</span>) <span class="comment">#创建含有值的字典，注意键值如果加引号会报错</span></span><br><span class="line"><span class="comment">#dict5 = dict(&#x27;a&#x27;=&#x27;11&#x27;,b=&#x27;ddd&#x27;,c=&#x27;ssss&#x27;) # SyntaxError: keyword can&#x27;t be an expression</span></span><br><span class="line"></span><br><span class="line">keys = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>,<span class="string">&#x27;d&#x27;</span>,<span class="string">&#x27;e&#x27;</span>]</span><br><span class="line">values = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]</span><br><span class="line">dict6 = <span class="built_in">dict</span>(<span class="built_in">zip</span>(keys,values)) <span class="comment">#键或值的列表元素个数不必相同，以少的为准</span></span><br><span class="line"><span class="comment"># &#123;&#x27;a&#x27;: 1, &#x27;b&#x27;: 2, &#x27;c&#x27;: 3, &#x27;d&#x27;: 4&#125;</span></span><br></pre></td></tr></table></figure><h3 id="字典排序"><a href="#字典排序" class="headerlink" title="字典排序"></a>字典排序</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> operator</span><br><span class="line">test = &#123;<span class="string">&#x27;a&#x27;</span>:<span class="number">1</span>,<span class="string">&#x27;c&#x27;</span>:<span class="number">2</span>,<span class="string">&#x27;b&#x27;</span>:<span class="number">7</span>,<span class="string">&#x27;f&#x27;</span>:<span class="number">5</span>&#125;</span><br></pre></td></tr></table></figure><h4 id="根据键排序"><a href="#根据键排序" class="headerlink" title="根据键排序"></a>根据键排序</h4><h5 id="sorted-方式"><a href="#sorted-方式" class="headerlink" title="sorted() 方式"></a>sorted() 方式</h5><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items())) <span class="comment">#升序</span></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items(),reverse=<span class="literal">True</span>)) <span class="comment">#降序</span></span><br></pre></td></tr></table></figure><h5 id="sorted-operator-方式"><a href="#sorted-operator-方式" class="headerlink" title="sorted + operator 方式"></a>sorted + operator 方式</h5><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items(),key=operator.itemgetter(<span class="number">0</span>))) <span class="comment">#升序</span></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items(),key=operator.itemgetter(<span class="number">0</span>),reverse=<span class="literal">True</span>)) <span class="comment">#降序</span></span><br></pre></td></tr></table></figure><h5 id="sorted-lambda-方式"><a href="#sorted-lambda-方式" class="headerlink" title="sorted + lambda 方式"></a>sorted + lambda 方式</h5><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items(),key=<span class="keyword">lambda</span> x : x[<span class="number">0</span>])) <span class="comment">#升序</span></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items(),key=<span class="keyword">lambda</span> x : x[<span class="number">0</span>],reverse=<span class="literal">True</span>)) <span class="comment">#降序</span></span><br></pre></td></tr></table></figure><h4 id="根据值排序"><a href="#根据值排序" class="headerlink" title="根据值排序"></a>根据值排序</h4><h5 id="sorted-operator-方式-1"><a href="#sorted-operator-方式-1" class="headerlink" title="sorted + operator 方式"></a>sorted + operator 方式</h5><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items(),key=operator.itemgetter(<span class="number">1</span>))) <span class="comment">#升序</span></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items(),key=operator.itemgetter(<span class="number">1</span>),reverse=<span class="literal">True</span>)) <span class="comment">#降序</span></span><br></pre></td></tr></table></figure><h5 id="sorted-lambda-方式-1"><a href="#sorted-lambda-方式-1" class="headerlink" title="sorted + lambda 方式"></a>sorted + lambda 方式</h5><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items(),key=<span class="keyword">lambda</span> x : x[<span class="number">1</span>])) <span class="comment">#升序</span></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test.items(),key=<span class="keyword">lambda</span> x : x[<span class="number">1</span>],reverse=<span class="literal">True</span>)) <span class="comment">#降序</span></span><br></pre></td></tr></table></figure><p>** 注意，如果值的数据类型不一样，以上根据值排序会报错，例如一下字典，值有int和str类型,lambda中要进行类型转换 **</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">test2 = &#123;<span class="string">&#x27;a&#x27;</span>:<span class="number">1</span>,<span class="string">&#x27;c&#x27;</span>:<span class="number">2</span>,<span class="string">&#x27;b&#x27;</span>:<span class="number">7</span>,<span class="string">&#x27;f&#x27;</span>:<span class="string">&#x27;5&#x27;</span>&#125;</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">sorted</span>(test2.items(),key=<span class="keyword">lambda</span> x : <span class="built_in">str</span>(x[<span class="number">1</span>]))) <span class="comment">#升序</span></span><br><span class="line"><span class="comment">#输出 [(&#x27;a&#x27;, 1), (&#x27;c&#x27;, 2), (&#x27;f&#x27;, &#x27;5&#x27;), (&#x27;b&#x27;, 7)]</span></span><br></pre></td></tr></table></figure><h3 id="字典合并"><a href="#字典合并" class="headerlink" title="字典合并"></a>字典合并</h3><h4 id="update方法"><a href="#update方法" class="headerlink" title="update方法"></a>update方法</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">dictA = &#123;<span class="string">&#x27;a&#x27;</span>:<span class="number">3</span>,<span class="string">&#x27;b&#x27;</span>:<span class="number">7</span>,<span class="string">&#x27;c&#x27;</span>:<span class="string">&#x27;2&#x27;</span>&#125;</span><br><span class="line">dictB = &#123;<span class="string">&#x27;d&#x27;</span>:<span class="number">12</span>,<span class="string">&#x27;f&#x27;</span>:<span class="string">&#x27;44&#x27;</span>&#125;</span><br><span class="line">dictA.update(dictB)</span><br><span class="line"><span class="built_in">print</span>(dictA) <span class="comment">#输出 &#123;&#x27;a&#x27;: 3, &#x27;b&#x27;: 7, &#x27;c&#x27;: &#x27;2&#x27;, &#x27;d&#x27;: 12, &#x27;f&#x27;: &#x27;44&#x27;&#125;</span></span><br></pre></td></tr></table></figure><h4 id="方法"><a href="#方法" class="headerlink" title="**方法"></a>**方法</h4><p>** 高版本python中可用 **</p><figure class="highlight python"><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">dictC = &#123;**dictA,**dictB&#125;</span><br><span class="line"><span class="built_in">print</span>(dictC) <span class="comment">#输出 &#123;&#x27;a&#x27;: 3, &#x27;b&#x27;: 7, &#x27;c&#x27;: &#x27;2&#x27;, &#x27;d&#x27;: 12, &#x27;f&#x27;: &#x27;44&#x27;&#125;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文主要介绍Ptyhon 3中字典创建方法，以及字典排序，合并等常用操作。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="Python" scheme="https://c-xuan.com/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>CSS视差效果设计</title>
    <link href="https://c-xuan.com/2019/03/05/20190305001_css_parallax_effects/"/>
    <id>https://c-xuan.com/2019/03/05/20190305001_css_parallax_effects/</id>
    <published>2019-03-05T11:16:42.000Z</published>
    <updated>2019-03-05T11:16:42.000Z</updated>
    
    <content type="html"><![CDATA[<p>codepen上不错的视差效果设计。</p><span id="more"></span><center><img src="/img/posts/20190305001-01.gif" alt="parallax effects"></img></center><ul><li>作者：oscicen</li><li>使用技术：HTML / CSS / JavaScript</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>响应式：否</li><li>源码链接：<a href="https://codepen.io/oscicen/pen/zyJeJw">https://codepen.io/oscicen/pen/zyJeJw</a></li></ul><center><img src="/img/posts/20190305001-02.gif" alt="parallax effects"></img></center><ul><li>作者：Guilmain Dorian</li><li>使用技术：HTML (Pug) / CSS (Less) / JavaScript</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox (partial), Opera, Safari</li><li>响应式：否</li><li>源码链接：<a href="https://codepen.io/Craaftx/pen/yQGpwa">https://codepen.io/Craaftx/pen/yQGpwa</a></li></ul><center><img src="/img/posts/20190305001-03.gif" alt="parallax effects"></img></center><ul><li>作者：Adrian Payne</li><li>使用技术：HTML / CSS (SCSS) / JavaScript (Babel)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>响应式：是</li><li>源码链接：<a href="https://codepen.io/dazulu/pen/VVZrQv">https://codepen.io/dazulu/pen/VVZrQv</a></li></ul><center><img src="/img/posts/20190305001-04.gif" alt="parallax effects"></img></center><ul><li>作者：Alex O’Neal</li><li>使用技术：HTML / CSS</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>响应式：是</li><li>源码链接：<a href="https://codepen.io/alexoneal/pen/OBqaoe">https://codepen.io/alexoneal/pen/OBqaoe</a></li></ul><center><img src="/img/posts/20190305001-05.gif" alt="parallax effects"></img></center><ul><li>作者：Sil van Diepen</li><li>使用技术：HTML (Pug) / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>响应式：是</li><li>源码链接：<a href="https://codepen.io/silvandiepen/full/NOboze">https://codepen.io/silvandiepen/full/NOboze</a></li></ul><center><img src="/img/posts/20190305001-06.gif" alt="parallax effects"></img></center><ul><li>作者：Yago Estévez</li><li>使用技术：HTML (Pug) / CSS</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>响应式：是</li><li>源码链接：<a href="https://codepen.io/yagoestevez/full/EdgRMX">https://codepen.io/yagoestevez/full/EdgRMX</a></li></ul><center><img src="/img/posts/20190305001-07.gif" alt="parallax effects"></img></center><ul><li>作者：jakob-e</li><li>使用技术：HTML / CSS (SCSS) / JavaScript</li><li>依赖库：</li><li>浏览器兼容：Chrome, Firefox, Opera, Safari</li><li>响应式：是</li><li>源码链接：<a href="https://codepen.io/jakob-e/pen/ELqeRM">https://codepen.io/jakob-e/pen/ELqeRM</a></li></ul><center><img src="/img/posts/20190305001-08.gif" alt="parallax effects"></img></center><ul><li>作者：Casey Callis</li><li>使用技术：HTML / CSS / JavaScript</li><li>依赖库：jquery.js, parallax.js</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>响应式：是</li><li>源码链接：<a href="https://codepen.io/caseycallis/full/pwEWxo">https://codepen.io/caseycallis/full/pwEWxo</a></li></ul><center><img src="/img/posts/20190305001-09.gif" alt="parallax effects"></img></center><ul><li>作者：Ravi Dhiman</li><li>使用技术：HTML (Pug) / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Firefox, Opera, Safari</li><li>响应式：是</li><li>源码链接：<a href="https://codepen.io/ravid7000/pen/LREEzv">https://codepen.io/ravid7000/pen/LREEzv</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;codepen上不错的视差效果设计。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="前端" scheme="https://c-xuan.com/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="CSS" scheme="https://c-xuan.com/tags/CSS/"/>
    
    <category term="JavaScript" scheme="https://c-xuan.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>类Jupyter notebook编辑器桌面版nteract</title>
    <link href="https://c-xuan.com/2019/02/21/20190221001_nteract/"/>
    <id>https://c-xuan.com/2019/02/21/20190221001_nteract/</id>
    <published>2019-02-21T05:40:29.000Z</published>
    <updated>2019-02-21T05:40:29.000Z</updated>
    
    <content type="html"><![CDATA[<p>Jupyter notebook是一款学习和科研的神奇，相信很多小伙伴已经利用它在学术科研、研究开发的道路上收获了便捷易用、可视直观的优点。我们使用的Jupyter notebook都是网页形式的，在浏览器中进行操作，保存的文件格式是<code>.ipynb</code>的。似乎在其他编辑器工具中打不开这种格式。有没有不想在网页中的Jupyter notebook编写代码，也可以直接编辑<code>.ipynb</code>格式的文件的方法呢？</p><span id="more"></span><p>有这样一个软件似乎可以：<a href="https://nteract.io/">nteract</a>，这个软件我理解为桌面版的Jupyter notebook，下面是nteract的官网.</p><center><img src="/img/posts/20190221001-02.gif" alt="pyvenv"></img></center><h3 id="软件安装"><a href="#软件安装" class="headerlink" title="软件安装"></a>软件安装</h3><p>官网上可以下载安装文件，支持跨平台，有windows,linux,mac版本，免费的。软件安装好后，启动进入，界面比较简洁。</p><center><img src="/img/posts/20190221001-03.png" alt="pyvenv"></img></center><p>可以看到，系统中<code>.ipynb</code>格式的文件打开方式变成了nteract，直接双击文件就能打开进行编辑，保存，跟在Jupyter notebook一样。</p><center><img src="/img/posts/20190221001-04.png" alt="pyvenv"></img></center><h3 id="执行代码"><a href="#执行代码" class="headerlink" title="执行代码"></a>执行代码</h3><p>软件安装前确保本机有Python执行环境，推荐安装Anaconda，nteract需要连接Jupyter内核才能执行代码，如果已安装有Anaconda，打开nteract后可以看到左下角连接的Jupyter内核名称。</p><center><img src="/img/posts/20190221001-06.png" alt="pyvenv"></img></center><p>如果需要切换python虚拟环境，就需要安装多个python内核，如何安装参考<a href="/2019/02/18/20190218001_hydrogen_venv">Atom编辑器中使用Hydrogen切换Python虚拟环境</a>，安装好后在nteract中切换方法如下</p><center><img src="/img/posts/20190221001-07.gif" alt="pyvenv"></img></center><p>和在Jupyter notebook一样，执行单元格的代码可用<code>Shift+Enter</code>等快捷键，或者单元格靠右侧有个执行程序的小按钮。</p><center><img src="/img/posts/20190221001-05.gif" alt="pyvenv"></img></center><p>敲代码时可以看到是支持代码自动提示与补全的。</p><h3 id="终止代码执行"><a href="#终止代码执行" class="headerlink" title="终止代码执行"></a>终止代码执行</h3><p>如果不小心写了死循环或者想临时终止代码的运行，可以在<code>Runtime</code>菜单下进行操作。</p><center><img src="/img/posts/20190221001-09.gif" alt="pyvenv"></img></center><h3 id="Markdown和Code切换"><a href="#Markdown和Code切换" class="headerlink" title="Markdown和Code切换"></a>Markdown和Code切换</h3><p>单元格右侧下拉菜单中可以切换单元格内容是Markdown文本还是代码，如果是MD文本，双击单元格即可显示原始内容。其他单元格操作及相关快捷键看下<code>Edit</code>或者<code>Cell</code>菜单就明白了。</p><center><img src="/img/posts/20190221001-08.gif" alt="pyvenv"></img></center><h3 id="暗色主题"><a href="#暗色主题" class="headerlink" title="暗色主题"></a>暗色主题</h3><p>软件可以切换亮色与暗色主题。</p><center><img src="/img/posts/20190221001-10.gif" alt="pyvenv"></img></center><h3 id="小问题"><a href="#小问题" class="headerlink" title="小问题"></a>小问题</h3><p>如果是直接启动软件，第一次保存文件按<code>Ctrl+s</code>保存会报错，得用另存为。</p><center><img src="/img/posts/20190221001-11.gif" alt="pyvenv"></img></center><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>相比于Jupyter notebook，nteract显得简洁很多，平时开发作为替代也是可以的。单元格操作上，nteract没有Jupyter notebook那么丰富。Jupyter notebook可以额外安装插件进行功能扩展，虽然nteract也可以安装插件，官网上有介绍，但功能似乎没那么强大。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Jupyter notebook是一款学习和科研的神奇，相信很多小伙伴已经利用它在学术科研、研究开发的道路上收获了便捷易用、可视直观的优点。我们使用的Jupyter notebook都是网页形式的，在浏览器中进行操作，保存的文件格式是&lt;code&gt;.ipynb&lt;/code&gt;的。似乎在其他编辑器工具中打不开这种格式。有没有不想在网页中的Jupyter notebook编写代码，也可以直接编辑&lt;code&gt;.ipynb&lt;/code&gt;格式的文件的方法呢？&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="工具" scheme="https://c-xuan.com/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>Python多个数组合并</title>
    <link href="https://c-xuan.com/2019/02/20/20190220001_py_list_merge/"/>
    <id>https://c-xuan.com/2019/02/20/20190220001_py_list_merge/</id>
    <published>2019-02-20T05:40:29.000Z</published>
    <updated>2019-02-20T05:40:29.000Z</updated>
    
    <content type="html"><![CDATA[<p>Python中多个数组合并为一个数组的方法整理。</p><span id="more"></span><h3 id="extend方法"><a href="#extend方法" class="headerlink" title="extend方法"></a>extend方法</h3><p>该方法可以扩展数组，会改变原始数组。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">7</span>,<span class="number">5</span>,<span class="number">6</span>]</span><br><span class="line">b = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>]</span><br><span class="line">c = [<span class="string">&#x27;h&#x27;</span>,<span class="number">12</span>,<span class="string">&#x27;c&#x27;</span>]</span><br><span class="line">a.extend(b)</span><br><span class="line">a.extend(c)</span><br><span class="line"><span class="built_in">print</span>(a)</span><br><span class="line"></span><br><span class="line"><span class="comment">#结果：[1, 2, 3, 4, 7, 5, 6, &#x27;a&#x27;, &#x27;b&#x27;, &#x27;h&#x27;, 12, &#x27;c&#x27;]</span></span><br></pre></td></tr></table></figure><h3 id="直接相加"><a href="#直接相加" class="headerlink" title="直接相加"></a>直接相加</h3><p>用<code>+</code>将各数组连接起来。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">7</span>,<span class="number">5</span>,<span class="number">6</span>]</span><br><span class="line">b = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>]</span><br><span class="line">c = [<span class="string">&#x27;h&#x27;</span>,<span class="number">12</span>,<span class="string">&#x27;c&#x27;</span>]</span><br><span class="line"></span><br><span class="line">d = a + b +c</span><br><span class="line"><span class="built_in">print</span>(d)</span><br><span class="line"></span><br><span class="line"><span class="comment">#结果：[1, 2, 3, 4, 7, 5, 6, &#x27;a&#x27;, &#x27;b&#x27;, &#x27;h&#x27;, 12, &#x27;c&#x27;]</span></span><br></pre></td></tr></table></figure><h3 id="flatten方法"><a href="#flatten方法" class="headerlink" title="flatten方法"></a>flatten方法</h3><p><code>flatten()</code>方法是numpy中array数组的方法，使用时要导入包和类型转换。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> numpy <span class="keyword">import</span> array</span><br><span class="line"></span><br><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line">b = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>]</span><br><span class="line">c = [<span class="string">&#x27;h&#x27;</span>,<span class="number">12</span>,<span class="string">&#x27;k&#x27;</span>]</span><br><span class="line">e = [a,b,c]</span><br><span class="line">e = array(e)</span><br><span class="line"><span class="built_in">print</span>(e.flatten())</span><br><span class="line"></span><br><span class="line"><span class="comment">#结果：[&#x27;1&#x27; &#x27;2&#x27; &#x27;3&#x27; &#x27;a&#x27; &#x27;b&#x27; &#x27;c&#x27; &#x27;h&#x27; &#x27;12&#x27; &#x27;k&#x27;]</span></span><br></pre></td></tr></table></figure><p>值得注意的是该方法不适用各数组中元素个数不同的情况。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]  <span class="comment">#元素个数不同</span></span><br><span class="line">b = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>]</span><br><span class="line">c = [<span class="string">&#x27;h&#x27;</span>,<span class="number">12</span>,<span class="string">&#x27;k&#x27;</span>]</span><br><span class="line">e = [a,b,c]</span><br><span class="line">e = array(e)</span><br><span class="line"><span class="built_in">print</span>(e.flatten())</span><br><span class="line"></span><br><span class="line"><span class="comment">#结果：[list([1, 2, 3, 4]) list([&#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;]) list([&#x27;h&#x27;, 12, &#x27;k&#x27;])]</span></span><br></pre></td></tr></table></figure><h3 id="列表表达式"><a href="#列表表达式" class="headerlink" title="列表表达式"></a>列表表达式</h3><p>使用前得把多个数组放在一个数组中，应用在一个二维数组上。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>] </span><br><span class="line">b = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>]</span><br><span class="line">c = [<span class="string">&#x27;h&#x27;</span>,<span class="number">12</span>,<span class="string">&#x27;k&#x27;</span>]</span><br><span class="line">e = [a,b,c]</span><br><span class="line">e = [y <span class="keyword">for</span> x <span class="keyword">in</span> e <span class="keyword">for</span> y <span class="keyword">in</span> x]</span><br><span class="line"><span class="built_in">print</span>(e)</span><br><span class="line"></span><br><span class="line">结果：[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>, <span class="string">&#x27;h&#x27;</span>, <span class="number">12</span>, <span class="string">&#x27;k&#x27;</span>]</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;Python中多个数组合并为一个数组的方法整理。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="Python" scheme="https://c-xuan.com/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>【Atom】autocomplete-python插件报乱码异常问题</title>
    <link href="https://c-xuan.com/2019/02/20/20190220002_atom_atuo_err/"/>
    <id>https://c-xuan.com/2019/02/20/20190220002_atom_atuo_err/</id>
    <published>2019-02-20T05:40:29.000Z</published>
    <updated>2019-02-20T05:40:29.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://atom.io/packages/autocomplete-python">autocomplete-python</a>插件可以帮助在写python代码时给出丰富的提示并且自动补全代码，换电脑重装该插件后发现按下键盘后，atom右上角总弹出<code>autocomplete-python traceback output:</code>的提示，提示信息还是乱码。</p><span id="more"></span><center><img src="/img/posts/20190220002-01.png" alt="pyvenv"></img></center><p>解决方式是设置<code>Python Executable Paths</code></p><p>进入Atom设置<code>Packages</code>,找到该插件，进入<code>Settings</code></p><center><img src="/img/posts/20190220002-02.png" alt="pyvenv"></img></center><p>在<code>Python Executable Paths</code>中设置python的执行路径，因为本机是安装的Anaconda，环境变量中没有python执行路径。</p><center><img src="/img/posts/20190220002-03.png" alt="pyvenv"></img></center><p>重启Atom后就可以了。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://atom.io/packages/autocomplete-python&quot;&gt;autocomplete-python&lt;/a&gt;插件可以帮助在写python代码时给出丰富的提示并且自动补全代码，换电脑重装该插件后发现按下键盘后，atom右上角总弹出&lt;code&gt;autocomplete-python traceback output:&lt;/code&gt;的提示，提示信息还是乱码。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="工具" scheme="https://c-xuan.com/tags/%E5%B7%A5%E5%85%B7/"/>
    
    <category term="atom" scheme="https://c-xuan.com/tags/atom/"/>
    
  </entry>
  
  <entry>
    <title>Atom编辑器中使用Hydrogen切换Python虚拟环境</title>
    <link href="https://c-xuan.com/2019/02/18/20190218001_hydrogen_venv/"/>
    <id>https://c-xuan.com/2019/02/18/20190218001_hydrogen_venv/</id>
    <published>2019-02-18T10:12:24.000Z</published>
    <updated>2019-02-18T10:12:24.000Z</updated>
    
    <content type="html"><![CDATA[<p>使用Anaconda的集成Python环境，自带的Jupyter代码编辑器很不错，可以进行代码交互运行。后来折腾Atom编辑器，在Atom中安装Hydrogen插件也可以达到交互运行目的，而且在Atom中编写代码体验稍微好点。有时候我们会在自己的项目中创建Python虚拟环境，Hydrogen连接Anaconda中的python内核，如何增加python虚拟环境的内核给Hydrogen使用呢？</p><span id="more"></span><h3 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h3><p>配置前先确认电脑上安装了<a href="https://www.anaconda.com/">Anaconda</a>,代码编辑器<a href="http://www.atom.io/">Atom</a>,Atom中安装了<a href="https://nteract.gitbooks.io/hydrogen/">Hydrogen</a>插件.</p><p>开始菜单中打开<code>Anaconda Prompt</code>命令行窗口。</p><p>查看当前可用的kernel</p><p><code>jupyter kernelspec list</code></p><figure class="highlight taggerscript"><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">(base) C:<span class="symbol">\W</span>indows<span class="symbol">\s</span>ystem32&gt;jupyter kernelspec list</span><br><span class="line">Available kernels:</span><br><span class="line">  python3    C:<span class="symbol">\U</span>sers<span class="symbol">\c</span>xuan<span class="symbol">\A</span>ppData<span class="symbol">\R</span>oaming<span class="symbol">\j</span>upyter<span class="symbol">\k</span>ernels<span class="symbol">\p</span>ython3</span><br><span class="line">  venv       C:<span class="symbol">\P</span>rogramData<span class="symbol">\j</span>upyter<span class="symbol">\k</span>ernels<span class="symbol">\v</span>env</span><br></pre></td></tr></table></figure><p>默认只有第一个，第二个是后加的，在Atom中运行Python启动kernel默认只有第一个。</p><center><img src="/img/posts/20190220001-01.png" alt="pyvenv"></img></center><h3 id="创建python虚拟环境"><a href="#创建python虚拟环境" class="headerlink" title="创建python虚拟环境"></a>创建python虚拟环境</h3><p><code>python -m venv E:\PythonProject\test\pyvenv</code></p><p>创建后文件夹下出现这些文件目录</p><center><img src="/img/posts/20190220001-02.png" alt="pyvenv"></img></center><h3 id="安装python内核"><a href="#安装python内核" class="headerlink" title="安装python内核"></a>安装python内核</h3><p>激活新的虚拟环境</p><p><code>E:\PythonProject\test\pyvenv\Scripts\activate</code></p><center><img src="/img/posts/20190220001-03.png" alt="pyvenv"></img></center><p>安装python kernel (ipykernel)到虚拟环境里</p><p><code>python -m pip install ipykernel</code></p><center><img src="/img/posts/20190220001-04.png" alt="pyvenv"></img></center><p>安装python kernel到可用的kernel列表中,<code>--name</code>是自定义名称参数。</p><p><code>python -m ipykernel install --name pyvenv</code></p><center><img src="/img/posts/20190220001-05.png" alt="pyvenv"></img></center><p>重启Atom编辑器，启动python内核时多出了一个选项，就是刚刚我们配置的虚拟环境内核。</p><center><img src="/img/posts/20190220001-06.png" alt="pyvenv"></img></center><h3 id="删除python内核"><a href="#删除python内核" class="headerlink" title="删除python内核"></a>删除python内核</h3><p>删除python keernel</p><p>remove后指定要删除的kernel名称</p><p><code>jupyter kernelspec remove pyvenv</code></p><center><img src="/img/posts/20190220001-07.png" alt="pyvenv"></img></center><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><p><a href="https://nteract.io/kernels">https://nteract.io/kernels</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;使用Anaconda的集成Python环境，自带的Jupyter代码编辑器很不错，可以进行代码交互运行。后来折腾Atom编辑器，在Atom中安装Hydrogen插件也可以达到交互运行目的，而且在Atom中编写代码体验稍微好点。有时候我们会在自己的项目中创建Python虚拟环境，Hydrogen连接Anaconda中的python内核，如何增加python虚拟环境的内核给Hydrogen使用呢？&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="Python" scheme="https://c-xuan.com/tags/Python/"/>
    
    <category term="工具" scheme="https://c-xuan.com/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>【Web前端】11个使用CSS制作产品展示卡片样例</title>
    <link href="https://c-xuan.com/2019/02/14/20190214001_product_card/"/>
    <id>https://c-xuan.com/2019/02/14/20190214001_product_card/</id>
    <published>2019-02-14T11:16:42.000Z</published>
    <updated>2019-02-14T11:16:42.000Z</updated>
    
    <content type="html"><![CDATA[<p>　　</p><span id="more"></span><center><img src="/img/posts/20190214001-01.png" alt="product card"></img></center><ul><li>作者：John Mantas</li><li>使用技术：HTML / CSS (SCSS)</li><li>是否自适应：否</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/john-mantas/full/bxmrBq">https://codepen.io/john-mantas/full/bxmrBq</a></li></ul><center><img src="/img/posts/20190214001-02.png" alt="product card"></img></center><ul><li>作者：George Gedox</li><li>使用技术：HTML / CSS (SCSS)</li><li>是否自适应：否</li><li>依赖库：font-awesome.css</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/GeorgeGedox/pen/yEwoqP">https://codepen.io/GeorgeGedox/pen/yEwoqP</a></li></ul><center><img src="/img/posts/20190214001-03.png" alt="product card"></img></center><ul><li>作者：Julie Park</li><li>使用技术：HTML / CSS (SCSS)</li><li>是否自适应：否</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/juliepark/pen/aKbYVp">https://codepen.io/juliepark/pen/aKbYVp</a></li></ul><center><img src="/img/posts/20190214001-04.png" alt="product card"></img></center><ul><li>作者：Fatih Takey</li><li>使用技术：HTML / CSS</li><li>是否自适应：否</li><li>依赖库：font-awesome.css</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/fatihtakey/pen/eyyWVr">https://codepen.io/fatihtakey/pen/eyyWVr</a></li></ul><center><img src="/img/posts/20190214001-05.gif" alt="product card"></img></center><ul><li>作者：Omar Dsoky</li><li>使用技术：HTML / CSS</li><li>是否自适应：否</li><li>依赖库：font-awesome.css</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/linux/pen/LjWrPZ">https://codepen.io/linux/pen/LjWrPZ</a></li></ul><center><img src="/img/posts/20190214001-06.gif" alt="product card"></img></center><ul><li>作者：SliceCrowd</li><li>使用技术：HTML / CSS</li><li>是否自适应：否</li><li>依赖库：bootstrap.css, swiper.css</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/slicecrowd/pen/GWJEZB">https://codepen.io/slicecrowd/pen/GWJEZB</a></li></ul><center><img src="/img/posts/20190214001-07.jpg" alt="product card"></img></center><ul><li>作者：Tobi Balogun</li><li>使用技术：HTML / CSS</li><li>是否自适应：否</li><li>依赖库：ionicons.css, animate.css</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/cupofmint/pen/wgyrRX">https://codepen.io/cupofmint/pen/wgyrRX</a></li></ul><center><img src="/img/posts/20190214001-08.png" alt="product card"></img></center><ul><li>作者：CodeFrog</li><li>使用技术：HTML / CSS</li><li>是否自适应：否</li><li>依赖库：font-awesome.css</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/CodeFrogShow/pen/rWjYrP">https://codepen.io/CodeFrogShow/pen/rWjYrP</a></li></ul><center><img src="/img/posts/20190214001-09.gif" alt="product card"></img></center><ul><li>作者：Oscar</li><li>使用技术：HTML / CSS (SCSS) / JavaScript</li><li>是否自适应：否</li><li>依赖库：jquery.js</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/olhilton/pen/dXaqxE">https://codepen.io/olhilton/pen/dXaqxE</a></li></ul><center><img src="/img/posts/20190214001-10.png" alt="product card"></img></center><ul><li>作者：Alexandra K</li><li>使用技术：HTML / CSS</li><li>是否自适应：否</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/ff0004-red/pen/WxJEJZ">https://codepen.io/ff0004-red/pen/WxJEJZ</a></li></ul><center><img src="/img/posts/20190214001-11.png" alt="product card"></img></center><ul><li>作者：Jacob Sauerhoefer</li><li>使用技术：HTML / CSS (SCSS)</li><li>是否自适应：否</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/jacobsauerhoefer/pen/mVZwLB">https://codepen.io/jacobsauerhoefer/pen/mVZwLB</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;　　&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="前端" scheme="https://c-xuan.com/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="CSS" scheme="https://c-xuan.com/tags/CSS/"/>
    
    <category term="JavaScript" scheme="https://c-xuan.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>CSS制作水滴效果</title>
    <link href="https://c-xuan.com/2019/02/07/20190207001_css_water_effects/"/>
    <id>https://c-xuan.com/2019/02/07/20190207001_css_water_effects/</id>
    <published>2019-02-07T15:00:48.000Z</published>
    <updated>2019-02-07T15:00:48.000Z</updated>
    
    <content type="html"><![CDATA[<p>　　</p><span id="more"></span><center><img src="/img/posts/20190207001-01.gif" alt="css fire"></img></center><ul><li>作者：Nicholas Gratton</li><li>使用技术：HTML / CSS</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/ngratton/pen/MZKJvr">https://codepen.io/ngratton/pen/MZKJvr</a></li></ul><center><img src="/img/posts/20190207001-02.gif" alt="css fire"></img></center><ul><li>作者：Jhey</li><li>使用技术：HTML (Pug) / CSS (Stylus)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/jh3y/full/WyNdMG">https://codepen.io/jh3y/full/WyNdMG</a></li></ul><center><img src="/img/posts/20190207001-03.gif" alt="css fire"></img></center><ul><li>作者：Danny</li><li>使用技术：HTML (Haml) / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/edanny/full/JXwgdK">https://codepen.io/edanny/full/JXwgdK</a></li></ul><center><img src="/img/posts/20190207001-04.gif" alt="css fire"></img></center><ul><li>作者：Jaron White</li><li>使用技术：HTML / CSS</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/jaronwhite/full/zrmozE">https://codepen.io/jaronwhite/full/zrmozE</a></li></ul><center><img src="/img/posts/20190207001-05.gif" alt="css fire"></img></center><ul><li>作者：Adib Behjat</li><li>使用技术：HTML / CSS</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/abehjat/full/oXMENv">https://codepen.io/abehjat/full/oXMENv</a></li></ul><center><img src="/img/posts/20190207001-06.gif" alt="css fire"></img></center><ul><li>作者：Jér?me Beau</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/Javarome/pen/ogEoJM">https://codepen.io/Javarome/pen/ogEoJM</a></li></ul><center><img src="/img/posts/20190207001-07.gif" alt="css fire"></img></center><ul><li>作者：Lucas Bebber</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/lbebber/full/xrwja">https://codepen.io/lbebber/full/xrwja</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;　　&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="前端" scheme="https://c-xuan.com/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="CSS" scheme="https://c-xuan.com/tags/CSS/"/>
    
    <category term="JavaScript" scheme="https://c-xuan.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>Python连接数据库将查询结果转换为DataFrame(列名和表字段一致)</title>
    <link href="https://c-xuan.com/2019/01/15/20190115001_python_db_select_to_df/"/>
    <id>https://c-xuan.com/2019/01/15/20190115001_python_db_select_to_df/</id>
    <published>2019-01-15T11:47:39.000Z</published>
    <updated>2019-01-15T13:59:34.440Z</updated>
    
    <content type="html"><![CDATA[<p>很多时候，我们用Python处理数据，需要连接到Mysql、Postgresql等数据库，获取表数据，再构建pandas的DataFrame进行进一步处理。但是查询数据库结果集是没有表字段名称的，我们希望构建的DataFrame的列名和表字段一样。</p><span id="more"></span><h3 id="直接上代码"><a href="#直接上代码" class="headerlink" title="直接上代码"></a>直接上代码</h3><p>这里以Postgresql数据库为例，Mysql数据库差不多，其他的自行改造。</p><p>先封装一个查询类，查询返回的结果是一个字典，<code>head</code>是表列名,<code>data</code>是表数据，再用DataFrame构造数据结构。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> psycopg2</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">db_pg</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self, host, db, user, pwd, port</span>):</span></span><br><span class="line">        self.host = host</span><br><span class="line">        self.db = db</span><br><span class="line">        self.user = user</span><br><span class="line">        self.pwd = pwd</span><br><span class="line">        self.port = port</span><br><span class="line">        self._conn = self._connect()</span><br><span class="line">        self._cursor = self._conn.cursor()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">_connect</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="keyword">return</span> psycopg2.connect(</span><br><span class="line">            database=self.db,</span><br><span class="line">            user=self.user,</span><br><span class="line">            password=self.pwd,</span><br><span class="line">            host=self.host,</span><br><span class="line">            port=self.port)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">select</span>(<span class="params">self, sqlCode</span>):</span></span><br><span class="line">        self.common(sqlCode)</span><br><span class="line">        col_names = []</span><br><span class="line">        result = &#123;&#125;</span><br><span class="line">        column_count = <span class="built_in">len</span>(self._cursor.description)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(column_count):</span><br><span class="line">            desc = self._cursor.description[i]</span><br><span class="line">            col_names.append(desc[<span class="number">0</span>])</span><br><span class="line">        data = self._cursor.fetchall()</span><br><span class="line">        result[<span class="string">&#x27;head&#x27;</span>] = col_names</span><br><span class="line">        result[<span class="string">&#x27;data&#x27;</span>] = data</span><br><span class="line">        <span class="keyword">return</span> result</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">close</span>(<span class="params">self</span>):</span></span><br><span class="line">        self._cursor.close()</span><br><span class="line">        self._conn.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">common</span>(<span class="params">self, sqlCode</span>):</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            self._cursor.execute(sqlCode)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(e)</span><br><span class="line">            self._conn.rollback()</span><br><span class="line">            self._cursor.execute(sqlCode)</span><br><span class="line">        self._conn.commit()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__del__</span>(<span class="params">self</span>):</span></span><br><span class="line">        self.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">db_conn = &#123;</span><br><span class="line">        <span class="string">&#x27;host&#x27;</span>: <span class="string">&quot;******&quot;</span>,</span><br><span class="line">        <span class="string">&#x27;db&#x27;</span>  : <span class="string">&quot;******&quot;</span>,</span><br><span class="line">        <span class="string">&#x27;user&#x27;</span>: <span class="string">&quot;******&quot;</span>,</span><br><span class="line">        <span class="string">&#x27;pwd&#x27;</span> :<span class="string">&quot;******&quot;</span>,</span><br><span class="line">        <span class="string">&#x27;port&#x27;</span>: <span class="string">&quot;******&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">pg_conn = db_pg(host=db_conn[<span class="string">&#x27;host&#x27;</span>],db=db_conn[<span class="string">&#x27;db&#x27;</span>],user=db_conn[<span class="string">&#x27;user&#x27;</span>],pwd=db_conn[<span class="string">&#x27;pwd&#x27;</span>],port=db_conn[<span class="string">&#x27;port&#x27;</span>])</span><br><span class="line">rs            = pg_conn.select(<span class="string">&quot;select * from test&quot;</span>)</span><br><span class="line">rs_df       = pd.DataFrame(<span class="built_in">list</span>(rs.get(<span class="string">&#x27;data&#x27;</span>)),columns=rs.get(<span class="string">&#x27;head&#x27;</span>))</span><br></pre></td></tr></table></figure><p>运行示例</p><center><img src="/img/posts/20190115001-01.png" alt="运行结果"></img></center>]]></content>
    
    
    <summary type="html">&lt;p&gt;很多时候，我们用Python处理数据，需要连接到Mysql、Postgresql等数据库，获取表数据，再构建pandas的DataFrame进行进一步处理。但是查询数据库结果集是没有表字段名称的，我们希望构建的DataFrame的列名和表字段一样。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="数据库" scheme="https://c-xuan.com/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="Python" scheme="https://c-xuan.com/tags/Python/"/>
    
    <category term="PostgreSQL" scheme="https://c-xuan.com/tags/PostgreSQL/"/>
    
    <category term="Mysql" scheme="https://c-xuan.com/tags/Mysql/"/>
    
  </entry>
  
  <entry>
    <title>SQL如何实现查找节点依赖</title>
    <link href="https://c-xuan.com/2019/01/04/20190104001_graph_sql/"/>
    <id>https://c-xuan.com/2019/01/04/20190104001_graph_sql/</id>
    <published>2019-01-04T07:16:42.000Z</published>
    <updated>2019-03-20T15:51:45.798Z</updated>
    
    <content type="html"><![CDATA[<p>SQL如何运用递归查找有向无环图的节点依赖呢？</p><span id="more"></span><center><img src="/img/posts/20190104001-01.png" alt="有向无环图"></img></center><h3 id="问题是这样的"><a href="#问题是这样的" class="headerlink" title="问题是这样的"></a>问题是这样的</h3><p>例如我有以上的两个图，节点<code>b</code>的前置节点是<code>a</code>,节点<code>c</code>的前置节点是<code>b</code>和<code>d</code>，以此类推。给出一个节点，需要找出以此节点为前置节点的所有链条节点。比如给出<code>a</code>，那出来的结果就是<code>a,b,c,d,e</code>,给出<code>f</code>,那出来的结果就是<code>f,g,h,i,j,k</code>。</p><h3 id="数据准备"><a href="#数据准备" class="headerlink" title="数据准备"></a>数据准备</h3><p>创建表以及插入数据，多个前置节点用<code>,</code>隔开，注意，使用的是PostgreSQL数据库。</p><figure class="highlight sql"><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="comment">-- ----------------------------</span></span><br><span class="line"><span class="comment">-- Table structure for mytest</span></span><br><span class="line"><span class="comment">-- ----------------------------</span></span><br><span class="line"><span class="keyword">DROP</span> <span class="keyword">TABLE</span> IF <span class="keyword">EXISTS</span> &quot;public&quot;.&quot;mytest&quot;;</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> &quot;public&quot;.&quot;mytest&quot; (</span><br><span class="line">&quot;node&quot; <span class="type">varchar</span>(<span class="number">256</span>) <span class="keyword">COLLATE</span> &quot;default&quot;,</span><br><span class="line">&quot;pre_nodes&quot; <span class="type">varchar</span>(<span class="number">10240</span>) <span class="keyword">COLLATE</span> &quot;default&quot;</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- ----------------------------</span></span><br><span class="line"><span class="comment">-- Records of mytest</span></span><br><span class="line"><span class="comment">-- ----------------------------</span></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;a&#x27;</span>, <span class="keyword">null</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;a&#x27;</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;c&#x27;</span>, <span class="string">&#x27;b,d&#x27;</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;d&#x27;</span>, <span class="string">&#x27;b&#x27;</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;e&#x27;</span>, <span class="string">&#x27;c&#x27;</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;f&#x27;</span>, <span class="keyword">null</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;g&#x27;</span>, <span class="string">&#x27;f&#x27;</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;h&#x27;</span>, <span class="string">&#x27;g&#x27;</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;i&#x27;</span>, <span class="string">&#x27;g&#x27;</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;j&#x27;</span>, <span class="string">&#x27;g&#x27;</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> &quot;public&quot;.&quot;mytest&quot; <span class="keyword">VALUES</span> (<span class="string">&#x27;k&#x27;</span>, <span class="string">&#x27;h,i,j&#x27;</span>);</span><br></pre></td></tr></table></figure><center><img src="/img/posts/20190104001-02.png" alt="数据表"></img></center><h3 id="SQL创建"><a href="#SQL创建" class="headerlink" title="SQL创建"></a>SQL创建</h3><p>方法有多种，用函数或者存储过程也可以，这里使用<code>WITH</code>递归，相关信息可以百度:<code>postgresql 递归</code>。第一个<code>select</code>语句中要给出起始节点。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">WITH</span> <span class="keyword">RECURSIVE</span> graph_depds <span class="keyword">AS</span> (</span><br><span class="line">  <span class="keyword">SELECT</span> node,pre_nodes <span class="keyword">FROM</span> mytest a <span class="keyword">WHERE</span> node <span class="operator">=</span> <span class="string">&#x27;f&#x27;</span></span><br><span class="line">  <span class="keyword">UNION</span> <span class="keyword">ALL</span></span><br><span class="line">  <span class="keyword">SELECT</span> a.node,a.pre_nodes <span class="keyword">FROM</span> mytest a, graph_depds b <span class="keyword">WHERE</span> strpos(a.pre_nodes, b.node) <span class="operator">&gt;</span> <span class="number">0</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> node,pre_nodes <span class="keyword">FROM</span> graph_depds <span class="keyword">ORDER</span> <span class="keyword">BY</span> node;</span><br></pre></td></tr></table></figure><center><img src="/img/posts/20190104001-03.png" alt="查询结果"></img></center><h3 id="如果想向前查找呢"><a href="#如果想向前查找呢" class="headerlink" title="如果想向前查找呢"></a>如果想<code>向前</code>查找呢</h3><p>上面的查找相当于找出一个节点所有<code>影响</code>到的节点，其实就是向下递归，如果给出一个节点，想从这个节点往前追溯有关的节点呢？例如给出<code>c</code>节点，结果是<code>a,b,c,d</code>,其实就是向上递归，可以像下面这样写。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">WITH</span> <span class="keyword">RECURSIVE</span> graph_depds <span class="keyword">AS</span> (</span><br><span class="line">  <span class="keyword">SELECT</span> node,pre_nodes <span class="keyword">FROM</span> mytest a <span class="keyword">WHERE</span> node <span class="operator">=</span> <span class="string">&#x27;i&#x27;</span></span><br><span class="line">  <span class="keyword">UNION</span> <span class="keyword">ALL</span></span><br><span class="line">  <span class="keyword">SELECT</span> a.node,a.pre_nodes <span class="keyword">FROM</span> mytest a, graph_depds b <span class="keyword">WHERE</span> strpos(b.pre_nodes,a.node) <span class="operator">&gt;</span> <span class="number">0</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> node,pre_nodes <span class="keyword">FROM</span> graph_depds <span class="keyword">ORDER</span> <span class="keyword">BY</span> node;</span><br></pre></td></tr></table></figure><center><img src="/img/posts/20190104001-04.png" alt="查询结果"></img></center><h3 id="其他数据库"><a href="#其他数据库" class="headerlink" title="其他数据库"></a>其他数据库</h3><p>如果像<code>Sql Server</code>等支持<code>WITH</code>语法的数据，以上写法可以移植，稍作修改就好。但是<code>mysql</code>等数据库中的实现方式不一样，百度mysql 递归相关的内容都能找到方法。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;SQL如何运用递归查找有向无环图的节点依赖呢？&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="数据库" scheme="https://c-xuan.com/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="PostgreSQL" scheme="https://c-xuan.com/tags/PostgreSQL/"/>
    
  </entry>
  
  <entry>
    <title>Flask服务本机之外不能访问</title>
    <link href="https://c-xuan.com/2018/12/23/20181223001_flask_intranet_visit/"/>
    <id>https://c-xuan.com/2018/12/23/20181223001_flask_intranet_visit/</id>
    <published>2018-12-23T15:31:17.000Z</published>
    <updated>2018-12-23T15:42:01.470Z</updated>
    
    <content type="html"><![CDATA[<p>Flask 开启服务后，默认是本机访问的，使用<code>localhost:5000</code>可以访问Web服务，但是使用如<code>192.168.1.10</code>这类本机IP地址却访问不了。 </p><span id="more"></span><p>启动Falsk服务后信息如下，</p><figure class="highlight pgsql"><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">* Serving Flask app &quot;app&quot; (lazy loading)</span><br><span class="line">* Environment: production</span><br><span class="line">  <span class="built_in">WARNING</span>: <span class="keyword">Do</span> <span class="keyword">not</span> use the development <span class="keyword">server</span> <span class="keyword">in</span> a production environment.</span><br><span class="line">  Use a production WSGI <span class="keyword">server</span> <span class="keyword">instead</span>.</span><br><span class="line">* <span class="keyword">Debug</span> mode: <span class="keyword">on</span></span><br><span class="line">* Restarting <span class="keyword">with</span> stat</span><br><span class="line">* Debugger <span class="keyword">is</span> active!</span><br><span class="line">* Debugger PIN: <span class="number">228</span><span class="number">-080</span><span class="number">-042</span></span><br><span class="line">* Running <span class="keyword">on</span> http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">5000</span>/ (Press CTRL+C <span class="keyword">to</span> quit)</span><br></pre></td></tr></table></figure><p>除本机外是不能访问的，需要在<code>run</code>参数中设置,端口自定，主机为<code>0.0.0.0</code></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">app.run(host=<span class="string">&#x27;0.0.0.0&#x27;</span>, port=<span class="number">5000</span>)</span><br></pre></td></tr></table></figure><p>再次启动后就可以了。</p><figure class="highlight pgsql"><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">* Serving Flask app &quot;app&quot; (lazy loading)</span><br><span class="line">* Environment: production</span><br><span class="line">  <span class="built_in">WARNING</span>: <span class="keyword">Do</span> <span class="keyword">not</span> use the development <span class="keyword">server</span> <span class="keyword">in</span> a production environment.</span><br><span class="line">  Use a production WSGI <span class="keyword">server</span> <span class="keyword">instead</span>.</span><br><span class="line">* <span class="keyword">Debug</span> mode: <span class="keyword">on</span></span><br><span class="line">* Restarting <span class="keyword">with</span> stat</span><br><span class="line">* Debugger <span class="keyword">is</span> active!</span><br><span class="line">* Debugger PIN: <span class="number">228</span><span class="number">-080</span><span class="number">-042</span></span><br><span class="line">* Running <span class="keyword">on</span> http://<span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span>:<span class="number">5000</span>/ (Press CTRL+C <span class="keyword">to</span> quit)</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;Flask 开启服务后，默认是本机访问的，使用&lt;code&gt;localhost:5000&lt;/code&gt;可以访问Web服务，但是使用如&lt;code&gt;192.168.1.10&lt;/code&gt;这类本机IP地址却访问不了。 &lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="Flask" scheme="https://c-xuan.com/tags/Flask/"/>
    
  </entry>
  
  <entry>
    <title>Atom插件aligner冒号(:)对齐的问题</title>
    <link href="https://c-xuan.com/2018/12/21/20181221001_atom_aligner/"/>
    <id>https://c-xuan.com/2018/12/21/20181221001_atom_aligner/</id>
    <published>2018-12-21T15:31:17.000Z</published>
    <updated>2018-12-23T16:33:10.201Z</updated>
    
    <content type="html"><![CDATA[<p>最近在折腾Atom编辑器，写Python进行交互运行还是很方便的，代码提示什么的比Jupyter也好一些，还可以配置一堆插件，定制自己的开发环境。对于代码整齐性来说，<code>aligner</code>插件是不能错过的。</p><span id="more"></span><p><a href="https://github.com/adrianlee44/atom-aligner">atom-aligner</a>是干什么的呢，就是用来对齐的，比如我们写这样一段变量赋值的程序：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">var_a =<span class="number">1</span> <span class="comment">#我是变量1</span></span><br><span class="line">b = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]<span class="comment">#我是变量2</span></span><br><span class="line">cccc=(<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>)<span class="comment">#注释</span></span><br><span class="line">ddddddd=<span class="string">&#x27;rrrrrrrr&#x27;</span><span class="comment">#又一个注释</span></span><br></pre></td></tr></table></figure><p>虽然也没问题，但是如果能按<code>=</code>对齐就更强迫症一些。安装插件后，选中要对齐的行，按快捷键:<br>Mac: <code>ctrl-cmd-/</code> Linux/Windows: <code>ctrl-alt-/</code><br>就会变为这样</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">var_a   = <span class="number">1</span>         <span class="comment">#我是变量1</span></span><br><span class="line">b       = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>] <span class="comment">#我是变量2</span></span><br><span class="line">cccc    = (<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>)   <span class="comment">#注释</span></span><br><span class="line">ddddddd = <span class="string">&#x27;rrrrrrrr&#x27;</span><span class="comment">#又一个注释</span></span><br></pre></td></tr></table></figure><p>需要注意是，只安装一个<code>atom-aligner</code>插件是不够的，得配合不同语言的另一些插件，比如我写python代码，得另外装一个<code>aligner-python</code>插件才可以。</p><p>如果是JSON格式的对象，也是可以按冒号:对齐的</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">obj = &#123;<span class="string">&#x27;aaa&#x27;</span>: <span class="number">11</span>,</span><br><span class="line">    <span class="string">&#x27;bbb&#x27;</span>: <span class="string">&#x27;terdff&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;ccc&#x27;</span>: <span class="number">123111</span>,</span><br><span class="line">    <span class="string">&#x27;array&#x27;</span>: [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]&#125;</span><br></pre></td></tr></table></figure><p>要注意的是，如果连同<code>=</code>,<code>&#123;&#125;</code>一起选中，按快捷键对齐是不起作用的，得写成这样：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">obj = &#123;</span><br><span class="line">  <span class="string">&#x27;aaa&#x27;</span>: <span class="number">11</span>,</span><br><span class="line">    <span class="string">&#x27;bbb&#x27;</span>: <span class="string">&#x27;terdff&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;ccc&#x27;</span>: <span class="number">123111</span>,</span><br><span class="line">    <span class="string">&#x27;array&#x27;</span>: [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>对齐后是这样的</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">obj = &#123;</span><br><span class="line"> <span class="string">&#x27;aaa&#x27;</span>:      <span class="number">11</span>,</span><br><span class="line">    <span class="string">&#x27;bbb&#x27;</span>:   <span class="string">&#x27;terdff&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;ccc&#x27;</span>:     <span class="number">123111</span>,</span><br><span class="line">    <span class="string">&#x27;array&#x27;</span>: [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>所以<code>:</code>左边是不会对齐的，我们在编辑器写代码的时候一般都会左对齐了，像这样</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">obj = &#123;</span><br><span class="line">    <span class="string">&#x27;aaa&#x27;</span>:   <span class="number">11</span>,</span><br><span class="line">    <span class="string">&#x27;bbb&#x27;</span>:   <span class="string">&#x27;terdff&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;ccc&#x27;</span>:   <span class="number">123111</span>,</span><br><span class="line">    <span class="string">&#x27;array&#x27;</span>: [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>有个问题是，官方的说明里说是可以冒号对齐的，对齐成这样</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">obj = &#123;</span><br><span class="line">    <span class="string">&#x27;aaa&#x27;</span>  : <span class="number">11</span>,</span><br><span class="line">    <span class="string">&#x27;bbb&#x27;</span>  : <span class="string">&#x27;terdff&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;ccc&#x27;</span>  : <span class="number">123111</span>,</span><br><span class="line">    <span class="string">&#x27;array&#x27;</span>: [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>插件设置中没有找到相关设置，官方说明看了半天也没找到怎么设置，最后无奈改了插件的源码。</p><p>进入插件设置</p><center><img src="/img/posts/20181221001-01.gif" alt=""></img></center><p>找到插件包配置，修改默认为<code>left</code></p><center><img src="/img/posts/20181221001-02.gif" alt=""></img></center><p>重启编辑器就可以了。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近在折腾Atom编辑器，写Python进行交互运行还是很方便的，代码提示什么的比Jupyter也好一些，还可以配置一堆插件，定制自己的开发环境。对于代码整齐性来说，&lt;code&gt;aligner&lt;/code&gt;插件是不能错过的。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="Atom" scheme="https://c-xuan.com/tags/Atom/"/>
    
  </entry>
  
  <entry>
    <title>Html中使用CSS制作火焰燃烧动画</title>
    <link href="https://c-xuan.com/2018/11/24/20181124001_css_fire/"/>
    <id>https://c-xuan.com/2018/11/24/20181124001_css_fire/</id>
    <published>2018-11-24T11:16:42.000Z</published>
    <updated>2018-11-24T11:16:42.000Z</updated>
    
    <content type="html"><![CDATA[<p>　　</p><span id="more"></span><center><img src="/img/posts/20181124001-01.gif" alt="css fire"></img></center><ul><li>作者：Chalda Pnuzig</li><li>使用技术：HTML (Pug) / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/chalda/pen/wRJYmz">https://codepen.io/chalda/pen/wRJYmz</a></li></ul><center><img src="/img/posts/20181124001-02.gif" alt="css fire"></img></center><ul><li>作者：Jamie Coulter</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/jcoulterdesign/pen/yGgxOY">https://codepen.io/jcoulterdesign/pen/yGgxOY</a></li></ul><center><img src="/img/posts/20181124001-03.gif" alt="css fire"></img></center><ul><li>作者：Ivan Grozdic</li><li>使用技术：HTML / CSS / JavaScript</li><li>依赖库：bootstrap.css, jquery.js, popper.js, bootstrap.js</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/ig_design/pen/NeRxzj">https://codepen.io/ig_design/pen/NeRxzj</a></li></ul><center><img src="/img/posts/20181124001-04.gif" alt="css fire"></img></center><ul><li>作者：Jon Kantner</li><li>使用技术：HTML (Pug) / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/jkantner/pen/gKRKKb">https://codepen.io/jkantner/pen/gKRKKb</a></li></ul><center><img src="/img/posts/20181124001-05.gif" alt="css fire"></img></center><ul><li>作者：Yusuke Nakaya</li><li>使用技术：HTML (Pug) / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/YusukeNakaya/pen/vJKwZw">https://codepen.io/YusukeNakaya/pen/vJKwZw</a></li></ul><center><img src="/img/posts/20181124001-06.gif" alt="css fire"></img></center><ul><li>作者：Satrio Yamanda</li><li>使用技术：HTML / CSS</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/yamanda/pen/RpNMaY">https://codepen.io/yamanda/pen/RpNMaY</a></li></ul><center><img src="/img/posts/20181124001-07.gif" alt="css fire"></img></center><ul><li>作者：Tahina</li><li>使用技术：HTML / CSS</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/tahina/pen/WRXNwQ">https://codepen.io/tahina/pen/WRXNwQ</a></li></ul><center><img src="/img/posts/20181124001-08.gif" alt="css fire"></img></center><ul><li>作者：Zed Dash</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/z-/pen/JXVpgp">https://codepen.io/z-/pen/JXVpgp</a></li></ul><center><img src="/img/posts/20181124001-09.gif" alt="css fire"></img></center><ul><li>作者：Deepak K Vijayan</li><li>使用技术：HTML (Haml) / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/BrianBravo/pen/JaFfz">https://codepen.io/BrianBravo/pen/JaFfz</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;　　&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="前端" scheme="https://c-xuan.com/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="CSS" scheme="https://c-xuan.com/tags/CSS/"/>
    
    <category term="JavaScript" scheme="https://c-xuan.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>有趣的403页面设计</title>
    <link href="https://c-xuan.com/2018/11/18/20181118001_403_pages/"/>
    <id>https://c-xuan.com/2018/11/18/20181118001_403_pages/</id>
    <published>2018-11-18T11:16:42.000Z</published>
    <updated>2019-01-22T13:59:08.580Z</updated>
    
    <content type="html"><![CDATA[<p>在访问网站的时候，会时不时的出现403 Forbidden错误，浏览器会给出403 Forbidden错误提示，在打开Access Error中列出的URL之后, 出现以下错误：</p><blockquote><p>403 Forbidden<br> Access to this resource on the server is denied!<br> Powered By LiteSpeed Web Server<br> LiteSpeed Technologies is not responsible for administration and contents of this web site!</p></blockquote><span id="more"></span><h3 id="403状态码"><a href="#403状态码" class="headerlink" title="403状态码"></a>403状态码</h3><p>403错误是网站访问过程中，常见的错误提示。资源不可用，服务器理解客户的请求，但拒绝处理它。通常由于服务器上文件或目录的权限设置导致，比如IIS或者apache设置了访问权限不当。</p><p>下面看一些有意思的403页面设计，撇开实不实用，能看见几回等等等，，，专注于设计。</p><center><img src="/img/posts/20181118001-01.gif" alt="404page"></img></center><ul><li>作者：Mansoour</li><li>使用技术：HTML / CSS</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/Mansoour/pen/LgGGvm">https://codepen.io/Mansoour/pen/LgGGvm</a></li></ul><center><img src="/img/posts/20181118001-02.gif" alt="404page"></img></center><ul><li>作者：lsgrrd</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/lsgrrd/pen/BObbYY">https://codepen.io/lsgrrd/pen/BObbYY</a></li></ul><center><img src="/img/posts/20181118001-03.gif" alt="404page"></img></center><ul><li>作者：ycw</li><li>使用技术：HTML (Pug) / CSS (Less)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/ycw/pen/BObmJr">https://codepen.io/ycw/pen/BObmJr</a></li></ul><center><img src="/img/posts/20181118001-04.gif" alt="404page"></img></center><ul><li>作者：Aimie | Blissful Lemon</li><li>使用技术：HTML / CSS</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/ablissfullemon/pen/zJepap">https://codepen.io/ablissfullemon/pen/zJepap</a></li></ul><center><img src="/img/posts/20181118001-05.gif" alt="404page"></img></center><ul><li>作者：Sean B</li><li>使用技术：HTML / CSS (SCSS) / JavaScript</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/Chesswithsean/pen/ZMwagQ">https://codepen.io/Chesswithsean/pen/ZMwagQ</a></li></ul><center><img src="/img/posts/20181118001-06.png" alt="404page"></img></center><ul><li>作者：Blessing Oni</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/blecaf/pen/EervOE">https://codepen.io/blecaf/pen/EervOE</a></li></ul><center><img src="/img/posts/20181118001-07.gif" alt="404page"></img></center><ul><li>作者：Arturo Wibawa</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/artcoholic/pen/ZMVNMw">https://codepen.io/artcoholic/pen/ZMVNMw</a></li></ul><center><img src="/img/posts/20181118001-08.png" alt="404page"></img></center><ul><li>作者：Leena Lavanya</li><li>使用技术：HTML / CSS / JavaScript</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/leenalavanya/pen/RYqvgK">https://codepen.io/leenalavanya/pen/RYqvgK</a></li></ul><center><img src="/img/posts/20181118001-09.gif" alt="404page"></img></center><ul><li>作者：Cassidy Williams</li><li>使用技术：HTML (Haml) / CSS (Less)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/cassidoo/pen/rZQQrj">https://codepen.io/cassidoo/pen/rZQQrj</a></li></ul><center><img src="/img/posts/20181118001-10.gif" alt="404page"></img></center><ul><li>作者：creme</li><li>使用技术：HTML / CSS (SCSS) / JavaScript</li><li>依赖库：jquery.js, tweenmax.js</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/creme/pen/VGVpbJ">https://codepen.io/creme/pen/VGVpbJ</a></li></ul><center><img src="/img/posts/20181118001-11.gif" alt="404page"></img></center><ul><li>作者：Mariana</li><li>使用技术：HTML / CSS / JavaScript</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/marianab/pen/EedpEb">https://codepen.io/marianab/pen/EedpEb</a></li></ul><center><img src="/img/posts/20181118001-12.png" alt="404page"></img></center><ul><li>作者：A van Hagen</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/anjanas_dh/pen/ZMqKwb">https://codepen.io/anjanas_dh/pen/ZMqKwb</a></li></ul><center><img src="/img/posts/20181118001-13.gif" alt="404page"></img></center><ul><li>作者：Nuuou</li><li>使用技术：HTML / CSS (SCSS) / JavaScript (Babel)</li><li>依赖库：bootstrap-reboot.css, tweenmax.js</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/Nuuou/pen/GXYmJv">https://codepen.io/Nuuou/pen/GXYmJv</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;在访问网站的时候，会时不时的出现403 Forbidden错误，浏览器会给出403 Forbidden错误提示，在打开Access Error中列出的URL之后, 出现以下错误：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;403 Forbidden&lt;br&gt; Access to this resource on the server is denied!&lt;br&gt; Powered By LiteSpeed Web Server&lt;br&gt; LiteSpeed Technologies is not responsible for administration and contents of this web site!&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="前端" scheme="https://c-xuan.com/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="CSS" scheme="https://c-xuan.com/tags/CSS/"/>
    
    <category term="JavaScript" scheme="https://c-xuan.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>有趣的404页面设计</title>
    <link href="https://c-xuan.com/2018/11/14/20181114001_404_pages/"/>
    <id>https://c-xuan.com/2018/11/14/20181114001_404_pages/</id>
    <published>2018-11-14T11:16:42.000Z</published>
    <updated>2019-03-20T15:49:58.985Z</updated>
    
    <content type="html"><![CDATA[<p>　　</p><span id="more"></span><center><img src="/img/posts/20181114001-01.gif" alt="404page"></img></center><ul><li>作者：Andrew Hani</li><li>使用技术：HTML / CSS / JavaScript</li><li>依赖库：jquery.js</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/androhani/pen/deOpMZ">https://codepen.io/androhani/pen/deOpMZ</a></li></ul><center><img src="/img/posts/20181114001-02.gif" alt="404page"></img></center><ul><li>作者：Saleh Riaz Qureshi</li><li>使用技术：HTML / CSS / JavaScript</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/salehriaz/pen/erJrZM">https://codepen.io/salehriaz/pen/erJrZM</a></li></ul><center><img src="/img/posts/20181114001-03.gif" alt="404page"></img></center><ul><li>作者：Vincent Van Goggles</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/Gogh/pen/eeReMO">https://codepen.io/Gogh/pen/eeReMO</a></li></ul><center><img src="/img/posts/20181114001-04.gif" alt="404page"></img></center><ul><li>作者：Selcuk Cura</li><li>使用技术：HTML / CSS (SCSS) / JavaScript</li><li>依赖库：jquery.js, tweenmax.js, splittext.js</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/selcukcura/pen/XeQpEv">https://codepen.io/selcukcura/pen/XeQpEv</a></li></ul><center><img src="/img/posts/20181114001-05.gif" alt="404page"></img></center><ul><li>作者：Robin Selmer</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/robinselmer/pen/vJjbOZ">https://codepen.io/robinselmer/pen/vJjbOZ</a></li></ul><center><img src="/img/posts/20181114001-06.gif" alt="404page"></img></center><ul><li>作者：Clement Girault</li><li>使用技术：HTML / CSS / JavaScript</li><li>依赖库：jquery.js</li><li>浏览器兼容：Chrome, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/clementGir/pen/PqGyMq">https://codepen.io/clementGir/pen/PqGyMq</a></li></ul><center><img src="/img/posts/20181114001-07.gif" alt="404page"></img></center><ul><li>作者：john</li><li>使用技术：HTML / CSS (Less) / JavaScript</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/thejohnyagiz/pen/npDyq">https://codepen.io/thejohnyagiz/pen/npDyq</a></li></ul><center><img src="/img/posts/20181114001-08.gif" alt="404page"></img></center><ul><li>作者：gavra</li><li>使用技术：HTML / CSS / JavaScript</li><li>依赖库：jquery.js</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/gavra/pen/upHzg">https://codepen.io/gavra/pen/upHzg</a></li></ul><center><img src="/img/posts/20181114001-09.png" alt="404page"></img></center><ul><li>作者：Ian Gloude</li><li>使用技术：HTML / CSS (SCSS)</li><li>依赖库：-</li><li>浏览器兼容：Chrome, Edge, Firefox, Opera, Safari</li><li>源码链接：<a href="https://codepen.io/igloude/pen/qNNWKr">https://codepen.io/igloude/pen/qNNWKr</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;　　&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="前端" scheme="https://c-xuan.com/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="CSS" scheme="https://c-xuan.com/tags/CSS/"/>
    
    <category term="JavaScript" scheme="https://c-xuan.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>理解Python函数闭包</title>
    <link href="https://c-xuan.com/2018/08/13/20180813001_py_clousure/"/>
    <id>https://c-xuan.com/2018/08/13/20180813001_py_clousure/</id>
    <published>2018-08-13T15:36:28.000Z</published>
    <updated>2018-08-13T15:36:28.000Z</updated>
    
    <content type="html"><![CDATA[<p>本文主要介绍什么是闭包，Ptyhon中使用闭包时容易出现的变量问题。</p><span id="more"></span><h3 id="闭包"><a href="#闭包" class="headerlink" title="闭包"></a>闭包</h3><p>闭包指延伸了作用域的函数，其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。函数是不是匿名的没有关系，关键是它能访问定义体之外定义的非全局变量。</p><h3 id="举个栗子"><a href="#举个栗子" class="headerlink" title="举个栗子"></a>举个栗子</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">make_averager</span>():</span></span><br><span class="line">    series = []</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">averager</span>(<span class="params">new_value</span>):</span></span><br><span class="line">        series.append(new_value)</span><br><span class="line">        total = <span class="built_in">sum</span>(series)</span><br><span class="line">        <span class="keyword">return</span> total/<span class="built_in">len</span>(series)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> averager</span><br><span class="line"></span><br><span class="line">avg = make_averager()</span><br><span class="line">avg(<span class="number">10</span>) <span class="comment"># 10.0</span></span><br><span class="line">avg(<span class="number">13</span>) <span class="comment"># 11.5</span></span><br><span class="line">avg(<span class="number">19</span>) <span class="comment"># 14.0</span></span><br></pre></td></tr></table></figure><p>上面定义了一个嵌套函数，作用是计算移动平均值。<br>调用<code>make_averager</code>时，返回一个<code>averager</code>函数对象。每次调用<code>averager</code>时，会把一个新的参数值添加到列表中，然后计算列表的平均值。<code>series</code>是<code>make_averager</code>函数的局部变量，但是调用<code>avg(10)</code>时，<code>make_averager()</code>函数已经返回了，所以它的本地作用域也没有了。</p><p>在<code>averager()</code>函数中，<code>series</code>变成了自由变量，就是没在本地作用域中绑定的变量。</p><center><img src="/img/posts/20180813001-01.png" alt="clousure"></img></center><p>所以闭包是一种函数，它会保留定义函数时存在的自由变量的绑定，在调用函数时，虽然定义作用域不可用了但是还可以使用绑定的变量。注意，只有嵌套在其他函数中的函数才可能需要处理不在全局作用域中的外部变量</p><h3 id="栗子改进"><a href="#栗子改进" class="headerlink" title="栗子改进"></a>栗子改进</h3><p>虽然上面函数可以实现计算移动平均，但是效率不高，因为把所有历史数据都保留在列表中。如果只存储总和以及元素个数，再求平均值更好些。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">make_averager</span>():</span></span><br><span class="line">    count = <span class="number">0</span></span><br><span class="line">    total = <span class="number">0</span></span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">averager</span>(<span class="params">new_value</span>):</span></span><br><span class="line">        count += <span class="number">1</span></span><br><span class="line">        total += new_value</span><br><span class="line">        <span class="keyword">return</span> total / count</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> averager</span><br></pre></td></tr></table></figure><p>上述函数在调用<code>averager()</code>时是有问题的，原因是<code>count</code>初始定义是数字，是不可变类型。在执行<code>count = count + 1</code> 时，<code>count</code>变成了局部变量，不是自由变量，所以解析器认为<code>count</code>在<code>averager()</code>里没有定义。<code>total</code>变量也是这样的问题。</p><p>问题显然出现在变量是否是可变类型上，在用列表计算的时候，采用的<code>series</code>是可变的列表类型。但是对于数字、字符串、元祖等不可变类型，嵌套函数内只能读取，不能更新，如果尝试重新绑定，比如<code>count = count + 1</code>,就会隐式创建局部变量，不会成为自由变量保存在闭包里。</p><p>python3下解决方式是引入<code>nonlocal</code>声明。作用就是把变量标记为自由变量。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">make_averager</span>():</span></span><br><span class="line">    count = <span class="number">0</span></span><br><span class="line">    total = <span class="number">0</span></span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">averager</span>(<span class="params">new_value</span>):</span></span><br><span class="line">        <span class="keyword">nonlocal</span> count,total</span><br><span class="line">        count += <span class="number">1</span></span><br><span class="line">        total += new_value</span><br><span class="line">        <span class="keyword">return</span> total / count</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> averager</span><br></pre></td></tr></table></figure><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>在函数内嵌套的函数如果引用了外层函数定义的变量，外部调用嵌套的函数时，可以认为这时候函数变量的作用域延伸了，存在自由变量。主意自由变量如果是不可变类型，需要使用<code>nonlocal</code>声明。那么闭包有什么用呢？如果要了解Python装饰器，或许会有所帮助。</p><p>参考Luciano Ramalho-《Fluent Python》</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文主要介绍什么是闭包，Ptyhon中使用闭包时容易出现的变量问题。&lt;/p&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="Python" scheme="https://c-xuan.com/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>Aqua Data Studio 执行HiveSql的问题</title>
    <link href="https://c-xuan.com/2018/07/26/20180726001_aqua_hive_go/"/>
    <id>https://c-xuan.com/2018/07/26/20180726001_aqua_hive_go/</id>
    <published>2018-07-26T03:15:01.000Z</published>
    <updated>2018-07-26T03:15:01.000Z</updated>
    
    <content type="html"><![CDATA[<p>连接Hive的客户端有很多，<strong>Aqua Data Studio</strong>是不错的一个，之前用过DbVisualizer，多个Sql语句都是用<code>;</code>结束的，运行没问题，但是到了Aqua里就报错了：</p><figure class="highlight cmd"><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">&gt;[Error] Script lines: <span class="number">1</span>-<span class="number">1</span> --------------------------</span><br><span class="line"> Error while compiling statement: FAILED: ParseException line <span class="number">1</span>:<span class="number">19</span> </span><br><span class="line"> cannot recognize input near &#x27;agent&#x27; &#x27;;&#x27; &#x27;&lt;EOF&gt;&#x27; <span class="keyword">in</span> from source</span><br></pre></td></tr></table></figure><span id="more"></span><h3 id="Aqua-Data-Studio简介"><a href="#Aqua-Data-Studio简介" class="headerlink" title="Aqua Data Studio简介"></a>Aqua Data Studio简介</h3><blockquote><p>Aqua Data Studio是一套完整IDE的数据库开发工具，拥有数据库查询、管理、比对和源码控制等功能，可用于创建、编辑和执行SQL的管理工具脚本编写，以及浏览和修改数据库内容，支持大多数常见的数据库，如Oracle，MySQL，MSSQL，Vertica，Hadoop，Impala等，为所有数据库提供了一个统一界面的平台，让使用者或开发者在一个应用程序中能同时处理多个任务。</p></blockquote><h3 id="使用环境"><a href="#使用环境" class="headerlink" title="使用环境"></a>使用环境</h3><ul><li>Aqua Data Studio 18.0.18</li><li>JDK 1.8</li><li>Windows 7</li></ul><h3 id="解决"><a href="#解决" class="headerlink" title="解决"></a>解决</h3><p>问题解决比较简单，菜单<code>File-&gt;Options</code>,在弹出的设置窗口总的搜索里搜索<code>Hive</code>,结果中的<code>Scripts</code>下的<code>Apache Hive</code>里面，勾选<code>;Statement Separator</code>即可。</p><p><img src="/img/posts/20180726001-01.png" alt="20180726001-01"></p><p>其实如果不设置这个选项，默认情况下如何在查询窗口执行多条语句而不报错呢？每条语句用<code>GO</code>隔开就可以了，例如：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> tb1</span><br><span class="line">go</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> tb2</span><br></pre></td></tr></table></figure><p><strong>DbVisualizer</strong> 也是一个不错的工具，可以试用下。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;连接Hive的客户端有很多，&lt;strong&gt;Aqua Data Studio&lt;/strong&gt;是不错的一个，之前用过DbVisualizer，多个Sql语句都是用&lt;code&gt;;&lt;/code&gt;结束的，运行没问题，但是到了Aqua里就报错了：&lt;/p&gt;
&lt;figure class=&quot;highlight cmd&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;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&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;&amp;gt;[Error] Script lines: &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;-&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt; --------------------------&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt; Error while compiling statement: FAILED: ParseException line &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;:&lt;span class=&quot;number&quot;&gt;19&lt;/span&gt; &lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt; cannot recognize input near &amp;#x27;agent&amp;#x27; &amp;#x27;;&amp;#x27; &amp;#x27;&amp;lt;EOF&amp;gt;&amp;#x27; &lt;span class=&quot;keyword&quot;&gt;in&lt;/span&gt; from source&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="码路刺客" scheme="https://c-xuan.com/categories/%E7%A0%81%E8%B7%AF%E5%88%BA%E5%AE%A2/"/>
    
    
    <category term="数据库" scheme="https://c-xuan.com/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="原创" scheme="https://c-xuan.com/tags/%E5%8E%9F%E5%88%9B/"/>
    
    <category term="Hive" scheme="https://c-xuan.com/tags/Hive/"/>
    
    <category term="工具" scheme="https://c-xuan.com/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
</feed>
