<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>计算计算化学笔记Autolife&#39;s Blog</title>
  <icon>https://www.gravatar.com/avatar/23abff54ccaa172231469f20d94ef884</icon>
  <subtitle>跟对人，做对事</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://blog.chenzhaoqiang.com/"/>
  <updated>2021-03-14T11:38:43.845Z</updated>
  <id>http://blog.chenzhaoqiang.com/</id>
  
  <author>
    <name>AutoLife</name>
    <email>744891290@qq.com</email>
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>VNCServer[]教程</title>
    <link href="http://blog.chenzhaoqiang.com/2021/03/14/VNCServer-%E6%95%99%E7%A8%8B/"/>
    <id>http://blog.chenzhaoqiang.com/2021/03/14/VNCServer-教程/</id>
    <published>2021-03-14T11:38:28.000Z</published>
    <updated>2021-03-14T11:38:43.845Z</updated>
    
    <content type="html"><![CDATA[<h1 id="VNCServer-教程"><a href="#VNCServer-教程" class="headerlink" title="VNCServer[]教程"></a>VNCServer[]教程</h1><h2 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h2><p>VNC属于一种显示系统,也就是说他能将完整的窗口界面通过网络,传输到另一台计算机的屏幕上.<br>Windows服务器中包含的”Terminal Server”、Symantec公司开发的收费软件PCAnywhere、近期流行的Teamviewer、国内的协通XT800、快递通KDT都是属于这种原理的设计，同时这些软件又在VNC的原理基础上做了各自相应改进，提高了易用性、连通率和可穿透内网（Teamviewer、协通XT800、 KDT）.</p><p>同样可能远程连入UNIX、Linux进行图形化操作的还有流行的Xmanager，VNC与之相比——两者工作原理不一样。<br>VNC是远程连入操作系统，所有操作在UNIX、Linux主机服务端进行，即使操作过程中”本地电脑与操作主机网络断开”，也不影响操作的顺利进行；</p><p>Xmanager是通过端口将主机服务器的UI界面引导到本地电脑进行展现，如操作过程出现”本地电脑与操作主机网络断开”，操作将中断失败！如果操作都进行的工作任务非常重要，不能中断，如ORACLE RAC实施，结果是灾难性的！<br>更重要的是，VNC是免费的、开源的，Xmanager你一定是用的破解注册版的。</p><h2 id="VNC组成部分"><a href="#VNC组成部分" class="headerlink" title="VNC组成部分"></a>VNC组成部分</h2><p>VNC基本上是由两部分组成：一部分是客户端的应用程序(vncviewer)；另外一部分是服务器端的应用程序(vncserver)。<br>VNC的基本 运行原理和一些Windows下的远程控制软件很相象。VNC的服务器端应用程序在UNIX和Linux操作系统中适应性很强，图形用户界面十分友好。在任何安装了客户端的应用程序(vncviewer)的Linux平台的计算机都能十分方便的和安装了服务器 端的应用程序(vncserver)的计算机相互连接。另外，服务器端 (vncserver)还内建了Java Web接口，这样用户通过服务器端对其他计算机的操作就能通过Netscape显示出来了，这样的操作过程和显示方式比较直观方便。</p><h2 id="命令描述"><a href="#命令描述" class="headerlink" title="命令描述"></a>命令描述</h2><p>内置了 vncconfig     vncfinger.sh  vncpasswd     vncserver     vncviewer Xvnc这5个命令。<br>其中最常用的命令是 vncserver 。</p><ol><li>vncserver     此服务程序必须在主（或遥控）计算机上运行。你只能作为使用者使用此项服务。</li></ol><p>vncviewer     本地应用程序，用于远程接入运行vncserver的计算机并显示其环境。</p><p>你需要知道远程计算机的IP地址和vncserver设定的密码。</p><p>vncpasswd     vncserver的密码设置工具。vncserver服务程序没有设置密码将不能运行（好习惯）。如果你没有设置，运行vncserver时它会提示你输入一个密码。<br>vncconnect     告诉vncserver连接到远程一个运行vncviewer的计算机的IP和端口号。这样我就可以避免给其他人一个接入的密码。<br>Xvnc     一个vnc”主控”程序，一般来说不需要直接运行。（vncserver和vncviewer实际上是Xvnc的脚本）</p><p>查找所有可用的选项，运行：</p><p>Xvnc –help</p><p>出于安全的考虑，一般不建议直接以超级用户帐号运行vncserver程序。如果你需要超级用户的环境，请以一般用户登录后再使用su命令登录到超级用户帐号。 </p><h2 id="客服端推荐"><a href="#客服端推荐" class="headerlink" title="客服端推荐"></a>客服端推荐</h2><ol><li>MobaXterm (非常推荐)</li><li>tightVNC  (推荐)</li></ol><h2 id="开启VNCServer-服务"><a href="#开启VNCServer-服务" class="headerlink" title="开启VNCServer 服务"></a>开启VNCServer 服务</h2><p>vncserver -geometry 1920x1080 :65</p><p>需要输入用户名和密码 建议和linux服务电脑用户一样</p><p>然后在VNCVIEWER客服端上就可以登陆,凭借端口号和密码登录。</p><p>vncrun maestro </p><h2 id="进入全屏-【tight-VNC-VIEWER】"><a href="#进入全屏-【tight-VNC-VIEWER】" class="headerlink" title="进入全屏 【tight VNC VIEWER】"></a>进入全屏 【tight VNC VIEWER】</h2><p>ctrl+alt+shift+F </p><h2 id="退出全屏-【tight-VNC-VIEWER】"><a href="#退出全屏-【tight-VNC-VIEWER】" class="headerlink" title="退出全屏 【tight VNC VIEWER】"></a>退出全屏 【tight VNC VIEWER】</h2><p>ctrl+alt+shift+f</p><h2 id="VNC-配置文件"><a href="#VNC-配置文件" class="headerlink" title="VNC 配置文件"></a>VNC 配置文件</h2><p>cd ~/.vnc</p><h2 id="查看-开放的端口"><a href="#查看-开放的端口" class="headerlink" title="查看 开放的端口"></a>查看 开放的端口</h2><p>[XXX@hostname .vnc]$ vncserver -list</p><p>TigerVNC server sessions:<br>X DISPLAY #     PROCESS ID<br>:66             22712<br>:65             46755</p><h2 id="重启VNC服务"><a href="#重启VNC服务" class="headerlink" title="重启VNC服务"></a>重启VNC服务</h2><p>到putty 中 </p><p>vncserver -kill :65<br>vncserver -geometry 1920x1080 :65<br>vncserver -geometry 1920x1080 :16</p><p>一般来说出问题后，还原配置，清理临时文件，再重启服务器或重启vncserver服务即可解决</p><p>重启vncserver 就可以了，大约需要等待5到10分钟。</p><h2 id="在服务器的终端输入-vncconfig-就可以了。"><a href="#在服务器的终端输入-vncconfig-就可以了。" class="headerlink" title="在服务器的终端输入 vncconfig 就可以了。"></a>在服务器的终端输入 vncconfig 就可以了。</h2><p>tight vncviewer 连接服务器，然后再终端中输入vncconfig, 这样就可以和主机共享剪切板了。</p><p>vncconfig -nowin &amp;</p><p>我喜欢用打开一个终端，然后vncconfig保持窗口打开状态。</p><h2 id="黑屏解决办法"><a href="#黑屏解决办法" class="headerlink" title="黑屏解决办法"></a>黑屏解决办法</h2><p>首先要确保~/.vnc 目录下面会有pid 和log 文件，</p><p>如果没有这2个文件就删除/tmp下面相应的文件，</p><p>重新开启vncserver服务</p><p>排错的话，一定要注意<br>一定要注意查看log 文件，log 文件中会告诉你出现了什么问题。<br>如果没有告诉你问题，只需要等待就可以了。</p><p>Fri Feb 19 10:10:37 2021<br> VNCSConnST:  Server default pixel format depth 24 (32bpp) little-endian rgb888</p><p>黑屏原因之一<br>大概就是文件目录权限的问题，导致无法写入文件。<br>~/.config 文件夹<br>~/.cache 文件夹</p><p>ll .cache -d</p><p>[‎2019/‎10/‎9 9:38] Chen Zhaoqiang0101:<br>chown qiuli .config -R<br>chgrp qiuli .config -R<br>[‎2019/‎10/‎9 9:39] Chen Zhaoqiang0101:<br>chown qiuli:qiuli .config -R</p><h2 id="黑屏"><a href="#黑屏" class="headerlink" title="黑屏"></a>黑屏</h2><p>如果log文件没有报错信息，鼠标双击黑屏试试看</p><p>保持黑屏30分钟以上，然后双击黑屏，<br>如果还没有反应，先尝试重启 vncserver,<br><strong>如果还没有反应，则需要重启系统。</strong></p><p>service vncserver restart</p><p>sudo  /bin/systemctl restart  vncserver.service</p><p>vncserver -geometry 1920x1080 :65</p><p>[xxx@hostname .vnc]$ ps -aux |grep vnc|grep username</p><p>ps -aux |grep vnc|grep username<br>cd .vnc<br>rm * -fr</p><p>(imsettings-check:25069): GLib-GIO-CRITICAL **: g_dbus_proxy_call_sync_internal: assertion ‘G_IS_DBUS_PROXY (proxy)’ failed<br>gnome-session-is-accelerated: llvmpipe detected.</p><p>vncserver -geometry 1920x1080 :65<br>vncserver -kill :65<br>vncserver -geometry 1920x1080 :65</p><p>which python 必须是系统内置的python .</p><p>由于 连接方在一段时间后没有正确答复或连接的主机没有反应，连接尝试失败。</p><p>配置<br>/etc/sysconfig/vncservers</p><p>netstat -an |grep 5801</p><p>netstat -an |grep 5965</p><p>telnet 10.111.9.147  5965</p><p><strong>重启系统后，成功解决黑屏问题</strong></p><h2 id="黑屏万能方法总结"><a href="#黑屏万能方法总结" class="headerlink" title="黑屏万能方法总结"></a>黑屏万能方法总结</h2><ol><li>kill 所有的端口服务</li><li>删除 ./vnc 文件夹下面所有的文件</li><li>保证 python 为系统自带的python</li><li>启动端口服务</li><li>打开vnc客服端 进行连接</li><li>重启系统，重复上述步骤</li></ol><h2 id="CAN’T-FIND-FILE-PID-解决办法"><a href="#CAN’T-FIND-FILE-PID-解决办法" class="headerlink" title="CAN’T FIND FILE PID 解决办法"></a>CAN’T FIND FILE PID 解决办法</h2><p>###<br>在使用VNC之后想要关闭自己的VNC端口，结果遇到了如下图的问题：<br>这里写图片描述<br>解决办法：</p><ol><li>在终端上执行命令ps aux | grep xxx（xxx是你在服务器上的账户，本例中就是chenxiayu）</li><li>找到列出的所有进程中，一个叫Xvnc的进程，大概是这个样子的：<br>这里写图片描述</li><li>看它的进程号是多少，这里是28592</li><li>然后用 kill （进程号） 把进程杀掉即可。<br>注意，如果你找不到Xvnc这个进程，那应该是本来就不存在，不需要kill，应该可以直接重开vnc端口。</li></ol><p>补充：出现这个问题的原因可能是VNC的服务端崩溃，导致~/.vnc目录下的pid文件丢失，然而在/tmp目录下的Xlock文件依然存在，导致系统以为仍有一个vncserver在你的端口上运行。用以下命令可以看看/tmp目录下的相关临时文件。<br>这里写图片描述<br>因此另一个办法就是删除相应端口的临时文件（这里以端口21为例），然后就可以重开vnc端口了：</p><p>rm -rf /tmp/.X11-unix/X21</p><p>有时候只需要上面这句就搞定了（我应该没记错的），但是最近发现还需要再把.X21-lock文件删掉才行：</p><p>rm -rf /tmp/.X21-lock</p><p>cd ./vnc<br>把原来的配置文件都删除掉<br>然后开始链接 </p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://www.iteye.com/blog/cxh61207-1050210" target="_blank" rel="noopener">https://www.iteye.com/blog/cxh61207-1050210</a></li><li><a href="https://jingyan.baidu.com/article/86112f1396100227379787a3.html" target="_blank" rel="noopener">https://jingyan.baidu.com/article/86112f1396100227379787a3.html</a></li><li><a href="http://lazybios.com/2013/01/vnc-in-fedora-14/" target="_blank" rel="noopener">http://lazybios.com/2013/01/vnc-in-fedora-14/</a></li><li><a href="http://xstarcd.github.io/wiki/Linux/vnc-server.html" target="_blank" rel="noopener">http://xstarcd.github.io/wiki/Linux/vnc-server.html</a></li><li><a href="https://www.cnblogs.com/kevingrace/p/5821450.html" target="_blank" rel="noopener">https://www.cnblogs.com/kevingrace/p/5821450.html</a></li><li><a href="https://blog.csdn.net/lifuxin1125/article/details/7744027" target="_blank" rel="noopener">https://blog.csdn.net/lifuxin1125/article/details/7744027</a></li><li><a href="https://blog.csdn.net/sunshine_drizzle/article/details/50933748" target="_blank" rel="noopener">https://blog.csdn.net/sunshine_drizzle/article/details/50933748</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;VNCServer-教程&quot;&gt;&lt;a href=&quot;#VNCServer-教程&quot; class=&quot;headerlink&quot; title=&quot;VNCServer[]教程&quot;&gt;&lt;/a&gt;VNCServer[]教程&lt;/h1&gt;&lt;h2 id=&quot;摘要&quot;&gt;&lt;a href=&quot;#摘要&quot; class
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>how2django[]视图模板</title>
    <link href="http://blog.chenzhaoqiang.com/2021/01/09/how2django-%E8%A7%86%E5%9B%BE%E6%A8%A1%E6%9D%BF/"/>
    <id>http://blog.chenzhaoqiang.com/2021/01/09/how2django-视图模板/</id>
    <published>2021-01-09T05:09:00.000Z</published>
    <updated>2021-01-09T05:17:44.518Z</updated>
    
    <content type="html"><![CDATA[<h1 id="how2django-视图模板"><a href="#how2django-视图模板" class="headerlink" title="how2django[]视图模板"></a>how2django[]视图模板</h1><h2 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h2><p>web的运作方式：</p><ol><li>用户点击链接（<strong>路由</strong>），向后台发起请求（<strong>视图函数</strong>），</li><li>后台执行视图函数，返回<strong>视图</strong>。</li></ol><p>模板基于参数生成实际的视图。<br>模板好比是一个类，视图是实际的对象。</p><h2 id="模板的应用场景"><a href="#模板的应用场景" class="headerlink" title="模板的应用场景"></a>模板的应用场景</h2><p>模板继承的使用场景是，你写好了一个<strong>骨架</strong>模板后，<br>可以在子模板引用父模板，并替换或修改父模板的某些部分。</p><p>举个例子，我们定义一个显示图书信息的父模板，命名为 base.html：</p><p>另外可以先填充测试数据。</p><h2 id="模板引擎"><a href="#模板引擎" class="headerlink" title="模板引擎"></a>模板引擎</h2><p>在django中自带的是DTL( Django template language)模板引擎，和jinja2类似。<br>指定和切换模板引擎在settings.py中设置TEMPLATES中的 ‘BACKEND’。</p><p><strong>Django2 和 Django3 稍微有点不一样</strong></p><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">TEMPLATES = [</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line"></span><br><span class="line"><span class="string">'BACKEND'</span>: <span class="string">'django.template.backends.django.DjangoTemplates'</span>,</span><br><span class="line"></span><br><span class="line"><span class="string">'DIRS'</span>: [],</span><br><span class="line"></span><br><span class="line"><span class="string">'APP_DIRS'</span>: <span class="keyword">True</span>,</span><br><span class="line"></span><br><span class="line"><span class="string">'OPTIONS'</span>: &#123;</span><br><span class="line"></span><br><span class="line">&#125;,&#125;,]</span><br></pre></td></tr></table></figure><p>除了可以使用 django 自带的模板系统，还有jinja2系统。<br>Django是一个强大且全面的大型Web框架，我建议一切都使用django自带的系统，兼容性非常好。</p><h2 id="视图函数中的render函数传递一个字典给模板"><a href="#视图函数中的render函数传递一个字典给模板" class="headerlink" title="视图函数中的render函数传递一个字典给模板"></a>视图函数中的render函数传递一个字典给模板</h2><figure class="highlight py"><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">render(request, template_name, context=<span class="keyword">None</span>, content_type=<span class="keyword">None</span>, status=<span class="keyword">None</span>, using=<span class="keyword">None</span>)</span><br><span class="line">render(request, template_name, context=<span class="keyword">None</span>)</span><br></pre></td></tr></table></figure><p>context 字典中元素的键值 “hello” 对应了模板中的变量 ““。</p><p>request: 是一个固定参数</p><p>template_name: templates中定义的模板文件名，注意路径名。比如：”templates/polls/index.html”, 则参数这样写：”polls/index.html”</p><p>context: 要传入文件中用于渲染呈现的数据, 默认是字典格式</p><p>content_type: 生成的文档要使用的MIME 类型。默认为DEFAULT_CONTENT_TYPE 设置的值。</p><p>status: http的响应代码,默认是200.</p><p>using: 用于加载模板使用的模板引擎的名称。默认采用django内置的模板引擎。</p><p><strong>context 可以是实名字典也可以是匿名字典。</strong><br><strong>模板中的变量是字典的key</strong></p><p>视图中的字典 只能用点号访问key,不能用中括号访问</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">- &#123;&#123; a.k1  &#125;&#125;</span><br><span class="line">- &#123;&#123; a[&apos;k1&apos;]&#125;&#125;  这个就不对</span><br></pre></td></tr></table></figure><p>访问列表中的元素 也只能用点号</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">- &#123;&#123;a.0&#125;&#125;</span><br><span class="line">- &#123;&#123;a[0]&#125;&#125; 这个就不对</span><br></pre></td></tr></table></figure><p>上下文变量查找  仅仅支持点号查找</p><p>遍历 Django 模板中复杂数据结构的关键是点号（ . ）。点号可以访问字典的键、属性、方法或对象的索引。假如我们把一个 Python 字典传给模板。若想通过键访问那个字典中的值，要使用点号。</p><p>注意，方法调用中没有括号。此外，不能给方法传递变量（只能调用无需参数的方法）。不允许使用负数索引。</p><p><strong>模板系统遇到变量名中的点号时会按照下述顺序尝试查找：</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">字典查找（如 foo[&quot;bar&quot;] ）</span><br><span class="line"></span><br><span class="line">属性查找（如 foo.bar ）</span><br><span class="line"></span><br><span class="line">方法调用（如 foo.bar() ）</span><br><span class="line"></span><br><span class="line">列表索引查找（如 foo[2] ）</span><br></pre></td></tr></table></figure><p>模板系统将使用第一个可用的类型，这是一种短路逻辑。点号查找可以嵌套多层。</p><p>一般来说，如果变量不存在，模板系统在变量处插入引擎的 string_if_invalid 配置选项。这个选项的默认值为一个空字符串。</p><h2 id="模板中支持的过滤器函数"><a href="#模板中支持的过滤器函数" class="headerlink" title="模板中支持的过滤器函数"></a>模板中支持的过滤器函数</h2><p>django模板中默认已经支持了大量常用的函数，<br>另外也可以自定义拓展更多的函数，建议使用内置的函数，不要自行拓展。<br>或者使用第三方的模板函数库。自行拓展维护成本有点高，兼容性可能会差。<br>可以在视图函数中对数据进行清洗，避开在模板中使用复杂函数。</p><p>django[]模板过滤器函数汇总，通过过滤器的形式支持简单函数</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">- length 计算列表的元素的个数 &#123;&#123;arr|length&#125;&#125;</span><br><span class="line">- stringformat  控制浮点数位数 &#123;&#123; float_value|stringformat:&quot;.2f&quot; &#125;&#125;</span><br></pre></td></tr></table></figure><h2 id="load加载导入第三方模板标签或者过滤器"><a href="#load加载导入第三方模板标签或者过滤器" class="headerlink" title="load加载导入第三方模板标签或者过滤器"></a>load加载导入第三方模板标签或者过滤器</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tag %&#125;  使用% 里面的称为标签</span><br><span class="line">&#123;&#123; var|filter&#125;&#125;  管道后面的称为过滤器</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% load packagename %&#125;  加载自定义标签或者过滤器，第三方标签或者过滤器</span><br></pre></td></tr></table></figure><h2 id="自定义模板标签或者过滤器"><a href="#自定义模板标签或者过滤器" class="headerlink" title="自定义模板标签或者过滤器"></a>自定义模板标签或者过滤器</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">你能通过 Python 代码自定义 tags 和 filters 扩展集成模板引擎，通过 &#123;% load %&#125; 标签使其可用。</span><br></pre></td></tr></table></figure><p>示例：</p><h2 id="include-和-extends-的区别"><a href="#include-和-extends-的区别" class="headerlink" title="include 和 extends 的区别"></a>include 和 extends 的区别</h2><p>在正常的做网站时，我们都需要编写很多的html代码，但你会发现，你会重复很多代码，<br>而每次，这写代码基本上都是复制，然后粘贴，现在有两种解决方法：</p><p>1.使用include标记来引入重复的文件的部分  不变<br>2.使用Django中的模板的继承（extends）特性，可变（block块可以自定义）</p><p>extends 查找的位置</p><p>所以让我们使用 Django 的模板系统，只要创建一个视图，就可以将页面的设计从代码中分离出来。</p><p>情况1：通常写页面都有个模板用来框定头部LOGO页面，左侧导航菜单，只有右部的内容不同。如果不使用模板就大量重复工作。</p><p>特别如果头部或者左侧导航需要修改或者添加，所有页面都需要修改。django 通过模板继承解决。</p><p>情况2：一个页面如果内容特别多，不可能都一起写同一个页面。比如京东首页内容非常多。如何解决了？django通过include导入其他页面。</p><h2 id="extends-的顺序"><a href="#extends-的顺序" class="headerlink" title="extends 的顺序"></a>extends 的顺序</h2><p>继承模板和 载入模板的顺序 一致。</p><figure class="highlight py"><figcaption><span>settings.py</span></figcaption><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">TEMPLATE_LOADERS = [<span class="string">'django.template.loaders.filesystem.Loader'</span>,</span><br><span class="line"> <span class="string">'django.template.loaders.app_directories.Loader'</span>]</span><br></pre></td></tr></table></figure><ul><li>filesystem.loader 和 template_dir 配合使用</li></ul><p>‘django.template.loaders.filesystem.Loader’依赖于’DIRS’的设置，如果’DIRS’是一个空列表的话，他将找不到任何模板</p><p>‘django.template.loaders.app_directories.Loader’会自动去app下面的template目录下寻找模板，所以采用这种方法就无需给’DIRS’赋值</p><p>如果两个都开启的话<br>Django会先依据TEMPLATE_LOADERS中最先列出的模板载入方式来查找并载入模板，方式同上，若找不到模板文件则使用列出的第二种方式查找，依次类推，直至找到或找不到。这样的话，Django要么找不到模板，要么会载入最先找到的模板，若在多个不同路径下存在同名的模板文件，最终载入的模板与列出的载入方式的顺序和列出的包含模板的目录的顺序嘻嘻相关。这往往是不明确的，极易造成混淆。</p><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><p>%和中括号要紧密靠在一起</p><p>管道和前后两个变量也要紧密靠在一起</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;&#123;  var|filter &#125;&#125;</span><br></pre></td></tr></table></figure><h2 id="模板中的url-函数"><a href="#模板中的url-函数" class="headerlink" title="模板中的url 函数"></a>模板中的url 函数</h2><p>对于url在template中的映射</p><p>对于1中的例子用：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% url ’path.to.some_view’ v1 v2 %&#125;</span><br></pre></td></tr></table></figure><p>对于2 中的例子用：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% url ’path.to.some_view’ arg1=v1 arg2=v2 %&#125;</span><br></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% url 'retro_interactive_mcts' %&#125;</span><br></pre></td></tr></table></figure><p>url 第二个参数是 视图函数的同名字符串 需要加引号<br>除了会帮忙生成正确的url 以后 还会检查是否正确配置了该名字的视图路由 </p><p>路由url.py</p><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">url(<span class="string">r'^reactionDB/reaction/rxnid=(?P&lt;rxnid&gt;.+)$'</span>, views.reactionbyrxnid, name=<span class="string">'reaction_byrxnid'</span>),</span><br></pre></td></tr></table></figure><p>视图</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">"&#123;% url 'reaction_byrxnid' 1 %&#125;"</span> <span class="attr">class</span>=<span class="string">"btn btn-default"</span>&gt;</span>Browse<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://docs.djangoproject.com/zh-hans/3.0/topics/templates/" target="_blank" rel="noopener">https://docs.djangoproject.com/zh-hans/3.0/topics/templates/</a></li><li><a href="https://www.cnblogs.com/lixiang1013/p/7784523.html" target="_blank" rel="noopener">https://www.cnblogs.com/lixiang1013/p/7784523.html</a></li><li><a href="https://michaelyou.github.io/2015/04/15/django%E8%BD%BD%E5%85%A5%E6%A8%A1%E6%9D%BF%E7%9A%84%E9%A1%BA%E5%BA%8F/" target="_blank" rel="noopener">https://michaelyou.github.io/2015/04/15/django%E8%BD%BD%E5%85%A5%E6%A8%A1%E6%9D%BF%E7%9A%84%E9%A1%BA%E5%BA%8F/</a> good</li><li><a href="https://blog.csdn.net/zyz511919766/article/details/18355827" target="_blank" rel="noopener">https://blog.csdn.net/zyz511919766/article/details/18355827</a></li><li><a href="https://blog.csdn.net/wangeen/article/details/40828793" target="_blank" rel="noopener">https://blog.csdn.net/wangeen/article/details/40828793</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;how2django-视图模板&quot;&gt;&lt;a href=&quot;#how2django-视图模板&quot; class=&quot;headerlink&quot; title=&quot;how2django[]视图模板&quot;&gt;&lt;/a&gt;how2django[]视图模板&lt;/h1&gt;&lt;h2 id=&quot;摘要&quot;&gt;&lt;a href
      
    
    </summary>
    
      <category term="django" scheme="http://blog.chenzhaoqiang.com/categories/django/"/>
    
    
      <category term="django" scheme="http://blog.chenzhaoqiang.com/tags/django/"/>
    
  </entry>
  
  <entry>
    <title>python小技巧[] 禁用脚本中的print</title>
    <link href="http://blog.chenzhaoqiang.com/2020/12/26/python%E5%B0%8F%E6%8A%80%E5%B7%A7-%E7%A6%81%E7%94%A8%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84print/"/>
    <id>http://blog.chenzhaoqiang.com/2020/12/26/python小技巧-禁用脚本中的print/</id>
    <published>2020-12-26T12:07:02.000Z</published>
    <updated>2020-12-26T12:07:06.719Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python小技巧-禁用脚本中的print"><a href="#python小技巧-禁用脚本中的print" class="headerlink" title="python小技巧[] 禁用脚本中的print"></a>python小技巧[] 禁用脚本中的print</h1><h2 id="场景"><a href="#场景" class="headerlink" title="场景"></a>场景</h2><p>在调试的过程中在脚本中引入了过多的print,如何快速禁用print 函数。</p><h2 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h2><figure class="highlight py"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys, os</span><br><span class="line"></span><br><span class="line"><span class="comment"># Disable</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">blockPrint</span><span class="params">()</span>:</span></span><br><span class="line">    sys.stdout = open(os.devnull, <span class="string">'w'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Restore</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">enablePrint</span><span class="params">()</span>:</span></span><br><span class="line">    sys.stdout = sys.__stdout__</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> <span class="string">'This will print'</span></span><br><span class="line"></span><br><span class="line">blockPrint()</span><br><span class="line"><span class="keyword">print</span> <span class="string">"This won't"</span></span><br><span class="line"></span><br><span class="line">enablePrint()</span><br><span class="line"><span class="keyword">print</span> <span class="string">"This will too"</span></span><br></pre></td></tr></table></figure><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://stackoverflow.com/questions/8391411/suppress-calls-to-print-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/8391411/suppress-calls-to-print-python</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python小技巧-禁用脚本中的print&quot;&gt;&lt;a href=&quot;#python小技巧-禁用脚本中的print&quot; class=&quot;headerlink&quot; title=&quot;python小技巧[] 禁用脚本中的print&quot;&gt;&lt;/a&gt;python小技巧[] 禁用脚本中的pri
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>linux[]用户用户组文件文件夹权限汇总</title>
    <link href="http://blog.chenzhaoqiang.com/2020/12/26/linux-%E7%94%A8%E6%88%B7%E7%94%A8%E6%88%B7%E7%BB%84%E6%96%87%E4%BB%B6%E6%96%87%E4%BB%B6%E5%A4%B9%E6%9D%83%E9%99%90%E6%B1%87%E6%80%BB/"/>
    <id>http://blog.chenzhaoqiang.com/2020/12/26/linux-用户用户组文件文件夹权限汇总/</id>
    <published>2020-12-26T12:04:34.000Z</published>
    <updated>2021-02-21T11:19:45.804Z</updated>
    
    <content type="html"><![CDATA[<h1 id="linux-用户用户组文件文件夹权限汇总"><a href="#linux-用户用户组文件文件夹权限汇总" class="headerlink" title="linux[]用户用户组文件文件夹权限汇总"></a>linux[]用户用户组文件文件夹权限汇总</h1><h2 id="设置文件不可删除"><a href="#设置文件不可删除" class="headerlink" title="设置文件不可删除"></a>设置文件不可删除</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo chattr -V +a  ads.txt</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">“+文件属性” 就是添加该属性</span><br><span class="line"></span><br><span class="line">“-文件属性”去掉此属性</span><br><span class="line"></span><br><span class="line">“=文件属性” 此文件有且只有这属性</span><br><span class="line">2）文件属性</span><br><span class="line"></span><br><span class="line">a 文件是否只能添加，修改，而不能删除</span><br><span class="line"></span><br><span class="line">c 文件夹是否能添加压缩文件</span><br><span class="line"></span><br><span class="line">s 安全删除</span><br><span class="line"></span><br><span class="line">u 不可删除</span><br></pre></td></tr></table></figure><h2 id="查看用户的UID-GID信息"><a href="#查看用户的UID-GID信息" class="headerlink" title="查看用户的UID GID信息"></a>查看用户的UID GID信息</h2><p>id username</p><p>每一个用户只有唯一的uid,可以有多个gid,主gid是第一个，<br>副gid可以有很多。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uid=1052(zqchen) gid=1052(zqchen) groups=1052(zqchen),10(wheel),1011(vglusers),10002(SharedUsers)</span><br></pre></td></tr></table></figure><p>在 Linux 中，一个用户是可以属于多个组的，一个组也是可以包含多个用户的</p><h2 id="查看系统中有多少用户和用户组"><a href="#查看系统中有多少用户和用户组" class="headerlink" title="查看系统中有多少用户和用户组"></a>查看系统中有多少用户和用户组</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">compgen -u  查看用户信息</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">compgen -g   查看用户组信息</span><br></pre></td></tr></table></figure><h2 id="创建用户和同名用户组"><a href="#创建用户和同名用户组" class="headerlink" title="创建用户和同名用户组"></a>创建用户和同名用户组</h2><p>结果基本是类似的，因为每个用户在被创建的时候都会自动创建一个同名的组作为其默认的用户组。<br>adduser zqchen<br>useradd -g test phpq               //新建phpq用户，并设置用户主组的名字为test  不建议这么使用 </p><p>adduser phpq ## 新建用户,并设置用户组 phpq</p><h2 id="给已有用户加组"><a href="#给已有用户加组" class="headerlink" title="给已有用户加组"></a>给已有用户加组</h2><h3 id="修改非主group"><a href="#修改非主group" class="headerlink" title="修改非主group"></a>修改非主group</h3><p>usermod -G groupname username  修改非主group，剩下主group和新修改的group</p><h3 id="追加新的group"><a href="#追加新的group" class="headerlink" title="追加新的group"></a>追加新的group</h3><p>usermod -aG groupname username  为用户添加新的group </p><h2 id="删除用户"><a href="#删除用户" class="headerlink" title="删除用户"></a>删除用户</h2><p><strong>userdel –r 用户名</strong>     删除用户     -r 选项会自动删除用户家目录 推荐<br>userdel peter  删除用户</p><p>groupdel peter 删除用户的同名组别</p><p>usermod –G peter peter   （强制删除该用户的主目录和主目录下的所有文件和子目录）删除用户的目录 </p><h2 id="查看当前用户属于哪些组group"><a href="#查看当前用户属于哪些组group" class="headerlink" title="查看当前用户属于哪些组group"></a>查看当前用户属于哪些组group</h2><p>groups  zqchen<br>或者<br>id zqchen </p><h2 id="查看用户组下有多少个用户"><a href="#查看用户组下有多少个用户" class="headerlink" title="查看用户组下有多少个用户"></a>查看用户组下有多少个用户</h2><p>members SharedUsers  <strong>ubuntu中的命令</strong><br>getent group SharedUsers  <strong>centos中的命令</strong></p><h2 id="主工作组-普通工作组"><a href="#主工作组-普通工作组" class="headerlink" title="主工作组 普通工作组"></a>主工作组 普通工作组</h2><p>主工作组 有 gid 编号的主工作用</p><p>id username</p><h2 id="修改用户组的gid编号"><a href="#修改用户组的gid编号" class="headerlink" title="修改用户组的gid编号"></a>修改用户组的gid编号</h2><h3 id="在修改之前先查看有没有被使用"><a href="#在修改之前先查看有没有被使用" class="headerlink" title="在修改之前先查看有没有被使用"></a>在修改之前先查看有没有被使用</h3><p> cat /etc/passwd | grep 30003<br> usermod -u 3003 postgres</p><p>usermod: user   xxx   is currently used by process xxxx</p><p>彻底退出这个用户，用户直接进入root 或者从其他用户切换到root </p><p>groupmod -g 3003 postgres</p><h2 id="添加新的用户组"><a href="#添加新的用户组" class="headerlink" title="添加新的用户组"></a>添加新的用户组</h2><p>sudo groupadd docker</p><h2 id="设置用户密码为空，情况用户密码"><a href="#设置用户密码为空，情况用户密码" class="headerlink" title="设置用户密码为空，情况用户密码"></a>设置用户密码为空，情况用户密码</h2><p>passwd -d zqchen</p><h2 id="文件的类型"><a href="#文件的类型" class="headerlink" title="文件的类型"></a>文件的类型</h2><p>在linux中一切都是文件，文件夹也可以看成是文件。<br>ll  xxx<br>文件的权限一共占据10位。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[xxx@CADD4 ~]$ ll /etc -d</span><br><span class="line">drwxr-xr-x. 164 root root 12288 Dec 25 13:27 /etc</span><br></pre></td></tr></table></figure></p><p>第一位是文件的类型。然后依次文件的所有者权限，文件所在组的权限，其他用户的权限。<br>rwx 对于文件而言是可读可写可执行权限。<br>rxw 对于文件夹而言是可读可写可访问进入权限</p><h2 id="查看文件的权限"><a href="#查看文件的权限" class="headerlink" title="查看文件的权限"></a>查看文件的权限</h2><p>ll file</p><h2 id="查看文件夹的权限"><a href="#查看文件夹的权限" class="headerlink" title="查看文件夹的权限"></a>查看文件夹的权限</h2><p>ll dir -d</p><h2 id="给普通用户添加sudo-权限"><a href="#给普通用户添加sudo-权限" class="headerlink" title="给普通用户添加sudo 权限"></a>给普通用户添加sudo 权限</h2><p>方法一 修改sudoers 文件：<br>sudoers 文件属于root组的root用户，只有uers 和 group 只有可读的权限。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-r--r-----. 1 root root 4252 Sep  4 11:17 /etc/sudoers</span><br></pre></td></tr></table></figure><p>)切换到root用户，添加可写权限，编辑vim /etc/sudoers  添加以下内容：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">## Allow root to run any commands anywhere</span><br><span class="line">root    ALL=(ALL)       ALL</span><br><span class="line">username  ALL=(ALL)       ALL</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">cd /etc</span><br><span class="line">su  # 切换到 root账号</span><br><span class="line">chmod +w sudoers  ## 等价于 chmod u+w sudoers 给文件的用户添加可写权限</span><br><span class="line">vi sudoers  # 添加用户拥有 sudo 权限，然后保存</span><br><span class="line">chmod -w sudoers # 恢复文件的可读权限，**如果不恢复权限，可能会报错**</span><br><span class="line">exit # 退出sudo账号</span><br></pre></td></tr></table></figure><p><strong>如果不恢复权限，可能会报错</strong></p><p>方法二(推荐) 把用户添加到wheel(sudo)组：</p><p>sudoers 中定义了哪个组的用户有sudo 权限。在centos中是wheel组，而unbuntu 中是sudo组。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">## Allows people in group wheel to run all commands</span><br><span class="line">%wheel  ALL=(ALL)       ALL</span><br></pre></td></tr></table></figure></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">su</span><br><span class="line">usermod -aG wheel zqchen</span><br><span class="line">exit  </span><br><span class="line">exit #退出账号，重新连接才能生效。</span><br></pre></td></tr></table></figure><p><strong>第二种方法需要退出账号，重新连接才能生效。</strong></p><h2 id="实践-共享文件"><a href="#实践-共享文件" class="headerlink" title="实践 共享文件"></a>实践 共享文件</h2><h2 id="共享用户文件给其他用户"><a href="#共享用户文件给其他用户" class="headerlink" title="共享用户文件给其他用户"></a>共享用户文件给其他用户</h2><h2 id="为什么所有的用户都能看到-home-目录"><a href="#为什么所有的用户都能看到-home-目录" class="headerlink" title="为什么所有的用户都能看到 home 目录"></a>为什么所有的用户都能看到 home 目录</h2><p>给目录加x  就可以访问目录了<br>因为home目录具有o+x的权限</p><h2 id="在当前用户的-目录下新建一个文件夹"><a href="#在当前用户的-目录下新建一个文件夹" class="headerlink" title="在当前用户的 ~ 目录下新建一个文件夹"></a>在当前用户的 ~ 目录下新建一个文件夹</h2><p>该文件夹的权限是drwxrwxr-x 用户 group o 都可以看得到。</p><h2 id="自己的账号目录-默认是只有自己可以看到的"><a href="#自己的账号目录-默认是只有自己可以看到的" class="headerlink" title="自己的账号目录 默认是只有自己可以看到的"></a>自己的账号目录 默认是只有自己可以看到的</h2><p>ll /home/*/ -rtlhd<br>如果要想让其他人能访问你的文件，至少要让你的主目录（主文件夹）添加一个g+x权限或者o+x 权限</p><h2 id="用户组应用场景"><a href="#用户组应用场景" class="headerlink" title="用户组应用场景"></a>用户组应用场景</h2><p>上述信息可以清楚地看到，关于如何使用非root用户对docker进行管理，由于Docker的守护进程会绑定Unix Socket而不是使用TCP端口方式，而缺省情况下Unix socket为root用户所有，其他用户只能通过sudo来进行访问，所以Docker的守护进程只能以root用户进行启动。</p><p>如果不希望在docker命令前面添加sudo进行执行，这时可以创建一个名为docker的Unix Group并向这个Group中添加用户，当Docker守护进程启动的时候，守护进程会创建一个Unix Socket文件，而docker这个group的成员对于该文件具有访问权限。</p><h2 id="nfs部署的注意事项"><a href="#nfs部署的注意事项" class="headerlink" title="nfs部署的注意事项"></a>nfs部署的注意事项</h2><p>我在部署nfs的时候，共享了一个文件夹。为了让远程nfs客户端挂载这个文件夹的时候都有可读写权限，我需要把服务器上的用户uid、gid设置成nfs服务端文件夹一样的权限。不过因为之前新建的用户uid、gid都是系统自动生成的，几台服务器之前某个用户的uid、gid可能都不一样，所以现在需要把这个uid、gid都设置成统一某个值。</p><p>修改用户uid和组gid的命令分别是usermod和groupmod，思路很简单。先使用usermod修改用户的uid，然后使用groupmod修改组的gid，最后使用chown和chgrp命令修改原来用户文件和目录的属主属组。</p><p>例如测试用户foo和测试组foo。</p><p>把 CADD2 上的用户的UID 修改为 3003 和CADD0 一致</p><p>[root@L01CADD00 user]# id postgres<br>uid=3003(postgres) gid=3003(postgres) groups=3003(postgres)<br><strong>同一个用户和NFS 上的用户 同一个uid 和gid 就有相同的权限了</strong></p><h2 id="可执行文件"><a href="#可执行文件" class="headerlink" title="可执行文件"></a>可执行文件</h2><p><strong>普通用户 which 不能探测到sbin下面的可执行文件。</strong></p><p>在Linux中，绝大多数可执行文件都保存在/bin、/sbin、/usr/bin、/usr/sbin</p><p>/bin（binary）是二进制可执行目录，主要是具体应用</p><p>/sbin（system binary）是系统管理员专用的二进制代码存放目录，主要用于系统管理</p><p>/usr/bin（user command for application）后期安装的一些软件</p><p>/usr/sbin（superuser command for application）超级用户的一些管理程序</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://www.cnblogs.com/wyl9527/p/6495444.html" target="_blank" rel="noopener">https://www.cnblogs.com/wyl9527/p/6495444.html</a> </li><li><a href="https://www.jianshu.com/p/f6d9a27f5cfc" target="_blank" rel="noopener">https://www.jianshu.com/p/f6d9a27f5cfc</a></li><li><a href="https://blog.csdn.net/liumiaocn/article/details/88651955" target="_blank" rel="noopener">https://blog.csdn.net/liumiaocn/article/details/88651955</a></li><li><a href="https://askubuntu.com/questions/515103/how-can-i-display-all-users-and-groups-with-a-command" target="_blank" rel="noopener">https://askubuntu.com/questions/515103/how-can-i-display-all-users-and-groups-with-a-command</a></li><li><a href="https://askubuntu.com/questions/477551/how-can-i-use-docker-without-sudo" target="_blank" rel="noopener">https://askubuntu.com/questions/477551/how-can-i-use-docker-without-sudo</a></li><li><a href="https://blog.51cto.com/12127893/1861688" target="_blank" rel="noopener">https://blog.51cto.com/12127893/1861688</a></li><li><a href="https://blog.csdn.net/yzf0011/article/details/60474036" target="_blank" rel="noopener">https://blog.csdn.net/yzf0011/article/details/60474036</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;linux-用户用户组文件文件夹权限汇总&quot;&gt;&lt;a href=&quot;#linux-用户用户组文件文件夹权限汇总&quot; class=&quot;headerlink&quot; title=&quot;linux[]用户用户组文件文件夹权限汇总&quot;&gt;&lt;/a&gt;linux[]用户用户组文件文件夹权限汇总&lt;/h1
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>python模块推荐【】pypdf2自动添加水印</title>
    <link href="http://blog.chenzhaoqiang.com/2020/12/19/python%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%90%E3%80%90%E3%80%91pypdf2%E8%87%AA%E5%8A%A8%E6%B7%BB%E5%8A%A0%E6%B0%B4%E5%8D%B0/"/>
    <id>http://blog.chenzhaoqiang.com/2020/12/19/python模块推荐【】pypdf2自动添加水印/</id>
    <published>2020-12-19T07:28:26.000Z</published>
    <updated>2020-12-19T07:31:19.384Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python模块推荐【】pypdf2自动添加水印"><a href="#python模块推荐【】pypdf2自动添加水印" class="headerlink" title="python模块推荐【】pypdf2自动添加水印"></a>python模块推荐【】pypdf2自动添加水印</h1><h2 id="需求场景"><a href="#需求场景" class="headerlink" title="需求场景"></a>需求场景</h2><p>为多个pdf文件自动添加水印。</p><h2 id="实战代码"><a href="#实战代码" class="headerlink" title="实战代码"></a>实战代码</h2><p>准备文件，创建一页带有水印的pdf文件。</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># !/usr/bin/python</span></span><br><span class="line"><span class="comment"># Adding a watermark to a single-page PDF</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> PyPDF2</span><br><span class="line"><span class="keyword">from</span> glob <span class="keyword">import</span> glob </span><br><span class="line"></span><br><span class="line"></span><br><span class="line">input_file = <span class="string">"example.pdf"</span></span><br><span class="line">output_file = <span class="string">"example-drafted.pdf"</span></span><br><span class="line">watermark_file = <span class="string">"draft.pdf"</span></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">addwatermark</span><span class="params">(inputf,watermark,outf=<span class="string">""</span>)</span>:</span></span><br><span class="line">    <span class="string">'''</span></span><br><span class="line"><span class="string">    '''</span></span><br><span class="line">    print(<span class="string">"convert the file %s to watermaped file"</span>%inputf)</span><br><span class="line">    pdf_writer = PyPDF2.PdfFileWriter()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> outf:</span><br><span class="line">        outf=inputf.replace(<span class="string">".pdf"</span>,<span class="string">"_mark.pdf"</span>)</span><br><span class="line">    </span><br><span class="line">    fh_in = open(input_file, <span class="string">"rb"</span>) </span><br><span class="line">    pdf = PyPDF2.PdfFileReader(fh_in)</span><br><span class="line"></span><br><span class="line">    fh_wm = open(watermark_file, <span class="string">"rb"</span>) </span><br><span class="line">    watermark = PyPDF2.PdfFileReader(fh_wm)</span><br><span class="line">    first_page_watermark = watermark.getPage(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> range(pdf.getNumPages()):</span><br><span class="line">        page=pdf.getPage(i)</span><br><span class="line">        page.mergePage(first_page_watermark)</span><br><span class="line">        pdf_writer.addPage(page)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        </span><br><span class="line">    <span class="keyword">with</span> open(outf, <span class="string">"wb"</span>) <span class="keyword">as</span> filehandle_output:</span><br><span class="line">        <span class="comment"># write the watermarked file to the new file</span></span><br><span class="line">        pdf_writer.write(filehandle_output)</span><br><span class="line">    print(<span class="string">"finished"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line">    input_file = <span class="string">"example.pdf"</span></span><br><span class="line">    output_file = <span class="string">"example-drafted.pdf"</span></span><br><span class="line">    watermark_file = <span class="string">"draft.pdfi.watermap"</span></span><br><span class="line">    <span class="comment">#addwatermark(input_file ,watermark_file,output_file)</span></span><br><span class="line"></span><br><span class="line">    pdffiles = glob(<span class="string">"*.pdf"</span>)</span><br><span class="line">    watermark_file = <span class="string">"draft.pdf.watermap"</span></span><br><span class="line">    <span class="keyword">for</span> input_file <span class="keyword">in</span> pdffiles:</span><br><span class="line">        addwatermark(input_file ,watermark_file)</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python模块推荐【】pypdf2自动添加水印&quot;&gt;&lt;a href=&quot;#python模块推荐【】pypdf2自动添加水印&quot; class=&quot;headerlink&quot; title=&quot;python模块推荐【】pypdf2自动添加水印&quot;&gt;&lt;/a&gt;python模块推荐【】py
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>yum[]使用教程</title>
    <link href="http://blog.chenzhaoqiang.com/2020/12/17/yum-%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    <id>http://blog.chenzhaoqiang.com/2020/12/17/yum-使用教程/</id>
    <published>2020-12-17T12:46:43.000Z</published>
    <updated>2020-12-17T12:46:47.138Z</updated>
    
    <content type="html"><![CDATA[<h1 id="yum-使用总结"><a href="#yum-使用总结" class="headerlink" title="yum[]使用总结"></a>yum[]使用总结</h1><h2 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h2><p>yum 是centos中centos中最好用的包下载工具。</p><h2 id="yum的中国镜像"><a href="#yum的中国镜像" class="headerlink" title="yum的中国镜像"></a>yum的中国镜像</h2><ol><li><p>清华镜像: <a href="https://mirrors.tuna.tsinghua.edu.cn/help/centos/" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/help/centos/</a></p></li><li><p>网易镜像<br><a href="https://mirrors.163.com/.help/centos.html" target="_blank" rel="noopener">https://mirrors.163.com/.help/centos.html</a></p></li></ol><p>建议 网易 和 清华镜像交换使用， 有时候清华镜像抽风，有时网易镜像抽风。<br>使用方法也很简单，到官网下载相应的Centos-Base.repo文件。<br>然后替换系统中文件即可，/etc/yum.repos.d/<br>最后清楚系统中原来的缓存，并生成新的缓存。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum clean all</span><br><span class="line">yum makecache</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">替换前，建议备份该文件</span><br></pre></td></tr></table></figure><h2 id="CentOS7-Base-163-repo-文件"><a href="#CentOS7-Base-163-repo-文件" class="headerlink" title="CentOS7-Base-163.repo 文件"></a>CentOS7-Base-163.repo 文件</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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></pre></td><td class="code"><pre><span class="line"># CentOS-Base.repo</span><br><span class="line">#</span><br><span class="line"># The mirror system uses the connecting IP address of the client and the</span><br><span class="line"># update status of each mirror to pick mirrors that are updated to and</span><br><span class="line"># geographically close to the client.  You should use this for CentOS updates</span><br><span class="line"># unless you are manually picking other mirrors.</span><br><span class="line">#</span><br><span class="line"># If the mirrorlist= does not work for you, as a fall back you can try the </span><br><span class="line"># remarked out baseurl= line instead.</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">[base]</span><br><span class="line">name=CentOS-$releasever - Base - 163.com</span><br><span class="line">#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;arch=$basearch&amp;repo=os</span><br><span class="line">baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/</span><br><span class="line">gpgcheck=1</span><br><span class="line">gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7</span><br><span class="line"></span><br><span class="line">#released updates</span><br><span class="line">[updates]</span><br><span class="line">name=CentOS-$releasever - Updates - 163.com</span><br><span class="line">#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;arch=$basearch&amp;repo=updates</span><br><span class="line">baseurl=http://mirrors.163.com/centos/$releasever/updates/$basearch/</span><br><span class="line">gpgcheck=1</span><br><span class="line">gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7</span><br><span class="line"></span><br><span class="line">#additional packages that may be useful</span><br><span class="line">[extras]</span><br><span class="line">name=CentOS-$releasever - Extras - 163.com</span><br><span class="line">#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&amp;arch=$basearch&amp;repo=extras</span><br><span class="line">baseurl=http://mirrors.163.com/centos/$releasever/extras/$basearch/</span><br><span class="line">gpgcheck=1</span><br><span class="line">gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7</span><br><span class="line"></span><br><span class="line">#additional packages that extend functionality of existing packages</span><br><span class="line">[centosplus]</span><br><span class="line">name=CentOS-$releasever - Plus - 163.com</span><br><span class="line">baseurl=http://mirrors.163.com/centos/$releasever/centosplus/$basearch/</span><br><span class="line">gpgcheck=1</span><br><span class="line">enabled=0</span><br><span class="line">gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7</span><br></pre></td></tr></table></figure><h2 id="配置文件-baseurl-和-mirrorllist的区别"><a href="#配置文件-baseurl-和-mirrorllist的区别" class="headerlink" title="配置文件 baseurl 和 mirrorllist的区别"></a>配置文件 baseurl 和 mirrorllist的区别</h2><p>首先从beseurl中寻找相应的软件，找不到后再尝试从mirrorlist寻找资源。<br>在镜像文件中，通常会指定baseurl为镜像的url并注释掉mirrorlist，加快下载速度。<br>可根据自己的需要决定是否注释掉mirrorlist。</p><h2 id="问题汇总1"><a href="#问题汇总1" class="headerlink" title="问题汇总1"></a>问题汇总1</h2><h2 id="方法二"><a href="#方法二" class="headerlink" title="方法二"></a>方法二</h2><p>yum安装NodeJS在访问镜像列表时出现404，升级yum更新epel之后则出现这个错误： “Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again”</p><p>通过Google得知：原因</p><p>yum-epel升级到0.5.2版本，更换了https链接，所以原来的镜像列表就过时了，砸地。</p><p>解决方法是，运行：yum –disablerepo=epel -y update ca-certificates</p><p>记住一定要加上–disablerepo=epel，否则怎么都更新不了</p><h2 id="使用代理"><a href="#使用代理" class="headerlink" title="使用代理"></a>使用代理</h2><p>可以在/etc/yum.conf或者bashrc中配置代理，<br>yum.conf中的优先级更高，仅仅针对yum 命令有效<br>建议bashrc中添加代理，全局有效，方便管理。</p><h2 id="修复epel仓库"><a href="#修复epel仓库" class="headerlink" title="修复epel仓库"></a>修复epel仓库</h2><h3 id="删除epel"><a href="#删除epel" class="headerlink" title="删除epel"></a>删除epel</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum remove epel-release</span><br></pre></td></tr></table></figure><h3 id="安装epel"><a href="#安装epel" class="headerlink" title="安装epel"></a>安装epel</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install epel-release</span><br></pre></td></tr></table></figure><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ol><li><a href="http://www.devkang.com/yum-errno-12-timeout-on" target="_blank" rel="noopener">http://www.devkang.com/yum-errno-12-timeout-on</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;yum-使用总结&quot;&gt;&lt;a href=&quot;#yum-使用总结&quot; class=&quot;headerlink&quot; title=&quot;yum[]使用总结&quot;&gt;&lt;/a&gt;yum[]使用总结&lt;/h1&gt;&lt;h2 id=&quot;摘要&quot;&gt;&lt;a href=&quot;#摘要&quot; class=&quot;headerlink&quot; ti
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>python推荐[]超级工具anaconda</title>
    <link href="http://blog.chenzhaoqiang.com/2020/11/19/python%E6%8E%A8%E8%8D%90-%E8%B6%85%E7%BA%A7%E5%B7%A5%E5%85%B7anaconda/"/>
    <id>http://blog.chenzhaoqiang.com/2020/11/19/python推荐-超级工具anaconda/</id>
    <published>2020-11-19T14:49:33.000Z</published>
    <updated>2021-05-04T14:28:27.898Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python推荐-超级工具anaconda"><a href="#python推荐-超级工具anaconda" class="headerlink" title="python推荐[]超级工具anaconda"></a>python推荐[]超级工具anaconda</h1><h2 id="阅读对象"><a href="#阅读对象" class="headerlink" title="阅读对象"></a>阅读对象</h2><ol><li>没有使用过anaconda的读者</li><li>没有使用过anaconda创建项目环境的读者</li><li>没有使用过anaconda镜像的读者</li><li>对channel的配置不熟悉的读者</li></ol><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>anaconda是最好用python解释器，里面默认包含了大量的科学计算包，以及最厉害的包管理工具conda。<br>在我最喜欢的软件列表，希望通过本文安利更多的伙伴。</p><h2 id="anaconda-的安装"><a href="#anaconda-的安装" class="headerlink" title="anaconda 的安装"></a>anaconda 的安装</h2><p>直接到<a href="https://www.anaconda.com/" target="_blank" rel="noopener">官网</a>上根据自己的系统下载相应的<a href="https://www.anaconda.com/products/individual" target="_blank" rel="noopener">程序</a>就可以了。<br>推荐下载使用anaconda3，anconda3中内置的python3版本。<br>推荐使用python3,python3 比python2 更快，bug更少。</p><h2 id="默认base环境"><a href="#默认base环境" class="headerlink" title="默认base环境"></a>默认base环境</h2><p>看前面是否有base,如果没有通过下述命令激活base环境<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda init bash</span><br></pre></td></tr></table></figure></p><h2 id="anaconda创建项目环境"><a href="#anaconda创建项目环境" class="headerlink" title="anaconda创建项目环境"></a>anaconda创建项目环境</h2><p>不同的项目依赖同一个模块的不同版本，如果不对环境进行隔离，<br>开发过程中就发生模块冲突的问题。</p><p>开始一个新项目，第一步就是建立相应的项目环境，并根据需要安装相应的模块。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">conda create --name py37MolDocking python=3.7</span><br><span class="line">conda create --name py37deepchembook python=3.7 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main   速度飞快</span><br></pre></td></tr></table></figure><p>项目环境的名称是 py37MolDocking,里面的python 版本是 py37MolDocking<br>默认是安装3.7.x中的最新版本。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda create --name py37Fep python=3.5</span><br></pre></td></tr></table></figure><p>默认是安装3.5.x中的最新版本。</p><p>建议： 虚拟环境命名和创建原则，一个项目一个虚拟环境，以python版本号+项目进行命名，方便记忆。</p><h2 id="查看当前系统上所有的项目环境"><a href="#查看当前系统上所有的项目环境" class="headerlink" title="查看当前系统上所有的项目环境"></a>查看当前系统上所有的项目环境</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda info -e</span><br></pre></td></tr></table></figure><h2 id="激活项目环境"><a href="#激活项目环境" class="headerlink" title="激活项目环境"></a>激活项目环境</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda activate ProjectEnvName</span><br></pre></td></tr></table></figure><p>或者<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">source activate ProjectEnvName</span><br></pre></td></tr></table></figure></p><p>或者<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">activate  ProjectEnvName</span><br></pre></td></tr></table></figure></p><p>检查环境是否正常激活</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">which python</span><br></pre></td></tr></table></figure><h2 id="退出项目环境"><a href="#退出项目环境" class="headerlink" title="退出项目环境"></a>退出项目环境</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda deactivate</span><br></pre></td></tr></table></figure><h2 id="conda-安装模块"><a href="#conda-安装模块" class="headerlink" title="conda 安装模块"></a>conda 安装模块</h2><p>不同的模块可能在不同的channel中。<br>建议通过google 搜索 “conda 模块的名字” 查看相应的安装命令。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda install rdkit -c rdkit</span><br></pre></td></tr></table></figure><h2 id="卸载模块"><a href="#卸载模块" class="headerlink" title="卸载模块"></a>卸载模块</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda uninstall rdkit -c rdkit</span><br></pre></td></tr></table></figure><h2 id="使用国内的镜像安装"><a href="#使用国内的镜像安装" class="headerlink" title="使用国内的镜像安装"></a>使用国内的镜像安装</h2><h2 id="conda-修改项目环境的名字"><a href="#conda-修改项目环境的名字" class="headerlink" title="conda 修改项目环境的名字"></a>conda 修改项目环境的名字</h2><p>如果你觉得项目环境名字起得不是很好，想进行修改。<br>可通过下面的方法进行间接修改<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">conda create --name new_name --clone old_name</span><br><span class="line">conda remove --name old_name --all</span><br></pre></td></tr></table></figure></p><p>目前不支持直接修改项目环境的名字，只能先复制项目环境然后删除旧的环境。</p><h2 id="删除环境"><a href="#删除环境" class="headerlink" title="删除环境"></a>删除环境</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda remove --name py35customNM --all</span><br></pre></td></tr></table></figure><h2 id="查看某个指定项目环境下的安装包"><a href="#查看某个指定项目环境下的安装包" class="headerlink" title="查看某个指定项目环境下的安装包"></a>查看某个指定项目环境下的安装包</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda list -n py35project</span><br></pre></td></tr></table></figure><h2 id="安装模块到指定的项目环境中"><a href="#安装模块到指定的项目环境中" class="headerlink" title="安装模块到指定的项目环境中"></a>安装模块到指定的项目环境中</h2><p>方法一：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda install -n py35 numpy</span><br></pre></td></tr></table></figure></p><p>方法二： 激活相应的项目环境，然后安装需要的模块（推荐）<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">conda activate py35</span><br><span class="line">conda install xxx -c xxxchanel</span><br></pre></td></tr></table></figure></p><h2 id="使用国内镜像"><a href="#使用国内镜像" class="headerlink" title="使用国内镜像"></a>使用国内镜像</h2><p>推荐清华或者北师大镜像<br>建议使用的时候指定镜像，不建议直接配置。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">conda install rdkit -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/rdkit/</span><br><span class="line"></span><br><span class="line">conda install -c anaconda pymongo=3.7.2 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main</span><br><span class="line"></span><br><span class="line">conda install -c anaconda keras=2.2.4 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</span><br></pre></td></tr></table></figure><p>更多关于<a href="http://www.chenzhaoqiang.com/2020/03/16/%E4%B8%AD%E5%9B%BD%E9%95%9C%E5%83%8F/" target="_blank" rel="noopener">中国镜像的文章</a>，</p><h2 id="分享自己的项目环境"><a href="#分享自己的项目环境" class="headerlink" title="分享自己的项目环境"></a>分享自己的项目环境</h2><p>首先切换到base环境中，<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda-env export -n py27proj -f=py27proj.yml</span><br></pre></td></tr></table></figure></p><p>会产生项目的配置文件py27proj.yml,分享该文件给对方后。<br>对方通过该文件就可以建立和你相同的环境。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda-env create -n py27proj -f=py27proj.yml</span><br></pre></td></tr></table></figure><h2 id="查看conda的环境"><a href="#查看conda的环境" class="headerlink" title="查看conda的环境"></a>查看conda的环境</h2><p>conda config –show</p><h2 id="配置conda的代理网络"><a href="#配置conda的代理网络" class="headerlink" title="配置conda的代理网络"></a>配置conda的代理网络</h2><p>建议直接在bashrc中配置，condarc中的优先级高于bashrc的优先级。</p><p>在condarc 中添加正确的地址，注意没有https<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">channels:</span><br><span class="line">  - defaults</span><br><span class="line">show_channel_urls: true</span><br><span class="line"></span><br><span class="line">use_pip: true</span><br><span class="line">proxy_servers:</span><br><span class="line">  http:  http://1x.1x.1x.8x:nnn</span><br><span class="line">  https: http://1x.1x.1x.8x:nnnn</span><br></pre></td></tr></table></figure></p><h2 id="未完待续"><a href="#未完待续" class="headerlink" title="未完待续"></a>未完待续</h2><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://zhuanlan.zhihu.com/p/44398592" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/44398592</a></li><li><a href="https://stackoverflow.com/questions/45864595/how-to-transfer-anaconda-env-installed-on-one-machine-to-another-both-with-ubu" target="_blank" rel="noopener">https://stackoverflow.com/questions/45864595/how-to-transfer-anaconda-env-installed-on-one-machine-to-another-both-with-ubu</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python推荐-超级工具anaconda&quot;&gt;&lt;a href=&quot;#python推荐-超级工具anaconda&quot; class=&quot;headerlink&quot; title=&quot;python推荐[]超级工具anaconda&quot;&gt;&lt;/a&gt;python推荐[]超级工具anaconda
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>氨基酸残基信息汇总</title>
    <link href="http://blog.chenzhaoqiang.com/2020/06/17/%E6%B0%A8%E5%9F%BA%E9%85%B8%E6%AE%8B%E5%9F%BA%E4%BF%A1%E6%81%AF%E6%B1%87%E6%80%BB/"/>
    <id>http://blog.chenzhaoqiang.com/2020/06/17/氨基酸残基信息汇总/</id>
    <published>2020-06-17T13:36:32.000Z</published>
    <updated>2020-06-17T13:47:30.132Z</updated>
    
    <content type="html"><![CDATA[<h1 id="氨基酸残基信息汇总"><a href="#氨基酸残基信息汇总" class="headerlink" title="氨基酸残基信息汇总"></a>氨基酸残基信息汇总</h1><figure class="highlight py"><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">Residues = [<span class="string">"Ala"</span>,<span class="string">"Ile"</span>,<span class="string">"Leu"</span>,<span class="string">"Met"</span>,<span class="string">"Val"</span>,<span class="string">"Phe"</span>,<span class="string">"Trp"</span>,<span class="string">"Tyr"</span>,<span class="string">"Asn"</span>,<span class="string">"Cys"</span>,<span class="string">"Gln"</span>,<span class="string">"Ser"</span>,<span class="string">"Thr"</span>,<span class="string">"Asp"</span>,<span class="string">"Glu"</span>,<span class="string">"Arg"</span>,<span class="string">"His"</span>,<span class="string">"Lys"</span>,<span class="string">"Gly"</span>,<span class="string">"Pro"</span>]</span><br><span class="line"></span><br><span class="line">RESIDUES=[<span class="string">'ALA'</span>, <span class="string">'ILE'</span>, <span class="string">'LEU'</span>, <span class="string">'MET'</span>, <span class="string">'VAL'</span>, <span class="string">'PHE'</span>, <span class="string">'TRP'</span>, <span class="string">'TYR'</span>, <span class="string">'ASN'</span>, <span class="string">'CYS'</span>, <span class="string">'GLN'</span>, <span class="string">'SER'</span>, <span class="string">'THR'</span>, <span class="string">'ASP'</span>, <span class="string">'GLU'</span>, <span class="string">'ARG'</span>, <span class="string">'HIS'</span>, <span class="string">'LYS'</span>, <span class="string">'GLY'</span>, <span class="string">'PRO'</span>]</span><br><span class="line"></span><br><span class="line">Residues_ALL=[<span class="string">'ALA'</span>, <span class="string">'ILE'</span>, <span class="string">'LEU'</span>, <span class="string">'MET'</span>, <span class="string">'VAL'</span>, <span class="string">'PHE'</span>, <span class="string">'TRP'</span>, <span class="string">'TYR'</span>, <span class="string">'ASN'</span>, <span class="string">'CYS'</span>, <span class="string">'GLN'</span>, <span class="string">'SER'</span>, <span class="string">'THR'</span>, <span class="string">'ASP'</span>, <span class="string">'GLU'</span>, <span class="string">'ARG'</span>, <span class="string">'HIS'</span>, <span class="string">'LYS'</span>, <span class="string">'GLY'</span>, <span class="string">'PRO'</span>,<span class="string">"Ala"</span>,<span class="string">"Ile"</span>,<span class="string">"Leu"</span>,<span class="string">"Met"</span>,<span class="string">"Val"</span>,<span class="string">"Phe"</span>,<span class="string">"Trp"</span>,<span class="string">"Tyr"</span>,<span class="string">"Asn"</span>,<span class="string">"Cys"</span>,<span class="string">"Gln"</span>,<span class="string">"Ser"</span>,<span class="string">"Thr"</span>,<span class="string">"Asp"</span>,<span class="string">"Glu"</span>,<span class="string">"Arg"</span>,<span class="string">"His"</span>,<span class="string">"Lys"</span>,<span class="string">"Gly"</span>,<span class="string">"Pro"</span>]</span><br></pre></td></tr></table></figure><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://www.sigmaaldrich.com/china-mainland/life-science/metabolomics/learning-center/amino-acid-reference-chart.html" target="_blank" rel="noopener">https://www.sigmaaldrich.com/china-mainland/life-science/metabolomics/learning-center/amino-acid-reference-chart.html</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;氨基酸残基信息汇总&quot;&gt;&lt;a href=&quot;#氨基酸残基信息汇总&quot; class=&quot;headerlink&quot; title=&quot;氨基酸残基信息汇总&quot;&gt;&lt;/a&gt;氨基酸残基信息汇总&lt;/h1&gt;&lt;figure class=&quot;highlight py&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td c
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>python模块推荐[15]tempfile创建随机临时文件夹和随机文件</title>
    <link href="http://blog.chenzhaoqiang.com/2020/04/07/python%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%90-15-tempfile%E5%88%9B%E5%BB%BA%E9%9A%8F%E6%9C%BA%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6%E5%A4%B9%E5%92%8C%E9%9A%8F%E6%9C%BA%E6%96%87%E4%BB%B6/"/>
    <id>http://blog.chenzhaoqiang.com/2020/04/07/python模块推荐-15-tempfile创建随机临时文件夹和随机文件/</id>
    <published>2020-04-07T14:50:08.000Z</published>
    <updated>2020-04-07T14:50:14.428Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python模块推荐-15-tempfile创建随机临时文件夹和随机文件"><a href="#python模块推荐-15-tempfile创建随机临时文件夹和随机文件" class="headerlink" title="python模块推荐[15]tempfile创建随机临时文件夹和随机文件"></a>python模块推荐[15]tempfile创建随机临时文件夹和随机文件</h1><h2 id="场景"><a href="#场景" class="headerlink" title="场景"></a>场景</h2><p> tempfile模块是python的内置模块无需安装。可以帮你创建随机、不重名的文件和文件夹。</p><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ol><li>默认参数下，不要去找临时文件或临时文件夹，因为程序退出时该临时文件和临时文件夹都会被删除。<br>默认创建的文件和文件夹是看不到的，仅仅存在脚本运行期间，而且运行期间也是不可见得，因为他没有使用文件系统表。</li><li>如何你的应用程序需要一个临时文件来存储数据，但不需要同其他程序共享，那么用TemporaryFile函数创建临时文件是最好的选择。其他的应用程序是无法找到或打开这个文件的，因为它并没有引用文件系统表。用这个函数创建的临时文件，关闭后会自动删除。</li></ol><h2 id="创建自动删除的临时文件"><a href="#创建自动删除的临时文件" class="headerlink" title="创建自动删除的临时文件"></a>创建自动删除的临时文件</h2><figure class="highlight py"><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">import</span> tempfile</span><br><span class="line"></span><br><span class="line">f = tempfile.NamedTemporaryFile(mode=<span class="string">'w+b'</span>)</span><br><span class="line">f.write(<span class="string">"hello,world. weixin: pythonperl"</span>)</span><br><span class="line">print(f.name)</span><br><span class="line">f.close()</span><br></pre></td></tr></table></figure><p>你在/tmp目录是找不到该文件的。</p><h2 id="delete-False-创建不删除的临时文件，可以找到的临时文件"><a href="#delete-False-创建不删除的临时文件，可以找到的临时文件" class="headerlink" title="delete=False 创建不删除的临时文件，可以找到的临时文件"></a>delete=False 创建不删除的临时文件，可以找到的临时文件</h2><figure class="highlight py"><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">import</span> tempfile</span><br><span class="line"></span><br><span class="line">f = tempfile.NamedTemporaryFile(mode=<span class="string">'w+b'</span>, delete=<span class="keyword">False</span>)</span><br><span class="line">f.write(<span class="string">"hello,world. weixin: pythonperl"</span>)</span><br><span class="line"><span class="keyword">print</span> f.name</span><br><span class="line">f.close()</span><br></pre></td></tr></table></figure><p>你在/tmp目录下是可以找到该文件的</p><h2 id="创建不被删除的临时目录"><a href="#创建不被删除的临时目录" class="headerlink" title="创建不被删除的临时目录"></a>创建不被删除的临时目录</h2><figure class="highlight py"><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> tempfile</span><br><span class="line">dirname = tempfile.mkdtemp()</span><br><span class="line">print(dirname)</span><br></pre></td></tr></table></figure><h2 id="其他一些方法-‘gettempdir’-‘gettempprefix’-‘mkdtemp’-‘mkstemp’-‘mktemp’-‘tempdir’-‘template’"><a href="#其他一些方法-‘gettempdir’-‘gettempprefix’-‘mkdtemp’-‘mkstemp’-‘mktemp’-‘tempdir’-‘template’" class="headerlink" title="其他一些方法  ‘gettempdir’, ‘gettempprefix’, ‘mkdtemp’, ‘mkstemp’, ‘mktemp’, ‘tempdir’, ‘template’"></a>其他一些方法  ‘gettempdir’, ‘gettempprefix’, ‘mkdtemp’, ‘mkstemp’, ‘mktemp’, ‘tempdir’, ‘template’</h2><figure class="highlight py"><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> tempfile</span><br><span class="line">print(tempfile.__all__)</span><br></pre></td></tr></table></figure><p>输出：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[&apos;NamedTemporaryFile&apos;, &apos;TemporaryFile&apos;, &apos;SpooledTemporaryFile&apos;, &apos;mkstemp&apos;, &apos;mkdtemp&apos;, &apos;mktemp&apos;, &apos;TMP_MAX&apos;, &apos;gettempprefix&apos;, &apos;tempdir&apos;, &apos;gettempdir&apos;]</span><br></pre></td></tr></table></figure></p><h2 id="查看文件的默认位置，"><a href="#查看文件的默认位置，" class="headerlink" title="查看文件的默认位置，"></a>查看文件的默认位置，</h2><p>获取系统的临时目录的位置<br><figure class="highlight py"><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> tempfile</span><br><span class="line">dirname = tempfile.gettempdir()</span><br><span class="line">print(dirname)</span><br></pre></td></tr></table></figure></p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://docs.python.org/3/library/tempfile.html" target="_blank" rel="noopener">https://docs.python.org/3/library/tempfile.html</a></li><li><a href="https://python3-cookbook.readthedocs.io/zh_CN/latest/c05/p19_make_temporary_files_and_directories.html" target="_blank" rel="noopener">https://python3-cookbook.readthedocs.io/zh_CN/latest/c05/p19_make_temporary_files_and_directories.html</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python模块推荐-15-tempfile创建随机临时文件夹和随机文件&quot;&gt;&lt;a href=&quot;#python模块推荐-15-tempfile创建随机临时文件夹和随机文件&quot; class=&quot;headerlink&quot; title=&quot;python模块推荐[15]tempfi
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>pymol绘制三角形表面</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/18/pymol%E7%BB%98%E5%88%B6%E4%B8%89%E8%A7%92%E5%BD%A2%E8%A1%A8%E9%9D%A2/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/18/pymol绘制三角形表面/</id>
    <published>2020-03-18T14:03:20.000Z</published>
    <updated>2020-03-18T14:14:42.167Z</updated>
    
    <content type="html"><![CDATA[<p>Molecular Shape Comparison using Spherical Harmonics</p><p>有点像surface_type,2<br><a href="https://pymolwiki.org/index.php/File:Pocket.png" target="_blank" rel="noopener">https://pymolwiki.org/index.php/File:Pocket.png</a><br>可能需要做两张图 然后合在一起。<br><a href="http://hex.loria.fr/gallery/" target="_blank" rel="noopener">http://hex.loria.fr/gallery/</a><br><a href="https://pymol.org/dokuwiki/doku.php?id=setting:surface" target="_blank" rel="noopener">https://pymol.org/dokuwiki/doku.php?id=setting:surface</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Molecular Shape Comparison using Spherical Harmonics&lt;/p&gt;
&lt;p&gt;有点像surface_type,2&lt;br&gt;&lt;a href=&quot;https://pymolwiki.org/index.php/File:Pocket.png
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>vi常用操作集合</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/18/vi%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C%E9%9B%86%E5%90%88/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/18/vi常用操作集合/</id>
    <published>2020-03-18T13:03:44.000Z</published>
    <updated>2020-03-18T13:07:24.127Z</updated>
    
    <content type="html"><![CDATA[<h1 id="vi-常用操作集合"><a href="#vi-常用操作集合" class="headerlink" title="vi 常用操作集合"></a>vi 常用操作集合</h1><h2 id="撤销和恢复"><a href="#撤销和恢复" class="headerlink" title="撤销和恢复"></a>撤销和恢复</h2><ul><li><p>u是撤销你刚才做的动作</p></li><li><p>ctrl+r 是恢复你刚才撤销的动作、</p></li><li><p>dd 剪切本行</p></li><li><p>shift+d  或者d$ 删除光标到行末</p></li><li><p>x 删除光标所在字符</p></li><li><p>保存修改并且退出 vim：  “ZZ”或者”:wq”</p></li><li><p>按列选择并插入 </p></li></ul><ol><li>首先ctrl+v进入列选择-&gt;</li><li>按大写I进入插入模式-&gt;</li><li>输入要插入的字符-&gt;</li><li>按Esc键退出</li><li>刚刚选中的列前面都插入相同的字符</li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;vi-常用操作集合&quot;&gt;&lt;a href=&quot;#vi-常用操作集合&quot; class=&quot;headerlink&quot; title=&quot;vi 常用操作集合&quot;&gt;&lt;/a&gt;vi 常用操作集合&lt;/h1&gt;&lt;h2 id=&quot;撤销和恢复&quot;&gt;&lt;a href=&quot;#撤销和恢复&quot; class=&quot;header
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>sudo添加配置环境变量</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/16/sudo%E6%B7%BB%E5%8A%A0%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/16/sudo添加配置环境变量/</id>
    <published>2020-03-16T13:22:02.000Z</published>
    <updated>2020-03-16T13:24:30.380Z</updated>
    
    <content type="html"><![CDATA[<h1 id="sudo-添加配置环境变量"><a href="#sudo-添加配置环境变量" class="headerlink" title="sudo 添加配置环境变量"></a>sudo 添加配置环境变量</h1><p>sudo –preserve-env=HOME /usr/bin/env</p><p>Finally you can also set environment variables directly in the sudo command, like this:</p><p>sudo ZEBRA=true /usr/bin/env</p><p>sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c “import numpy”</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://www.petefreitag.com/item/877.cfm" target="_blank" rel="noopener">https://www.petefreitag.com/item/877.cfm</a></li><li><a href="https://askubuntu.com/questions/57915/environment-variables-when-run-with-sudo" target="_blank" rel="noopener">https://askubuntu.com/questions/57915/environment-variables-when-run-with-sudo</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;sudo-添加配置环境变量&quot;&gt;&lt;a href=&quot;#sudo-添加配置环境变量&quot; class=&quot;headerlink&quot; title=&quot;sudo 添加配置环境变量&quot;&gt;&lt;/a&gt;sudo 添加配置环境变量&lt;/h1&gt;&lt;p&gt;sudo –preserve-env=HOME /u
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>最喜欢的软件列表</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/16/%E6%9C%80%E5%96%9C%E6%AC%A2%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%88%97%E8%A1%A8/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/16/最喜欢的软件列表/</id>
    <published>2020-03-16T13:04:24.000Z</published>
    <updated>2020-12-23T23:38:11.927Z</updated>
    
    <content type="html"><![CDATA[<h1 id="最喜欢的软件列表（强烈推荐）"><a href="#最喜欢的软件列表（强烈推荐）" class="headerlink" title="最喜欢的软件列表（强烈推荐）"></a>最喜欢的软件列表（强烈推荐）</h1><ul><li><p>anconda</p></li><li><p>centos</p></li></ul><ul><li><p>jupyter</p></li><li><p>pymol</p></li><li>python</li><li><p>perl</p></li><li><p>rdkit</p></li><li><p>vscode</p></li><li><p>mobaxterm   替代商业版 xmanager</p></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;最喜欢的软件列表（强烈推荐）&quot;&gt;&lt;a href=&quot;#最喜欢的软件列表（强烈推荐）&quot; class=&quot;headerlink&quot; title=&quot;最喜欢的软件列表（强烈推荐）&quot;&gt;&lt;/a&gt;最喜欢的软件列表（强烈推荐）&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;anconda&lt;/p&gt;
&lt;
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>中国镜像</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/16/%E4%B8%AD%E5%9B%BD%E9%95%9C%E5%83%8F/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/16/中国镜像/</id>
    <published>2020-03-16T12:49:00.000Z</published>
    <updated>2020-12-17T12:13:43.724Z</updated>
    
    <content type="html"><![CDATA[<h1 id="中国镜像"><a href="#中国镜像" class="headerlink" title="中国镜像"></a>中国镜像</h1><h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>好过开源软件的仓库都在国外，直接从国外仓库下载速度比较慢，如果再有Q的存在，下载就是个灾难。</p><p>我个人喜欢临时启用国内镜像，不喜欢永久配置国内镜像。当官方仓库下载很慢的时候再主动启用镜像，一切尽在掌握之中。</p><h2 id="pypi"><a href="#pypi" class="headerlink" title="pypi"></a>pypi</h2><p>python -m pip install web.py -i <a href="http://pypi.douban.com/simple" target="_blank" rel="noopener">http://pypi.douban.com/simple</a> –trusted-host pypi.douban.com</p><p>python -m pip install web.py -i <a href="http://pypi.douban.com/simple" target="_blank" rel="noopener">http://pypi.douban.com/simple</a> –trusted-host pypi.douban.com</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python -m pip install tqdm  -i http://pypi.douban.com/simple --trusted-host pypi.douban.com</span><br></pre></td></tr></table></figure><h2 id="conda-镜像使用示例"><a href="#conda-镜像使用示例" class="headerlink" title="conda 镜像使用示例"></a>conda 镜像使用示例</h2><p>conda install rdkit -c  <a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/rdkit/" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/rdkit/</a></p><p>conda install -c anaconda pymongo=3.7.2 -c <a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main</a></p><p>conda install -c anaconda keras=2.2.4  -c <a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge</a></p><h2 id="conda-镜像列表"><a href="#conda-镜像列表" class="headerlink" title="conda 镜像列表"></a>conda 镜像列表</h2><ol><li><p>tuna: <a href="https://mirrors.tuna.tsinghua.edu.cn" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn</a></p></li><li><p>bfsu: <a href="https://mirrors.bfsu.edu.cn/" target="_blank" rel="noopener">https://mirrors.bfsu.edu.cn/</a> （推荐）</p></li></ol><p>建议尝试不同的镜像，有时候tuna速度更快，有时候bfsu速度更快。</p><h2 id="yum-镜像"><a href="#yum-镜像" class="headerlink" title="yum 镜像"></a>yum 镜像</h2><ol><li><p>清华镜像: <a href="https://mirrors.tuna.tsinghua.edu.cn/help/centos/" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/help/centos/</a></p></li><li><p>网易镜像<br><a href="https://mirrors.163.com/.help/centos.html" target="_blank" rel="noopener">https://mirrors.163.com/.help/centos.html</a></p></li></ol><p>建议 网易 和 清华镜像交换使用， 有时候清华镜像抽风，有时网易镜像抽风。<br>使用方法也很简单，到官网下载相应的Centos-Base.repo文件。<br>然后替换系统中文件即可，/etc/yum.repos.d/<br>最后清楚系统中原来的缓存，并生成新的缓存。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum clean all</span><br><span class="line">yum makecache</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">替换前，建议备份该文件</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;中国镜像&quot;&gt;&lt;a href=&quot;#中国镜像&quot; class=&quot;headerlink&quot; title=&quot;中国镜像&quot;&gt;&lt;/a&gt;中国镜像&lt;/h1&gt;&lt;h2 id=&quot;介绍&quot;&gt;&lt;a href=&quot;#介绍&quot; class=&quot;headerlink&quot; title=&quot;介绍&quot;&gt;&lt;/a&gt;介绍&lt;/h
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>关系数据库SQL</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/15/%E5%85%B3%E7%B3%BB%E6%95%B0%E6%8D%AE%E5%BA%93SQL/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/15/关系数据库SQL/</id>
    <published>2020-03-15T06:07:36.000Z</published>
    <updated>2021-01-09T03:24:37.337Z</updated>
    
    <content type="html"><![CDATA[<h1 id="关系数据库SQL"><a href="#关系数据库SQL" class="headerlink" title="关系数据库SQL"></a>关系数据库SQL</h1><h2 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h2><p>关系数据库的核心就是关系，表和表之间有关系。<br>如果只有一张表，那就不需要建立关系。</p><h2 id="一对多的关系"><a href="#一对多的关系" class="headerlink" title="一对多的关系"></a>一对多的关系</h2><p>首先分别建立这两张表，<br>然后建立这两张表的关系，</p><p>外键总是在多的一侧定义，方便节省空间。<br>ForeignKey</p><p>集合在一的一侧定义。<br>relationship</p><p>建立关系以后，就能从A表找B表的内容，也能从B表找到A表的内容。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;关系数据库SQL&quot;&gt;&lt;a href=&quot;#关系数据库SQL&quot; class=&quot;headerlink&quot; title=&quot;关系数据库SQL&quot;&gt;&lt;/a&gt;关系数据库SQL&lt;/h1&gt;&lt;h2 id=&quot;摘要&quot;&gt;&lt;a href=&quot;#摘要&quot; class=&quot;headerlink&quot; titl
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>python模块推荐[]定时任务plan</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/14/python%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%90-plan/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/14/python模块推荐-plan/</id>
    <published>2020-03-14T10:04:25.000Z</published>
    <updated>2020-03-14T12:39:49.333Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python模块推荐-14-定时任务plan"><a href="#python模块推荐-14-定时任务plan" class="headerlink" title="python模块推荐[14]定时任务plan"></a>python模块推荐[14]定时任务plan</h1><h2 id="Plan是什么"><a href="#Plan是什么" class="headerlink" title="Plan是什么"></a>Plan是什么</h2><p> Plan 是一个python 模块可以帮助我们写和部署cron 任务。借助于plan 可以把python代码转化成cron语法<br> 或者直接修改生成cronfile文件。</p><h2 id="plan的优点"><a href="#plan的优点" class="headerlink" title="plan的优点"></a>plan的优点</h2><ol><li>语法对人更加友好。</li></ol><h2 id="安装plan"><a href="#安装plan" class="headerlink" title="安装plan"></a>安装plan</h2><p>python -m pip install plan </p><h2 id="快速体验plan"><a href="#快速体验plan" class="headerlink" title="快速体验plan"></a>快速体验plan</h2><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> plan <span class="keyword">import</span> Plan</span><br><span class="line">cron = Plan()</span><br><span class="line">cron.command(<span class="string">'date'</span>, every=<span class="string">'weekend'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line">    cron.run()</span><br><span class="line">```           </span><br><span class="line">输出crotab的语法</span><br></pre></td></tr></table></figure><h1 id="Begin-Plan-generated-jobs-for-main"><a href="#Begin-Plan-generated-jobs-for-main" class="headerlink" title="Begin Plan generated jobs for: main"></a>Begin Plan generated jobs for: main</h1><p>0 0 <em> </em> 6,0 date</p><h1 id="End-Plan-generated-jobs-for-main"><a href="#End-Plan-generated-jobs-for-main" class="headerlink" title="End Plan generated jobs for: main"></a>End Plan generated jobs for: main</h1><p>[message] Your crontab file was not updated.<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">此时并没有更新crontab 文件，默认run执行的是check模式不会更新cronfile,只会输出crontab的语法。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">## 最佳实践</span><br><span class="line">$ mkdir planschedule</span><br><span class="line">$ cd planschedule</span><br><span class="line">$ plan-quickstart</span><br><span class="line">会生成一个命名为schdule.py的模板文件。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">## command</span><br><span class="line">```py</span><br><span class="line">cron.command(&apos;top&apos;, every=&apos;4.hour&apos;, output=</span><br><span class="line">             dict(stdout=&apos;/tmp/top_stdout.log&apos;,</span><br><span class="line">                  stderr=&apos;/tmp/top_stderr.log&apos;))</span><br></pre></td></tr></table></figure></p><h2 id="script"><a href="#script" class="headerlink" title="script"></a>script</h2><figure class="highlight py"><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">cron.script(<span class="string">'script.py'</span>, every=<span class="string">'1.day'</span>, path=<span class="string">'/web/yourproject/scripts'</span>,</span><br><span class="line">            environment=&#123;<span class="string">'YOURAPP_ENV'</span>: <span class="string">'production'</span>&#125;)</span><br></pre></td></tr></table></figure><h2 id="command-和script的区别"><a href="#command-和script的区别" class="headerlink" title="command 和script的区别"></a>command 和script的区别</h2><p>command 一般用于linux自带的命令，<br>而script 用于执行一些脚本，如python perl shell等脚本，会根据脚本文件的后缀名找到对应的解释器。<br>path 用于定义脚本所在的位置，environment 可以用于定义环境变量，比如指定python的虚拟环境等。</p><h2 id="拆分成不同类的任务进行命名"><a href="#拆分成不同类的任务进行命名" class="headerlink" title="拆分成不同类的任务进行命名"></a>拆分成不同类的任务进行命名</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ cp schedule.py schedule_commands.py</span><br><span class="line">$ cp schedule.py schedule_scripts.py</span><br></pre></td></tr></table></figure><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> plan <span class="keyword">import</span> Plan</span><br><span class="line"></span><br><span class="line">cron = Plan(<span class="string">"commands"</span>)</span><br><span class="line"></span><br><span class="line">cron.command(<span class="string">'top'</span>, every=<span class="string">'4.hour'</span>, output=</span><br><span class="line">             dict(stdout=<span class="string">'/tmp/top_stdout.log'</span>,</span><br><span class="line">                  stderr=<span class="string">'/tmp/top_stderr.log'</span>))</span><br><span class="line">cron.command(<span class="string">'yourcommand'</span>, every=<span class="string">'sunday'</span>, at=<span class="string">'hour.12 minute.0 minute.30'</span>)</span><br><span class="line"><span class="comment"># more commands here</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line">    cron.run()</span><br></pre></td></tr></table></figure><figure class="highlight py"><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="keyword">from</span> plan <span class="keyword">import</span> Plan</span><br><span class="line"></span><br><span class="line">cron = Plan(<span class="string">"scripts"</span>, path=<span class="string">'/web/yourproject/scripts'</span>,</span><br><span class="line">            environment=&#123;<span class="string">'YOURAPP_ENV'</span>: <span class="string">'production'</span>&#125;)</span><br><span class="line"></span><br><span class="line">cron.script(<span class="string">'script.py'</span>, every=<span class="string">'1.day'</span>)</span><br><span class="line">cron.script(<span class="string">'script_2.py'</span>, every=<span class="string">'1.month'</span>, at=<span class="string">'hour.12 minute.0'</span>)</span><br><span class="line"><span class="comment"># more scripts here</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line">    cron.run()</span><br></pre></td></tr></table></figure><p>Plan的第一个参数是类别的名字，方便进行控制，比如像删除每一个类别的任务。</p><h2 id="Job"><a href="#Job" class="headerlink" title="Job"></a>Job</h2><p>Job 中可以包含的参数有 ：</p><ol><li>task  需要执行的命令</li><li>every 执行命令的频率</li><li>at 具体时间</li><li>path 命令的工作路径</li><li>environment 工作环境</li><li>output 命令输出到哪里</li></ol><figure class="highlight py"><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="keyword">from</span> plan <span class="keyword">import</span> Job</span><br><span class="line"></span><br><span class="line">job = Job(<span class="string">'ruby script.rb'</span>, every=<span class="string">'1.month'</span>, at=<span class="string">'day.5'</span>,</span><br><span class="line">          path=<span class="string">'/web/scripts'</span>, output=<span class="string">'null'</span>,</span><br><span class="line">          environment=&#123;<span class="string">'RAILS_ENV'</span>: <span class="string">'production'</span>&#125;)</span><br></pre></td></tr></table></figure><h2 id="Every"><a href="#Every" class="headerlink" title="Every"></a>Every</h2><p>Every参数用于定义任务运行的频率:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">[1-60].minute</span><br><span class="line">[1-24].hour</span><br><span class="line">[1-31].day</span><br><span class="line">[1-12].month</span><br><span class="line">jan feb mar apr may jun jul aug sep oct nov dec</span><br><span class="line">and all of those full month names(case insensitive)</span><br><span class="line">sunday, monday, tuesday, wednesday, thursday, friday, saturday</span><br><span class="line">weekday, weekend (case insensitive)</span><br><span class="line">[1].year</span><br><span class="line"></span><br><span class="line">&quot;yearly&quot;    # Run once a year at midnight on the morning of January 1</span><br><span class="line">&quot;monthly&quot;   # Run once a month at midnight on the morning of the first day</span><br><span class="line">            # of the month</span><br><span class="line">&quot;weekly&quot;    # Run once a week at midnight on Sunday morning</span><br><span class="line">&quot;daily&quot;     # Run once a day at midnight</span><br><span class="line">&quot;hourly&quot;    # Run once an hour at the beginning of the hour</span><br><span class="line">&quot;reboot&quot;    # Run at startup</span><br></pre></td></tr></table></figure></p><p>以及支持原生的crontab语法<br><figure class="highlight py"><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">from</span> plan <span class="keyword">import</span> Job</span><br><span class="line">job = Job(<span class="string">'demo'</span>, every=<span class="string">'1,2 5,6 * * 3,4'</span>)</span><br></pre></td></tr></table></figure></p><h2 id="at-语法"><a href="#at-语法" class="headerlink" title="at 语法"></a>at 语法</h2><p>定义任务具体运行时间<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">minute.[0-59]</span><br><span class="line">hour.[0-23]</span><br><span class="line">hour:minute</span><br><span class="line">day.[1-31]</span><br><span class="line">sunday, monday, tuesday, wednesday, thursday, friday, saturday</span><br><span class="line">weekday, weekend (case insensitive)</span><br></pre></td></tr></table></figure></p><p>示例代码：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">job = Job(&apos;onejob&apos;, every=&apos;1.day&apos;, at=&apos;12:00&apos;)</span><br><span class="line">job = Job(&apos;onejob&apos;, every=&apos;1.day&apos;, at=&apos;hour.12 minute.15 minute.45&apos;)</span><br><span class="line"># or even better</span><br><span class="line">job = Job(&apos;onejob&apos;, every=&apos;1.day&apos;, at=&apos;12:15 12:45&apos;)</span><br></pre></td></tr></table></figure><h2 id="PATH"><a href="#PATH" class="headerlink" title="PATH"></a>PATH</h2><p>定义运行这个任务需要的工作路径。默认path 是当前脚本的路径。<br>对于command类型的job, 不依赖于PATH，因此即使定义path 也会被忽略。<br>For job types that do not need one path, this will be ignored, for example, CommandJob.</p><h2 id="output"><a href="#output" class="headerlink" title="output"></a>output</h2><p>对任务的输出进行指定位置。<br>示例代码：<br><figure class="highlight py"><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">job = Job(<span class="string">'job'</span>, every=<span class="string">'1.day'</span>, output=<span class="string">'null'</span>)</span><br><span class="line">job = Job(<span class="string">'job'</span>, every=<span class="string">'1.day'</span>, output=<span class="string">'&gt; /tmp/stdout.log 2&gt; /tmp/stderr.log'</span>)</span><br><span class="line">job = Job(<span class="string">'job'</span>, every=<span class="string">'1.day'</span>, output=</span><br><span class="line">          dict(stdout=<span class="string">'/tmp/stdout.log'</span>, stderr=<span class="string">'/tmp/stderr.log'</span>))</span><br></pre></td></tr></table></figure></p><h2 id="plan"><a href="#plan" class="headerlink" title="plan"></a>plan</h2><p>Plan 对象可以接受的参数有 name, path, environment, output and user。<br>其中Path, environment 和 output 和Job 中的参数是一样的。<br>只要在plan中设置了这些参数，在plan中的JOB会自动继承这些参数。</p><p>其中environment 可以通过上面dict的形式定义，也可以通过<strong>env</strong>函数进行定义。</p><figure class="highlight py"><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">cron = Plan()</span><br><span class="line">cron.env(<span class="string">'MAILTO'</span>, <span class="string">'user@example.com'</span>)</span><br><span class="line">cron.command(<span class="string">'command'</span>, every=<span class="string">'1.day'</span>)</span><br><span class="line">cron.run(<span class="string">'check'</span>)</span><br></pre></td></tr></table></figure><h2 id="bootstrap用法"><a href="#bootstrap用法" class="headerlink" title="bootstrap用法"></a>bootstrap用法</h2><figure class="highlight py"><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">from</span> plan <span class="keyword">import</span> Plan</span><br><span class="line">cron = Plan()</span><br><span class="line">cron.bootstrap(<span class="string">'pip install requests'</span>)</span><br><span class="line">cron.bootstrap([<span class="string">'pip install Sphinx'</span>, <span class="string">'sphinx-quickstart'</span>])</span><br><span class="line">cron.script(<span class="string">'crawl.py'</span>, every=<span class="string">'1.day'</span>, path=<span class="string">'/tmp'</span>)</span><br><span class="line">cron.run(<span class="string">'check'</span>)</span><br></pre></td></tr></table></figure><p>bootstrap接受一个命令或者命令列表，bootstrap 和script的区别是仅仅执行一次，不需要定义执行频率。</p><h2 id="类别"><a href="#类别" class="headerlink" title="类别"></a>类别</h2><p>一个Plan 对象管理一个类别的JOBS。不同的plan对象需要起不同的名字。 根据名字可以对同一类JOBS进行管理。<br>不同Plan可以方便控制。<br>在cronfile 中会根据Plan的名字创建相应的block。<br>示例代码</p><figure class="highlight py"><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="keyword">from</span> plan <span class="keyword">import</span> Plan</span><br><span class="line"></span><br><span class="line">cron1 = Plan( name=<span class="string">"shellscript"</span>)</span><br><span class="line">cron1.command(<span class="string">'pwd'</span>,every=<span class="string">'1.day'</span>)</span><br><span class="line">cron2 = Plan( name=<span class="string">"pythonscript"</span>)</span><br><span class="line">cron2.script(<span class="string">'1.py'</span>,every=<span class="string">'1.day'</span>)</span><br><span class="line"><span class="comment"># register one command, script or module</span></span><br><span class="line"><span class="comment"># cron.command('command', every='1.day')</span></span><br><span class="line"><span class="comment"># cron.script('script.py', path='/web/yourproject/scripts', every='1.month')</span></span><br><span class="line"><span class="comment"># cron.module('calendar', every='feburary', at='day.3')</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line">    cron1.run()</span><br><span class="line">    cron2.run()</span><br></pre></td></tr></table></figure><p>示例输出<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># Begin Plan generated jobs for: shellscript</span><br><span class="line">0 0 * * * pwd</span><br><span class="line"># End Plan generated jobs for: shellscript</span><br><span class="line"></span><br><span class="line">[message] Your crontab file was not updated.</span><br><span class="line"># Begin Plan generated jobs for: pythonscript</span><br><span class="line">0 0 * * * cd /home/czq/planschedule &amp;&amp; /home/czq/anaconda2/bin/python 1.py</span><br><span class="line"># End Plan generated jobs for: pythonscript</span><br><span class="line"></span><br><span class="line">[message] Your crontab file was not updated.</span><br></pre></td></tr></table></figure></p><h2 id="JOB的类型"><a href="#JOB的类型" class="headerlink" title="JOB的类型"></a>JOB的类型</h2><p>plan 内置了4中job的类型： 1. Command Job；2. Script Job; 3. Module Job; 4.Raw Job</p><p>raw job的示例代码</p><figure class="highlight py"><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">cron = Plan()</span><br><span class="line">cron.raw(<span class="string">'cd /tmp &amp;&amp; ruby script.rb &gt; /dev/null 2&gt;&amp;1'</span>, every=<span class="string">'1.day'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># In this particular case, you should try Job</span></span><br><span class="line">job = Job(<span class="string">'ruby script.rb'</span>, every=<span class="string">'1.day'</span>, path=<span class="string">'/tmp'</span>, output=<span class="string">'null'</span>)</span><br><span class="line">cron.job(job)</span><br></pre></td></tr></table></figure><h2 id="自定义JOB类型"><a href="#自定义JOB类型" class="headerlink" title="自定义JOB类型"></a>自定义JOB类型</h2><h2 id="plan-quickstart"><a href="#plan-quickstart" class="headerlink" title="plan-quickstart"></a>plan-quickstart</h2><p>脚手架工具,帮你产生脚本模板<br>plan-quickstart –path filepath<br>plan-quickstart –help</p><p><strong>所有的job至少接受两个参数，一个command,一个every</strong> </p><h2 id="run-types"><a href="#run-types" class="headerlink" title="run types"></a>run types</h2><figure class="highlight py"><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">cron = Plan()</span><br><span class="line">cron.run(<span class="string">'check'</span>) <span class="comment"># could be 'check', 'write', 'update', 'clear'</span></span><br></pre></td></tr></table></figure><p>支持4种不同的run类型，’check’, ‘write’, ‘update’, ‘clear’</p><ul><li>check  cron.run(‘check’) 比较安全，但是不会更新你的crontab文件，会把python code转化成cron语法，<br>然后你手动更新crontab文件，crontab -e  <strong>默认</strong></li><li>write 该模式会把<strong>你的crontab文件清空</strong>，然后写入新的crontab命令到cronfile中。</li><li>Update 该模式会在cronfile中根据plan对象中task进行更新或者追加新的任务 <strong>推荐</strong></li><li>Clear 该模式会找到plan对象中定义的task,并把它从cronfile文件中删除。</li></ul><h2 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h2><pre><code class="py"><span class="keyword">from</span> plan <span class="keyword">import</span> Plancron = Plan()cron.command(<span class="string">'sh /home/czq/pymolcn/sub_bd.sh'</span>, every=<span class="string">'1.day'</span>, at=<span class="string">'0:05'</span>)cron.command(<span class="string">'date'</span>, every=<span class="string">'weekend'</span>)<span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:    cron.run()</code></pre><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://plan.readthedocs.io/installation.html#installation" target="_blank" rel="noopener">https://plan.readthedocs.io/installation.html#installation</a></li><li><a href="https://github.com/fengsp/plan" target="_blank" rel="noopener">https://github.com/fengsp/plan</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python模块推荐-14-定时任务plan&quot;&gt;&lt;a href=&quot;#python模块推荐-14-定时任务plan&quot; class=&quot;headerlink&quot; title=&quot;python模块推荐[14]定时任务plan&quot;&gt;&lt;/a&gt;python模块推荐[14]定时任务pl
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>个人常用软件集合</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/14/%E4%B8%AA%E4%BA%BA%E5%B8%B8%E7%94%A8%E8%BD%AF%E4%BB%B6%E9%9B%86%E5%90%88/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/14/个人常用软件集合/</id>
    <published>2020-03-14T09:55:53.000Z</published>
    <updated>2020-03-14T10:02:53.570Z</updated>
    
    <content type="html"><![CDATA[<h1 id="个人常用软件集合"><a href="#个人常用软件集合" class="headerlink" title="个人常用软件集合"></a>个人常用软件集合</h1><p>个人试用过的软件，按字母顺序排序</p><ol><li><p>anaconda3  带python的工具  +++++</p></li><li><p>autodock   分子对接</p></li><li><p>autodockVINA           +++++</p></li><li><p>cmake3</p></li><li><p>gaussian </p></li><li><p>gcc 版本切换scl devtoolset</p></li><li><p>gromacs</p></li><li><p>openmpi</p></li><li><p>pdb2pqr</p></li><li><p>PyMOL</p></li><li><p>Rosettta</p></li><li><p>schrodinger</p></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;个人常用软件集合&quot;&gt;&lt;a href=&quot;#个人常用软件集合&quot; class=&quot;headerlink&quot; title=&quot;个人常用软件集合&quot;&gt;&lt;/a&gt;个人常用软件集合&lt;/h1&gt;&lt;p&gt;个人试用过的软件，按字母顺序排序&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;anaconda3  带p
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title># python模块推荐[]multiprocessing-Pool多核批处理</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/13/python%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%90-multiprocessing-Pool%E5%A4%9A%E6%A0%B8%E6%89%B9%E5%A4%84%E7%90%86/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/13/python模块推荐-multiprocessing-Pool多核批处理/</id>
    <published>2020-03-13T01:21:20.000Z</published>
    <updated>2020-03-13T02:41:16.225Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python模块推荐-multiprocessing-Pool多核批处理"><a href="#python模块推荐-multiprocessing-Pool多核批处理" class="headerlink" title="python模块推荐[]multiprocessing-Pool多核批处理"></a>python模块推荐[]multiprocessing-Pool多核批处理</h1><h2 id="场景"><a href="#场景" class="headerlink" title="场景"></a>场景</h2><p>作业是独立的，且每个作业都比较耗时，但是数量非常多。这时候使用多核进行计算作业能显著提高效率。<br>有点类似大家一起干。如果是普通的单核处理的话，就类似于 一人干活，其他人休息，当然慢。</p><h2 id="单核处理任务"><a href="#单核处理任务" class="headerlink" title="单核处理任务"></a>单核处理任务</h2><p>比如 60次特殊的加法，每个加法之前先休息1s,增加这个任务的时间，<br>你可以根据自己的需求定义任务函数。</p><figure class="highlight py"><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="keyword">from</span> random <span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">task</span><span class="params">()</span>:</span></span><br><span class="line">    time.sleep(<span class="number">1</span>)</span><br><span class="line">    a = random()</span><br><span class="line">    b = random()</span><br><span class="line">    <span class="keyword">return</span> a+b</span><br><span class="line">start = time.time()</span><br><span class="line"><span class="comment">#           range(100000000)</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">60</span>):</span><br><span class="line">    task()</span><br><span class="line">end = time.time()</span><br><span class="line">span= end-start</span><br><span class="line">print(<span class="string">"it take %s seconds"</span>%span)</span><br></pre></td></tr></table></figure><p>输出：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">it take 60.1150267124176 seconds</span><br></pre></td></tr></table></figure></p><h2 id="多核处理"><a href="#多核处理" class="headerlink" title="多核处理"></a>多核处理</h2><figure class="highlight py"><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="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br><span class="line"><span class="keyword">from</span> random <span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">task</span><span class="params">(x)</span>:</span></span><br><span class="line">    a = random()</span><br><span class="line">    b = random()</span><br><span class="line">    <span class="keyword">return</span> a+b</span><br><span class="line">start = time.time()</span><br><span class="line">pool = Pool()                         <span class="comment"># Create a multiprocessing Pool</span></span><br><span class="line">data_inputs = range(<span class="number">10</span>**<span class="number">9</span>)</span><br><span class="line">pool.map(task, data_inputs)  <span class="comment"># process data_inputs iterable with pool</span></span><br><span class="line">end = time.time()</span><br><span class="line">span= end-start</span><br><span class="line">print(<span class="string">"it take %s seconds"</span>%span)</span><br></pre></td></tr></table></figure><p>输出：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">it take 2.5520200729370117 seconds</span><br></pre></td></tr></table></figure></p><p>同样的任务，在48核电脑上只需要2.5秒就能完成。</p><p>我们可以看到使用多核处理能显著地加快耗时任务的快速完成。</p><h2 id="如果任务耗时很短，则使用多核效果不明显。"><a href="#如果任务耗时很短，则使用多核效果不明显。" class="headerlink" title="如果任务耗时很短，则使用多核效果不明显。"></a>如果任务耗时很短，则使用多核效果不明显。</h2><p>比例比如执行一次普通加法，大约耗时7us，时间非常快，而你分配给核的时间可能和任务的时间差不多，这时候采用多核效果就不好。</p><p>示例1： 单核普通加法<br><figure class="highlight py"><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="keyword">from</span> random <span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">task</span><span class="params">()</span>:</span></span><br><span class="line"><span class="comment">#     time.sleep(1)</span></span><br><span class="line">    a = random()</span><br><span class="line">    b = random()</span><br><span class="line">    <span class="keyword">return</span> a+b</span><br><span class="line">start = time.time()</span><br><span class="line"><span class="comment">#           range(100000000)</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">10</span>**<span class="number">7</span>):</span><br><span class="line">    task()</span><br><span class="line">end = time.time()</span><br><span class="line">span= end-start</span><br><span class="line">print(<span class="string">"it take %s seconds"</span>%span)</span><br></pre></td></tr></table></figure></p><p>输出：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">it take 2.497889518737793 seconds</span><br></pre></td></tr></table></figure><p>示例2： 多核普通加法</p><figure class="highlight py"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br><span class="line"><span class="keyword">from</span> random <span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">task</span><span class="params">(x)</span>:</span></span><br><span class="line"><span class="comment">#     time.sleep(1)</span></span><br><span class="line">    a = random()</span><br><span class="line">    b = random()</span><br><span class="line">    <span class="keyword">return</span> a+b</span><br><span class="line">start = time.time()</span><br><span class="line">pool = Pool()                         <span class="comment"># Create a multiprocessing Pool</span></span><br><span class="line">data_inputs = range(<span class="number">10</span>**<span class="number">7</span>)</span><br><span class="line">pool.map(task, data_inputs)  <span class="comment"># process data_inputs iterable with pool</span></span><br><span class="line">end = time.time()</span><br><span class="line">span= end-start</span><br><span class="line">print(<span class="string">"it take %s seconds"</span>%span)</span><br></pre></td></tr></table></figure><p>输出：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">it take 3.088542938232422 seconds</span><br></pre></td></tr></table></figure></p><p>我们可以看到同样的任务，多核的完成需要的时间反而比单核多。<br>对于时间非常短的任务，不适合多核做。</p><p>这和实现生活中的情形也比较相似，对于大的项目，领导统筹协调各方资源能够加快项目的完成。<br>对于小的项目，交给一个人负责就可以了。</p><h2 id="如果task-中需要接受多个参数可通过-数据结构进行封装示例"><a href="#如果task-中需要接受多个参数可通过-数据结构进行封装示例" class="headerlink" title="如果task 中需要接受多个参数可通过[[],[]]数据结构进行封装示例"></a>如果task 中需要接受多个参数可通过[[],[]]数据结构进行封装示例</h2><p>task(1,2)  task(1,3) task(2,10)等作业</p><p>示例代码：</p><figure class="highlight py"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br><span class="line"><span class="keyword">from</span> random <span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">task</span><span class="params">(x)</span>:</span></span><br><span class="line">    time.sleep(<span class="number">1</span>)</span><br><span class="line">    a = x[<span class="number">0</span>]</span><br><span class="line">    b = x[<span class="number">1</span>]</span><br><span class="line">    <span class="keyword">return</span> a+b</span><br><span class="line">start = time.time()</span><br><span class="line">pool = Pool()                         <span class="comment"># Create a multiprocessing Pool</span></span><br><span class="line">a = range(<span class="number">100</span>)</span><br><span class="line">b = range(<span class="number">100</span>)</span><br><span class="line"></span><br><span class="line">data_inputs =zip(a,b)</span><br><span class="line">pool.map(task, data_inputs)  <span class="comment"># process data_inputs iterable with pool</span></span><br><span class="line">end = time.time()</span><br><span class="line">span= end-start</span><br><span class="line">print(<span class="string">"it take %s seconds"</span>%span)</span><br></pre></td></tr></table></figure><p>输出：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">it take 3.7886974811553955 seconds</span><br></pre></td></tr></table></figure><h2 id="其他事项"><a href="#其他事项" class="headerlink" title="其他事项"></a>其他事项</h2><ul><li>process参数来指定使用的核的数目，默认是电脑最大核的数目，Pool(processes = 3)</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python模块推荐-multiprocessing-Pool多核批处理&quot;&gt;&lt;a href=&quot;#python模块推荐-multiprocessing-Pool多核批处理&quot; class=&quot;headerlink&quot; title=&quot;python模块推荐[]multipro
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>python 排列组合</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/07/python-%E6%8E%92%E5%88%97%E7%BB%84%E5%90%88/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/07/python-排列组合/</id>
    <published>2020-03-07T07:35:04.000Z</published>
    <updated>2020-03-09T02:22:49.203Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python-排列组合-itertools"><a href="#python-排列组合-itertools" class="headerlink" title="python 排列组合 itertools"></a>python 排列组合 itertools</h1><h2 id="考虑顺序排列组合permutations"><a href="#考虑顺序排列组合permutations" class="headerlink" title="考虑顺序排列组合permutations"></a>考虑顺序排列组合permutations</h2><figure class="highlight py"><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">high_imps_list_all = [[<span class="string">'3157'</span>,</span><br><span class="line">  <span class="string">'3175'</span>,</span><br><span class="line">  <span class="string">'16'</span>,</span><br><span class="line">  <span class="string">'34'</span>,</span><br><span class="line">  <span class="string">'3159'</span>]]</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line">list(itertools.permutations(high_imps_list_all[<span class="number">0</span>],<span class="number">5</span>))</span><br></pre></td></tr></table></figure><h2 id="不考虑顺序-combinations"><a href="#不考虑顺序-combinations" class="headerlink" title="不考虑顺序 combinations"></a>不考虑顺序 combinations</h2><figure class="highlight py"><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">high_imps_list_all = [[<span class="string">'3157'</span>,</span><br><span class="line">  <span class="string">'3175'</span>,</span><br><span class="line">  <span class="string">'16'</span>,</span><br><span class="line">  <span class="string">'34'</span>,</span><br><span class="line">  <span class="string">'3159'</span>]]</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line">list(itertools.combinations(high_imps_list_all[<span class="number">0</span>],<span class="number">5</span>))</span><br></pre></td></tr></table></figure><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><p>返回的是元组的列表</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python-排列组合-itertools&quot;&gt;&lt;a href=&quot;#python-排列组合-itertools&quot; class=&quot;headerlink&quot; title=&quot;python 排列组合 itertools&quot;&gt;&lt;/a&gt;python 排列组合 itertools&lt;/
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>python中的pickle 使用注意事项</title>
    <link href="http://blog.chenzhaoqiang.com/2020/03/04/python%E4%B8%AD%E7%9A%84pickle-%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/"/>
    <id>http://blog.chenzhaoqiang.com/2020/03/04/python中的pickle-使用注意事项/</id>
    <published>2020-03-04T02:25:57.000Z</published>
    <updated>2020-03-04T04:02:17.500Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python-中的pickle-使用注意事项"><a href="#python-中的pickle-使用注意事项" class="headerlink" title="python 中的pickle 使用注意事项"></a>python 中的pickle 使用注意事项</h1><h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><h2 id="如何让pickle-兼容python2-和python3"><a href="#如何让pickle-兼容python2-和python3" class="headerlink" title="如何让pickle 兼容python2 和python3"></a>如何让pickle 兼容python2 和python3</h2><p>当python版本为python 3的时候 保存为protocal=2 就可以兼容python2 了。</p><figure class="highlight py"><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">f = open(<span class="string">'TemInfo_py3_pro2_dict.pkl'</span>, <span class="string">'wb'</span>)</span><br><span class="line">pickle.dump(templates, f ,protocol=<span class="number">2</span>)</span><br><span class="line">f.close()</span><br></pre></td></tr></table></figure><h2 id="pickle-保存的数据类型"><a href="#pickle-保存的数据类型" class="headerlink" title="pickle 保存的数据类型"></a>pickle 保存的数据类型</h2><p>尽量不要包含自己定义的类，否则兼容性很麻烦同时python2 保存速度最慢。</p><p>因为pickle的创建最初目的就是保存数据。如果类中的仅仅包含数据，可以把类转换成字典。<br>或者仅仅需要类中的数据，可以类转换成字典的格式。</p><p>这样就可以避免各种奇怪的错误，<br>AttributeError: ‘module’ object has no attribute ‘Class Name’</p><p>如果坚持保存为定义的class的话，可以参看<a href="https://www.stefaanlippens.net/python-pickling-and-dealing-with-attributeerror-module-object-has-no-attribute-thing.html" target="_blank" rel="noopener">这篇文章</a><br>和 <a href="http://x-wei.github.io/python%20pickle%20%E7%9A%84%E4%B8%80%E4%B8%AA%E5%B0%8F%E9%97%AE%E9%A2%98.html" target="_blank" rel="noopener">这篇文章</a></p><h2 id="python"><a href="#python" class="headerlink" title="python"></a>python</h2><p>存储97万条字典数据，含多个字典索引的时候 python3 明显快于Python2。<br>同一台电脑上测试同一个脚本<br>时间计算：<br>PYTHON3 it take 36.402302503585815 seconds<br>PYTHON2 it take    4+ hour</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python-中的pickle-使用注意事项&quot;&gt;&lt;a href=&quot;#python-中的pickle-使用注意事项&quot; class=&quot;headerlink&quot; title=&quot;python 中的pickle 使用注意事项&quot;&gt;&lt;/a&gt;python 中的pickle 使用注意
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>python指令</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/26/python%E6%8C%87%E4%BB%A4/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/26/python指令/</id>
    <published>2020-02-26T13:35:37.000Z</published>
    <updated>2020-02-26T13:37:01.688Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python-常用指令汇总"><a href="#python-常用指令汇总" class="headerlink" title="python 常用指令汇总"></a>python 常用指令汇总</h1><h2 id="i-交互"><a href="#i-交互" class="headerlink" title="-i  交互"></a>-i  交互</h2><p>方便测试里面的变量和方法</p><h2 id="u-没有缓冲缓存-直接输出"><a href="#u-没有缓冲缓存-直接输出" class="headerlink" title="-u 没有缓冲缓存 直接输出"></a>-u 没有缓冲缓存 直接输出</h2><p>## </p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python-常用指令汇总&quot;&gt;&lt;a href=&quot;#python-常用指令汇总&quot; class=&quot;headerlink&quot; title=&quot;python 常用指令汇总&quot;&gt;&lt;/a&gt;python 常用指令汇总&lt;/h1&gt;&lt;h2 id=&quot;i-交互&quot;&gt;&lt;a href=&quot;#i-交互&quot;
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>打乱顺序shuffle</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/25/%E6%89%93%E4%B9%B1%E9%A1%BA%E5%BA%8Fshuffle/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/25/打乱顺序shuffle/</id>
    <published>2020-02-25T13:56:39.000Z</published>
    <updated>2020-02-25T13:59:26.997Z</updated>
    
    <content type="html"><![CDATA[<h1 id="python-中打乱顺序模块"><a href="#python-中打乱顺序模块" class="headerlink" title="python 中打乱顺序模块"></a>python 中打乱顺序模块</h1><h2 id="同步打乱两个numpy-array的顺序"><a href="#同步打乱两个numpy-array的顺序" class="headerlink" title="同步打乱两个numpy array的顺序"></a>同步打乱两个numpy array的顺序</h2><figure class="highlight py"><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">state = np.random.get_state()</span><br><span class="line">np.random.shuffle(X)</span><br><span class="line">np.random.set_state(state)</span><br><span class="line">np.random.shuffle(Y)</span><br></pre></td></tr></table></figure><p>我建议每个epoch 结束后打乱顺序，防止过拟合。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;python-中打乱顺序模块&quot;&gt;&lt;a href=&quot;#python-中打乱顺序模块&quot; class=&quot;headerlink&quot; title=&quot;python 中打乱顺序模块&quot;&gt;&lt;/a&gt;python 中打乱顺序模块&lt;/h1&gt;&lt;h2 id=&quot;同步打乱两个numpy-array
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>VSCODE常用快捷键</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/24/VSCODE%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/24/VSCODE常用快捷键/</id>
    <published>2020-02-24T14:13:00.000Z</published>
    <updated>2020-02-24T14:14:50.822Z</updated>
    
    <content type="html"><![CDATA[<h1 id="VSCODE-常用快捷键"><a href="#VSCODE-常用快捷键" class="headerlink" title="VSCODE 常用快捷键"></a>VSCODE 常用快捷键</h1><h2 id="自动换行-alt-z"><a href="#自动换行-alt-z" class="headerlink" title="自动换行 alt+z"></a>自动换行 alt+z</h2><h2 id="vscode-跳转F12到函数之后怎么跳转回之前的位置"><a href="#vscode-跳转F12到函数之后怎么跳转回之前的位置" class="headerlink" title="vscode 跳转F12到函数之后怎么跳转回之前的位置"></a>vscode 跳转F12到函数之后怎么跳转回之前的位置</h2><p>alt+上下左右箭头</p><p>## </p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;VSCODE-常用快捷键&quot;&gt;&lt;a href=&quot;#VSCODE-常用快捷键&quot; class=&quot;headerlink&quot; title=&quot;VSCODE 常用快捷键&quot;&gt;&lt;/a&gt;VSCODE 常用快捷键&lt;/h1&gt;&lt;h2 id=&quot;自动换行-alt-z&quot;&gt;&lt;a href=&quot;#自动换
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>VSCODE插件推荐</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/24/VSCODE%E6%8F%92%E4%BB%B6%E6%8E%A8%E8%8D%90/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/24/VSCODE插件推荐/</id>
    <published>2020-02-24T14:08:43.000Z</published>
    <updated>2020-02-24T14:11:32.098Z</updated>
    
    <content type="html"><![CDATA[<h1 id="VSCODE-插件推荐"><a href="#VSCODE-插件推荐" class="headerlink" title="VSCODE 插件推荐"></a>VSCODE 插件推荐</h1><ol><li>vscode -fileheader</li></ol><p>这个插件可以为你在文件开头插件头信息，比如文件的作者，修改时间，有了这个插件你就不需要每次都码一次所谓的无用信息了。</p><p>这个插件的用法也好简单：快捷键为：ctrl+alt+i，的依次点开【开始】-【首选项】-【设置】，在用户配置文件中添加如下代码：</p><p>2.HTML Snippets 或者 emmet 插件，可以提高编写效率。如果没有生效的话，可能是和已有插件冲突，禁用或者删除相应的插件即可。</p><ol start="3"><li>vscode-tidyhtml</li></ol><p>安装后按F1就可以美化html。</p><ol start="4"><li>中文语言包</li></ol><p>ctrl+shift+p 然后输入 configure display language,然后安装或者选择中文包zh-cn.</p><ol start="5"><li>rst 插件<br><a href="https://github.com/vscode-restructuredtext/vscode-restructuredtext/blob/master/docs/sphinx.md" target="_blank" rel="noopener">https://github.com/vscode-restructuredtext/vscode-restructuredtext/blob/master/docs/sphinx.md</a></li></ol><p>查找插件</p><p>ext:rst方式查找安装一个插件。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;VSCODE-插件推荐&quot;&gt;&lt;a href=&quot;#VSCODE-插件推荐&quot; class=&quot;headerlink&quot; title=&quot;VSCODE 插件推荐&quot;&gt;&lt;/a&gt;VSCODE 插件推荐&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;vscode -fileheader&lt;/li&gt;
&lt;/ol
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>VSCODE常用设置</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/24/VSCODE%E5%B8%B8%E7%94%A8%E8%AE%BE%E7%BD%AE/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/24/VSCODE常用设置/</id>
    <published>2020-02-24T14:04:09.000Z</published>
    <updated>2020-02-24T14:08:03.971Z</updated>
    
    <content type="html"><![CDATA[<h1 id="VSCODE-常用设置"><a href="#VSCODE-常用设置" class="headerlink" title="VSCODE 常用设置"></a>VSCODE 常用设置</h1><h2 id="主题设置"><a href="#主题设置" class="headerlink" title="主题设置"></a>主题设置</h2><p>点击左下角的齿轮-》color theme-&gt; 选择自己感兴趣的颜色主题即可。</p><ul><li>建议 工作使用黑色主题。</li><li>复制 代码的时候切换到白色主题。</li></ul><h2 id="比较两个文件的异同"><a href="#比较两个文件的异同" class="headerlink" title="比较两个文件的异同"></a>比较两个文件的异同</h2><p>在文件区 按住ctrl 选中两个待比较的文件，然后右击-&gt;compare就可以比较两个文件。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;VSCODE-常用设置&quot;&gt;&lt;a href=&quot;#VSCODE-常用设置&quot; class=&quot;headerlink&quot; title=&quot;VSCODE 常用设置&quot;&gt;&lt;/a&gt;VSCODE 常用设置&lt;/h1&gt;&lt;h2 id=&quot;主题设置&quot;&gt;&lt;a href=&quot;#主题设置&quot; class=&quot;
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>pandas在数据分析中的常用函数</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/24/pandas%E5%9C%A8%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B8%AD%E7%9A%84%E5%B8%B8%E7%94%A8%E5%87%BD%E6%95%B0/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/24/pandas在数据分析中的常用函数/</id>
    <published>2020-02-24T13:29:00.000Z</published>
    <updated>2020-03-10T02:33:29.853Z</updated>
    
    <content type="html"><![CDATA[<h1 id="pandas-在数据分析中的常用函数"><a href="#pandas-在数据分析中的常用函数" class="headerlink" title="pandas 在数据分析中的常用函数"></a>pandas 在数据分析中的常用函数</h1><h2 id="载入csv-文件load"><a href="#载入csv-文件load" class="headerlink" title="载入csv 文件load"></a>载入csv 文件load</h2><p>数据通常保存为csv文件。</p><p>示例代码：</p><figure class="highlight py"><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> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line">train_df = pd.read_csv(<span class="string">'../input/train.csv'</span>)</span><br></pre></td></tr></table></figure><h2 id="修改列的名字rename"><a href="#修改列的名字rename" class="headerlink" title="修改列的名字rename"></a>修改列的名字rename</h2><p>示例</p><ul><li>atom-&gt;atom_0</li><li>x-&gt;x_0</li><li>y-&gt;y_0</li><li>z-&gt;z_0</li></ul><p>示例代码</p><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">newtrain_df.rename(columns=&#123;<span class="string">'atom'</span>:<span class="string">'atom_0'</span>, <span class="string">'x'</span>:<span class="string">'x_0'</span>, <span class="string">'y'</span>:<span class="string">'y_0'</span>, <span class="string">'z'</span>:<span class="string">'z_0'</span>&#125;, inplace = <span class="keyword">True</span>)</span><br></pre></td></tr></table></figure><h2 id="调整列的顺序"><a href="#调整列的顺序" class="headerlink" title="调整列的顺序"></a>调整列的顺序</h2><p>代码</p><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df = df[[<span class="string">'user_id'</span>,<span class="string">'book_id'</span>,<span class="string">'rating'</span>,<span class="string">'mark_date'</span>]]</span><br></pre></td></tr></table></figure><h2 id="去除重复记录drop-duplicates"><a href="#去除重复记录drop-duplicates" class="headerlink" title="去除重复记录drop_duplicates"></a>去除重复记录drop_duplicates</h2><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DataFrame.drop_duplicates(subset=<span class="keyword">None</span>, keep=<span class="string">'first'</span>, inplace=<span class="keyword">False</span>)</span><br></pre></td></tr></table></figure><ul><li>subset : column label or sequence of labels, optional 用来指定特定的列，默认所有列</li><li>keep : {‘first’, ‘last’, False}, default ‘first’ 删除重复项并保留第一次出现的项</li><li>inplace : boolean, default False 是直接在原来数据上修改还是复制一个副本在副本上修改</li></ul><h2 id="对旧列计算添加新的列"><a href="#对旧列计算添加新的列" class="headerlink" title="对旧列计算添加新的列"></a>对旧列计算添加新的列</h2><h3 id="单列计算"><a href="#单列计算" class="headerlink" title="单列计算"></a>单列计算</h3><figure class="highlight py"><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="function"><span class="keyword">def</span> <span class="title">newfunc</span><span class="params">(x)</span>:</span></span><br><span class="line">    <span class="keyword">return</span> x**<span class="number">2</span></span><br><span class="line">df[<span class="string">'newcol'</span>]=df[<span class="string">'oldcol'</span>].map(newfunc)</span><br></pre></td></tr></table></figure><h3 id="多列计算"><a href="#多列计算" class="headerlink" title="多列计算"></a>多列计算</h3><p>示例<br><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df[<span class="string">'test'</span>]=df.apply(<span class="keyword">lambda</span> x: x[<span class="string">'x_0'</span>]+x[<span class="string">'x_1'</span>],axis=<span class="number">1</span>)</span><br></pre></td></tr></table></figure></p><h2 id="删除行和列"><a href="#删除行和列" class="headerlink" title="删除行和列"></a>删除行和列</h2><figure class="highlight py"><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">print</span> frame.drop([<span class="string">'a'</span>])  <span class="comment"># 删除行 返回新表</span></span><br><span class="line"><span class="keyword">print</span> frame.drop([<span class="string">'Ohio'</span>], axis = <span class="number">1</span>)  <span class="comment"># 删除列  返回新表</span></span><br><span class="line">DF.drop(<span class="string">'column_name'</span>,axis=<span class="number">1</span>, inplace=<span class="keyword">True</span>)</span><br></pre></td></tr></table></figure><p>drop函数默认删除行，删除列需要加axis = 1</p><p>第一个参数：删除那几行，行名或者列名的列表<br>第二个参数：axis=0 默认行； axis=1 列</p><p>删除列的第二个方法，保留需要的列</p><figure class="highlight py"><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">newtrain_df=newtrain_df[[<span class="string">'id'</span>,<span class="string">'molecule_name'</span>,<span class="string">'atom_index_0'</span>,<span class="string">'atom_elem_0'</span>,<span class="string">'x_0'</span>,<span class="string">'y_0'</span>,<span class="string">'z_0'</span>,<span class="string">'atom_index_1'</span>,<span class="string">'type'</span>,<span class="string">'scalar_coupling_constant'</span>]]</span><br><span class="line">newtrain_df.head()</span><br></pre></td></tr></table></figure><h2 id="横向合并两张表df"><a href="#横向合并两张表df" class="headerlink" title="横向合并两张表df"></a>横向合并两张表df</h2><p>如果两张表的记录数目是一样的，id也是完全对应的，直接合并就可以。<br><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">result = pd.merge(df_train, df_ans, on=[<span class="string">'id'</span>])</span><br></pre></td></tr></table></figure></p><p>或者<br><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">result = df_train.merge( df_ans, on=[<span class="string">'id'</span>])</span><br></pre></td></tr></table></figure></p><h2 id="纵向合并多张表"><a href="#纵向合并多张表" class="headerlink" title="纵向合并多张表"></a>纵向合并多张表</h2><p>当需要合并的表的字段完全相同的时候，直接用concat 合并即可<br><figure class="highlight py"><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">frames = [df1, df2, df3]</span><br><span class="line"></span><br><span class="line">result = pd.concat(frames)</span><br></pre></td></tr></table></figure></p><h2 id="将df-导出为csv"><a href="#将df-导出为csv" class="headerlink" title="将df 导出为csv"></a>将df 导出为csv</h2><p>示例代码</p><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">result.to_csv(<span class="string">"train_x_y.csv"</span>)</span><br></pre></td></tr></table></figure><h2 id="根据key-value查找具体的记录"><a href="#根据key-value查找具体的记录" class="headerlink" title="根据key-value查找具体的记录"></a>根据key-value查找具体的记录</h2><p>我们想查看merge 后的表和前面的表记录是否一致，查看id=’52b6d03a’的记录。<br><figure class="highlight py"><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">df_train[df_train[<span class="string">'id'</span>].isin([<span class="string">'52b6d03a'</span>])]</span><br><span class="line">df_ans[df_ans[<span class="string">'id'</span>].isin([<span class="string">'52b6d03a'</span>])]</span><br><span class="line">result[result[<span class="string">'id'</span>].isin([<span class="string">'52b6d03a'</span>])]</span><br></pre></td></tr></table></figure></p><h2 id="根据value的数值比较-查找具体的记录"><a href="#根据value的数值比较-查找具体的记录" class="headerlink" title="根据value的数值比较 查找具体的记录"></a>根据value的数值比较 查找具体的记录</h2><figure class="highlight py"><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">imfs_df[imfs_df[<span class="string">'score0'</span>] == <span class="number">0</span>]</span><br><span class="line">imfs_df[imfs_df[<span class="string">'score0'</span>] &gt; <span class="number">0</span>]</span><br><span class="line">df[(df[col] &gt; <span class="number">0.5</span>) &amp; (df[col] &lt; <span class="number">0.7</span>)]</span><br></pre></td></tr></table></figure><h2 id="打乱顺序"><a href="#打乱顺序" class="headerlink" title="打乱顺序"></a>打乱顺序</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">result_random = result.sample(frac=1)</span><br></pre></td></tr></table></figure><p>frac 返回数据的比例，</p><ul><li>frac =1 打乱所有的数据并返回。</li><li>frac =0.5 打乱并返回其中一半的数据</li></ul><h2 id="统计行数"><a href="#统计行数" class="headerlink" title="统计行数"></a>统计行数</h2><ul><li>len(df)</li><li>df.shape 行列</li></ul><h2 id="添加新列"><a href="#添加新列" class="headerlink" title="添加新列"></a>添加新列</h2><p>查看原有列的shape df_valx[‘id’].shape<br>确保新列的shape 和旧列的 shape 相同<br><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df_valx[<span class="string">'newcolname'</span>]=p4_predict.reshape((<span class="number">26358</span>,))</span><br></pre></td></tr></table></figure></p><h2 id="选取多个列的数据"><a href="#选取多个列的数据" class="headerlink" title="选取多个列的数据"></a>选取多个列的数据</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df[[&apos;col1&apos;,&apos;col3&apos;]]</span><br></pre></td></tr></table></figure><p><a href="https://stackoverflow.com/questions/11285613/selecting-multiple-columns-in-a-pandas-dataframe" target="_blank" rel="noopener">https://stackoverflow.com/questions/11285613/selecting-multiple-columns-in-a-pandas-dataframe</a></p><h2 id="根据colname-获取子表"><a href="#根据colname-获取子表" class="headerlink" title="根据colname 获取子表"></a>根据colname 获取子表</h2><figure class="highlight py"><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><br><span class="line">colnames=[<span class="string">'name1'</span>,[<span class="string">'name2'</span>]]</span><br><span class="line">df[colnames]</span><br></pre></td></tr></table></figure><p>接受的参数必须是列表，不能是元组。</p><h2 id="查看数据类型"><a href="#查看数据类型" class="headerlink" title="查看数据类型"></a>查看数据类型</h2><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df.dtypes</span><br></pre></td></tr></table></figure><h2 id="修改数据类型"><a href="#修改数据类型" class="headerlink" title="修改数据类型"></a>修改数据类型</h2><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df[[column]] = df[[column]].astype(type)</span><br></pre></td></tr></table></figure><p>含3个值的数据数据修改为类别数据<br><figure class="highlight py"><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">cols = data.columns.tolist()</span><br><span class="line">col2=[]</span><br><span class="line"><span class="keyword">for</span> col <span class="keyword">in</span> cols:</span><br><span class="line">    print(<span class="string">'col'</span>,col,data[col].nunique() )</span><br><span class="line">    <span class="keyword">if</span>(data[col].nunique()&lt;<span class="number">2</span>):</span><br><span class="line">        col2.append(col)</span><br><span class="line"><span class="keyword">for</span> c <span class="keyword">in</span> col2:</span><br><span class="line">    print(<span class="string">"c"</span>,c)</span><br><span class="line">    data[[c]]=data[[c]].astype(<span class="string">'category'</span>)</span><br></pre></td></tr></table></figure></p><h2 id="替换所有的NAN"><a href="#替换所有的NAN" class="headerlink" title="替换所有的NAN"></a>替换所有的NAN</h2><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#可以尝试下 fillna()：</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#fill all Nan value with zero</span></span><br><span class="line">df = df.fillna(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#如果不想用df=df.addna()，也可以这么做：</span></span><br><span class="line"></span><br><span class="line">df.fillna(<span class="number">0</span>, inplace=<span class="keyword">True</span>)</span><br></pre></td></tr></table></figure><p>推荐方法一<br><figure class="highlight py"><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">data[[<span class="string">'p2'</span>]]=data[[<span class="string">'p2'</span>]].fillna(<span class="number">0</span>)</span><br><span class="line">data[[<span class="string">'p4'</span>]]=data[[<span class="string">'p4'</span>]].fillna(<span class="number">0</span>)</span><br></pre></td></tr></table></figure></p><h2 id="UPDATING"><a href="#UPDATING" class="headerlink" title="UPDATING"></a>UPDATING</h2>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;pandas-在数据分析中的常用函数&quot;&gt;&lt;a href=&quot;#pandas-在数据分析中的常用函数&quot; class=&quot;headerlink&quot; title=&quot;pandas 在数据分析中的常用函数&quot;&gt;&lt;/a&gt;pandas 在数据分析中的常用函数&lt;/h1&gt;&lt;h2 id=&quot;载
      
    
    </summary>
    
      <category term="python" scheme="http://blog.chenzhaoqiang.com/categories/python/"/>
    
    
      <category term="data analysis" scheme="http://blog.chenzhaoqiang.com/tags/data-analysis/"/>
    
  </entry>
  
  <entry>
    <title>如何在PyMOL中显示盐桥</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/23/%E5%A6%82%E4%BD%95%E5%9C%A8PyMOL%E4%B8%AD%E6%98%BE%E7%A4%BA%E7%9B%90%E6%A1%A5/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/23/如何在PyMOL中显示盐桥/</id>
    <published>2020-02-23T13:09:01.000Z</published>
    <updated>2020-02-23T13:28:22.068Z</updated>
    
    <content type="html"><![CDATA[<h1 id="如何在PyMOL中快速显示蛋白的盐桥"><a href="#如何在PyMOL中快速显示蛋白的盐桥" class="headerlink" title="如何在PyMOL中快速显示蛋白的盐桥"></a>如何在PyMOL中快速显示蛋白的盐桥</h1><h2 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h2><ol><li>先定位带负电荷的氨基酸上的羧基上的氧原子；</li><li>然后定位正电荷氨基的Lys 上的带正电荷的N原子；</li><li>最后显示这两类原子在4A范围之内的配对情况。</li></ol><p>方法1 命令行版本<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">PyMOL&gt;select negative, (resn ASP+Glu and name OD*+OE*)</span><br><span class="line">PyMOL&gt;select positive, (resn Lys and name NZ) or (resn arg and name NE+NH*)</span><br><span class="line">PyMOL&gt;distance saltbridge, (negative ), (positive ), 4.0, 0</span><br></pre></td></tr></table></figure></p><p>方法2 拓展成一个命令 saltbridge.py</p><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pymol <span class="keyword">import</span> cmd</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">show_saltbridge</span><span class="params">()</span>:</span></span><br><span class="line">    cmd.select(<span class="string">"negative"</span>,<span class="string">"resn ASP+Glu and name OD*+OE*"</span>)</span><br><span class="line">    cmd.select(<span class="string">"positive"</span>,<span class="string">"(resn Lys and name NZ) or (resn arg and name NE+NH*)"</span>)</span><br><span class="line">    cmd.distance(<span class="string">"saltbridge"</span>,<span class="string">"negative"</span>,<span class="string">"positive"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">cmd.extend(<span class="string">"show_saltbridge"</span>, show_saltbridge)</span><br></pre></td></tr></table></figure><p>用法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">PyMOL&gt;run saltbridge.py</span><br><span class="line">PyMOL&gt;show_saltbridge</span><br></pre></td></tr></table></figure></p><p>两个氨基酸之间存在黄色虚线，说明这个氨基酸存在盐桥。</p><p>更详细教程参见 <a href="http://pymol.chenzhaoqiang.com/intro/advanceManual.html" target="_blank" rel="noopener">PyMOL教程</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;如何在PyMOL中快速显示蛋白的盐桥&quot;&gt;&lt;a href=&quot;#如何在PyMOL中快速显示蛋白的盐桥&quot; class=&quot;headerlink&quot; title=&quot;如何在PyMOL中快速显示蛋白的盐桥&quot;&gt;&lt;/a&gt;如何在PyMOL中快速显示蛋白的盐桥&lt;/h1&gt;&lt;h2 id=&quot;思
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>如何阅读github上面优秀项目的源代码</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/21/%E5%A6%82%E4%BD%95%E9%98%85%E8%AF%BBgithub%E4%B8%8A%E9%9D%A2%E4%BC%98%E7%A7%80%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/21/如何阅读github上面优秀项目的源代码/</id>
    <published>2020-02-21T13:40:23.000Z</published>
    <updated>2020-02-22T15:37:42.912Z</updated>
    
    <content type="html"><![CDATA[<h1 id="如何阅读github上面优秀项目的源代码"><a href="#如何阅读github上面优秀项目的源代码" class="headerlink" title="如何阅读github上面优秀项目的源代码"></a>如何阅读github上面优秀项目的源代码</h1><h2 id="挑选项目："><a href="#挑选项目：" class="headerlink" title="挑选项目："></a>挑选项目：</h2><ol><li>star多的项目，保证项目的质量</li><li>自己擅长的语言写的项目</li><li>作者最近有回答问题或者更新项目。</li></ol><h2 id="阅读前判断项目适不适合你："><a href="#阅读前判断项目适不适合你：" class="headerlink" title="阅读前判断项目适不适合你："></a>阅读前判断项目适不适合你：</h2><p>如果你觉得看代码比写代码还难的话，这可能是有2个原因：</p><ol><li>你的水平远低于对方的水平，打好基础继续阅读，阅读完了对你的水平会有一个质的提升；</li><li>对方代码写的很混乱，没有读的必要，换一个star 更多的类似项目阅读。</li></ol><p>大家如果都按照通用的规范来写的话，代码读起来很容易。</p><p>阅读之前最好能把该项目部署起来，方便调试验证你的想法。</p><h2 id="阅读过程："><a href="#阅读过程：" class="headerlink" title="阅读过程："></a>阅读过程：</h2><p>几乎没有一个项目是没有bug的，因此在阅读的过程中你可以提交pull request 一方面是反馈问题，另一方面也能看看自己的理解对不对。</p><p>即使项目没有bug, 但是一定有需要改进和提高的地方，这时候也可以pull request。</p><p>整理阅读记录，做好笔记。</p><h2 id="阅读结束"><a href="#阅读结束" class="headerlink" title="阅读结束"></a>阅读结束</h2><p>总结这个项目中一些亮点，以后写代码的时候可以进行借鉴。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;如何阅读github上面优秀项目的源代码&quot;&gt;&lt;a href=&quot;#如何阅读github上面优秀项目的源代码&quot; class=&quot;headerlink&quot; title=&quot;如何阅读github上面优秀项目的源代码&quot;&gt;&lt;/a&gt;如何阅读github上面优秀项目的源代码&lt;/h1&gt;&lt;
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>linux 下命令使用小技巧汇总</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/21/linux-%E4%B8%8B%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7%E6%B1%87%E6%80%BB/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/21/linux-下命令使用小技巧汇总/</id>
    <published>2020-02-21T03:48:53.000Z</published>
    <updated>2020-02-21T04:51:02.053Z</updated>
    
    <content type="html"><![CDATA[<h1 id="linux-下命令使用小技巧汇总"><a href="#linux-下命令使用小技巧汇总" class="headerlink" title="linux 下命令使用小技巧汇总"></a>linux 下命令使用小技巧汇总</h1><ol><li>grep </li></ol><ul><li>-F: 匹配特殊的raw 字符串 -F  grep -F ‘XXX[SS:NN]‘  file.txt</li><li>-n: 显示匹配的字符串的行号 </li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;linux-下命令使用小技巧汇总&quot;&gt;&lt;a href=&quot;#linux-下命令使用小技巧汇总&quot; class=&quot;headerlink&quot; title=&quot;linux 下命令使用小技巧汇总&quot;&gt;&lt;/a&gt;linux 下命令使用小技巧汇总&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;grep &lt;/l
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>如何把cat 当简单的 vi 命令使用</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/20/%E5%A6%82%E4%BD%95%E6%8A%8Acat-%E5%BD%93%E7%AE%80%E5%8D%95%E7%9A%84-vi-%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/20/如何把cat-当简单的-vi-命令使用/</id>
    <published>2020-02-19T22:37:59.000Z</published>
    <updated>2020-02-19T22:44:59.768Z</updated>
    
    <content type="html"><![CDATA[<h1 id="如何把cat当简单的vi命令使用"><a href="#如何把cat当简单的vi命令使用" class="headerlink" title="如何把cat当简单的vi命令使用"></a>如何把cat当简单的vi命令使用</h1><h2 id="遇到的场景"><a href="#遇到的场景" class="headerlink" title="遇到的场景"></a>遇到的场景</h2><p>好多docker 镜像中没有自带vi命令而自带了cat 命令。<br>由于我的环境不能连接外网，而又要在docker 容器中创建脚本。<br>借助 EOF 标签可以把cat 当成 vi来使用。</p><h2 id="解决方案示例"><a href="#解决方案示例" class="headerlink" title="解决方案示例"></a>解决方案示例</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[xxx@linux]$ cat &lt;&lt;EOF &gt;hello.py</span><br><span class="line">print(&quot;hello,world&quot;)</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><h2 id="查看文件hello-py"><a href="#查看文件hello-py" class="headerlink" title="查看文件hello.py"></a>查看文件hello.py</h2><p>cat hello.py</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;如何把cat当简单的vi命令使用&quot;&gt;&lt;a href=&quot;#如何把cat当简单的vi命令使用&quot; class=&quot;headerlink&quot; title=&quot;如何把cat当简单的vi命令使用&quot;&gt;&lt;/a&gt;如何把cat当简单的vi命令使用&lt;/h1&gt;&lt;h2 id=&quot;遇到的场景&quot;&gt;&lt;a
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>jupytyer[02]如何让多张图片显示在一行中</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/16/jupytyer-02-%E5%A6%82%E4%BD%95%E8%AE%A9%E5%A4%9A%E5%BC%A0%E5%9B%BE%E7%89%87%E6%98%BE%E7%A4%BA%E5%9C%A8%E4%B8%80%E8%A1%8C%E4%B8%AD/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/16/jupytyer-02-如何让多张图片显示在一行中/</id>
    <published>2020-02-16T05:14:00.000Z</published>
    <updated>2020-02-16T13:51:27.590Z</updated>
    
    <content type="html"><![CDATA[<h1 id="jupytyer-如何让多张图片显示在一行中"><a href="#jupytyer-如何让多张图片显示在一行中" class="headerlink" title="jupytyer[]如何让多张图片显示在一行中"></a>jupytyer[]如何让多张图片显示在一行中</h1><h2 id="display-img-默认是一行一张图片"><a href="#display-img-默认是一行一张图片" class="headerlink" title="display(img) 默认是一行一张图片"></a>display(img) 默认是一行一张图片</h2><p>示例代码：<br><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> rdkit.Chem <span class="keyword">import</span> Draw</span><br><span class="line"><span class="keyword">from</span> rdkit <span class="keyword">import</span> Chem</span><br><span class="line">mol = Chem.MolFromSmiles(<span class="string">'c1cccnc1C'</span>)</span><br><span class="line">bi = &#123;&#125;</span><br><span class="line">fp = AllChem.GetMorganFingerprintAsBitVect(mol,nBits=<span class="number">256</span>, radius=<span class="number">2</span>, bitInfo=bi)</span><br><span class="line">pprint(bi)</span><br><span class="line">bits =[<span class="number">19</span>,<span class="number">64</span>,<span class="number">81</span>]</span><br><span class="line">imgs=[]</span><br><span class="line"><span class="keyword">for</span> bit <span class="keyword">in</span> bits:</span><br><span class="line">    mfp2_svg = Draw.DrawMorganBit(mol, bit, bi)</span><br><span class="line">    imgs.append(mfp2_svg)</span><br><span class="line"><span class="comment">#     display(mfp2_svg)</span></span><br><span class="line">display(*imgs)</span><br></pre></td></tr></table></figure></p><p>输出：</p><p><img src="/images/111.png" alt="upload successful"></p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/images/pasted-1.png" alt="upload successful" title="">                </div>                <div class="image-caption">upload successful</div>            </figure><h2 id="借助matplotlb-可以实现多张图片显示在一行上面"><a href="#借助matplotlb-可以实现多张图片显示在一行上面" class="headerlink" title="借助matplotlb 可以实现多张图片显示在一行上面"></a>借助matplotlb 可以实现多张图片显示在一行上面</h2><p>示例代码<br><figure class="highlight py"><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><br><span class="line">fig, ax = plt.subplots(<span class="number">1</span>,<span class="number">2</span>)</span><br><span class="line">ax[<span class="number">0</span>].set_axis_off()</span><br><span class="line">ax[<span class="number">0</span>].imshow(imgs[<span class="number">0</span>]);</span><br><span class="line">ax[<span class="number">1</span>].set_axis_off()</span><br><span class="line">ax[<span class="number">1</span>].imshow(imgs[<span class="number">1</span>]);</span><br></pre></td></tr></table></figure></p><p>输出：</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/images/pasted-0.png" alt="upload successful" title="">                </div>                <div class="image-caption">upload successful</div>            </figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;jupytyer-如何让多张图片显示在一行中&quot;&gt;&lt;a href=&quot;#jupytyer-如何让多张图片显示在一行中&quot; class=&quot;headerlink&quot; title=&quot;jupytyer[]如何让多张图片显示在一行中&quot;&gt;&lt;/a&gt;jupytyer[]如何让多张图片显示
      
    
    </summary>
    
    
      <category term="python" scheme="http://blog.chenzhaoqiang.com/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>jamdocs[02]为jamdocs添加上传文件功能</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/14/jamdocs%5B02%5D%E4%B8%BAjamdocs%E6%B7%BB%E5%8A%A0%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E5%8A%9F%E8%83%BD/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/14/jamdocs[02]为jamdocs添加上传文件功能/</id>
    <published>2020-02-13T16:00:00.000Z</published>
    <updated>2020-02-14T14:29:09.152Z</updated>
    
    <content type="html"><![CDATA[<h1 id="jamdocs-02-为jamdocs添加上传文件功能"><a href="#jamdocs-02-为jamdocs添加上传文件功能" class="headerlink" title="jamdocs[02] 为jamdocs添加上传文件功能"></a>jamdocs[02] 为jamdocs添加上传文件功能</h1><h2 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h2><p>编写sphinx文档的时候，通常需要插入一些图片。<br>通过对jamdocs进行二次开发使得可以在jamdocs中上传本地图片和文件。</p><h2 id="jamdocs-二次开发特色"><a href="#jamdocs-二次开发特色" class="headerlink" title="jamdocs 二次开发特色"></a>jamdocs 二次开发特色</h2><p>jamdocs 是基于jam.py 开发的，jamdocs开发过程中 全程在浏览器中开发就可以了。<br>开发在 <a href="http://118.89.150.227:54322/builder.html" target="_blank" rel="noopener">http://118.89.150.227:54322/builder.html</a> 进行编程；<br>开发在 <a href="http://118.89.150.227:54322" target="_blank" rel="noopener">http://118.89.150.227:54322</a>  预览管理页面效果。<br>不需要IDE;</p><h2 id="builder-html-添加上传按钮"><a href="#builder-html-添加上传按钮" class="headerlink" title="builder.html 添加上传按钮"></a>builder.html 添加上传按钮</h2><p>点击task,然后点击index.html,如图：</p><p>通过F12 定位到管理页面的 new 按钮。</p><p>id:  “new-btn”<br>一共有 3个地方有new-button</p><ul><li><ol><li>div [ templates -&gt; default view -&gt; form-footer]   {模板}</li></ol></li><li><ol start="2"><li>div [ topics-view -&gt; modal-body -&gt; modal-footer ]  {文件列表窗口}</li></ol></li><li><ol start="3"><li>div [ parameters-view    -&gt;           -&gt; “form-footer”   ] {project 窗口}<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"modal-footer"</span>&gt;</span>           </span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">"new-upload-btn"</span> <span class="attr">class</span>=<span class="string">"btn"</span> <span class="attr">type</span>=<span class="string">"button"</span>&gt;</span><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">"icon-plus"</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span> New<span class="tag">&lt;<span class="name">small</span> <span class="attr">class</span>=<span class="string">"muted"</span>&gt;</span>&amp;nbsp;[Ins]<span class="tag">&lt;/<span class="name">small</span>&gt;</span><span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">"new-btn"</span> <span class="attr">class</span>=<span class="string">"btn"</span> <span class="attr">type</span>=<span class="string">"button"</span>&gt;</span><span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">"icon-plus"</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span> New<span class="tag">&lt;<span class="name">small</span> <span class="attr">class</span>=<span class="string">"muted"</span>&gt;</span>&amp;nbsp;[Ins]<span class="tag">&lt;/<span class="name">small</span>&gt;</span><span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ol></li></ul><p>在文件列表窗口添加new-upload-btn<br>保存下，查看管理页面效果,如图：。</p><h2 id="在builder-html-页面中开发为upload-按钮添加-点击-功能"><a href="#在builder-html-页面中开发为upload-按钮添加-点击-功能" class="headerlink" title="在builder.html 页面中开发为upload 按钮添加 点击 功能"></a>在builder.html 页面中开发为upload 按钮添加 点击 功能</h2><p>点击 task -&gt; Groups -&gt; Journals，选中topics,然后点击client_module 对应的是topic.js<br><figure class="highlight js"><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">item.view_form.find(<span class="string">"#new-btn"</span>).off(<span class="string">'click.task'</span>).on(<span class="string">'click'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">    new_doc(item);</span><br><span class="line">&#125;);  </span><br><span class="line">item.view_form.find(<span class="string">"#new-upload-btn"</span>).off(<span class="string">'click.task'</span>).on(<span class="string">'click'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        upload_file(item);</span><br><span class="line">    &#125;);</span><br></pre></td></tr></table></figure></p><figure class="highlight js"><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">upload_file</span>(<span class="params">item</span>) </span>&#123;</span><br><span class="line">    <span class="built_in">console</span>.log(<span class="string">"click upload button"</span>);</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">after_upload</span>(<span class="params">server_file_name</span>) </span>&#123;</span><br><span class="line">            <span class="keyword">var</span> file_id = item.task.server(<span class="string">'move_image_file'</span>, [item.item_tree.id.value, server_file_name]);</span><br><span class="line">            <span class="built_in">console</span>.log(file_id);</span><br><span class="line">    </span><br><span class="line">            <span class="keyword">if</span> (file_id) &#123;  <span class="comment">// refresh </span></span><br><span class="line">            item.view_panel = item.view_form.find(<span class="string">"#view-panel"</span>);</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// http://118.89.150.227:12345/api   </span></span><br><span class="line">            <span class="comment">// xhr    refresh </span></span><br><span class="line">        item.set_order_by([<span class="string">'file_name'</span>]);                </span><br><span class="line">            item.filters.type_gt.value = <span class="number">1</span>;</span><br><span class="line">            item.filters.parent.value = item.item_tree.id.value;</span><br><span class="line">            item.open();</span><br><span class="line">            item.locate(<span class="string">'id'</span>, file_id);</span><br><span class="line">            item.task.param_dialog.close_edit_form();</span><br><span class="line">            item.task.server(<span class="string">'check_files'</span>);  <span class="comment">// refresh the div of file list.</span></span><br><span class="line">            setTimeout(</span><br><span class="line">                <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">                    item.open();</span><br><span class="line">                &#125;,  </span><br><span class="line">                <span class="number">100</span></span><br><span class="line">            );</span><br><span class="line">   </span><br><span class="line">            </span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// refresh  </span></span><br><span class="line">            </span><br><span class="line">        &#125;</span><br><span class="line">    item.task.upload(</span><br><span class="line">                &#123;</span><br><span class="line">                    accept: <span class="string">'image/*'</span>,</span><br><span class="line">                    callback: <span class="function"><span class="keyword">function</span>(<span class="params">server_file_name</span>) </span>&#123;</span><br><span class="line">                        after_upload(server_file_name)</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            );</span><br><span class="line"></span><br><span class="line">&#125;   </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">new_doc</span>(<span class="params">item</span>) </span>&#123;</span><br><span class="line">   item.task.param_dialog.get_params(item, <span class="string">'New file'</span>, [<span class="string">'title'</span>, <span class="string">'file_name'</span>], <span class="function"><span class="keyword">function</span>(<span class="params">result</span>) </span>&#123;</span><br><span class="line">        <span class="keyword">var</span> file_id = item.task.server(<span class="string">'create_doc'</span>, [item.item_tree.id.value, result]);</span><br><span class="line">        </span><br><span class="line">... ...)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="在服务端实现-move-image-file-功能；"><a href="#在服务端实现-move-image-file-功能；" class="headerlink" title="在服务端实现 move_image_file 功能；"></a>在服务端实现 move_image_file 功能；</h2><p>在builder页面点击task -&gt;server module<br><figure class="highlight py"><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> shutil</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">move_image_file</span><span class="params">(task, dir_id,file_name)</span>:</span></span><br><span class="line">    targetdir=task.cur_project.project_path </span><br><span class="line">    print(targetdir)</span><br><span class="line">    print(file_name)</span><br><span class="line"><span class="comment">#     /home/czq/rdkitcn</span></span><br><span class="line"><span class="comment"># zl2020-02-05_223632.678159.jpg</span></span><br><span class="line">    topics = task.topics.copy()</span><br><span class="line">    topics.set_where(id=dir_id)</span><br><span class="line">    topics.open()</span><br><span class="line">    path = os.path.join(topics.relative_path.value, topics.file_name.value)</span><br><span class="line">    srcpath=os.path.join(os.getcwd(),<span class="string">'static/files'</span>,file_name)</span><br><span class="line">    targetpath=os.path.join(targetdir,path,file_name)</span><br><span class="line">    <span class="comment"># copyfile(srcpath,targetpath)</span></span><br><span class="line">    shutil.move(srcpath,targetpath)</span><br><span class="line">    topics.open()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> topics.id.value</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">create_doc</span><span class="params">(task, dir_id, file_info)</span>:</span></span><br><span class="line">    file_name = file_info[<span class="string">'file_name'</span>]</span><br><span class="line">    title = file_info[<span class="string">'title'</span>]</span><br><span class="line">    topics = task.topics.copy()</span><br><span class="line">    topics.set_where(id=dir_id)</span><br><span class="line">    topics.open()</span><br><span class="line">    ... ...</span><br></pre></td></tr></table></figure></p><p>到这里，上传文件的功能就已经实现了。</p><h2 id="编程技巧"><a href="#编程技巧" class="headerlink" title="编程技巧"></a>编程技巧</h2><p>光标必须定位在代码中，<br>ctrl+alt+f 在项目中查找，<br>ctrl+f 在当前编辑的页面中查找 。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;jamdocs-02-为jamdocs添加上传文件功能&quot;&gt;&lt;a href=&quot;#jamdocs-02-为jamdocs添加上传文件功能&quot; class=&quot;headerlink&quot; title=&quot;jamdocs[02] 为jamdocs添加上传文件功能&quot;&gt;&lt;/a&gt;jamd
      
    
    </summary>
    
    
      <category term="python" scheme="http://blog.chenzhaoqiang.com/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>Jamdocs[01]管理sphinx文档利器</title>
    <link href="http://blog.chenzhaoqiang.com/2020/02/14/jamdocs%5B01%5D%E7%AE%A1%E7%90%86sphinx%E6%96%87%E6%A1%A3%E5%88%A9%E5%99%A8/"/>
    <id>http://blog.chenzhaoqiang.com/2020/02/14/jamdocs[01]管理sphinx文档利器/</id>
    <published>2020-02-13T16:00:00.000Z</published>
    <updated>2020-02-14T14:25:47.382Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Jamdocs-01-管理sphinx文档利器"><a href="#Jamdocs-01-管理sphinx文档利器" class="headerlink" title="Jamdocs[01]管理sphinx文档利器"></a>Jamdocs[01]管理sphinx文档利器</h1><h2 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h2><p>Jamdocs 是全网唯一的管理sphinx文档工具，基于jam.py开发。<br>sphinx 是优秀的文档写作工具，方便管理文档。<br>Jamdocs 能够让你在浏览器中编写文档并编译。</p><h2 id="项目地址"><a href="#项目地址" class="headerlink" title="项目地址"></a>项目地址</h2><p>github: <a href="https://github.com/jam-py/jamdocs" target="_blank" rel="noopener">https://github.com/jam-py/jamdocs</a></p><h2 id="安装教程"><a href="#安装教程" class="headerlink" title="安装教程"></a>安装教程</h2><p>git clone <a href="https://github.com/jam-py/jamdocs.git" target="_blank" rel="noopener">https://github.com/jam-py/jamdocs.git</a></p><h2 id="运行jamdoc-server"><a href="#运行jamdoc-server" class="headerlink" title="运行jamdoc server"></a>运行jamdoc server</h2><p>cd jamdocs<br>./server.py 12345<br>(base) [xxx@centos jamdocs]$ ./server.py 12345</p><ul><li>Running on <a href="http://0.0.0.0:12345/" target="_blank" rel="noopener">http://0.0.0.0:12345/</a> (Press CTRL+C to quit)</li><li><h2 id="在浏览器中访问jamdoc-服务-http-118-89-150-227-12345"><a href="#在浏览器中访问jamdoc-服务-http-118-89-150-227-12345" class="headerlink" title="在浏览器中访问jamdoc 服务 http://118.89.150.227:12345/"></a>在浏览器中访问jamdoc 服务 <a href="http://118.89.150.227:12345/" target="_blank" rel="noopener">http://118.89.150.227:12345/</a></h2>第一次使用会弹出对话框，<br>要求填写project的名字：随便写一个名字，方便自己知道是哪一个项目的文档即可<br>要求填写project的配置文件conf.py位置(以sphinx文件结尾)。<br>如图所示：</li></ul><p>可以同时添加并管理多个sphinx project.</p><h2 id="看到sphinx-文档的结构，具有如下功能"><a href="#看到sphinx-文档的结构，具有如下功能" class="headerlink" title="看到sphinx 文档的结构，具有如下功能"></a>看到sphinx 文档的结构，具有如下功能</h2><ul><li>编辑rst文件 </li><li>添加rst文件</li><li>编译rst文件</li></ul><p>这样我们就可以在浏览器中编写文档，不需要登陆服务器。</p><h2 id="jamdocs-不足之处"><a href="#jamdocs-不足之处" class="headerlink" title="jamdocs 不足之处"></a>jamdocs 不足之处</h2><ul><li>不能上传文档</li></ul><p>但是jam.py非常灵活，你可以对jamdocs的功能进行自定义就可以实现上传文档的功能。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://github.com/jam-py/jamdocs" target="_blank" rel="noopener">https://github.com/jam-py/jamdocs</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Jamdocs-01-管理sphinx文档利器&quot;&gt;&lt;a href=&quot;#Jamdocs-01-管理sphinx文档利器&quot; class=&quot;headerlink&quot; title=&quot;Jamdocs[01]管理sphinx文档利器&quot;&gt;&lt;/a&gt;Jamdocs[01]管理sphi
      
    
    </summary>
    
    
      <category term="python" scheme="http://blog.chenzhaoqiang.com/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>matplotlib[07]绘制双坐标轴</title>
    <link href="http://blog.chenzhaoqiang.com/2018/04/08/matplotlib%5B07%5D%E7%BB%98%E5%88%B6%E5%8F%8C%E5%9D%90%E6%A0%87%E8%BD%B4/"/>
    <id>http://blog.chenzhaoqiang.com/2018/04/08/matplotlib[07]绘制双坐标轴/</id>
    <published>2018-04-07T22:32:56.000Z</published>
    <updated>2018-05-29T01:32:47.933Z</updated>
    
    <content type="html"><![CDATA[<h3 id="matplotlib-07-绘制双坐标轴"><a href="#matplotlib-07-绘制双坐标轴" class="headerlink" title="matplotlib[07]绘制双坐标轴"></a>matplotlib[07]绘制双坐标轴</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>matplotlib面向对象绘图，可以自由定义各种元素。这里讲解绘制双坐标轴。</p><h4 id="数据"><a href="#数据" class="headerlink" title="数据"></a>数据</h4><ul><li>数据内容如下表</li></ul><table><thead><tr><th>x1-index</th><th>x2-frameid</th><th>y</th></tr></thead><tbody><tr><td>1</td><td>10</td><td>1</td></tr><tr><td>2</td><td>24</td><td>4</td></tr><tr><td>3</td><td>42</td><td>2</td></tr><tr><td>4</td><td>56</td><td>3</td></tr><tr><td>5</td><td>76</td><td>1</td></tr></tbody></table><p>以上数据存放在文件data.txt 中。</p><h4 id="绘制X2-Y-折线图"><a href="#绘制X2-Y-折线图" class="headerlink" title="绘制X2-Y 折线图"></a>绘制X2-Y 折线图</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!python2</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> fire</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">from</span> glob <span class="keyword">import</span> glob</span><br><span class="line"><span class="comment">#output a finally static picture of network</span></span><br><span class="line"><span class="keyword">import</span> networkx <span class="keyword">as</span> nx</span><br><span class="line"><span class="keyword">import</span> pylab</span><br><span class="line"><span class="keyword">from</span> pprint <span class="keyword">import</span> pprint</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> matplotlib</span><br><span class="line"><span class="keyword">import</span> matplotlib <span class="keyword">as</span> mpl</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#read data</span></span><br><span class="line">fh=open(<span class="string">"data.txt"</span>)</span><br><span class="line"></span><br><span class="line">text = fh.readlines()[<span class="number">1</span>:]</span><br><span class="line"></span><br><span class="line">x1s=map(<span class="keyword">lambda</span> i: i.split()[<span class="number">0</span>],text)</span><br><span class="line">x2s=map(<span class="keyword">lambda</span> i: i.split()[<span class="number">1</span>],text)</span><br><span class="line">y1s=map(<span class="keyword">lambda</span> i: i.split()[<span class="number">2</span>],text)</span><br><span class="line"></span><br><span class="line">fig = plt.figure()</span><br><span class="line"></span><br><span class="line">ax1 = fig.add_subplot(<span class="number">111</span>)</span><br><span class="line">ax1.plot(x2s,y1s)</span><br><span class="line"></span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><h4 id="添加x1坐标"><a href="#添加x1坐标" class="headerlink" title="添加x1坐标"></a>添加x1坐标</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!python2</span></span><br><span class="line"><span class="keyword">import</span> fire</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">from</span> glob <span class="keyword">import</span> glob</span><br><span class="line"><span class="comment">#output a finally static picture of network</span></span><br><span class="line"><span class="keyword">import</span> networkx <span class="keyword">as</span> nx</span><br><span class="line"><span class="keyword">import</span> pylab</span><br><span class="line"><span class="keyword">from</span> pprint <span class="keyword">import</span> pprint</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> matplotlib</span><br><span class="line"><span class="keyword">import</span> matplotlib <span class="keyword">as</span> mpl</span><br><span class="line"></span><br><span class="line"><span class="comment">#read data</span></span><br><span class="line">fh=open(<span class="string">"data.txt"</span>)</span><br><span class="line">text = fh.readlines()[<span class="number">1</span>:]</span><br><span class="line"></span><br><span class="line">x1s=map(<span class="keyword">lambda</span> i: i.split()[<span class="number">0</span>],text)</span><br><span class="line">x2s=map(<span class="keyword">lambda</span> i: i.split()[<span class="number">1</span>],text)</span><br><span class="line">y1s=map(<span class="keyword">lambda</span> i: i.split()[<span class="number">2</span>],text)</span><br><span class="line"></span><br><span class="line">fig = plt.figure()</span><br><span class="line"></span><br><span class="line">ax1 = fig.add_subplot(<span class="number">111</span>)</span><br><span class="line">ax1.plot(x2s,y1s)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ax2 = ax1.twiny()  <span class="comment"># this is the important function</span></span><br><span class="line">ax2.set_xlabel(<span class="string">'frame order from 1'</span>)</span><br><span class="line">ax2.set_xlim(ax1.get_xlim())</span><br><span class="line"><span class="keyword">print</span> <span class="string">"ax1 lim"</span>,ax1.get_xlim()</span><br><span class="line"><span class="keyword">print</span> <span class="string">"ax1 ticks"</span>,ax1.get_xticks()</span><br><span class="line">pprint(x1s)</span><br><span class="line">ax2.set_xticks( ax1.get_xticks())</span><br><span class="line">ax2.set_xticklabels(x1s)</span><br><span class="line"></span><br><span class="line">plt.show()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># refer : https://stackoverflow.com/questions/10514315/how-to-add-a-second-x-axis-in-matplotlib</span></span><br></pre></td></tr></table></figure><h3 id="关键函数"><a href="#关键函数" class="headerlink" title="关键函数"></a>关键函数</h3><ul><li>ax.twiny () 共享Y坐标，添加新的x轴</li><li>ax.twinx () 共享X坐标，添加新的Y轴</li></ul><h4 id="突破点"><a href="#突破点" class="headerlink" title="突破点"></a>突破点</h4><ul><li>获得原来坐标的范围赋予新坐标<br><strong>ax2.set_xlim(ax1.get_xlim())</strong></li><li>获得原来坐标的tick位置赋予新坐标<br><strong>ax2.set_xticks( ax1.get_xticks())</strong></li><li>修改新坐标的ticklabel<br><strong> ax2.set_xticklabels(x1s) </strong></li></ul><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>matplotlib 一切皆有可能。</p><h4 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h4><ol><li><a href="https://stackoverflow.com/questions/10514315/how-to-add-a-second-x-axis-in-matplotlib" target="_blank" rel="noopener">https://stackoverflow.com/questions/10514315/how-to-add-a-second-x-axis-in-matplotlib</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;matplotlib-07-绘制双坐标轴&quot;&gt;&lt;a href=&quot;#matplotlib-07-绘制双坐标轴&quot; class=&quot;headerlink&quot; title=&quot;matplotlib[07]绘制双坐标轴&quot;&gt;&lt;/a&gt;matplotlib[07]绘制双坐标轴&lt;/h3&gt;&lt;
      
    
    </summary>
    
    
      <category term="python" scheme="http://blog.chenzhaoqiang.com/tags/python/"/>
    
      <category term="matplotlib" scheme="http://blog.chenzhaoqiang.com/tags/matplotlib/"/>
    
  </entry>
  
  <entry>
    <title>matplotlib[05]——微信好友的全国分布的热图</title>
    <link href="http://blog.chenzhaoqiang.com/2018/04/06/matplotlib%5B05%5D%E5%9C%B0%E5%9B%BE%E7%83%AD%E5%9B%BE%E2%80%94%E2%80%94%E5%BE%AE%E4%BF%A1%E5%A5%BD%E5%8F%8B%E7%9A%84%E5%85%A8%E5%9B%BD/"/>
    <id>http://blog.chenzhaoqiang.com/2018/04/06/matplotlib[05]地图热图——微信好友的全国/</id>
    <published>2018-04-05T22:32:56.000Z</published>
    <updated>2018-05-29T01:32:47.934Z</updated>
    
    <content type="html"><![CDATA[<h3 id="matplotlib-05-——微信好友的全国分布的热图"><a href="#matplotlib-05-——微信好友的全国分布的热图" class="headerlink" title="matplotlib[05]——微信好友的全国分布的热图"></a>matplotlib[05]——微信好友的全国分布的热图</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>看到朋友圈 “一件有趣的事： 爬了爬自己的微信朋友 ”，看完以后觉得里面缺少了一张中国热图。<br>您的微信朋友遍布全中国了吗？一张热图告诉你。</p><h4 id="主要工具"><a href="#主要工具" class="headerlink" title="主要工具"></a>主要工具</h4><ul><li>安装itchat<br>‘’’<br>python -m pip install itchat<br>‘’’</li><li><p>Excel模板-中国地图填色图.xls</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">链接：https://pan.baidu.com/s/1nwjTW2P 密码：zgik</span><br></pre></td></tr></table></figure></li><li><p>中国的省份 pro_list.txt</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">链接：https://pan.baidu.com/s/1brg0MIz 密码：selo</span><br></pre></td></tr></table></figure></li><li><p>脚本 chinamap.py</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">链接：https://pan.baidu.com/s/1mjAuym8 密码：wjrs</span><br></pre></td></tr></table></figure></li></ul><h4 id="主要代码"><a href="#主要代码" class="headerlink" title="主要代码"></a>主要代码</h4><p>使用不到20行的代码chinamap.py统计您的微信朋友在各个省份的分布。最后输出文件保存在pro_no.txt。<br><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!python2</span></span><br><span class="line"><span class="comment">#coding:utf-8</span></span><br><span class="line"><span class="keyword">import</span> itchat</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> Counter</span><br><span class="line"><span class="keyword">from</span>  pprint <span class="keyword">import</span> pprint</span><br><span class="line">itchat.auto_login(hotReload=<span class="keyword">True</span>)</span><br><span class="line">friends = itchat.get_friends(update=<span class="keyword">True</span>)[<span class="number">0</span>:]</span><br><span class="line"></span><br><span class="line">provinces=[]  <span class="comment"># #获取 所有好友的省份信息</span></span><br><span class="line"><span class="keyword">for</span> friend <span class="keyword">in</span> friends:</span><br><span class="line">    provinces.append(friend[<span class="string">'Province'</span>])</span><br><span class="line"></span><br><span class="line">province_d=Counter(provinces)  <span class="comment">##利用自带的Counter,统计省份出现的次数</span></span><br><span class="line"></span><br><span class="line">pro_list =[ i.strip()  <span class="keyword">for</span> i <span class="keyword">in</span>  open(<span class="string">"pro_list.txt"</span>).readlines()]</span><br><span class="line">fh=open(<span class="string">"pro_no.txt"</span>,<span class="string">'w'</span>)</span><br><span class="line"><span class="keyword">for</span> pro <span class="keyword">in</span> pro_list:</span><br><span class="line">    pro = pro.decode(<span class="string">'utf8'</span>)</span><br><span class="line">    num=  province_d[pro] <span class="keyword">if</span> pro <span class="keyword">in</span> province_d.keys() <span class="keyword">else</span> <span class="number">0</span></span><br><span class="line">    fh.write(str(num)+<span class="string">"\n"</span>)</span><br></pre></td></tr></table></figure></p><p><strong>运行</strong></p><ol><li>把pro_no.txt 和 chinamap.py放到同一个目录下面</li><li>命令行中 python chinamap.py ,就可以生成结果文件pro_no.txt</li></ol><h4 id="制作热图"><a href="#制作热图" class="headerlink" title="制作热图"></a>制作热图</h4><ol><li>打开填色图.xls</li><li>把pro_no.txt 中的结果粘贴过来。</li><li>确定热图的颜色，可以使用默认的。</li><li>修改每个颜色对应的范围a-b</li><li>填写范围的底限a</li><li>点击按钮开始填色。</li></ol><h4 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h4><p>我在贵州、海南、宁夏、青海、西藏还没有朋友了。这里的朋友去哪里了，快到后台留言。</p><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>多条朋友多条路。您的朋友遍布天下了吗？ 如需帮助，后台留言帮忙制作您的朋友全国热图分布。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;matplotlib-05-——微信好友的全国分布的热图&quot;&gt;&lt;a href=&quot;#matplotlib-05-——微信好友的全国分布的热图&quot; class=&quot;headerlink&quot; title=&quot;matplotlib[05]——微信好友的全国分布的热图&quot;&gt;&lt;/a&gt;ma
      
    
    </summary>
    
    
      <category term="python" scheme="http://blog.chenzhaoqiang.com/tags/python/"/>
    
      <category term="matplotlib" scheme="http://blog.chenzhaoqiang.com/tags/matplotlib/"/>
    
  </entry>
  
  <entry>
    <title>matplotlib[04]对象Line2D</title>
    <link href="http://blog.chenzhaoqiang.com/2018/04/05/matplotlib%5B04%5D%E5%AF%B9%E8%B1%A1Line2D/"/>
    <id>http://blog.chenzhaoqiang.com/2018/04/05/matplotlib[04]对象Line2D/</id>
    <published>2018-04-04T22:32:56.000Z</published>
    <updated>2018-05-29T01:32:47.501Z</updated>
    
    <content type="html"><![CDATA[<h3 id="matplotlib-04-对象Line2D"><a href="#matplotlib-04-对象Line2D" class="headerlink" title="matplotlib[04]对象Line2D"></a>matplotlib[04]对象Line2D</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>点、线、面是视觉形态的基本构成元素。上一篇文章中引入了点的动画，这篇文章中我们将介绍线的动画。</p><h4 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h4><h4 id="安装ffmpeg"><a href="#安装ffmpeg" class="headerlink" title="安装ffmpeg"></a>安装ffmpeg</h4><p>下载链接： <a href="https://ffmpeg.zeranoe.com/builds/" target="_blank" rel="noopener">https://ffmpeg.zeranoe.com/builds/</a></p><h4 id="核心代码"><a href="#核心代码" class="headerlink" title="核心代码"></a>核心代码</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">line = Line2D([xlist[0]],[ylist[0]])</span><br><span class="line">ax.add_line(line)</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!python2</span></span><br><span class="line"><span class="comment">#coding: utf-8</span></span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> pylab <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">from</span> matplotlib.animation <span class="keyword">import</span> FuncAnimation</span><br><span class="line"><span class="keyword">from</span> matplotlib.lines <span class="keyword">import</span> Line2D</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> animation</span><br><span class="line">fig, ax = plt.subplots()</span><br><span class="line">fig.set_tight_layout(<span class="keyword">True</span>)</span><br><span class="line">plt.rcParams[<span class="string">'animation.ffmpeg_path'</span>] =<span class="string">u'D:\\Python27_64\\Scripts\\ffmpeg.exe'</span></span><br><span class="line">FFwriter = animation.FFMpegWriter()</span><br><span class="line">plt.rcParams.update(&#123;<span class="string">'font.size'</span>:<span class="number">10</span>&#125;)</span><br><span class="line"></span><br><span class="line">fh=open(<span class="string">"pmf.dat"</span>)</span><br><span class="line">xlist=[]</span><br><span class="line">ylist=[]</span><br><span class="line">barlist=[]</span><br><span class="line">xydict=&#123;&#125;</span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> fh.readlines()[<span class="number">1</span>:]:</span><br><span class="line">    x,y,bar=line.strip().split()</span><br><span class="line">    xydict[x]=y</span><br><span class="line">    x,y,bar=map(float,line.strip().split())</span><br><span class="line">    xlist.append(x)</span><br><span class="line">    ylist.append(y)</span><br><span class="line"></span><br><span class="line">    barlist.append(bar)</span><br><span class="line"></span><br><span class="line"><span class="comment">#http://www.tuicool.com/articles/Z7BzY3V</span></span><br><span class="line"><span class="comment">#plt.legend(loc=2,prop=&#123;'size': 9&#125;)</span></span><br><span class="line">plt.xlabel(<span class="string">'Z (Angstrom)'</span>)</span><br><span class="line">plt.ylabel (<span class="string">'Free Energy (kCal/mol)'</span>)</span><br><span class="line">plt.xlim(<span class="number">0</span>,<span class="number">12</span>)</span><br><span class="line">plt.xticks([<span class="number">0</span>,<span class="number">2</span>,<span class="number">4</span>,<span class="number">6</span>,<span class="number">8</span>,<span class="number">10</span>,<span class="number">12</span>])</span><br><span class="line">plt.ylim(<span class="number">0</span>,<span class="number">12</span>)</span><br><span class="line">plt.yticks([<span class="number">0</span>,<span class="number">2</span>,<span class="number">4</span>,<span class="number">6</span>,<span class="number">8</span>,<span class="number">10</span>,<span class="number">12</span>])</span><br><span class="line"><span class="comment"># plt.plot(xlist,ylist,linewidth = 2.5, color = 'r')</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># how to set line</span></span><br><span class="line"><span class="comment"># Line2D</span></span><br><span class="line">line = Line2D([xlist[<span class="number">0</span>]],[ylist[<span class="number">0</span>]])</span><br><span class="line"></span><br><span class="line">ax.add_line(line)</span><br><span class="line">point_line,=plt.plot(xlist[<span class="number">0</span>],ylist[<span class="number">0</span>],<span class="string">'or'</span>,linewidth = <span class="number">3</span>, color = <span class="string">'#00FF7F'</span>)</span><br><span class="line"><span class="comment"># point_line2,=plt.plot(xlist[0],ylist[0],'or',linewidth = 3, color = '#00FF7F')</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">update</span><span class="params">(i)</span>:</span></span><br><span class="line">    <span class="comment"># pass</span></span><br><span class="line">    line.set_xdata(xlist[<span class="number">0</span>:i])</span><br><span class="line">    line.set_ydata(ylist[<span class="number">0</span>:i])</span><br><span class="line">    <span class="keyword">print</span> i</span><br><span class="line">    <span class="comment">#plt.plot(xlist[0:i],ylist[0:i],linewidth = 2.5, color = 'r')  </span></span><br><span class="line">    <span class="comment"># point_line2.set_xdata(xlist[0:i])</span></span><br><span class="line">    <span class="comment"># point_line2.set_ydata(ylist[0:i])</span></span><br><span class="line">    point_line.set_xdata(xlist[i<span class="number">-1</span>])</span><br><span class="line">    point_line.set_ydata(ylist[i<span class="number">-1</span>])</span><br><span class="line">    <span class="keyword">return</span> point_line</span><br><span class="line"><span class="comment">#http://ffmpeg.zeranoe.com/builds/</span></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line">    anim=FuncAnimation(fig,update,frames=np.arange(<span class="number">0</span>,<span class="number">8</span>),interval=<span class="number">200</span>)</span><br><span class="line">    <span class="comment"># ffmpeg -i small.mp4 small.gif</span></span><br><span class="line">    <span class="comment"># http://note.rpsh.net/posts/2015/04/21/mac-osx-ffmpeg-mp4-gif-convert/</span></span><br><span class="line">    <span class="comment">#anim.save('linetest1.mp4',writer=FFwriter )</span></span><br><span class="line">    <span class="comment"># anim.save('line.gif',writer=FFwriter )</span></span><br><span class="line">    plt.show()</span><br></pre></td></tr></table></figure><h4 id="数据data-pmf-dat"><a href="#数据data-pmf-dat" class="headerlink" title="数据data  pmf.dat"></a>数据data  pmf.dat</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">1 7.2725 1</span><br><span class="line">2 7.1284 2</span><br><span class="line">3 7.0523 3</span><br><span class="line">4 6.9731 3</span><br><span class="line">5 6.8909 4</span><br><span class="line">6 6.7982 4</span><br><span class="line">7 6.7207 5</span><br><span class="line">8 6.6218 6</span><br><span class="line">9 6.5092 7</span><br></pre></td></tr></table></figure><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>图是由各种元素组成的。制作动画的前提是正确定位到该对象。对象的变化更新就形成了所谓的动画。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;matplotlib-04-对象Line2D&quot;&gt;&lt;a href=&quot;#matplotlib-04-对象Line2D&quot; class=&quot;headerlink&quot; title=&quot;matplotlib[04]对象Line2D&quot;&gt;&lt;/a&gt;matplotlib[04]对象Line
      
    
    </summary>
    
    
      <category term="python" scheme="http://blog.chenzhaoqiang.com/tags/python/"/>
    
      <category term="matplotlib" scheme="http://blog.chenzhaoqiang.com/tags/matplotlib/"/>
    
  </entry>
  
  <entry>
    <title>matplotlib[03]python 绘制动画animation</title>
    <link href="http://blog.chenzhaoqiang.com/2018/04/04/matplotlib%5B03%5D%E5%8A%A8%E7%94%BBanimation/"/>
    <id>http://blog.chenzhaoqiang.com/2018/04/04/matplotlib[03]动画animation/</id>
    <published>2018-04-03T22:32:56.000Z</published>
    <updated>2018-05-29T01:32:47.501Z</updated>
    
    <content type="html"><![CDATA[<h3 id="matplotlib-03-python-绘制动画animation"><a href="#matplotlib-03-python-绘制动画animation" class="headerlink" title="matplotlib[03]python 绘制动画animation"></a>matplotlib[03]python 绘制动画animation</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>一图胜千言，动画胜百图。python中的matplotlib可以快速绘制gif动画。</p><h4 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h4><p>安装matplotlib</p><blockquote><p>python -m pip install matplotlib   </p></blockquote><p>安装 ffmpeg，为了保存gif图片</p><blockquote><p><a href="https://www.ffmpeg.org/download.html#build-windows" target="_blank" rel="noopener">https://www.ffmpeg.org/download.html#build-windows</a></p></blockquote><p><strong>在win中如果保存gif出错，可以先保存为mp4,然后利用ffmpeg命令转化为gif动画。</strong></p><blockquote><p>H:\file&gt; ffmpeg.exe -i .\line.mp4 line.gif</p></blockquote><h4 id="DEMO"><a href="#DEMO" class="headerlink" title="DEMO"></a>DEMO</h4><ul><li>小球滚动动画   </li></ul><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">#!python2</span></span><br><span class="line"><span class="comment">#coding: utf-8</span></span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> pylab <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">from</span> matplotlib.animation <span class="keyword">import</span> FuncAnimation</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> animation</span><br><span class="line">fig, ax = plt.subplots()</span><br><span class="line">fig.set_tight_layout(<span class="keyword">True</span>)</span><br><span class="line">plt.rcParams[<span class="string">'animation.ffmpeg_path'</span>] =<span class="string">u'D:\\Python27\\Scripts\\ffmpeg.exe'</span></span><br><span class="line">FFwriter = animation.FFMpegWriter()</span><br><span class="line"></span><br><span class="line">fh=open(<span class="string">"pmf.dat"</span>)</span><br><span class="line">xlist=[]</span><br><span class="line">ylist=[]</span><br><span class="line">barlist=[]</span><br><span class="line">xydict=&#123;&#125;</span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> fh.readlines()[<span class="number">1</span>:]:</span><br><span class="line">    x,y,bar=line.strip().split()</span><br><span class="line">    xydict[x]=y</span><br><span class="line">    x,y,bar=map(float,line.strip().split())</span><br><span class="line">    xlist.append(x)</span><br><span class="line">    ylist.append(y)</span><br><span class="line"></span><br><span class="line">    barlist.append(bar)</span><br><span class="line"></span><br><span class="line"><span class="comment">#http://www.tuicool.com/articles/Z7BzY3V</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">plt.plot(xlist,ylist)</span><br><span class="line"><span class="comment">#polygoncollection</span></span><br><span class="line">point_line,=plt.plot(xlist[<span class="number">0</span>],ylist[<span class="number">0</span>],<span class="string">'or'</span>)</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">update</span><span class="params">(i)</span>:</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line">    point_line.set_xdata(xlist[i])</span><br><span class="line">    point_line.set_ydata(ylist[i])</span><br><span class="line">    <span class="keyword">return</span> point_line</span><br><span class="line"><span class="comment">#http://ffmpeg.zeranoe.com/builds/</span></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line">    anim=FuncAnimation(fig,update,frames=np.arange(<span class="number">0</span>,<span class="number">99</span>),interval=<span class="number">200</span>)</span><br><span class="line">    <span class="comment"># ffmpeg -i small.mp4 small.gif</span></span><br><span class="line">    <span class="comment"># http://note.rpsh.net/posts/2015/04/21/mac-osx-ffmpeg-mp4-gif-convert/</span></span><br><span class="line">    anim.save(<span class="string">'line.mp4'</span>,writer=FFwriter )</span><br><span class="line">    anim.save(<span class="string">'line.gif'</span>,writer=FFwriter )</span><br><span class="line">    <span class="comment"># plt.show()</span></span><br></pre></td></tr></table></figure><h4 id="核心思想"><a href="#核心思想" class="headerlink" title="核心思想"></a>核心思想</h4><p>matplotlib中的一切元素都是对象，设置动画的关键就是选择合适的对象。</p><ul><li>首先创建一张静态图，动画的第一帧</li><li>在第一帧上面包含一个对象，通过设置该对象的属性可以实现动画</li></ul><h4 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h4><ol><li><a href="http://www.tuicool.com/articles/Z7BzY3V" target="_blank" rel="noopener">http://www.tuicool.com/articles/Z7BzY3V</a></li><li><a href="http://ffmpeg.zeranoe.com/builds/" target="_blank" rel="noopener">http://ffmpeg.zeranoe.com/builds/</a></li><li><a href="http://note.rpsh.net/posts/2015/04/21/mac-osx-ffmpeg-mp4-gif-convert/" target="_blank" rel="noopener">http://note.rpsh.net/posts/2015/04/21/mac-osx-ffmpeg-mp4-gif-convert/</a></li></ol><h4 id="素材文件-pmf-txt"><a href="#素材文件-pmf-txt" class="headerlink" title="素材文件 pmf.txt"></a>素材文件 pmf.txt</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><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br></pre></td><td class="code"><pre><span class="line">x            y           bar</span><br><span class="line"><span class="number">20.41195</span><span class="number">2.74</span>         <span class="number">0</span></span><br><span class="line"><span class="number">20.78465</span><span class="number">1.37592</span>      <span class="number">0.7196</span></span><br><span class="line"><span class="number">21.15736</span><span class="number">0.76087</span>      <span class="number">0.74207</span></span><br><span class="line"><span class="number">21.53007</span><span class="number">0.3116</span>       <span class="number">0.72869</span></span><br><span class="line"><span class="number">21.90277</span><span class="number">0.05602</span>      <span class="number">0.73386</span></span><br><span class="line"><span class="number">22.27548</span><span class="number">0.05348</span>      <span class="number">0.75097</span></span><br><span class="line"><span class="number">22.64819</span><span class="number">0.08492</span>      <span class="number">0.74599</span></span><br><span class="line"><span class="number">23.02089</span><span class="number">0.0985</span>       <span class="number">0.71082</span></span><br><span class="line"><span class="number">23.3936</span><span class="number">0.06613</span>          <span class="number">0.70322</span></span><br><span class="line"><span class="number">23.7663</span><span class="number">0.14481</span>          <span class="number">0.69655</span></span><br><span class="line"><span class="number">24.13901</span><span class="number">0.3257</span>       <span class="number">0.72263</span></span><br><span class="line"><span class="number">24.51172</span><span class="number">0.27692</span>      <span class="number">0.72225</span></span><br><span class="line"><span class="number">24.88442</span><span class="number">0.25218</span>      <span class="number">0.72751</span></span><br><span class="line"><span class="number">25.25713</span><span class="number">0.36809</span>      <span class="number">0.74037</span></span><br><span class="line"><span class="number">25.62984</span><span class="number">0.55323</span>      <span class="number">0.75481</span></span><br><span class="line"><span class="number">26.00254</span><span class="number">0.72995</span>      <span class="number">0.74839</span></span><br><span class="line"><span class="number">26.37525</span><span class="number">0.94172</span>      <span class="number">0.74698</span></span><br><span class="line"><span class="number">26.74796</span><span class="number">1.13001</span>      <span class="number">0.73844</span></span><br><span class="line"><span class="number">27.12066</span><span class="number">1.2329</span>       <span class="number">0.72841</span></span><br><span class="line"><span class="number">27.49337</span><span class="number">1.25246</span>      <span class="number">0.72547</span></span><br><span class="line"><span class="number">27.86608</span><span class="number">1.22187</span>      <span class="number">0.70788</span></span><br><span class="line"><span class="number">28.23878</span><span class="number">1.19993</span>      <span class="number">0.70379</span></span><br><span class="line"><span class="number">28.61149</span><span class="number">1.06911</span>      <span class="number">0.69691</span></span><br><span class="line"><span class="number">28.98419</span><span class="number">0.90244</span>      <span class="number">0.68734</span></span><br><span class="line"><span class="number">29.3569</span><span class="number">0.89425</span>          <span class="number">0.69907</span></span><br><span class="line"><span class="number">29.72961</span><span class="number">0.91524</span>      <span class="number">0.71852</span></span><br><span class="line"><span class="number">30.10231</span><span class="number">0.75044</span>      <span class="number">0.696</span></span><br><span class="line"><span class="number">30.47502</span><span class="number">0.58894</span>      <span class="number">0.69201</span></span><br><span class="line"><span class="number">30.84773</span><span class="number">0.45604</span>      <span class="number">0.67034</span></span><br><span class="line"><span class="number">31.22043</span><span class="number">0.42346</span>      <span class="number">0.65023</span></span><br><span class="line"><span class="number">31.59314</span><span class="number">0.4405</span>       <span class="number">0.65072</span></span><br><span class="line"><span class="number">31.96585</span><span class="number">0.33601</span>      <span class="number">0.63975</span></span><br><span class="line"><span class="number">32.33855</span><span class="number">0.20371</span>      <span class="number">0.62343</span></span><br><span class="line"><span class="number">32.71126</span><span class="number">0.17893</span>      <span class="number">0.62964</span></span><br><span class="line"><span class="number">33.08396</span><span class="number">0.05549</span>      <span class="number">0.61188</span></span><br><span class="line"><span class="number">33.45667</span><span class="number">-0.00328</span>     <span class="number">0.60007</span></span><br><span class="line"><span class="number">33.82938</span><span class="number">0.12251</span>      <span class="number">0.61449</span></span><br><span class="line"><span class="number">34.20208</span><span class="number">0.25589</span>      <span class="number">0.62247</span></span><br><span class="line"><span class="number">34.57479</span><span class="number">0.42555</span>      <span class="number">0.65859</span></span><br><span class="line"><span class="number">34.9475</span>    <span class="number">0.61604</span>      <span class="number">0.64286</span></span><br><span class="line"><span class="number">35.3202</span>    <span class="number">0.614</span>        <span class="number">0.64946</span></span><br><span class="line"><span class="number">35.69291</span><span class="number">0.57622</span>      <span class="number">0.66402</span></span><br><span class="line"><span class="number">36.06562</span><span class="number">0.58349</span>      <span class="number">0.65839</span></span><br><span class="line"><span class="number">36.43832</span><span class="number">0.58438</span>      <span class="number">0.63197</span></span><br><span class="line"><span class="number">36.81103</span><span class="number">0.65653</span>      <span class="number">0.65727</span></span><br><span class="line"><span class="number">37.18373</span><span class="number">0.83727</span>      <span class="number">0.70999</span></span><br><span class="line"><span class="number">37.55644</span><span class="number">1.08881</span>      <span class="number">0.72572</span></span><br><span class="line"><span class="number">37.92915</span><span class="number">1.60682</span>      <span class="number">0.8742</span></span><br><span class="line"><span class="number">38.30185</span><span class="number">2.10805</span>      <span class="number">0.84269</span></span><br><span class="line"><span class="number">38.67456</span><span class="number">2.42247</span>      <span class="number">0.83927</span></span><br><span class="line"><span class="number">39.04727</span><span class="number">2.75899</span>      <span class="number">0.81526</span></span><br><span class="line"><span class="number">39.41997</span><span class="number">3.09685</span>      <span class="number">0.79483</span></span><br><span class="line"><span class="number">39.79268</span><span class="number">3.3616</span>       <span class="number">0.78948</span></span><br><span class="line"><span class="number">40.16539</span><span class="number">3.61108</span>      <span class="number">0.79816</span></span><br><span class="line"><span class="number">40.53809</span><span class="number">3.87369</span>      <span class="number">0.7951</span></span><br><span class="line"><span class="number">40.9108</span>    <span class="number">4.0805</span>       <span class="number">0.77054</span></span><br><span class="line"><span class="number">41.28351</span><span class="number">4.216</span>        <span class="number">0.76996</span></span><br><span class="line"><span class="number">41.65621</span><span class="number">4.3389</span>       <span class="number">0.77383</span></span><br><span class="line"><span class="number">42.02892</span><span class="number">4.44717</span>      <span class="number">0.76177</span></span><br><span class="line"><span class="number">42.40162</span><span class="number">4.71326</span>      <span class="number">0.74032</span></span><br><span class="line"><span class="number">42.77433</span><span class="number">5.11622</span>      <span class="number">0.72166</span></span><br><span class="line"><span class="number">43.14704</span><span class="number">5.39028</span>      <span class="number">0.71028</span></span><br><span class="line"><span class="number">43.51974</span><span class="number">5.48795</span>      <span class="number">0.73882</span></span><br><span class="line"><span class="number">43.89245</span><span class="number">5.64299</span>      <span class="number">0.7484</span></span><br><span class="line"><span class="number">44.26516</span><span class="number">5.76421</span>      <span class="number">0.75824</span></span><br><span class="line"><span class="number">44.63786</span><span class="number">5.85875</span>      <span class="number">0.75837</span></span><br><span class="line"><span class="number">45.01057</span><span class="number">6.02089</span>      <span class="number">0.76564</span></span><br><span class="line"><span class="number">45.38328</span><span class="number">6.19278</span>      <span class="number">0.75816</span></span><br><span class="line"><span class="number">45.75598</span><span class="number">6.26079</span>      <span class="number">0.76254</span></span><br><span class="line"><span class="number">46.12869</span><span class="number">6.25071</span>      <span class="number">0.75838</span></span><br><span class="line"><span class="number">46.50139</span><span class="number">6.23831</span>      <span class="number">0.75017</span></span><br><span class="line"><span class="number">46.8741</span>    <span class="number">6.20682</span>      <span class="number">0.75129</span></span><br><span class="line"><span class="number">47.24681</span><span class="number">6.24886</span>      <span class="number">0.77286</span></span><br><span class="line"><span class="number">47.61951</span><span class="number">6.3017</span>       <span class="number">0.76859</span></span><br><span class="line"><span class="number">47.99222</span><span class="number">6.43433</span>      <span class="number">0.76982</span></span><br><span class="line"><span class="number">48.36493</span><span class="number">6.56277</span>      <span class="number">0.77959</span></span><br><span class="line"><span class="number">48.73763</span><span class="number">6.59075</span>      <span class="number">0.79015</span></span><br><span class="line"><span class="number">49.11034</span><span class="number">6.58024</span>      <span class="number">0.7903</span></span><br><span class="line"><span class="number">49.48305</span><span class="number">6.56504</span>      <span class="number">0.7857</span></span><br><span class="line"><span class="number">49.85575</span><span class="number">6.57508</span>      <span class="number">0.77676</span></span><br><span class="line"><span class="number">50.22846</span><span class="number">6.61263</span>      <span class="number">0.78518</span></span><br><span class="line"><span class="number">50.60116</span><span class="number">6.55328</span>      <span class="number">0.77659</span></span><br><span class="line"><span class="number">50.97387</span><span class="number">6.52119</span>      <span class="number">0.77264</span></span><br><span class="line"><span class="number">51.34658</span><span class="number">6.54181</span>      <span class="number">0.77423</span></span><br><span class="line"><span class="number">51.71928</span><span class="number">6.53653</span>      <span class="number">0.77963</span></span><br><span class="line"><span class="number">52.09199</span><span class="number">6.49281</span>      <span class="number">0.78699</span></span><br><span class="line"><span class="number">52.4647</span>    <span class="number">6.44565</span>      <span class="number">0.79181</span></span><br><span class="line"><span class="number">52.8374</span>    <span class="number">6.41955</span>      <span class="number">0.79063</span></span><br><span class="line"><span class="number">53.21011</span><span class="number">6.40472</span>      <span class="number">0.79415</span></span><br><span class="line"><span class="number">53.58282</span><span class="number">6.36367</span>      <span class="number">0.8039</span></span><br><span class="line"><span class="number">53.95552</span><span class="number">6.36215</span>      <span class="number">0.79789</span></span><br><span class="line"><span class="number">54.32823</span><span class="number">6.37414</span>      <span class="number">0.80248</span></span><br><span class="line"><span class="number">54.70094</span><span class="number">6.36651</span>      <span class="number">0.79711</span></span><br><span class="line"><span class="number">55.07364</span><span class="number">6.39756</span>      <span class="number">0.7919</span></span><br><span class="line"><span class="number">55.44635</span><span class="number">6.4867</span>       <span class="number">0.78849</span></span><br><span class="line"><span class="number">55.81905</span><span class="number">6.51402</span>      <span class="number">0.79147</span></span><br><span class="line"><span class="number">56.19176</span><span class="number">6.48499</span>      <span class="number">0.79197</span></span><br><span class="line"><span class="number">56.56447</span><span class="number">6.41461</span>      <span class="number">0.79307</span></span><br><span class="line"><span class="number">56.93717</span><span class="number">6.26777</span>      <span class="number">0.78993</span></span><br><span class="line"><span class="number">57.30988</span><span class="number">6.65838</span>      <span class="number">0.72711</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;matplotlib-03-python-绘制动画animation&quot;&gt;&lt;a href=&quot;#matplotlib-03-python-绘制动画animation&quot; class=&quot;headerlink&quot; title=&quot;matplotlib[03]python 绘制动
      
    
    </summary>
    
    
      <category term="python" scheme="http://blog.chenzhaoqiang.com/tags/python/"/>
    
      <category term="matplotlib" scheme="http://blog.chenzhaoqiang.com/tags/matplotlib/"/>
    
  </entry>
  
  <entry>
    <title>HOW2PY2[09] Windows中如何如何快速简单安装python模块</title>
    <link href="http://blog.chenzhaoqiang.com/2018/03/10/How2py%5B09%5D%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85python%E6%A8%A1%E5%9D%97/"/>
    <id>http://blog.chenzhaoqiang.com/2018/03/10/How2py[09]如何安装python模块/</id>
    <published>2018-03-09T22:32:56.000Z</published>
    <updated>2018-04-07T03:03:27.897Z</updated>
    
    <content type="html"><![CDATA[<h3 id="HOW2PY-09-Windows中如何如何快速简单安装python模块"><a href="#HOW2PY-09-Windows中如何如何快速简单安装python模块" class="headerlink" title="HOW2PY[09] Windows中如何如何快速简单安装python模块"></a>HOW2PY[09] Windows中如何如何快速简单安装python模块</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>python 的流行，得益于其强大的模块库。借助pip,可快速安装大量优秀的模块。</p><h4 id="必备条件"><a href="#必备条件" class="headerlink" title="必备条件"></a>必备条件</h4><ul><li>win系统</li><li>python2请使用2.7版本，python3 可以使用任一版本。</li><li>参考 HOW2PY[01]教程 配置好python的环境变量</li><li>pip  </li></ul><h4 id="检查是否有pip"><a href="#检查是否有pip" class="headerlink" title="检查是否有pip"></a>检查是否有pip</h4><p>在cmd窗口中<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python -m pip -V</span><br></pre></td></tr></table></figure></p><p>如果能看到pip的版本，则说明电脑中安装有pip。<br>如果没有pip,则按照下面的办法进行安装，首先下载get-pip.py，<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">get-pip.py  https://pan.baidu.com/s/1dHk0Cq1</span><br></pre></td></tr></table></figure></p><p>在cmd中运行<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python get-pip.py</span><br></pre></td></tr></table></figure></p><h4 id="模块安装方法"><a href="#模块安装方法" class="headerlink" title="模块安装方法"></a>模块安装方法</h4><ul><li>模块名方法<br>该类型模块通常是用python直接编写，在cmd窗口中直接输入如下命令<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python -m pip install  module_name</span><br></pre></td></tr></table></figure></li></ul><p>举例子<br><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">python -m pip install flask         </span><br><span class="line">python -m pip install scrapy</span><br></pre></td></tr></table></figure></p><ul><li>whl文件法<br>该类型模块底层往往是通过C/C++所编写，因此建议从uci wheel 官网中找到python版本以及系统对应的包，<br>然后下载该wheel文件。<br>uci wheel官网：  <strong> <a href="https://www.lfd.uci.edu/~gohlke/pythonlibs/" target="_blank" rel="noopener">https://www.lfd.uci.edu/~gohlke/pythonlibs/</a> </strong><br>在wheel文件夹下面打开cmd窗口，然后通过如下命令安装：<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python -m pip install xxx.whl</span><br></pre></td></tr></table></figure></li></ul><p>举例子<br>下载django,  <strong><a href="https://download.lfd.uci.edu/pythonlibs/rqr3k8is/Django-1.11.9-py2.py3-none-any.whl" target="_blank" rel="noopener">https://download.lfd.uci.edu/pythonlibs/rqr3k8is/Django-1.11.9-py2.py3-none-any.whl</a></strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python -m pip install .\Django-1.11.9-py2.py3-none-any.whl</span><br></pre></td></tr></table></figure></p><h4 id="建议安装模块顺序"><a href="#建议安装模块顺序" class="headerlink" title="建议安装模块顺序"></a>建议安装模块顺序</h4><p>首先尝试模块名方法，如果不成功，再尝试whl方法。<br>这2个方法都失败，请考虑更换模块。</p><h4 id="作业"><a href="#作业" class="headerlink" title="作业"></a>作业</h4><p>请在你电脑上，安装如下模块：</p><ul><li>requests</li><li>scrapy</li><li>scipy</li><li>matplotlib</li><li>sklearn</li></ul><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>合理使用模块，提高编程效率。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;HOW2PY-09-Windows中如何如何快速简单安装python模块&quot;&gt;&lt;a href=&quot;#HOW2PY-09-Windows中如何如何快速简单安装python模块&quot; class=&quot;headerlink&quot; title=&quot;HOW2PY[09] Windows中如
      
    
    </summary>
    
    
      <category term="how2py2" scheme="http://blog.chenzhaoqiang.com/tags/how2py2/"/>
    
      <category term="python2" scheme="http://blog.chenzhaoqiang.com/tags/python2/"/>
    
  </entry>
  
  <entry>
    <title>HOW2PY2[06]常用内置函数</title>
    <link href="http://blog.chenzhaoqiang.com/2018/03/07/HOW2PY%5B05%5D%E5%B8%B8%E7%94%A8%E5%86%85%E7%BD%AE%E5%87%BD%E6%95%B0/"/>
    <id>http://blog.chenzhaoqiang.com/2018/03/07/HOW2PY[05]常用内置函数/</id>
    <published>2018-03-06T22:32:56.000Z</published>
    <updated>2018-04-07T03:03:27.912Z</updated>
    
    <content type="html"><![CDATA[<h3 id="HOW2PY-06-常用内置函数"><a href="#HOW2PY-06-常用内置函数" class="headerlink" title="HOW2PY[06]常用内置函数"></a>HOW2PY[06]常用内置函数</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>函数/方法（算法）是程序的灵魂，python 自身提供了大量有用的函数供我们使用，节省我们大量的时间。<br>如何掌握内置函数，一个方法：多记，多用。就想背单词一样，很快就会记住。</p><h4 id="常用内置函数"><a href="#常用内置函数" class="headerlink" title="常用内置函数"></a>常用内置函数</h4><p>函数和方法的区别在于函数是独立的，而方法是依赖于对象的。<br>形式上有如下区别：<br><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">function(args)   <span class="comment"># 函数的形式</span></span><br><span class="line">obj.method(args) <span class="comment"># 方法的形式</span></span><br></pre></td></tr></table></figure></p><ul><li><p>abs 求绝对值的</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">print</span> abs(<span class="number">-10</span>)   <span class="comment"># output: 10</span></span><br></pre></td></tr></table></figure></li><li><p>len  求列表（数组）的长度</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">aa =[<span class="number">1</span>,<span class="number">2</span>,<span class="string">"adfs"</span>,<span class="string">"xxx"</span>]</span><br><span class="line"><span class="keyword">print</span> len(aa)    <span class="comment"># output: 4</span></span><br></pre></td></tr></table></figure></li><li><p>min 求最小数</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">nums=[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>]</span><br><span class="line"><span class="keyword">print</span> min[nums]  <span class="comment"># output: 1</span></span><br></pre></td></tr></table></figure></li><li><p>range 按照规则产生列表</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"><span class="keyword">print</span> range(<span class="number">4</span>)      <span class="comment"># output:   0 1 2 3 4</span></span><br><span class="line"><span class="keyword">print</span> range(<span class="number">1</span>,<span class="number">10</span>,<span class="number">2</span>) <span class="comment"># output   1 3  5 7 9</span></span><br></pre></td></tr></table></figure></li><li><p>set  列表转集合，列表可以有重复元素，集合没有重复元素。</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">li =[<span class="number">11</span>,<span class="number">2</span>,<span class="number">11</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">2</span>]</span><br><span class="line">num =set(li)</span><br><span class="line"><span class="keyword">print</span> num  <span class="comment"># 11 2  3 4</span></span><br></pre></td></tr></table></figure></li><li><p>sorted 排序<br>sorted是函数，sort 是方法。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">nums=[2,3,1,5,4]</span><br><span class="line">num_sorted = sorted(nums)</span><br><span class="line">print num_sorted  # output:  1 2 3 4 5</span><br></pre></td></tr></table></figure></li></ul><h4 id="常用内置方法"><a href="#常用内置方法" class="headerlink" title="常用内置方法"></a>常用内置方法</h4><h5 id="对象是字符串str1-”-I-love-you-SH-“"><a href="#对象是字符串str1-”-I-love-you-SH-“" class="headerlink" title="对象是字符串str1=” I love you, SH      “"></a>对象是字符串str1=” I love you, SH      “</h5><ul><li><p>strip  去除首尾的空格,包含换行符合，tab空格</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">str1=<span class="string">" I love you, SH      "</span></span><br><span class="line"><span class="keyword">print</span> str1.strip()  <span class="comment">#I love you, SH</span></span><br></pre></td></tr></table></figure></li><li><p>split 把字符串切割成列表</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">str1=<span class="string">" I love you, SH      "</span></span><br><span class="line">str2=str1.strip()  <span class="comment">#I love you, SH</span></span><br><span class="line">li = str2.split()  </span><br><span class="line"><span class="keyword">print</span> li[<span class="number">1</span>]   <span class="comment"># love</span></span><br></pre></td></tr></table></figure></li></ul><h5 id="对象是列表"><a href="#对象是列表" class="headerlink" title="对象是列表"></a>对象是列表</h5><ul><li><p>append 添加元素到列表中</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">li =[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line">li.append(<span class="string">"me"</span>)</span><br><span class="line"><span class="keyword">print</span> li         <span class="comment"># output 1 2 3 "me"</span></span><br></pre></td></tr></table></figure></li><li><p>pop 从列表中取出元素，列表也会更新。</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">li=[<span class="number">11</span>,<span class="number">9</span>,<span class="number">2</span>,<span class="number">4</span>,<span class="number">10</span>,<span class="number">7</span>]</span><br><span class="line"><span class="keyword">print</span> li.pop()  <span class="comment">#  默认是取出最后一个元素 7</span></span><br><span class="line"><span class="keyword">print</span> li        <span class="comment">#  现在的列表是  [11,9,2,4,10]</span></span><br><span class="line"><span class="keyword">print</span> li.pop(<span class="number">0</span>) <span class="comment"># 通过索引取出第一个元素 11</span></span><br><span class="line"><span class="keyword">print</span> li        <span class="comment">#  现在的列表是  [9,2,4,10]</span></span><br></pre></td></tr></table></figure></li></ul><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>熟练使用内置函数，提供工作效率。更多重要的内置函数正在补充中… …。未完待续。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;HOW2PY-06-常用内置函数&quot;&gt;&lt;a href=&quot;#HOW2PY-06-常用内置函数&quot; class=&quot;headerlink&quot; title=&quot;HOW2PY[06]常用内置函数&quot;&gt;&lt;/a&gt;HOW2PY[06]常用内置函数&lt;/h3&gt;&lt;h4 id=&quot;摘要&quot;&gt;&lt;a hr
      
    
    </summary>
    
    
      <category term="how2py2" scheme="http://blog.chenzhaoqiang.com/tags/how2py2/"/>
    
      <category term="python2" scheme="http://blog.chenzhaoqiang.com/tags/python2/"/>
    
  </entry>
  
  <entry>
    <title>HOW2PY2[01]helloworld</title>
    <link href="http://blog.chenzhaoqiang.com/2018/03/02/HOW2PY%5B01%5Dhelloworld/"/>
    <id>http://blog.chenzhaoqiang.com/2018/03/02/HOW2PY[01]helloworld/</id>
    <published>2018-03-01T22:32:56.000Z</published>
    <updated>2018-04-07T03:03:28.684Z</updated>
    
    <content type="html"><![CDATA[<h3 id="HOW2PY-01-helloworld"><a href="#HOW2PY-01-helloworld" class="headerlink" title="HOW2PY[01]helloworld"></a>HOW2PY[01]helloworld</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>为了帮助大家更快的学习python，更容易的学习python，我精心设计了how2py教程系列。<br>首先第一课就是用python输出Hello,World。包含了python的下载，配置，验证3个过程。</p><h4 id="学习提示"><a href="#学习提示" class="headerlink" title="学习提示"></a>学习提示</h4><p>如果你从来没有安装过python, 建议你卸载python,然后根据下面的教程尝试安装。<br>如果你熟悉安装过程，建议你跳过该小节，把时间花在其他内容上。</p><h5 id="下载"><a href="#下载" class="headerlink" title="下载"></a>下载</h5><p>百度云<br>链接：<a href="https://pan.baidu.com/s/1boYw8c3" target="_blank" rel="noopener">https://pan.baidu.com/s/1boYw8c3</a><br>密码：6cp5</p><h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><p>建议安装到D盘python27文件夹下面。</p><h4 id="测试python是否在环境变量Path中"><a href="#测试python是否在环境变量Path中" class="headerlink" title="测试python是否在环境变量Path中"></a>测试python是否在环境变量Path中</h4><p>建议在D盘下面建立一个文件夹how2py。<br>进入how2py文件夹，按住shift+鼠标右键，然后选择cmd窗口或者PowerShell窗口。<br>然后输入python -V，如果能看到python的版本则说明安装成功。</p><p>如果报错，则按照下面的方法，将python 添加到环境变量中。</p><h4 id="测试helloworld-py"><a href="#测试helloworld-py" class="headerlink" title="测试helloworld.py"></a>测试helloworld.py</h4><p>在how2py 文件夹中建立helloworld.py 文件，然后写入如下内容：</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"><span class="comment">#!python2</span></span><br><span class="line"><span class="comment">#coding: utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> <span class="string">"hello world"</span></span><br></pre></td></tr></table></figure><p>运行：<br>首先鼠标左键点击在how2py 文件夹的空白处，然后按住shift+鼠标右键，然后选择cmd窗口或者PowerShell窗口。<br>输入python hellowold.py 即可运行。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">helloworld.py 文件下载链接：  https://pan.baidu.com/s/1bpsFuu7</span><br></pre></td></tr></table></figure><h4 id="知识点总结"><a href="#知识点总结" class="headerlink" title="知识点总结"></a>知识点总结</h4><ol><li>安装python</li><li>环境变量Path</li><li>运行python脚本<br>如果不能成功运行helloworld.py脚本，请及时寻求周围人或者我的帮助。</li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;HOW2PY-01-helloworld&quot;&gt;&lt;a href=&quot;#HOW2PY-01-helloworld&quot; class=&quot;headerlink&quot; title=&quot;HOW2PY[01]helloworld&quot;&gt;&lt;/a&gt;HOW2PY[01]helloworld&lt;/h3&gt;&lt;
      
    
    </summary>
    
    
      <category term="how2py2" scheme="http://blog.chenzhaoqiang.com/tags/how2py2/"/>
    
      <category term="python2" scheme="http://blog.chenzhaoqiang.com/tags/python2/"/>
    
  </entry>
  
  <entry>
    <title>HOW2PY2[02]变量</title>
    <link href="http://blog.chenzhaoqiang.com/2018/03/02/HOW2PY%5B02%5D%E5%8F%98%E9%87%8F/"/>
    <id>http://blog.chenzhaoqiang.com/2018/03/02/HOW2PY[02]变量/</id>
    <published>2018-03-01T22:32:56.000Z</published>
    <updated>2018-04-07T03:03:28.328Z</updated>
    
    <content type="html"><![CDATA[<h3 id="HOW2PY-02-变量"><a href="#HOW2PY-02-变量" class="headerlink" title="HOW2PY[02]变量"></a>HOW2PY[02]变量</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>变量是一切程序的基本元素，用来存放数据。选择合适的变量类型，存放合适的数据。<br>python 中常用的数据类型，主要包括标量、数组、字典。</p><h4 id="标量"><a href="#标量" class="headerlink" title="标量"></a>标量</h4><p>python 作为动态语言，变量不需要指定类型。<br><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">a = <span class="number">12345</span>         <span class="comment"># 整数</span></span><br><span class="line">a = <span class="string">"pythonperl"</span>  <span class="comment"># 字符串</span></span><br></pre></td></tr></table></figure></p><h4 id="数组"><a href="#数组" class="headerlink" title="数组"></a>数组</h4><p>python 作为动态语言，不需要指定数组大小。数组中的元素可以是任意对象。<br><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></pre></td><td class="code"><pre><span class="line">a = <span class="string">"pythonVSperl"</span>      <span class="comment"># 字符串</span></span><br><span class="line">b = <span class="string">"pythonperl"</span>        <span class="comment"># 字符串</span></span><br><span class="line">c = <span class="number">110</span>                 <span class="comment"># 数字</span></span><br><span class="line">array1 = [a,b,c]        <span class="comment"># 数组 ； 其成员有字符串、数字等类型</span></span><br><span class="line">array2 =[array1,a,b,c]  <span class="comment"># # 数组 ； 其成员有数组、字符串、数字等类型</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#访问数组中的成员，索引从0开始</span></span><br><span class="line"><span class="keyword">print</span> array1[<span class="number">0</span>]        <span class="comment">#output:  pythonVSperl</span></span><br><span class="line"><span class="keyword">print</span> array2[<span class="number">0</span>][<span class="number">1</span>]     <span class="comment">#output:  pythonperl</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#追加元素到数组 append</span></span><br><span class="line"> array1.append(<span class="string">"newstring"</span>)  <span class="comment"># pythonVSperl  pythonperl  110  newstring</span></span><br></pre></td></tr></table></figure></p><h4 id="字典"><a href="#字典" class="headerlink" title="字典"></a>字典</h4><p>字典key-value的数据结构，利用字典可以实现搜索功能，提高工作效率。<br>一般是把数据转成字典，然后进行查询使用。其中value可以是一切变量类型。<br><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#大括号申明空字典</span></span><br><span class="line">dd =&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加键值对</span></span><br><span class="line">dd[<span class="string">'word'</span>] =<span class="number">198</span></span><br><span class="line">dd[<span class="string">'home'</span>] =<span class="number">110</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#获取所有的键</span></span><br><span class="line"><span class="keyword">print</span> dd.keys()</span><br><span class="line"></span><br><span class="line"><span class="comment">#获取所有的值</span></span><br><span class="line"><span class="keyword">print</span> dd.values()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查询某个值</span></span><br><span class="line"><span class="keyword">print</span> dd[<span class="string">'home'</span>]</span><br></pre></td></tr></table></figure></p><h4 id="附加题001"><a href="#附加题001" class="headerlink" title="附加题001"></a>附加题001</h4><p>等学习了文本读取，再来思考这道题目。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">chen  11</span><br><span class="line">xu    21</span><br><span class="line">ji    32</span><br><span class="line">chen  13</span><br><span class="line">xu    21</span><br><span class="line">ji    32</span><br><span class="line">chen  13</span><br><span class="line">xu    21</span><br><span class="line">ji    12</span><br><span class="line">chen  23</span><br></pre></td></tr></table></figure></p><p>data.txt 文本中存放着3个人（chen,xu,ji)的花费流水账，我们想统计他们3人花费了多少钱？<br>设计数据结构，dictt[‘name’]=[num1,num2,…,num3]</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">dictt=&#123;&#125;</span><br><span class="line">dictt[<span class="string">'chen'</span>]=[]</span><br><span class="line">dictt[<span class="string">'xu'</span>]=[]</span><br><span class="line">dictt[<span class="string">'ji'</span>]=[]</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> open(<span class="string">"data.txt"</span>):</span><br><span class="line">     k,v=line.strip().split()</span><br><span class="line">     dictt[k].append(v)</span><br><span class="line"><span class="keyword">print</span> <span class="string">"chen: "</span>,sum(dictt[<span class="string">'chen'</span>])</span><br><span class="line"><span class="keyword">print</span> <span class="string">"xu: "</span>,sum(dictt[<span class="string">'xu'</span>])</span><br><span class="line"><span class="keyword">print</span> <span class="string">"ji: "</span>,sum(dictt[<span class="string">'ji'</span>])</span><br></pre></td></tr></table></figure><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>python 作为动态语言，对变量的限制很少，提供多种高级的数据结构。解决问题，选择合适的变量类型，存放合适的数据。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;HOW2PY-02-变量&quot;&gt;&lt;a href=&quot;#HOW2PY-02-变量&quot; class=&quot;headerlink&quot; title=&quot;HOW2PY[02]变量&quot;&gt;&lt;/a&gt;HOW2PY[02]变量&lt;/h3&gt;&lt;h4 id=&quot;摘要&quot;&gt;&lt;a href=&quot;#摘要&quot; class=&quot;
      
    
    </summary>
    
    
      <category term="how2py2" scheme="http://blog.chenzhaoqiang.com/tags/how2py2/"/>
    
      <category term="python2" scheme="http://blog.chenzhaoqiang.com/tags/python2/"/>
    
  </entry>
  
  <entry>
    <title>HOW2PY2[04] 文件读写</title>
    <link href="http://blog.chenzhaoqiang.com/2018/03/02/HOW2PY%5B04%5D%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99/"/>
    <id>http://blog.chenzhaoqiang.com/2018/03/02/HOW2PY[04]文件读写/</id>
    <published>2018-03-01T22:32:56.000Z</published>
    <updated>2018-04-07T03:03:28.263Z</updated>
    
    <content type="html"><![CDATA[<h4 id="HOW2PY-04-文件读写"><a href="#HOW2PY-04-文件读写" class="headerlink" title="HOW2PY[04] 文件读写"></a>HOW2PY[04] 文件读写</h4><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>数据是程序的血肉之躯。数据通常从文本或者数据库中读取，处理后再存回文本或者数据库。这里先讲下文本的读写操作。</p><h4 id="读文件流程"><a href="#读文件流程" class="headerlink" title="读文件流程"></a>读文件流程</h4><p>你有一个名字为data.txt文件,需要从里面把数据读取出来。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">11  22  11</span><br><span class="line">21  43  43</span><br><span class="line">324 543 543</span><br><span class="line">3123 435435</span><br></pre></td></tr></table></figure></p><ol><li><p>创建文件句柄，随意的变量名字就可以，一般用fh，比如文件名字是data.txt      </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">fh = open(<span class="string">'data.txt'</span>)</span><br></pre></td></tr></table></figure></li><li><p>读取内容。<br>2.1 - 一次性读取所有内容，存放到列表中 。          </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">context = fh.readlines()</span><br><span class="line"><span class="keyword">print</span> context[<span class="number">0</span>].strip()   <span class="comment"># 文本中第一行的内容</span></span><br></pre></td></tr></table></figure></li></ol><p>2.2 逐行读取文本，并处理<br><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">for</span> line <span class="keyword">in</span> fh:</span><br><span class="line">    nums=line.strip().split()</span><br></pre></td></tr></table></figure></p><h4 id="写文件流程"><a href="#写文件流程" class="headerlink" title="写文件流程"></a>写文件流程</h4><p>1 正规方法<br>比如你需要把输出到命令行窗口的hello,world,保存到文本result.txt。      </p><ul><li><p>1.1 创建文件句柄     </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">fw=open(<span class="string">"result.txt"</span>,<span class="string">'w'</span>)</span><br></pre></td></tr></table></figure></li><li><p>2.2 把内容写入到文件中      </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"><span class="comment">#print "hello,world"</span></span><br><span class="line">fw.write(<span class="string">"hello,world\n"</span>)</span><br><span class="line">fw.write(<span class="string">"come on"</span>)</span><br><span class="line">fw.close()</span><br></pre></td></tr></table></figure></li></ul><p>2重定向方法<br>你有如下脚本文件1.py;把cmd窗口输出内容保存到文本result.txt。<br>仅仅运行 <strong> python 1.py  &gt; result.txt </strong> .<br><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">print</span> <span class="string">"hello,world"</span></span><br><span class="line"><span class="keyword">print</span> <span class="string">"come on"</span></span><br></pre></td></tr></table></figure></p><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>数据是程序的血肉之躯。数据通常从文本或者数据库中读取，处理后再存回文本或者数据库。数据中蕴藏天机。收集数据，揭示天机。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;HOW2PY-04-文件读写&quot;&gt;&lt;a href=&quot;#HOW2PY-04-文件读写&quot; class=&quot;headerlink&quot; title=&quot;HOW2PY[04] 文件读写&quot;&gt;&lt;/a&gt;HOW2PY[04] 文件读写&lt;/h4&gt;&lt;h4 id=&quot;摘要&quot;&gt;&lt;a href=&quot;#摘
      
    
    </summary>
    
    
      <category term="how2py2" scheme="http://blog.chenzhaoqiang.com/tags/how2py2/"/>
    
      <category term="python2" scheme="http://blog.chenzhaoqiang.com/tags/python2/"/>
    
  </entry>
  
  <entry>
    <title>HOW2PY2[00]python能干什么</title>
    <link href="http://blog.chenzhaoqiang.com/2018/03/01/HOW2PY%5B00%5D%E6%87%82python%E5%BE%97%E6%9C%AA%E6%9D%A5/"/>
    <id>http://blog.chenzhaoqiang.com/2018/03/01/HOW2PY[00]懂python得未来/</id>
    <published>2018-02-28T22:32:56.000Z</published>
    <updated>2018-04-07T03:03:28.751Z</updated>
    
    <content type="html"><![CDATA[<h3 id="HOW2PY-00-python能干什么"><a href="#HOW2PY-00-python能干什么" class="headerlink" title="HOW2PY[00]python能干什么"></a>HOW2PY[00]python能干什么</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>python是一门通用的编程语言，对于pythonist而言，python无所不能。<br>目前python主要在几个方面大显生手：web开发、数据分析、人工智能、科学计算。</p><h4 id="Who-适合学python"><a href="#Who-适合学python" class="headerlink" title="Who 适合学python"></a>Who 适合学python</h4><p>everyone。python 能极大的提高工作效率。<br>这里我随便举几个例子：</p><ul><li>管理者 可以借助 python 自动收集商业信息。</li><li>金融者 可以借助 python 收集并分析股票信息。</li><li>医学者 可以借助 python 开发图像识别诊断工具。</li><li>药学者 可以借助 python 对药物疾病信息挖掘分析。</li><li>文件记录者 可以借助 python 实现工作半自动化。<br>等等<br>总而言之,<strong> 人生短暂，我用python</strong>。</li></ul><h4 id="python无所不能"><a href="#python无所不能" class="headerlink" title="python无所不能"></a>python无所不能</h4><ul><li>web 开发<br>python中又大量优秀的WEB框架，其中最流行的是Django、Tornado、Flask、Twisted。这些框架各有特点，比如Django大而全，一切都有。上手时间长，上手后极大提高开发效率。Flask小而美，适合初学者。除了Flask,还有一些微框架也适合初学者使用，如bottle、web.py、web2py等。<br>更多web框架<strong><a href="https://wiki.python.org/moin/WebFrameworks" target="_blank" rel="noopener">https://wiki.python.org/moin/WebFrameworks</a></strong></li><li>微信后台开发<br>多种流行软件，均提供python接口。比如微信后台开发有werobot、WeixinBot、wxBot。</li><li>数据分析<br>1.可以通过爬虫框架scrapy获取大量数据；</li></ul><ol start="2"><li>利用spyder、matplotlib、pandas等工具模块对数据进行分析。  </li></ol><ul><li>人工智能<br>python 中有大量的机器学习库，如PyBrain、PyML、scikit-learn、MDP-Toolkit等，<br>深度学习库 TensorLayer、theano (当然底层是底层c++)。</li><li>科学计算<br>python中有大量科学计算工具，如numpy、scipy；让理工者除了选择matlab，有了一个更多的选择。</li><li>桌面程序开发<br>python的GUI框架也有很多，比如自带的Tkinter,另外也有wxpython、Traits/TraitsUI、pyQt等。<br>更多框架可参考：<a href="https://wiki.python.org/moin/GuiProgramming" target="_blank" rel="noopener">https://wiki.python.org/moin/GuiProgramming</a></li></ul><p>Q: python这么牛，能当饭吃吗？有对象吗？<br>A: python 不能直接当饭吃，但是可以凭借python很容易找到一份工作。python是面向对象的语言。</p><h4 id="如何学习python"><a href="#如何学习python" class="headerlink" title="如何学习python?"></a>如何学习python?</h4><p>如果你是新手，推荐how2py系列教程。让python学习更快、更容易。<br>python 涵盖面很大，在掌握基础后，选择感兴趣的某一方向深入学习。然后就能举一反三，触类旁通。</p><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>python 无所不能，懂python，得未来。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;HOW2PY-00-python能干什么&quot;&gt;&lt;a href=&quot;#HOW2PY-00-python能干什么&quot; class=&quot;headerlink&quot; title=&quot;HOW2PY[00]python能干什么&quot;&gt;&lt;/a&gt;HOW2PY[00]python能干什么&lt;/h3&gt;&lt;
      
    
    </summary>
    
    
      <category term="how2py2" scheme="http://blog.chenzhaoqiang.com/tags/how2py2/"/>
    
      <category term="python2" scheme="http://blog.chenzhaoqiang.com/tags/python2/"/>
    
  </entry>
  
  <entry>
    <title>Perl模块推荐23——Perl::Shell</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/23/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9023_Perl-Shell/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/23/perl模块推荐23_Perl-Shell/</id>
    <published>2017-03-22T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:07.564Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Perl模块推荐23——Perl-Shell"><a href="#Perl模块推荐23——Perl-Shell" class="headerlink" title="Perl模块推荐23——Perl::Shell"></a>Perl模块推荐23——Perl::Shell</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>Perl::Shell 是perl中的种python风格的命令行REPL（ read eval print loop）模式。<br>和Shell::Perl相比其使用更加方便。莫失初心，勿忘初衷。</p><h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cpanm Perl::Shell</span><br></pre></td></tr></table></figure><p>或者使用<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ppm install Perl::Shell</span><br></pre></td></tr></table></figure></p><h4 id="用法"><a href="#用法" class="headerlink" title="用法"></a>用法</h4><p><strong>metacpan 上存在一个错误</strong><br>perlcmd 打开交互模式而不是perlthon命令。<br>错误的使用方法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">C:\Document and Settings\adamk&gt; perlthon</span><br><span class="line">Perl 5.10.1 (Sat Oct 17 22:14:49 2009) [Win32 strawberryperl 5.10.1.0 #1 33 i386]</span><br><span class="line">Type &quot;help;&quot;, &quot;copyright;&quot;, or &quot;license;&quot; for more information.</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; print &quot;Hello World!\n&quot;;</span><br><span class="line">Hello World!</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt;</span><br></pre></td></tr></table></figure></p><p>正确的使用方法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">C:\Users\chenzq&gt;perlcmd</span><br><span class="line">Perl 5.24.0 (Tue May 10 17:12:25 2016) [Win32 strawberry-perl 5.24.0.1 #1 Tue May 10 17:10:11 2016 i386]</span><br><span class="line">Type &quot;help;&quot;, &quot;copyright;&quot;, or &quot;license;&quot; for more information.</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; print &quot;hello,world!\n&quot;;</span><br><span class="line">hello,world!</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt;</span><br></pre></td></tr></table></figure></p><p><strong>使用交互模式提取分析网页中的元素特别方便</strong></p><p>我最近在Python中利用scrapy shell  url;打开交互模式，提取分析网页中的元素，感觉特别顺手。故给广大perler介绍了Perl::Shell模块。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;Perl模块推荐23——Perl-Shell&quot;&gt;&lt;a href=&quot;#Perl模块推荐23——Perl-Shell&quot; class=&quot;headerlink&quot; title=&quot;Perl模块推荐23——Perl::Shell&quot;&gt;&lt;/a&gt;Perl模块推荐23——Perl::S
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐21—UserAgent模拟HTTP上传文件</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/21/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9021_UserAgent/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/21/perl模块推荐21_UserAgent/</id>
    <published>2017-03-20T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:06.376Z</updated>
    
    <content type="html"><![CDATA[<h3 id="perl模块推荐21—UserAgent模拟HTTP上传文件"><a href="#perl模块推荐21—UserAgent模拟HTTP上传文件" class="headerlink" title="perl模块推荐21—UserAgent模拟HTTP上传文件"></a>perl模块推荐21—UserAgent模拟HTTP上传文件</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>UserAgent通过模拟一切网页（HTTP）操作活动（GET POST PUT）等，从而实现自动化。在Perl 中两个比较有名的模块是LWP::UserAgent 和 Mojo::UserAgent。</p><h4 id="Mojo-版本自动上传文件提交任务"><a href="#Mojo-版本自动上传文件提交任务" class="headerlink" title="Mojo 版本自动上传文件提交任务"></a>Mojo 版本自动上传文件提交任务</h4><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/perl</span></span><br><span class="line"><span class="keyword">use</span> Mojo::UserAgent;</span><br><span class="line"><span class="keyword">use</span> Data::Dumper;</span><br><span class="line"><span class="keyword">use</span> Mojo::UserAgent::CookieJar;</span><br><span class="line"><span class="keyword">my</span> $ua = Mojo::UserAgent-&gt;new();</span><br><span class="line"><span class="keyword">my</span> $browser=<span class="string">'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.2.2000 Chrome/30.0.1599.101 Safari/537.36'</span>;</span><br><span class="line"></span><br><span class="line">$ua-&gt;transactor-&gt;name($browser);</span><br><span class="line"><span class="keyword">my</span> $cookie_jar = $ua-&gt;cookie_jar;</span><br><span class="line">$ua            = $ua-&gt;cookie_jar(Mojo::UserAgent::CookieJar-&gt;new);</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $posturl=<span class="string">"http://20xxxx9/upload_insert.php"</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> @files=<span class="keyword">glob</span> <span class="string">"DRN*"</span>;</span><br><span class="line"><span class="keyword">print</span> <span class="keyword">join</span> <span class="string">"\n"</span>,@files;</span><br><span class="line"></span><br><span class="line"><span class="keyword">foreach</span> <span class="keyword">my</span> $file(@files)</span><br><span class="line">&#123;</span><br><span class="line">     <span class="keyword">my</span> $title=$file;</span><br><span class="line">     <span class="keyword">my</span> $filename=$file;</span><br><span class="line">     upload_file($title,$filename);   </span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">sub</span> <span class="title">upload_file</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">   <span class="keyword">my</span> ($title,$filename)=@_;</span><br><span class="line">   <span class="keyword">my</span> $tx=$ua-&gt;post($posturl=&gt;&#123;<span class="string">Content_Type =&gt;</span> <span class="string">'form-data'</span>&#125;=&gt;<span class="string">form=&gt;</span>&#123;  <span class="string">task_title=&gt;</span>$title,</span><br><span class="line">                             <span class="string">task_uploaded_file=&gt;</span>&#123;<span class="string">file=&gt;</span>$filename&#125;</span><br><span class="line"></span><br><span class="line">                          &#125; );</span><br><span class="line">   <span class="keyword">if</span> (<span class="keyword">my</span> $res = $tx-&gt;success)</span><br><span class="line">   &#123;</span><br><span class="line">      <span class="keyword">print</span> <span class="string">"OK\n"</span>;</span><br><span class="line">   &#125;</span><br><span class="line">   <span class="keyword">else</span></span><br><span class="line">   &#123;</span><br><span class="line">        <span class="keyword">my</span> $err = $tx-&gt;error;</span><br><span class="line">      <span class="keyword">print</span> <span class="string">"$filename failed\n"</span>;</span><br><span class="line">      <span class="keyword">die</span> <span class="string">"$err-&gt;&#123;code&#125; response: $err-&gt;&#123;message&#125;"</span> <span class="keyword">if</span> $err-&gt;&#123;code&#125;;</span><br><span class="line">      <span class="keyword">die</span> <span class="string">"Connection error: $err-&gt;&#123;message&#125;"</span>;</span><br><span class="line">   &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="LWP-版本自动上传文件提交任务"><a href="#LWP-版本自动上传文件提交任务" class="headerlink" title="LWP 版本自动上传文件提交任务"></a>LWP 版本自动上传文件提交任务</h5><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/perl -w</span></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> LWP;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> HTTP::Request::Common <span class="string">qw( POST GET)</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $browser=LWP::UserAgent-&gt;new( <span class="string">cookie_jar=&gt;</span>&#123;&#125;); <span class="comment">#非常重要</span></span><br><span class="line"></span><br><span class="line">$browser-&gt;agent(<span class="string">"MyApp/0.1 "</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $req=POST(</span><br><span class="line"></span><br><span class="line">  <span class="string">'http://idtarget.rcas.sinica.edu.tw/step2.php'</span>,</span><br><span class="line">  [ <span class="string">jobname =&gt;</span> <span class="string">'benzfuran'</span>,</span><br><span class="line">   <span class="string">ligF =&gt;</span> [<span class="string">'f:/test/benz_furan.mol2'</span>],    <span class="comment">#这里是被上传的文件路径</span></span><br><span class="line">    <span class="string">email =&gt;</span> <span class="string">'744891290@qq.com'</span>,</span><br><span class="line">    <span class="string">submit=&gt;</span><span class="string">"1"</span></span><br><span class="line">  ],</span><br><span class="line">  <span class="string">Content_Type =&gt;</span> <span class="string">'form-data'</span>,                          <span class="comment">#这句不可少，表示类型为 multipart/form-data</span></span><br><span class="line"></span><br><span class="line">  <span class="string">'Host'</span>=&gt;<span class="string">'idtarget.rcas.sinica.edu.tw'</span>,</span><br><span class="line"></span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $res = $browser-&gt;request($req);</span><br><span class="line"><span class="keyword">print</span> $res-&gt;code;</span><br></pre></td></tr></table></figure><h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>利用这个模块可以模拟一切网页操作，从而可以实现爬虫、自动登陆、webqq等功能。<br>推荐灰灰的Mojo::webqq项目：<br><a href="https://github.com/sjdy521/Mojo-Webqq" target="_blank" rel="noopener">https://github.com/sjdy521/Mojo-Webqq</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;perl模块推荐21—UserAgent模拟HTTP上传文件&quot;&gt;&lt;a href=&quot;#perl模块推荐21—UserAgent模拟HTTP上传文件&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐21—UserAgent模拟HTTP上传文件&quot;&gt;
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐20—读写EXCEL</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/20/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9020_%E8%AF%BB%E5%86%99EXCEL/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/20/perl模块推荐20_读写EXCEL/</id>
    <published>2017-03-19T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:05.903Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl模块推荐20—读写EXCEL"><a href="#perl模块推荐20—读写EXCEL" class="headerlink" title="perl模块推荐20—读写EXCEL"></a>perl模块推荐20—读写EXCEL</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>excel是一种常见数据存储的表格，被大家广泛。如何利用perl快速读写excel,是挖掘excel中信息的前提条件。excel分为2种版本，一种是03版本，xls后缀，另一种是07版本，xlsx后缀。对应模块<strong>Spreadsheet::ParseExcel，Spreadsheet::WriteExcel；以及Spreadsheet::XLSX和Excel::Writer::XLSX</strong>.</p><h5 id="cpanm安装上述模块"><a href="#cpanm安装上述模块" class="headerlink" title="cpanm安装上述模块"></a>cpanm安装上述模块</h5><p>如果安装中在test过程中报错，可以尝试强制安装。  </p><blockquote><p>cpanm Spreadsheet::XLSX -f</p></blockquote><h5 id="读excel"><a href="#读excel" class="headerlink" title="读excel"></a>读excel</h5><ul><li>xls 版本  </li></ul><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!perl -w</span></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> Spreadsheet::ParseExcel;  <span class="comment">#for xls</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#创建一个excel 解释器</span></span><br><span class="line"><span class="keyword">my</span> $parser   = Spreadsheet::ParseExcel-&gt;new();</span><br><span class="line"><span class="comment"># 解释xls文件，得到xls文件对象</span></span><br><span class="line"><span class="keyword">my</span> $workbook = $parser-&gt;parse(<span class="string">'2F.xls'</span>);</span><br><span class="line"><span class="comment">#得到excel 中所有的sheet</span></span><br><span class="line"><span class="keyword">my</span> @sheet_objs=$workbook-&gt;worksheets();</span><br><span class="line"><span class="comment">#指定要操作的sheet,可以通过sheet名字或者index进行指定</span></span><br><span class="line"><span class="comment">#index 从0开始计数</span></span><br><span class="line"><span class="keyword">my</span> $worksheet_name=$workbook-&gt;worksheet(<span class="string">'Worker name'</span>);</span><br><span class="line"><span class="keyword">my</span> $worksheet_1=$workbook-&gt;worksheet(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">#获取Worker name中的详细信息</span></span><br><span class="line"><span class="keyword">my</span> ( $row_min, $row_max ) = $worksheet_name-&gt;row_range();</span><br><span class="line"><span class="keyword">my</span> ( $col_min, $col_max ) = $worksheet_name-&gt;col_range();</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> <span class="keyword">my</span> $row ( $row_min .. $row_max )</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">for</span> <span class="keyword">my</span> $col ( $col_min .. $col_max )</span><br><span class="line">    &#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="keyword">my</span> $cell = $worksheet_name-&gt;get_cell( $row, $col );</span><br><span class="line">        <span class="keyword">next</span> <span class="keyword">unless</span> $cell;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">print</span> <span class="string">"Row, Col    = ($row, $col) "</span>;</span><br><span class="line">        <span class="keyword">print</span> <span class="string">"Value       = "</span>, $cell-&gt;value(),       <span class="string">"\n"</span>;</span><br><span class="line">        <span class="comment">#print "\n";</span></span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>xlsx 版本</li></ul><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/perl -w</span></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> Spreadsheet::XLSX;     <span class="comment">#xlsx</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $workbook=Spreadsheet::XLSX-&gt;new(<span class="string">'2F.xlsx'</span>);</span><br><span class="line"><span class="keyword">my</span> $worksheet_1=$workbook-&gt;worksheet(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">#获取Worker name中的详细信息</span></span><br><span class="line"><span class="keyword">my</span> ( $row_min, $row_max ) = $worksheet_1-&gt;row_range();</span><br><span class="line"><span class="keyword">my</span> ( $col_min, $col_max ) = $worksheet_1-&gt;col_range();</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> <span class="keyword">my</span> $row ( $row_min .. $row_max )</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">for</span> <span class="keyword">my</span> $col ( $col_min .. $col_max )</span><br><span class="line">    &#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="keyword">my</span> $cell = $worksheet_1-&gt;get_cell( $row, $col );</span><br><span class="line">        <span class="keyword">next</span> <span class="keyword">unless</span> $cell;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">print</span> <span class="string">"Row, Col    = ($row, $col) "</span>;</span><br><span class="line">        <span class="keyword">print</span> <span class="string">"Value       = "</span>, $cell-&gt;value(),       <span class="string">"\n"</span>;</span><br><span class="line">        <span class="comment">#print "\n";</span></span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="写excel"><a href="#写excel" class="headerlink" title="写excel"></a>写excel</h5><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><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">#!/usr/perl -w</span></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> Spreadsheet::ParseExcel;  <span class="comment">#for xls</span></span><br><span class="line"><span class="keyword">use</span> Spreadsheet::XLSX;     <span class="comment">#xlsx</span></span><br><span class="line"><span class="keyword">use</span> Spreadsheet::WriteExcel;</span><br><span class="line"><span class="keyword">use</span> Excel::Writer::XLSX;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $workbook=Spreadsheet::XLSX-&gt;new(<span class="string">'2F.xlsx'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">#for write</span></span><br><span class="line"><span class="comment">#分别创建xls xlsx格式文件进行写入</span></span><br><span class="line"><span class="keyword">my</span> $workbook_w = Excel::Writer::XLSX-&gt;new( <span class="string">'07.xlsx'</span> );</span><br><span class="line"><span class="keyword">my</span> $workbook_w03=Spreadsheet::WriteExcel-&gt;new(<span class="string">'03.xls'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">#read  and write</span></span><br><span class="line"><span class="keyword">for</span> <span class="keyword">my</span> $worksheet ( $workbook-&gt;worksheets() ) &#123;</span><br><span class="line">    <span class="keyword">my</span> $worksheet_w=$workbook_w-&gt;add_worksheet();</span><br><span class="line">    <span class="keyword">my</span> $worksheet_w03=$workbook_w03-&gt;add_worksheet();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">my</span> ( $row_min, $row_max ) = $worksheet-&gt;row_range();</span><br><span class="line">    <span class="keyword">my</span> ( $col_min, $col_max ) = $worksheet-&gt;col_range();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> <span class="keyword">my</span> $row ( $row_min .. $row_max ) &#123;</span><br><span class="line">        <span class="keyword">for</span> <span class="keyword">my</span> $col ( $col_min .. $col_max ) &#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">            <span class="keyword">my</span> $cell = $worksheet-&gt;get_cell( $row, $col );</span><br><span class="line">            <span class="keyword">next</span> <span class="keyword">unless</span> $cell;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">print</span> <span class="string">"Row, Col    = ($row, $col)\n"</span>;</span><br><span class="line">            <span class="keyword">print</span> <span class="string">"Value       = "</span>, $cell-&gt;value(),       <span class="string">"\n"</span>;</span><br><span class="line">            <span class="keyword">print</span> <span class="string">"Unformatted = "</span>, $cell-&gt;unformatted(), <span class="string">"\n"</span>;</span><br><span class="line">            <span class="keyword">print</span> <span class="string">"\n"</span>;</span><br><span class="line">            $worksheet_w-&gt;<span class="keyword">write</span>( $row, $col, $cell-&gt;value() );</span><br><span class="line">            $worksheet_w03-&gt;<span class="keyword">write</span>( $row, $col, $cell-&gt;value() );</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h4><p>xlsx 和xls 读写模块内部操作接口是相同的。只要在创建文件和读入文件的时候接口不同而已。</p><h5 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h5><p>更多使用方法，请参看metacpan中相应的模块。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl模块推荐20—读写EXCEL&quot;&gt;&lt;a href=&quot;#perl模块推荐20—读写EXCEL&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐20—读写EXCEL&quot;&gt;&lt;/a&gt;perl模块推荐20—读写EXCEL&lt;/h4&gt;&lt;h5 id=&quot;摘
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐19_XML-Simple</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/19/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9019_XML-Simple/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/19/perl模块推荐19_XML-Simple/</id>
    <published>2017-03-18T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:05.127Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl模块推荐19-XML-Simple"><a href="#perl模块推荐19-XML-Simple" class="headerlink" title="perl模块推荐19_XML-Simple"></a>perl模块推荐19_XML-Simple</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>XML 作为一种可扩展标记语言，在数据传输和交换中得到广泛应用。通过<strong>XML::Simple</strong>,可以轻松解析XML，提取想要的信息。</p><h5 id="代码示例"><a href="#代码示例" class="headerlink" title="代码示例"></a>代码示例</h5><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><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/local/bin/perl</span></span><br><span class="line"><span class="keyword">use</span> Encode;</span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> warnings;</span><br><span class="line"><span class="keyword">use</span> utf8;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> XML::Simple;</span><br><span class="line"><span class="keyword">use</span> Data::Dumper;</span><br><span class="line"></span><br><span class="line"><span class="comment">#1.xml 数据来自于DATA</span></span><br><span class="line"><span class="comment">#my $xmlfile = "1.xml" ;</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#my $config = XMLin($xmlfile);</span></span><br><span class="line"></span><br><span class="line">$/=<span class="keyword">undef</span>;</span><br><span class="line"><span class="keyword">my</span> $xmlfile=&lt;DATA&gt;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $config = XMLin($xmlfile);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $UP_Node = $config -&gt;&#123;UP&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">#使用Dumper 观察数据结构</span></span><br><span class="line"><span class="comment">#print Dumper($UP_Node);</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">foreach</span> <span class="keyword">my</span> $hash_ref(@$UP_Node)</span><br><span class="line">&#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $AreaCode= $hash_ref-&gt;&#123;<span class="string">"AREACODE"</span>&#125;;</span><br><span class="line"><span class="keyword">my</span> $Userid= $hash_ref-&gt;&#123;<span class="string">"USERID"</span>&#125;;</span><br><span class="line"><span class="keyword">my</span> $Date= $hash_ref-&gt;&#123;<span class="string">"DATE"</span>&#125;;</span><br><span class="line"><span class="keyword">my</span> $Ip= $hash_ref-&gt;&#123;<span class="string">"IP"</span>&#125;;</span><br><span class="line"><span class="keyword">my</span> $Stbid= $hash_ref-&gt;&#123;<span class="string">"STBID"</span>&#125;;</span><br><span class="line"><span class="keyword">my</span> $Caid= $hash_ref-&gt;&#123;<span class="string">"CAID"</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $ev=$hash_ref-&gt;&#123;<span class="string">'EV'</span>&#125;;</span><br><span class="line"><span class="comment">#my $ev_e2=$hash_ref-&gt;&#123;'EV'&#125;-&gt;&#123;'E2'&#125;;</span></span><br><span class="line"><span class="comment">#print ref($ev);</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">ref</span>($ev) eq <span class="string">'ARRAY'</span>)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">foreach</span> <span class="keyword">my</span> $ev_indivial(@$ev)</span><br><span class="line">    &#123;</span><br><span class="line">         <span class="keyword">my</span> $ev_e2=$ev_indivial-&gt;&#123;<span class="string">'E2'</span>&#125;;</span><br><span class="line">         <span class="keyword">print</span> $ev_e2,<span class="string">"\n"</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">elsif</span>(<span class="keyword">ref</span>($ev) eq <span class="string">'HASH'</span>)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">my</span> $ev_e2=$hash_ref-&gt;&#123;<span class="string">'EV'</span>&#125;-&gt;&#123;<span class="string">'E2'</span>&#125;;</span><br><span class="line">    <span class="keyword">print</span> $ev_e2;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> <span class="string">"\n"</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">__DATA__</span><br><span class="line">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span><br><span class="line">&lt;CoshipUP&gt;</span><br><span class="line">  &lt;UP STBID="0521607" CAID="8120010499497722" IP="10.200.38.208" USERID="7817334" AREACODE="1006" DATE="20160801"&gt;</span><br><span class="line">    &lt;EV E="000246" E1="0001" E2="0000" E3="0000" D1="0000" D2="0000" D3="0000" T="H"/&gt;</span><br><span class="line">  &lt;/UP&gt;</span><br><span class="line">  &lt;UP STBID="0390388" CAID="8120010542807752" IP="10.225.14.164" USERID="8035240" AREACODE="" DATE="20160801"&gt;</span><br><span class="line">    &lt;EV E="000231" E1="0000" E2="0000" E3="0000" E4="0000" E5="0000" D1="0003" D2="0000" D3="0000" T="L"/&gt;</span><br><span class="line">    &lt;EV E="000235" E1="0022" E2="0005" E3="22223" E4="0000" E5="0000" D1="0101" D2="0223" D3="山东教育" T="L"/&gt;</span><br><span class="line">    &lt;EV E="000236" E1="0003" E2="770" E3="17" E4="1" E5="0" D1="425" D2="164" D3="6" T="A"/&gt;</span><br><span class="line">  &lt;/UP&gt;</span><br><span class="line">&lt;/CoshipUP&gt;</span><br></pre></td></tr></table></figure><h4 id="代码解析"><a href="#代码解析" class="headerlink" title="代码解析"></a>代码解析</h4><p>合理使用Dumper,观察数据结构。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line">$VAR1 = [</span><br><span class="line">          &#123;</span><br><span class="line">            &apos;IP&apos; =&gt; &apos;10.200.38.208&apos;,</span><br><span class="line">            &apos;EV&apos; =&gt; &#123;</span><br><span class="line">                    &apos;E2&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                    &apos;T&apos; =&gt; &apos;H&apos;,</span><br><span class="line">                    &apos;D3&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                    &apos;E1&apos; =&gt; &apos;0001&apos;,</span><br><span class="line">                    &apos;E3&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                    &apos;D1&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                    &apos;E&apos; =&gt; &apos;000246&apos;,</span><br><span class="line">                    &apos;D2&apos; =&gt; &apos;0000&apos;</span><br><span class="line">                  &#125;,</span><br><span class="line">            &apos;CAID&apos; =&gt; &apos;8120010499497722&apos;,</span><br><span class="line">            &apos;STBID&apos; =&gt; &apos;0521607&apos;,</span><br><span class="line">            &apos;AREACODE&apos; =&gt; &apos;1006&apos;,</span><br><span class="line">            &apos;DATE&apos; =&gt; &apos;20160801&apos;,</span><br><span class="line">            &apos;USERID&apos; =&gt; &apos;7817334&apos;</span><br><span class="line">          &#125;,</span><br><span class="line">          &#123;</span><br><span class="line">            &apos;USERID&apos; =&gt; &apos;8035240&apos;,</span><br><span class="line">            &apos;AREACODE&apos; =&gt; &apos;&apos;,</span><br><span class="line">            &apos;DATE&apos; =&gt; &apos;20160801&apos;,</span><br><span class="line">            &apos;EV&apos; =&gt; [</span><br><span class="line">                    &#123;</span><br><span class="line">                      &apos;E5&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                      &apos;T&apos; =&gt; &apos;L&apos;,</span><br><span class="line">                      &apos;D3&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                      &apos;E2&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                      &apos;D2&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                      &apos;E&apos; =&gt; &apos;000231&apos;,</span><br><span class="line">                      &apos;E4&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                      &apos;D1&apos; =&gt; &apos;0003&apos;,</span><br><span class="line">                      &apos;E3&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                      &apos;E1&apos; =&gt; &apos;0000&apos;</span><br><span class="line">                    &#125;,</span><br><span class="line">                    &#123;</span><br><span class="line">                      &apos;E4&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                      &apos;E3&apos; =&gt; &apos;22223&apos;,</span><br><span class="line">                      &apos;D1&apos; =&gt; &apos;0101&apos;,</span><br><span class="line">                      &apos;E1&apos; =&gt; &apos;0022&apos;,</span><br><span class="line">                      &apos;D2&apos; =&gt; &apos;0223&apos;,</span><br><span class="line">                      &apos;E&apos; =&gt; &apos;000235&apos;,</span><br><span class="line">                      &apos;D3&apos; =&gt; &quot;\x&#123;5c71&#125;\x&#123;4e1</span><br><span class="line">                      &apos;T&apos; =&gt; &apos;L&apos;,</span><br><span class="line">                      &apos;E5&apos; =&gt; &apos;0000&apos;,</span><br><span class="line">                      &apos;E2&apos; =&gt; &apos;0005&apos;</span><br><span class="line">                    &#125;,</span><br><span class="line">                    &#123;</span><br><span class="line">                      &apos;E2&apos; =&gt; &apos;770&apos;,</span><br><span class="line">                      &apos;E5&apos; =&gt; &apos;0&apos;,</span><br><span class="line">                      &apos;T&apos; =&gt; &apos;A&apos;,</span><br><span class="line">                      &apos;D3&apos; =&gt; &apos;6&apos;,</span><br><span class="line">                      &apos;D2&apos; =&gt; &apos;164&apos;,</span><br><span class="line">                      &apos;E&apos; =&gt; &apos;000236&apos;,</span><br><span class="line">                      &apos;D1&apos; =&gt; &apos;425&apos;,</span><br><span class="line">                      &apos;E3&apos; =&gt; &apos;17&apos;,</span><br><span class="line">                      &apos;E1&apos; =&gt; &apos;0003&apos;,</span><br><span class="line">                      &apos;E4&apos; =&gt; &apos;1&apos;</span><br><span class="line">                    &#125;</span><br><span class="line">                  ],</span><br><span class="line">            &apos;IP&apos; =&gt; &apos;10.225.14.164&apos;,</span><br><span class="line">            &apos;STBID&apos; =&gt; &apos;0390388&apos;,</span><br><span class="line">            &apos;CAID&apos; =&gt; &apos;8120010542807752&apos;</span><br><span class="line">          &#125;</span><br><span class="line">        ];</span><br></pre></td></tr></table></figure></p><p>通过观察我们可以发现，EV 对应的元素只有一个，则对应的是一个hash引用。当EV对应的元素有多个的时候，则对应的是一个hash引用的数组。所以需要通过<strong>ref</strong>函数判断类型，然后进行对应解析。</p><p>如何解析各种引用，可以参考这篇文章。  </p><h5 id="标记语言（Markup-Language）"><a href="#标记语言（Markup-Language）" class="headerlink" title="标记语言（Markup Language）"></a>标记语言（Markup Language）</h5><ul><li>HTML，超文本标记语言，旨在显示信息；  </li><li>XML，可扩展标记语言，旨在传输信息；  </li><li>XHTML，可扩展超文本标记语言，基于XML，作用与HTML类似，但语法更严格。  </li></ul><p>JSON 是比XML 更轻量级的数据交换格式，数据通过键值对表示，这也决定了JSON 不允许键重复，而XML 和HTML 是允许同级下的元素重复。</p><p>JSON 的解析可以参考这篇文章。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl模块推荐19-XML-Simple&quot;&gt;&lt;a href=&quot;#perl模块推荐19-XML-Simple&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐19_XML-Simple&quot;&gt;&lt;/a&gt;perl模块推荐19_XML-Simple&lt;/
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐18-图形界面编程利器Tk</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/18/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9018-Tk/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/18/perl模块推荐18-Tk/</id>
    <published>2017-03-17T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:05.127Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl模块推荐18-图形界面编程利器Tk"><a href="#perl模块推荐18-图形界面编程利器Tk" class="headerlink" title="perl模块推荐18-图形界面编程利器Tk"></a>perl模块推荐18-图形界面编程利器Tk</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>程序员要不要写图形界面，我认为是会写简单界面，没必要追求特效。而Tk作为一个经典的GUI库，具有学习简单，代码少，使用方便，界面简单简洁等特点，非常适用于行业软件的开发。</p><h5 id="摘要-1"><a href="#摘要-1" class="headerlink" title="摘要"></a>摘要</h5><p>事件驱动编程是编程中的一种模式，区别于顺序执行。监控事件，如果事件发生，则触发函数。而GUI编程非常有利于帮助大家理解事件编程。<br>程序员要不要写图形界面，我认为是会写简单界面，没必要追求特效。而Tk作为一个经典的GUI库，具有学习简单，代码少，使用方便，界面简单简洁等特点，非常适用于行业软件的开发。</p><h5 id="Tk-的安装"><a href="#Tk-的安装" class="headerlink" title="Tk 的安装"></a>Tk 的安装</h5><p>一个网友，装了好几天的Tk,没有安装上。作为一个经典模块，会有这样的问题实在可惜。<br>所有的模块都不推荐解压+拷贝的安装模式，这不能解决含c代码的模块以及模块的依赖性问题。<br>我推荐ppm+cpanm 这2种方式，如果安装不上，我就认为这个模块的作者不够负责，前提是你要配置好这2个环境。<br>如果懒得配置环境，推荐使用草莓Strawberry Perl ,自带cpanm.</p><blockquote><p>cpanm Tk<br>就可以安装成功。</p></blockquote><h5 id="应用"><a href="#应用" class="headerlink" title="应用"></a>应用</h5><p>帮花瓣下载，添加一个简单的界面。<br>界面如下，</p><h5 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h5><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><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!perl -w</span></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> Encode <span class="string">qw(decode encode)</span>;</span><br><span class="line"><span class="keyword">use</span> Tk;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $mainwin=new MainWindow;</span><br><span class="line">$mainwin-&gt;title(<span class="string">"HUABAN DOWNLOADER"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#在mainwin上添加一个Frame1</span></span><br><span class="line"><span class="keyword">my</span> $board_idF=$mainwin-&gt;Frame();</span><br><span class="line">$board_idF-&gt;<span class="keyword">pack</span>(<span class="string">-expand=&gt;</span><span class="number">1</span>,<span class="string">-fill=&gt;</span><span class="string">"both"</span>,<span class="string">-side=&gt;</span><span class="string">"top"</span>);</span><br><span class="line"><span class="comment">#在Frame1 上添加一个label</span></span><br><span class="line"><span class="keyword">my</span> $board_idL=$board_idF-&gt;Label(<span class="string">-text=&gt;</span><span class="string">"The board id:"</span>,<span class="string">-width=&gt;</span><span class="number">50</span>,<span class="string">-anchor=&gt;</span><span class="string">'w'</span>);</span><br><span class="line">$board_idL-&gt;<span class="keyword">pack</span>(<span class="string">-side=&gt;</span><span class="string">"left"</span>);</span><br><span class="line"><span class="comment">#在Frame1 上添加一个文本框Entry</span></span><br><span class="line"><span class="keyword">my</span> $id_VAR=<span class="number">20194339</span>;</span><br><span class="line"><span class="keyword">my</span> $id_Ent=$board_idF-&gt;Entry(<span class="string">-textvariable=&gt;</span>\$id_VAR);</span><br><span class="line">$id_Ent-&gt;<span class="keyword">pack</span>(<span class="string">-side=&gt;</span><span class="string">'left'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#在mainwin上增加一个Frame ,存放下载图片数目</span></span><br><span class="line"><span class="keyword">my</span> $num_F=$mainwin-&gt;Frame();</span><br><span class="line">$num_F-&gt;<span class="keyword">pack</span>(<span class="string">-expand=&gt;</span><span class="number">1</span>,<span class="string">-fill=&gt;</span><span class="string">'both'</span>,<span class="string">-side=&gt;</span><span class="string">'top'</span>);</span><br><span class="line"><span class="keyword">my</span> $num_VAR=<span class="number">200</span>;</span><br><span class="line"></span><br><span class="line">$num_F-&gt;Label(<span class="string">-text=&gt;</span><span class="string">"number of photos to downloaded:"</span>,<span class="string">-width=&gt;</span><span class="number">50</span>,<span class="string">-anchor=&gt;</span><span class="string">'w'</span>)-&gt;<span class="keyword">pack</span>(<span class="string">-side=&gt;</span><span class="string">'left'</span>);</span><br><span class="line"><span class="keyword">my</span> $num_Ent=$num_F-&gt;Entry(<span class="string">-textvariable=&gt;</span>\$num_VAR);</span><br><span class="line">$num_Ent-&gt;<span class="keyword">pack</span>(<span class="string">-side=&gt;</span><span class="string">'left'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#在mainwin上增加Frame2</span></span><br><span class="line"><span class="keyword">my</span> $dir_F=$mainwin-&gt;Frame();</span><br><span class="line">$dir_F-&gt;<span class="keyword">pack</span>(<span class="string">-expand=&gt;</span><span class="number">1</span>,<span class="string">-fill=&gt;</span><span class="string">"both"</span>,<span class="string">-side=&gt;</span><span class="string">"top"</span>);</span><br><span class="line"><span class="comment">#在Frame2 增加一个Label</span></span><br><span class="line">$dir_F-&gt;Label(<span class="string">-text=&gt;</span><span class="string">"Output Dictory:"</span>,<span class="string">-width=&gt;</span><span class="number">50</span>,<span class="string">-anchor=&gt;</span><span class="string">'w'</span>)-&gt;<span class="keyword">pack</span>(<span class="string">-side=&gt;</span><span class="string">'left'</span>);</span><br><span class="line"><span class="comment">#Frame2 增加一个Button</span></span><br><span class="line"><span class="keyword">my</span> $dir=<span class="string">""</span>;</span><br><span class="line">$dir_F-&gt;Button(<span class="string">-text=&gt;</span><span class="string">"browse..."</span>,<span class="string">-width=&gt;</span><span class="number">15</span>, <span class="string">-command=&gt;</span><span class="function"><span class="keyword">sub</span> </span>&#123;&amp;selectdic&#125;)-&gt;<span class="keyword">pack</span>(<span class="string">-side=&gt;</span><span class="string">'left'</span>);</span><br><span class="line"><span class="comment">#Frame2 增加一个Label</span></span><br><span class="line"><span class="keyword">my</span> $dirL=$dir_F-&gt;Label(<span class="string">-text=&gt;</span><span class="string">"No dictory Selected."</span>);</span><br><span class="line">$dirL-&gt;<span class="keyword">pack</span>(<span class="string">-side=&gt;</span><span class="string">'left'</span>);</span><br><span class="line"></span><br><span class="line">$mainwin-&gt;Button(<span class="string">-text=&gt;</span><span class="string">"Download"</span>,<span class="string">-command=&gt;</span><span class="function"><span class="keyword">sub</span></span>&#123; &amp;download($id_VAR,$num_VAR,$dirL-&gt;cget(<span class="string">'-text'</span>)) &#125;)-&gt;<span class="keyword">pack</span>(<span class="string">-side=&gt;</span><span class="string">'top'</span>);</span><br><span class="line"><span class="comment">#在mainwin上增加一个bottomF,CONTACT</span></span><br><span class="line"><span class="keyword">my</span> $buttonF=$mainwin-&gt;Frame();</span><br><span class="line">$buttonF-&gt;<span class="keyword">pack</span>(<span class="string">-expand=&gt;</span><span class="number">1</span>,<span class="string">-fill=&gt;</span><span class="string">"both"</span>,<span class="string">-side=&gt;</span><span class="string">"top"</span>);  </span><br><span class="line">$buttonF-&gt;Label(<span class="string">-text=&gt;</span><span class="string">"contact: perlcoder weixin gongzhonghao"</span>)-&gt;<span class="keyword">pack</span>(<span class="string">-side=&gt;</span><span class="string">'left'</span>);</span><br><span class="line"><span class="function"><span class="keyword">sub</span> <span class="title">selectdic</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">   $dir = $mainwin-&gt;chooseDirectory();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span>(<span class="keyword">defined</span> $dir)</span><br><span class="line">    &#123;</span><br><span class="line">       $dirL-&gt;configure(<span class="string">-text=&gt;</span>$dir)   </span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">sub</span> <span class="title">download</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> ($board_id,$num,$directory)=@_;</span><br><span class="line"></span><br><span class="line"><span class="comment">#print "$directory\n" x100;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> Mojo::UserAgent;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> Mojo::UserAgent::CookieJar;</span><br><span class="line"><span class="keyword">my</span> $ua = Mojo::UserAgent-&gt;new();</span><br><span class="line"><span class="keyword">my</span> $browser=<span class="string">'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.2.2000 Chrome/30.0.1599.101 Safari/537.36'</span>;</span><br><span class="line"></span><br><span class="line">$ua-&gt;transactor-&gt;name($browser);</span><br><span class="line"><span class="keyword">my</span> $cookie_jar = $ua-&gt;cookie_jar;</span><br><span class="line"></span><br><span class="line">$ua = $ua-&gt;cookie_jar(Mojo::UserAgent::CookieJar-&gt;new);</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $num_pic=<span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $starturl=<span class="string">'http://huaban.com/boards/'</span>.$board_id;</span><br><span class="line"><span class="keyword">my</span> $body;</span><br><span class="line"><span class="keyword">my</span> $jsonbody;</span><br><span class="line"><span class="keyword">my</span> ($pin_id,$key);</span><br><span class="line"><span class="keyword">my</span> ($pngurl,$pngfile);</span><br><span class="line"><span class="keyword">my</span> $baseurl=<span class="string">'http://hbimg.b0.upaiyun.com/'</span>;</span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>)</span><br><span class="line">&#123;  </span><br><span class="line">    $body=$ua-&gt;get($starturl)-&gt;res-&gt;body;</span><br><span class="line">    <span class="keyword">while</span>($body=~<span class="regexp">/"pin_id":(\d+),.*?"key":"(\S+?)",/msg</span>)</span><br><span class="line">    &#123;</span><br><span class="line">           ($pin_id,$key)=($1,$2);</span><br><span class="line">           <span class="keyword">print</span> $pin_id,<span class="string">"\n"</span>;</span><br><span class="line">          $pngurl=$baseurl.$key.<span class="string">'_fw658'</span>;</span><br><span class="line">          <span class="comment">#print "pngurl: $pngurl\n";         </span></span><br><span class="line">          $pngfile=$pin_id.<span class="string">'.jpg'</span>;</span><br><span class="line">          <span class="keyword">if</span>($directory=~<span class="regexp">/No directory/</span>)</span><br><span class="line">          &#123;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">          &#125;</span><br><span class="line">          <span class="keyword">else</span></span><br><span class="line">          &#123;</span><br><span class="line"></span><br><span class="line">            $pngfile=$directory.<span class="string">'/'</span>.$pngfile;</span><br><span class="line">           &#125;</span><br><span class="line"></span><br><span class="line">         <span class="comment"># $pngfile=$directory?$pngfile:$directory.'/'.$pngfile;</span></span><br><span class="line">          <span class="keyword">print</span> <span class="string">"$pngfile\n"</span>;</span><br><span class="line">          $ua-&gt;get($pngurl)-&gt;res-&gt;content-&gt;asset-&gt;move_to($pngfile);</span><br><span class="line">          $num_pic++;</span><br><span class="line">          <span class="keyword">if</span>($num_pic&gt;<span class="number">200</span>)</span><br><span class="line">          &#123;</span><br><span class="line">             <span class="keyword">print</span> <span class="string">"you have download 200 Photos\n"</span>;</span><br><span class="line">            <span class="keyword">last</span>;          </span><br><span class="line">           &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>($starturl=~<span class="regexp">/limit/</span>)</span><br><span class="line">    &#123;</span><br><span class="line">         $starturl=~<span class="regexp">s/max=\d+/max=$pin_id/</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">   $starturl.=<span class="string">'/?isiv0rfd&amp;max=815376046&amp;limit=20&amp;wfl=1'</span>;</span><br><span class="line">   $starturl=~<span class="regexp">s/max=\d+/max=$pin_id/</span>;</span><br><span class="line">   &#125;</span><br><span class="line">   <span class="comment">#print $starturl,"\n";</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">   $ua = $ua-&gt;cookie_jar(Mojo::UserAgent::CookieJar-&gt;new);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span>($num_pic&gt;$num)</span><br><span class="line">    &#123;</span><br><span class="line">       <span class="keyword">print</span> <span class="string">"you have download 200 Photos\n"</span>;</span><br><span class="line">       <span class="keyword">last</span>;   </span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">#让所有的widget 进入事件循环中，等待触发</span></span><br><span class="line">MainLoop;</span><br></pre></td></tr></table></figure><h5 id="我的学习历程"><a href="#我的学习历程" class="headerlink" title="我的学习历程"></a>我的学习历程</h5><p>我先学习了几年perl,然后学习了pyhon的tkinter，语言都是想通的。深入了一门语言，再去学其他语言就会轻松很多，<br>熟悉了一个模块的使用理念，不管该模块在哪个语言中，你都能很快掌握。</p><h5 id="补充"><a href="#补充" class="headerlink" title="补充"></a>补充</h5><ul><li>事件编程。我之前介绍过一个模块Mojo::EventEmitter，参见<br><a href="http://mp.weixin.qq.com/s?__biz=MzA5NDU1OTY3Ng==&amp;mid=402014447&amp;idx=1&amp;sn=066b67c435826d3210835a49f57d8208&amp;scene=19#wechat_redirect" target="_blank" rel="noopener">http://mp.weixin.qq.com/s?__biz=MzA5NDU1OTY3Ng==&amp;mid=402014447&amp;idx=1&amp;sn=066b67c435826d3210835a49f57d8208&amp;scene=19#wechat_redirect</a></li><li>花瓣爬虫的核心代码介绍，参见<br><a href="http://mp.weixin.qq.com/s?__biz=MzA5NDU1OTY3Ng==&amp;mid=2650169240&amp;idx=1&amp;sn=ed09f9be8c250025e70291b12ec58327&amp;scene=0#wechat_redirect" target="_blank" rel="noopener">http://mp.weixin.qq.com/s?__biz=MzA5NDU1OTY3Ng==&amp;mid=2650169240&amp;idx=1&amp;sn=ed09f9be8c250025e70291b12ec58327&amp;scene=0#wechat_redirect</a></li></ul><h5 id="书读百遍其义自现。书越读越新，不同的时间读相同的内容可以读出不一样的东西。念念不忘，必有回响。当你下定决心，学习新的知识，一定要全身心，长期投入，直到完全吃透为止。"><a href="#书读百遍其义自现。书越读越新，不同的时间读相同的内容可以读出不一样的东西。念念不忘，必有回响。当你下定决心，学习新的知识，一定要全身心，长期投入，直到完全吃透为止。" class="headerlink" title="书读百遍其义自现。书越读越新，不同的时间读相同的内容可以读出不一样的东西。念念不忘，必有回响。当你下定决心，学习新的知识，一定要全身心，长期投入，直到完全吃透为止。"></a>书读百遍其义自现。书越读越新，不同的时间读相同的内容可以读出不一样的东西。念念不忘，必有回响。当你下定决心，学习新的知识，一定要全身心，长期投入，直到完全吃透为止。</h5>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl模块推荐18-图形界面编程利器Tk&quot;&gt;&lt;a href=&quot;#perl模块推荐18-图形界面编程利器Tk&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐18-图形界面编程利器Tk&quot;&gt;&lt;/a&gt;perl模块推荐18-图形界面编程利器Tk&lt;/
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>Perl模块推荐14_DBI</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/14/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9014_DBI/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/14/perl模块推荐14_DBI/</id>
    <published>2017-03-13T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:05.518Z</updated>
    
    <content type="html"><![CDATA[<h4 id="Perl模块推荐14-DBI"><a href="#Perl模块推荐14-DBI" class="headerlink" title="Perl模块推荐14_DBI"></a>Perl模块推荐14_DBI</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>键值对的数据结构，HASH首当其中，能够非常方便的根据键找到其对应的值。然后hash是存放在内存中的，当键值对超过100000条，不可避免就会出现out of memory。这时数据库就可以充当硬盘版的hash，拜托内存的限制。</p><h5 id="hash-版的键值对的查询"><a href="#hash-版的键值对的查询" class="headerlink" title="hash 版的键值对的查询"></a>hash 版的键值对的查询</h5><hr><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><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">#!/usr/bin/perl -w</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="comment">#contact perlcoder weixin</span></span><br><span class="line"><span class="keyword">my</span> %hash;</span><br><span class="line"><span class="keyword">while</span>(&lt;DATA&gt;)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span>($_=~<span class="regexp">/\S+/</span>)</span><br><span class="line">    &#123;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">       <span class="keyword">next</span>;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="keyword">chomp</span>;</span><br><span class="line"><span class="keyword">my</span> ($key)=$_=~<span class="regexp">/&gt;(\S+)/</span>;</span><br><span class="line"><span class="keyword">my</span> $value=&lt;DATA&gt;;</span><br><span class="line"><span class="keyword">chomp</span>($value);</span><br><span class="line">$hash&#123;$key&#125;=$value;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> $hash&#123;<span class="string">'Gh_A04G0739'</span>&#125;,<span class="string">"\n"</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">__DATA__</span><br><span class="line">&gt;Gh_A12G2559              </span><br><span class="line">ATGGCTACTTTCTTTGGCTATTTTAC</span><br><span class="line">&gt;Gh_A12G2554              </span><br><span class="line">ATGGCGGGAACTATCCAATCCCTAAT</span><br><span class="line">&gt;Gh_A04G0755              </span><br><span class="line">ATGGCCTCCGATCAGACCCTTTTTCA</span><br><span class="line">&gt;Gh_A04G0739              </span><br><span class="line">ATGGAGAAAGCAAAACCTGAAGCACC</span><br><span class="line">&gt;Gh_A04G0738              </span><br><span class="line">ATGGCGCAGGTTTTAGACGACGCTGA</span><br><span class="line">&gt;Gh_A07G1346              </span><br><span class="line">ATGGTTCATTGTCTGCCAAAGGTTTC</span><br><span class="line">&gt;Gh_A07G1331              </span><br><span class="line">ATGGCAGACAAGGATTCTTCAAGGCC</span><br><span class="line">&gt;Gh_A07G1334              </span><br><span class="line">ATGACGACGCCAACTCGAGATGCAAT</span><br><span class="line">&gt;Gh_A07G1335              </span><br><span class="line">ATGGCCGCAACTAGATTCCTCTCTCA</span><br><span class="line">&gt;Gh_A08G1510              </span><br><span class="line">ATGGCTACTGCACCGATAAAGTCTCA</span><br><span class="line">&gt;Gh_A08G1433              </span><br><span class="line">ATGGGTAAAACACCTACTGGCAAGGA</span><br></pre></td></tr></table></figure><hr><h5 id="perl-数据库"><a href="#perl-数据库" class="headerlink" title="perl 数据库"></a>perl 数据库</h5><p>DBI 中有多种数据库引擎，包括。这里以SQLite为例进行介绍，</p><blockquote><p>SQLite模块定义的“数据库”是存在于单个文件中的，把单个文件仿真为一个数据库。<br>SQLite模块定义的“数据库”是存在于单个文件中的，把单个文件仿真为一个数据库。<br>SQLite定义的数据库里面没有数据类型这个概念。不管你在创建一个表的时候指定的是什么数据类型，以后你可以在其中放入任何类型的数值（包括字符型，数字型，日期型，二进制对象/blob）。。实际上，创建表的时候你甚至可以不指定数据类型。 CREATE TABLE people ( id, name, age);  这和perl非常像。</p></blockquote><ul><li>step1 创建数据库和表格</li></ul><hr><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/perl -w</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> DBI;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> @drivers=DBI-&gt;available_drivers;</span><br><span class="line"></span><br><span class="line"><span class="comment">#print join("-",@drivers);</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#[create] and connect a database</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $db=<span class="string">'FASTA.db'</span>;</span><br><span class="line"><span class="keyword">my</span> $dbh=DBI-&gt;<span class="keyword">connect</span>(<span class="string">"DBI:SQLite:$db"</span>)  <span class="keyword">or</span> <span class="keyword">die</span> <span class="string">"can't connect FASTA\n"</span>;</span><br><span class="line"><span class="keyword">print</span> <span class="string">"Opened database successfully\n"</span>;</span><br><span class="line"><span class="comment">#create table</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $command = <span class="string">qq(CREATE TABLE fasta2016</span></span><br><span class="line"><span class="string">      (ID CHAR(50)</span> PRIMARY KEY     NOT NULL,</span><br><span class="line">             CONTENT        TEXT    NOT NULL</span><br><span class="line">          ););</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $rv = $dbh-&gt;<span class="keyword">do</span>($command);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>($rv &lt; <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">   <span class="keyword">print</span> $DBI::errstr;</span><br><span class="line">&#125; <span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">   <span class="keyword">print</span> <span class="string">"Table created successfully\n"</span>;</span><br><span class="line">&#125;</span><br><span class="line">$dbh-&gt;disconnect();</span><br></pre></td></tr></table></figure><hr><ul><li>step2 填充数据库  </li></ul><hr><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/perl -w</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> DBI;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> @drivers=DBI-&gt;available_drivers;</span><br><span class="line"></span><br><span class="line"><span class="comment">#print join("-",@drivers);</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#[create] and connect a database</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $db=<span class="string">'FASTA.db'</span>;</span><br><span class="line"><span class="keyword">my</span> $dbh=DBI-&gt;<span class="keyword">connect</span>(<span class="string">"DBI:SQLite:$db"</span>)  <span class="keyword">or</span> <span class="keyword">die</span> <span class="string">"can't connect FASTA\n"</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">#INSERT Table</span></span><br><span class="line"><span class="keyword">my</span> $sth=$dbh-&gt;prepare(<span class="string">"INSERT INTO fasta2016(ID,CONTENT)</span></span><br><span class="line"><span class="string">                       VALUES(?,?)"</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">#open FH,"test.fasta";</span></span><br><span class="line"><span class="comment">#open FH,"NBI_Gossypium_hirsutum_v1.1.fasta";</span></span><br><span class="line"><span class="keyword">my</span> $id=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(&lt;DATA&gt;)</span><br><span class="line">&#123;</span><br><span class="line">$id++;</span><br><span class="line"><span class="keyword">print</span> $id,<span class="string">"\n"</span>;</span><br><span class="line"><span class="keyword">if</span>($_=~<span class="regexp">/\S+/</span>)</span><br><span class="line">    &#123;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">       <span class="keyword">next</span>;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="keyword">chomp</span>;</span><br><span class="line"><span class="keyword">my</span> ($key)=$_=~<span class="regexp">/&gt;(\S+)/</span>;</span><br><span class="line"><span class="keyword">my</span> $value=&lt;DATA&gt;;</span><br><span class="line"><span class="keyword">print</span> <span class="string">"$key\n"</span>;</span><br><span class="line">$sth-&gt;execute($key,$value);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$dbh-&gt;disconnect();</span><br><span class="line"></span><br><span class="line">__DATA__</span><br><span class="line">&gt;Gh_A07G1331              </span><br><span class="line">ATGGCAGACAAGGATTCTTCAAGGCC</span><br><span class="line">&gt;Gh_A07G1334              </span><br><span class="line">ATGACGACGCCAACTCGAGATGCAAT</span><br><span class="line">&gt;Gh_A07G1335              </span><br><span class="line">ATGGCCGCAACTAGATTCCTCTCTCA</span><br><span class="line">&gt;Gh_A08G1510              </span><br><span class="line">ATGGCTACTGCACCGATAAAGTCTCA</span><br><span class="line">&gt;Gh_A08G1433              </span><br><span class="line">ATGGGTAAAACACCTACTGGCAAGGA</span><br></pre></td></tr></table></figure><ul><li>step3 查询</li></ul><hr><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><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">#!/usr/bin/perl -w</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> Data::Dumper;</span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> DBI;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> @drivers=DBI-&gt;available_drivers;</span><br><span class="line"></span><br><span class="line"><span class="comment">#print join("-",@drivers);</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#[create] and connect a database</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $db=<span class="string">'FASTA.db'</span>;</span><br><span class="line"><span class="keyword">my</span> $dbh=DBI-&gt;<span class="keyword">connect</span>(<span class="string">"DBI:SQLite:$db"</span>)  <span class="keyword">or</span> <span class="keyword">die</span> <span class="string">"can't connect FASTA\n"</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $sth;</span><br><span class="line"><span class="comment">#$sth=$dbh-&gt;prepare("select * FROM fasta2016 ")  or die "can not prepare the statement\n";</span></span><br><span class="line"><span class="keyword">my</span> $id=<span class="string">'Gh_A12G2554'</span>;</span><br><span class="line"><span class="comment">#$sth-&gt;execute($id);</span></span><br><span class="line"><span class="comment">#$sth-&gt;execute();</span></span><br><span class="line"><span class="keyword">my</span> @results;</span><br><span class="line"></span><br><span class="line"><span class="comment">#while(@results=$sth-&gt;fetchrow_array())&#123;    print $results[0],"\n";&#125;</span></span><br><span class="line"></span><br><span class="line">$sth=$dbh-&gt;prepare(<span class="string">"select  ID,CONTENT FROM fasta2016 where id = ?;"</span>) <span class="keyword">or</span> <span class="keyword">die</span> <span class="string">"cannot prepare"</span>;</span><br><span class="line"></span><br><span class="line">$sth-&gt;execute($id);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">@results=$sth-&gt;fetchrow_array();</span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> <span class="string">"aaa\n"</span>;</span><br><span class="line"><span class="keyword">print</span> <span class="keyword">join</span> <span class="string">"\n"</span>,@results,<span class="string">"AAA\n"</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$dbh-&gt;disconnect();</span><br></pre></td></tr></table></figure><hr><h5 id="参考博客"><a href="#参考博客" class="headerlink" title="参考博客"></a>参考博客</h5><ol><li>gunnerlzx <a href="http://blog.chinaunix.net/uid-20459533-id-1944446.html" target="_blank" rel="noopener">http://blog.chinaunix.net/uid-20459533-id-1944446.html</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;Perl模块推荐14-DBI&quot;&gt;&lt;a href=&quot;#Perl模块推荐14-DBI&quot; class=&quot;headerlink&quot; title=&quot;Perl模块推荐14_DBI&quot;&gt;&lt;/a&gt;Perl模块推荐14_DBI&lt;/h4&gt;&lt;h5 id=&quot;摘要&quot;&gt;&lt;a href=&quot;#摘要&quot;
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>Perl模块推荐12—Set::Scalar</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/12/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9012_Set-Scalar/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/12/perl模块推荐12_Set-Scalar/</id>
    <published>2017-03-11T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:07.432Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl模块推荐12—Set-Scalar"><a href="#perl模块推荐12—Set-Scalar" class="headerlink" title="perl模块推荐12—Set::Scalar"></a>perl模块推荐12—Set::Scalar</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>Set::Scalar 是一个优秀的集合操作模块。交集，补集（差集），并交集等操作</p><h5 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h5><blockquote><p>cpanm Set::Scalar</p></blockquote><h5 id="Demo"><a href="#Demo" class="headerlink" title="Demo"></a>Demo</h5><ul><li>交集</li><li>并集</li><li>补集</li><li>非并集</li></ul><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><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">#!/usr/bin/perl -w</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"></span><br><span class="line"><span class="comment">#cpanm Set::Scalar;</span></span><br><span class="line"><span class="keyword">use</span> Set::Scalar;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> @num1=(<span class="number">1</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">3</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>);</span><br><span class="line"><span class="keyword">my</span> @num2=(<span class="number">3</span>,<span class="number">4</span>,,<span class="number">5</span>,<span class="number">6</span>,,<span class="number">7</span>,<span class="number">7</span>,<span class="number">8</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment"># convert array to set</span></span><br><span class="line"><span class="keyword">my</span> $set1=Set::Scalar-&gt;new(@num1);</span><br><span class="line"><span class="keyword">print</span> <span class="keyword">join</span> <span class="string">"-"</span>,$set1-&gt;elements,<span class="string">"\n"</span>;</span><br><span class="line"><span class="comment">#output is 1-2-4-5-3-</span></span><br><span class="line"><span class="comment">#  1 2 3 4 5</span></span><br><span class="line"><span class="keyword">my</span> $set2=Set::Scalar-&gt;new(@num2);</span><br><span class="line"><span class="comment">#      3 4 5  6 7 8</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#交集</span></span><br><span class="line"><span class="keyword">my</span> $inter_set= $set1 * $set2;</span><br><span class="line"><span class="keyword">print</span> <span class="keyword">join</span> <span class="string">"-"</span>,$inter_set-&gt;elements,<span class="string">"\n"</span>;</span><br><span class="line"><span class="comment">#output is 5 3 4</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#交并集</span></span><br><span class="line"><span class="keyword">my</span> $union_set=$set1+$set2;</span><br><span class="line"><span class="keyword">print</span> <span class="keyword">join</span> <span class="string">"-"</span>,$union_set-&gt;elements,<span class="string">"\n"</span>;</span><br><span class="line"><span class="comment">#output is 1 2 3 4 5 6 7 8</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#差集 补集</span></span><br><span class="line"><span class="keyword">my</span> $set1_diff=$set1-$set2;</span><br><span class="line"><span class="keyword">print</span> <span class="keyword">join</span> <span class="string">"-"</span>,$set1_diff-&gt;elements,<span class="string">"\n"</span>;</span><br><span class="line"><span class="comment">#output is 1 2</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#双补集  非交集</span></span><br><span class="line"><span class="keyword">my</span> $set_uniq=$set1 % $set2;</span><br><span class="line"><span class="keyword">print</span> <span class="keyword">join</span> <span class="string">"-"</span>,$set_uniq-&gt;elements,<span class="string">"\n"</span>;</span><br><span class="line"><span class="comment">#output is 1 2 6 7 8</span></span><br></pre></td></tr></table></figure><h5 id="方法操作"><a href="#方法操作" class="headerlink" title="方法操作"></a>方法操作</h5><p>上面的符号重载和下面的方法是等效的<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$u = $s-&gt;union($t);        # +</span><br><span class="line">$i = $s-&gt;intersection($t); # *</span><br><span class="line">$d = $s-&gt;difference($t);   # -</span><br><span class="line">$e = $s-&gt;symmetric_difference($t); #%</span><br></pre></td></tr></table></figure></p><p><strong> 集合中的元素具有互异性，无序性</strong></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl模块推荐12—Set-Scalar&quot;&gt;&lt;a href=&quot;#perl模块推荐12—Set-Scalar&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐12—Set::Scalar&quot;&gt;&lt;/a&gt;perl模块推荐12—Set::Scalar
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐11_DateTime::Format::Strptime时间的格式化</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/11/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9011_DateTime-Format-Strptime%E6%97%B6%E9%97%B4%E6%A0%BC%E5%BC%8F/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/11/perl模块推荐11_DateTime-Format-Strptime时间格式/</id>
    <published>2017-03-10T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:06.755Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl模块推荐11-DateTime-Format-Strptime时间的格式化"><a href="#perl模块推荐11-DateTime-Format-Strptime时间的格式化" class="headerlink" title="perl模块推荐11_DateTime::Format::Strptime时间的格式化"></a>perl模块推荐11_DateTime::Format::Strptime时间的格式化</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>之前推荐过DateTime,它的特点是时间的计算。DateTime::Format::Strptime的特点可以设置时间的输入格式和输出格式。</p><h5 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h5><p>xx问下11/Apr/2016:00:00:01怎么转化成2016-04-11 00:00:01?</p><h5 id="demo"><a href="#demo" class="headerlink" title="demo"></a>demo</h5><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/perl -w</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> DateTime::Format::Strptime;</span><br><span class="line"><span class="keyword">my</span> $inputformatter = DateTime::Format::Strptime</span><br><span class="line">                    -&gt;new( <span class="string">pattern   =&gt;</span> <span class="string">'%d/%b/%Y:%H:%M:%S'</span>,</span><br><span class="line">                           <span class="string">on_error  =&gt;</span> <span class="string">'croak'</span>,);                                                                    </span><br><span class="line"><span class="keyword">my</span> $string=<span class="string">'11/Apr/2016:00:00:01'</span>;</span><br><span class="line"><span class="keyword">my</span> $dt=$inputformatter-&gt;parse_datetime($string);</span><br><span class="line"><span class="keyword">my</span> $outputformatter=DateTime::Format::Strptime</span><br><span class="line">                      -&gt;new( <span class="string">pattern =&gt;</span> <span class="string">'%Y-%m-%d %H:%M:%S'</span>,</span><br><span class="line">                             <span class="string">on_error  =&gt;</span> <span class="string">'croak'</span>,);</span><br><span class="line"><span class="keyword">print</span> $outputformatter-&gt;format_datetime($dt);</span><br></pre></td></tr></table></figure><h5 id="格式讲解"><a href="#格式讲解" class="headerlink" title="格式讲解"></a>格式讲解</h5><p>基本元素</p><ul><li>%a 星期的名字简称</li><li>%A 星期的名字全称</li><li>%b 月份的名字简称</li><li>%B 月份的名字全称</li><li>%d 日期 01-31</li><li>%g  the ISO week number0-99</li><li>%G 四位数的o the ISO week number星期数</li><li>%H  24小时制的小时 00-23</li><li>%l  12小时制的小时 1-12</li><li>%m  月份的数字表示 1-12</li><li>%M  分钟的数字表示 00-59</li><li>%p  AM PM</li><li>%S  秒0-60</li><li>%w  数字化的星期表示，0-6，0代表星期天</li><li>%y  2位数的年份</li><li>%Y  4位数的年份</li></ul><p>综合元素</p><ul><li>%D  相当于%m/%d/%y</li><li>%F  相当于%Y-%m-%d</li><li>%r  相当于 %I:%M:%S %p</li><li>%R  相当于%H:%M</li><li>%T  相当于 %H:%M:%S</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl模块推荐11-DateTime-Format-Strptime时间的格式化&quot;&gt;&lt;a href=&quot;#perl模块推荐11-DateTime-Format-Strptime时间的格式化&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐11
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl 模块推荐10_Tie-File</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/10/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9010_Tie-File/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/10/perl模块推荐10_Tie-File/</id>
    <published>2017-03-09T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:05.518Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl-模块推荐10-Tie-File"><a href="#perl-模块推荐10-Tie-File" class="headerlink" title="perl 模块推荐10_Tie-File"></a>perl 模块推荐10_Tie-File</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>Tie-File 模块把文件绑定到perl数组中，通过操纵perl数组来直接修改文件。好处就是不需要创建文件句柄。</p><h5 id="框架"><a href="#框架" class="headerlink" title="框架"></a>框架</h5><p>关联 -&gt; 操作-&gt;解除关联</p><h5 id="关联"><a href="#关联" class="headerlink" title="关联"></a>关联</h5><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> Tie::File;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> @lines;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $filename=<span class="string">'1.mol2'</span>;</span><br><span class="line"><span class="comment">#关联</span></span><br><span class="line"><span class="keyword">tie</span> (@lines,<span class="string">'Tie::File'</span>,$filename)  <span class="keyword">or</span> <span class="keyword">die</span> <span class="string">'can not tie'</span>;</span><br></pre></td></tr></table></figure><h5 id="增加行"><a href="#增加行" class="headerlink" title="增加行"></a>增加行</h5><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#前面增加</span></span><br><span class="line"><span class="keyword">unshift</span>(@lines,<span class="string">"the first line"</span>);</span><br><span class="line"><span class="keyword">splice</span>(@lines,<span class="number">0</span>,<span class="number">0</span>,<span class="string">"the first line"</span>);</span><br></pre></td></tr></table></figure><h5 id="删除行-pop-shift-delete"><a href="#删除行-pop-shift-delete" class="headerlink" title="删除行 pop shift delete"></a>删除行 pop shift delete</h5><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">shift</span> @lines;</span><br></pre></td></tr></table></figure><h5 id="修改行"><a href="#修改行" class="headerlink" title="修改行"></a>修改行</h5><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$lines[-<span class="number">1</span>]=<span class="string">"the end lines  jjjj!!!"</span>;</span><br></pre></td></tr></table></figure><h5 id="插入行"><a href="#插入行" class="headerlink" title="插入行"></a>插入行</h5><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#插入splice</span></span><br><span class="line"><span class="keyword">my</span> @list=(<span class="string">"a"</span>,<span class="string">"b"</span>,<span class="string">"c"</span>,<span class="string">"d"</span>);</span><br><span class="line"><span class="keyword">splice</span>(@lines,<span class="number">10</span>,<span class="number">0</span>,@list);</span><br></pre></td></tr></table></figure><h5 id="替换"><a href="#替换" class="headerlink" title="替换"></a>替换</h5><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#替换splice</span></span><br><span class="line"> @list=(<span class="string">"a"</span>,<span class="string">"b"</span>,<span class="string">"c"</span>,<span class="string">"d"</span>);</span><br><span class="line"><span class="keyword">splice</span>(@lines,<span class="number">1</span>,<span class="number">4</span>,@list);</span><br></pre></td></tr></table></figure><h5 id="解除关联"><a href="#解除关联" class="headerlink" title="解除关联"></a>解除关联</h5><p>untie(@lines);</p><h5 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h5><p>关联就相当于<br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">open</span> FH,<span class="string">"1.mol2"</span>;</span><br><span class="line"><span class="keyword">my</span> @lines=&lt;FH&gt;;</span><br><span class="line"><span class="keyword">close</span>(FH);</span><br><span class="line"><span class="comment">#deal @lines</span></span><br><span class="line"><span class="comment">#... ...</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="keyword">open</span> FH,<span class="string">"&gt;1.mol2"</span>;</span><br><span class="line"><span class="keyword">print</span> FH @lines;</span><br></pre></td></tr></table></figure></p><p>通过把数组和文件进行关联，修改数组就能直接修改文件。避开了多次创建文件句柄。<br>缺点，不能处理大文件，否则 out of memory。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl-模块推荐10-Tie-File&quot;&gt;&lt;a href=&quot;#perl-模块推荐10-Tie-File&quot; class=&quot;headerlink&quot; title=&quot;perl 模块推荐10_Tie-File&quot;&gt;&lt;/a&gt;perl 模块推荐10_Tie-File&lt;/h4&gt;&lt;
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐09_DateTime</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/09/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9009_DateTime/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/09/perl模块推荐09_DateTime/</id>
    <published>2017-03-08T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:07.030Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl模块推荐09-DateTime"><a href="#perl模块推荐09-DateTime" class="headerlink" title="perl模块推荐09_DateTime"></a>perl模块推荐09_DateTime</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>对于日期的处理，每一个成熟的语言都有自己的库。在perl中DateTime当之无愧，一共获得152个赞。</p><h5 id="应用场景1-2016年一共有多少个星期天"><a href="#应用场景1-2016年一共有多少个星期天" class="headerlink" title="应用场景1- 2016年一共有多少个星期天"></a>应用场景1- 2016年一共有多少个星期天</h5><p>$dt-&gt;day_of_week()<br>返回值是1到7，其中1代表周一，2代表周二，… …，7代表周日。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env perl</span><br><span class="line">use strict;</span><br><span class="line">use warnings;</span><br><span class="line">use DateTime;</span><br><span class="line"></span><br><span class="line">my $start = DateTime-&gt;new(</span><br><span class="line">    day   =&gt; 1,</span><br><span class="line">    month =&gt; 1,</span><br><span class="line">    year  =&gt; 2016,</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line">my $stop = DateTime-&gt;new(</span><br><span class="line">    day   =&gt; 1,</span><br><span class="line">    month =&gt; 1,</span><br><span class="line">    year  =&gt; 2017,</span><br><span class="line">);</span><br><span class="line">my $re=0;</span><br><span class="line">while($start&lt;$stop)</span><br><span class="line">&#123;</span><br><span class="line">   if($start-&gt;day_of_week()==7)</span><br><span class="line">   &#123;</span><br><span class="line">     $re++;</span><br><span class="line">   &#125;</span><br><span class="line">   $start-&gt;add(days=&gt;1);</span><br><span class="line">&#125;</span><br><span class="line">print $re,&quot;\n&quot;;</span><br></pre></td></tr></table></figure></p><h5 id="应用场景3-生成8位数的日期字典"><a href="#应用场景3-生成8位数的日期字典" class="headerlink" title="应用场景3-生成8位数的日期字典"></a>应用场景3-生成8位数的日期字典</h5><ul><li>DateTime</li></ul><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><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env perl</span></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> warnings;</span><br><span class="line"><span class="keyword">use</span> DateTime;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $start = DateTime-&gt;new(</span><br><span class="line">    <span class="string">day   =&gt;</span> <span class="number">1</span>,</span><br><span class="line">    <span class="string">month =&gt;</span> <span class="number">1</span>,</span><br><span class="line">    <span class="string">year  =&gt;</span> <span class="number">1940</span>,</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $stop = DateTime-&gt;new(</span><br><span class="line">    <span class="string">day   =&gt;</span> <span class="number">10</span>,</span><br><span class="line">    <span class="string">month =&gt;</span> <span class="number">1</span>,</span><br><span class="line">    <span class="string">year  =&gt;</span> <span class="number">2020</span>,</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> ( $start-&gt;add(<span class="string">days =&gt;</span> <span class="number">1</span>) &lt; $stop ) &#123;</span><br><span class="line">    <span class="keyword">printf</span>  $start-&gt;ymd(<span class="string">''</span>),<span class="string">"\n"</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>$dt-&gt;ymd(‘-‘)</strong> 输出格式是year month day，中间的连接符是-,如2016-1-1。</p><ul><li>Date::Range</li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env perl</span></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> warnings;</span><br><span class="line"><span class="keyword">use</span> Date::Simple;</span><br><span class="line"><span class="keyword">use</span> Date::Range;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $d1 = Date::Simple-&gt;new(<span class="string">'2009-03-02'</span>);</span><br><span class="line"><span class="keyword">my</span> $d2 = Date::Simple-&gt;new(<span class="string">'2009-03-07'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $range = Date::Range-&gt;new( $d1, $d2 );</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> <span class="keyword">my</span> $date ($range-&gt;dates) &#123;</span><br><span class="line">  <span class="keyword">print</span> $date-&gt;<span class="keyword">format</span>(<span class="string">"%m/%d/%Y"</span>), <span class="string">"\n"</span> <span class="comment"># Fixed format</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl模块推荐09-DateTime&quot;&gt;&lt;a href=&quot;#perl模块推荐09-DateTime&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐09_DateTime&quot;&gt;&lt;/a&gt;perl模块推荐09_DateTime&lt;/h4&gt;&lt;h5 i
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐07_Mojo::IOLoop事件编程</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/07/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9007_Mojo-IOLoop/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/07/perl模块推荐07_Mojo-IOLoop/</id>
    <published>2017-03-06T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:06.245Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl模块推荐07-Mojo-IOLoop事件编程"><a href="#perl模块推荐07-Mojo-IOLoop事件编程" class="headerlink" title="perl模块推荐07_Mojo::IOLoop事件编程"></a>perl模块推荐07_Mojo::IOLoop事件编程</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>编程有多种模式，比如面向对象编程，面向指针编程，面向事件编程。面向事件编程主要应用场景是GUI编程。Mojo::IOLoop是一个非常好用的面向事件编程模块。</p><h5 id="事件编程"><a href="#事件编程" class="headerlink" title="事件编程"></a>事件编程</h5><blockquote><p>在主流程中你基本只有一个主体框架,程序的动作触发都是由事件来驱动.比如我们使用的窗口程序.点最大化最小化,都是基于事件,当接收到了最大化的事件做最大化事件那部分的程序开始运行.不在从头到尾部来执行.所以我们读基于事件的程序,最好是画成思维导图来帮助我们理解.</p></blockquote><p>来源 凯哥的博客(<a href="http://www.php-oa.com/2011/03/23/perl-anyevent-ev.html" target="_blank" rel="noopener">http://www.php-oa.com/2011/03/23/perl-anyevent-ev.html</a>)</p><h5 id="监控者"><a href="#监控者" class="headerlink" title="监控者"></a>监控者</h5><ul><li><strong>TIMER</strong></li><li>以后再补充</li></ul><h5 id="条件变量"><a href="#条件变量" class="headerlink" title="条件变量"></a>条件变量</h5><h5 id="时间事件监控框架"><a href="#时间事件监控框架" class="headerlink" title="时间事件监控框架"></a>时间事件监控框架</h5><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> Mojo::IOLoop;</span><br><span class="line"><span class="comment">#定义回调函数</span></span><br><span class="line"><span class="keyword">my</span> $cb=<span class="function"><span class="keyword">sub</span></span>&#123;&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment"># Add a timer</span></span><br><span class="line"><span class="comment">#每隔5s触发回调函数</span></span><br><span class="line">Mojo::IOLoop-&gt;timer(<span class="string">5 =&gt;</span> $cb);</span><br><span class="line"></span><br><span class="line"><span class="comment"># Start event loop if necessary</span></span><br><span class="line"><span class="comment">#一切都是循环,开启循环模式</span></span><br><span class="line">Mojo::IOLoop-&gt;start <span class="keyword">unless</span> Mojo::IOLoop-&gt;is_running;</span><br></pre></td></tr></table></figure><h5 id="场景"><a href="#场景" class="headerlink" title="场景"></a>场景</h5><p>监控磁盘的可用空间大小，如果空间达到阈值则发送邮件提醒。</p><h5 id="demo"><a href="#demo" class="headerlink" title="demo"></a>demo</h5><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><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/bin/usr/perl -w</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> strict;</span><br><span class="line"><span class="keyword">use</span> Mojo::IOLoop;</span><br><span class="line"><span class="keyword">my</span> $command2=<span class="string">'df -BG|grep sda2'</span>;</span><br><span class="line"><span class="keyword">my</span> $cb=<span class="function"><span class="keyword">sub</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">my</span> $message2=<span class="string">`$command2`</span>;</span><br><span class="line"><span class="keyword">my</span> @info=$message2=~<span class="regexp">/(\S+)/g</span>;</span><br><span class="line"><span class="keyword">my</span> ($left)=$info[<span class="number">2</span>]=~<span class="regexp">/(\d+)/</span>;</span><br><span class="line"><span class="keyword">if</span> ($left &lt;<span class="number">100</span>)</span><br><span class="line">&#123;</span><br><span class="line"></span><br><span class="line">   <span class="keyword">my</span> $command=<span class="string">"./sendEmail -f xxn\@mm.cc.cn -t 101xxx4\@qq.com -u"</span>.<span class="string">' "NO space"'</span>.<span class="string">' -m "'</span>.$message2.<span class="string">'"'</span>;</span><br><span class="line">   <span class="string">`$command`</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">my</span> $time=<span class="number">4</span>*<span class="number">60</span>*<span class="number">60</span>;</span><br><span class="line">Mojo::IOLoop-&gt;recurring($time=&gt;$cb);</span><br><span class="line">Mojo::IOLoop-&gt;start <span class="keyword">unless</span> Mojo::IOLoop-&gt;is_running;</span><br></pre></td></tr></table></figure><h5 id="while版本"><a href="#while版本" class="headerlink" title="while版本"></a>while版本</h5><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span>(<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">sleep</span> $time;</span><br><span class="line">$cb-&gt;();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Mojo::IOLoop 对while循环进行了封装，除了有timer监控，还内置了其他监控，更加方便。</p><h5 id="recurring-VS-timer"><a href="#recurring-VS-timer" class="headerlink" title="recurring VS timer"></a><strong>recurring</strong> VS <strong>timer</strong></h5><ul><li>recurring<blockquote><p>Mojo::IOLoop-&gt;recurring($time=&gt;$cb);<br><br>每隔一定的时间执行回调函数，循环执行。</p></blockquote></li><li>timer<blockquote><p>Mojo::IOLoop-&gt;recurring($time=&gt;$cb);<br><br>等待一定的时间执行回调函数，只执行一次。</p></blockquote><h5 id="linux下常用命令"><a href="#linux下常用命令" class="headerlink" title="linux下常用命令"></a>linux下常用命令</h5></li><li>查看文件夹暂用大小<blockquote><p>du -s -BG ~/Downloads</p></blockquote></li></ul><p><strong>-s</strong>代表 只显示指定文件夹的总的大小，不显示内部文件以及文件夹的大小。<br><br><strong>-BG </strong> 代表文件大小的单位使用G作为单位</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl模块推荐07-Mojo-IOLoop事件编程&quot;&gt;&lt;a href=&quot;#perl模块推荐07-Mojo-IOLoop事件编程&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐07_Mojo::IOLoop事件编程&quot;&gt;&lt;/a&gt;perl模块推
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐[五]-List::Util</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/05/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%905%5B%E4%BA%94%5D-List-Util/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/05/perl模块推荐5[五]-List-Util/</id>
    <published>2017-03-04T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:05.903Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl模块推荐-五-List-Util"><a href="#perl模块推荐-五-List-Util" class="headerlink" title="perl模块推荐[五]-List::Util"></a>perl模块推荐[五]-List::Util</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p><strong>List::Util</strong> 在metacpan上获得了117个赞，该模块得到了大家的肯定，是一个非常常用的模块，集成了大量处理列表(数组)的函数,这是perl内置模块无需安装。这些函数都是经过 C 优化的，所以执行速度很快，不要重复造轮子。</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> List::Util <span class="string">qw(</span></span><br><span class="line"><span class="string">  reduce any all none notall first</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  max maxstr min minstr product sum sum0</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  pairs pairkeys pairvalues pairfirst pairgrep pairmap</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  shuffle</span></span><br><span class="line"><span class="string">)</span>;</span><br></pre></td></tr></table></figure><h5 id="常用函数说明示例"><a href="#常用函数说明示例" class="headerlink" title="常用函数说明示例"></a>常用函数说明示例</h5><ul><li>first 取出列表中第一个满足条件的元素.  </li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">my</span> @array=(<span class="number">7</span>,<span class="number">6</span>,<span class="number">1</span>,<span class="number">15</span>,<span class="number">7</span>,<span class="number">9</span>,<span class="number">18</span>);</span><br><span class="line"><span class="keyword">my</span> $re=first&#123;$_&gt;<span class="number">7</span>&#125; @List;</span><br><span class="line"><span class="keyword">print</span> $re,<span class="string">"\n"</span>; <span class="comment">#15</span></span><br></pre></td></tr></table></figure><ul><li>sum 求列表中所有元素的和，列表为空，返回undef</li><li>sum0 求列表中所有元素的和，列表为空，返回0</li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">my</span> @array=(<span class="number">7</span>,<span class="number">6</span>,<span class="number">1</span>,<span class="number">15</span>,<span class="number">7</span>,<span class="number">9</span>,<span class="number">18</span>);</span><br><span class="line"><span class="keyword">my</span> $sum=sum(@list);</span><br><span class="line"><span class="keyword">print</span> $sum,<span class="string">"\n"</span>; <span class="comment">#15</span></span><br></pre></td></tr></table></figure><ul><li><p>product 求列表中元素的乘积，列表为空返回1.</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">my</span> @array=(<span class="number">1</span>,<span class="number">4</span>,<span class="number">9</span>);</span><br><span class="line"><span class="keyword">my</span> $re=product(@array)</span><br><span class="line"><span class="keyword">print</span> $re,<span class="string">"\n"</span>; <span class="comment">#36</span></span><br></pre></td></tr></table></figure></li><li><p>max 取列表中数值最大者，列表为空返回undef</p></li><li>min 取列表中数值最小者，列表为空返回undef</li><li>maxstr 取字符串列表中的较大者</li><li><p>minstr 取字符串列表中的较小者</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></pre></td><td class="code"><pre><span class="line">$foo = minstr <span class="string">'A'</span>..<span class="string">'Z'</span>          <span class="comment"># 'A'</span></span><br><span class="line">$foo = minstr <span class="string">"hello"</span>,<span class="string">"world"</span>   <span class="comment"># "hello"</span></span><br><span class="line">$foo = maxstr <span class="string">'A'</span>..<span class="string">'Z'</span>          <span class="comment"># 'Z'</span></span><br><span class="line">$foo = maxstr <span class="string">"hello"</span>,<span class="string">"world"</span>   <span class="comment"># "world"</span></span><br></pre></td></tr></table></figure></li><li><p>any 列表中有一个元素满足条件返回true。</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">my</span> @strings=(<span class="string">"hello"</span>,<span class="string">"abcd"</span>,<span class="string">"whoami"</span>,<span class="string">"a"</span>)</span><br><span class="line"><span class="keyword">if</span>( any &#123; <span class="keyword">length</span> &gt; <span class="number">5</span> &#125; @strings ) &#123;  <span class="comment">#True</span></span><br><span class="line">    <span class="comment"># at least one string has more than 10 characters</span></span><br><span class="line">    <span class="keyword">print</span> <span class="string">"I have found at least a string length than 5 "</span></span><br><span class="line">&#125; <span class="comment">#</span></span><br></pre></td></tr></table></figure></li><li><p>all 列表中所有元素满足条件，返回True</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">my</span> @strings=(<span class="string">"hello"</span>,<span class="string">"abcd"</span>,<span class="string">"whoami"</span>,<span class="string">"a"</span>)</span><br><span class="line"><span class="keyword">if</span>( any &#123; <span class="keyword">length</span> &gt; <span class="number">5</span> &#125; @strings ) &#123;  <span class="comment">#False</span></span><br><span class="line">    <span class="comment"># at least one string has more than 10 characters</span></span><br><span class="line">    <span class="keyword">print</span> <span class="string">"I have found at least a string length than 5 "</span></span><br><span class="line">&#125; <span class="comment">#</span></span><br></pre></td></tr></table></figure></li><li><p>reduce 利用内置变量$a $b,进行循环处理</p></li></ul><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></pre></td><td class="code"><pre><span class="line"> $foo = reduce &#123; <span class="keyword">defined</span>($a)            ? $a :</span><br><span class="line">                $code-&gt;(<span class="keyword">local</span> $_ = $b) ? $b :</span><br><span class="line">                                         <span class="keyword">undef</span> &#125; <span class="keyword">undef</span>, @list <span class="comment"># first</span></span><br><span class="line"></span><br><span class="line">$foo = reduce &#123; $a &gt; $b ? $a : $b &#125; <span class="number">1</span>..<span class="number">10</span>       <span class="comment"># max</span></span><br><span class="line">$foo = reduce &#123; $a <span class="keyword">gt</span> $b ? $a : $b &#125; <span class="string">'A'</span>..<span class="string">'Z'</span>   <span class="comment"># maxstr</span></span><br><span class="line">$foo = reduce &#123; $a &lt; $b ? $a : $b &#125; <span class="number">1</span>..<span class="number">10</span>       <span class="comment"># min</span></span><br><span class="line">$foo = reduce &#123; $a <span class="keyword">lt</span> $b ? $a : $b &#125; <span class="string">'aa'</span>..<span class="string">'zz'</span> <span class="comment"># minstr</span></span><br><span class="line">$foo = reduce &#123; $a + $b &#125; <span class="number">1</span> .. <span class="number">10</span>               <span class="comment"># sum</span></span><br><span class="line">$foo = reduce &#123; $a . $b &#125; @bar                  <span class="comment"># concat</span></span><br><span class="line"></span><br><span class="line">$foo = reduce &#123; $a || $code-&gt;(<span class="keyword">local</span> $_ = $b) &#125; <span class="number">0</span>, @bar   <span class="comment"># any</span></span><br><span class="line">$foo = reduce &#123; $a &amp;&amp; $code-&gt;(<span class="keyword">local</span> $_ = $b) &#125; <span class="number">1</span>, @bar   <span class="comment"># all</span></span><br><span class="line">$foo = reduce &#123; $a &amp;&amp; !$code-&gt;(<span class="keyword">local</span> $_ = $b) &#125; <span class="number">1</span>, @bar  <span class="comment"># none</span></span><br><span class="line">$foo = reduce &#123; $a || !$code-&gt;(<span class="keyword">local</span> $_ = $b) &#125; <span class="number">0</span>, @bar  <span class="comment"># notall</span></span><br><span class="line"><span class="comment"># Note that these implementations do not fully short-circuit</span></span><br></pre></td></tr></table></figure><ul><li><p>shuffle 把列表中的顺序打乱</p><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@cards = shuffle <span class="number">0</span>..<span class="number">51</span>      <span class="comment"># 0..51 in a random order</span></span><br></pre></td></tr></table></figure></li><li><p>uniq  对字符串列表去重</p></li><li>uniqnum  对数字串列表去重</li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> List::Util <span class="string">qw(uniq uniqnum)</span>;</span><br><span class="line"><span class="keyword">my</span> @aa=(<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">3</span>,<span class="number">3</span>,<span class="number">2</span>,<span class="string">'a'</span>,<span class="string">'bdd'</span>,<span class="string">'c'</span>,<span class="string">'a'</span>);</span><br><span class="line"><span class="keyword">my</span> @bb=(<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">1</span>);</span><br><span class="line"><span class="keyword">print</span> <span class="keyword">join</span> <span class="string">","</span>,uniq @aa; <span class="comment">#1,2,3,a,bdd,c</span></span><br><span class="line"><span class="keyword">print</span> <span class="string">"\n"</span>;</span><br><span class="line"><span class="keyword">print</span> <span class="keyword">join</span> <span class="string">","</span>,uniqnum @bb; <span class="comment">#2,3,4,1</span></span><br></pre></td></tr></table></figure><p>如果上述函数，还不能满足你的话，可以看看<strong>List::MoreUtils</strong></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl模块推荐-五-List-Util&quot;&gt;&lt;a href=&quot;#perl模块推荐-五-List-Util&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐[五]-List::Util&quot;&gt;&lt;/a&gt;perl模块推荐[五]-List::Util&lt;/
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐[三]-Mojo::EventEmitter</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/03/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9002%5B%E4%BA%8C%5D-Mojo-EventEmitter/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/03/perl模块推荐02[二]-Mojo-EventEmitter/</id>
    <published>2017-03-02T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:06.626Z</updated>
    
    <content type="html"><![CDATA[<h3 id="perl模块推荐-三-Mojo-EventEmitter"><a href="#perl模块推荐-三-Mojo-EventEmitter" class="headerlink" title="perl模块推荐[三]-Mojo::EventEmitter"></a>perl模块推荐[三]-Mojo::EventEmitter</h3><h4 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h4><p>基本每个语言中都会有EventEmitter的类，可见这个模块的重要性。<br>通过Mojo-EventEmitter可以构建事件对象。一般情况下，事件对象是依附于其他具体的对象的。</p><h5 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h5><p>事件名称，事件处理函数，一个事件名称可以绑定多个事件处理函数。<br>事件对象 my $event_object=Mojo::EventEmitter-&gt;new();但是一般情况下，事件对象不是独立存在的。一般依附于具体的对象，也就是其它类通常会继承事件类。<br><figure class="highlight perl"><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">package</span> Cat;</span><br><span class="line"><span class="keyword">use</span> Mojo::Base <span class="string">'Mojo::EventEmitter'</span>;</span><br></pre></td></tr></table></figure></p><ul><li>通过<strong>on</strong>将事件名称和事件处理函数进行绑定。</li><li>通过<strong>once</strong>绑定的是一次性事件处理函数，执行完一次后，该事件处理函数会自动和事件名称解除绑定。</li><li>通过<strong>emit</strong>调用事件名称，触发所有绑定的事件处理函数。</li><li>通过<strong>has_subscribers</strong> 检查某个事件（名称）是否存在。</li><li>通过<strong>subscribers</strong> 获得该事件（名称）绑定的所有事件处理函数，返回一个数组应用。</li><li>通过<strong>unsubscribe</strong> 清除某个事件名称，或者清除某个事件上绑定的函数。</li></ul><h4 id="实际应用-demo"><a href="#实际应用-demo" class="headerlink" title="实际应用-demo"></a>实际应用-demo</h4><p>在类中定义好事件名称，事件处理函数，还是在对象中定义事件名称，事件处理函数。根据具体情况自行安排。<br><strong>类中一定要继承Mojo::EventEmitter。</strong><br><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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> Cat;</span><br><span class="line"><span class="keyword">use</span> Mojo::Base <span class="string">'Mojo::EventEmitter'</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">sub</span> <span class="title">new</span> </span>&#123;</span><br><span class="line">  <span class="keyword">my</span> $self = <span class="keyword">shift</span>-&gt;SUPER::new(@_);</span><br><span class="line">  $self-&gt;on(<span class="string">message =&gt;</span> \&amp;_message);</span><br><span class="line">  $self-&gt;on(<span class="string">message =&gt;</span> \&amp;_message2);</span><br><span class="line">  $self-&gt;once(<span class="string">message =&gt;</span> \&amp;_message3);</span><br><span class="line">  <span class="keyword">return</span> $self;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">sub</span> _<span class="title">message</span> </span>&#123;</span><br><span class="line">  <span class="keyword">my</span> ($self, $message) = (<span class="keyword">shift</span>, <span class="keyword">shift</span>);</span><br><span class="line">  <span class="keyword">print</span> $message,<span class="string">"\n"</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">sub</span> _<span class="title">message2</span> </span>&#123;</span><br><span class="line">  <span class="keyword">my</span> ($self, $message) = (<span class="keyword">shift</span>, <span class="keyword">shift</span>);</span><br><span class="line">  <span class="keyword">print</span> $message,<span class="string">"222\n"</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">sub</span> _<span class="title">message3</span> </span>&#123;</span><br><span class="line">  <span class="keyword">my</span> ($self, $message) = (<span class="keyword">shift</span>, <span class="keyword">shift</span>);</span><br><span class="line">  <span class="keyword">print</span> $message,<span class="string">"333\n"</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">sub</span> <span class="title">sing</span> </span>&#123; <span class="keyword">shift</span>-&gt;emit(<span class="string">'message'</span>, <span class="keyword">shift</span>, @_) &#125;  </span><br><span class="line"><span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">my</span> $cat=Cat-&gt;new();</span><br><span class="line">$cat-&gt;sing(<span class="string">"miao miao"</span>);</span><br><span class="line">$cat-&gt;sing(<span class="string">"ji ji"</span>);</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;perl模块推荐-三-Mojo-EventEmitter&quot;&gt;&lt;a href=&quot;#perl模块推荐-三-Mojo-EventEmitter&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐[三]-Mojo::EventEmitter&quot;&gt;&lt;/a&gt;
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
  <entry>
    <title>perl模块推荐[三]-Storable</title>
    <link href="http://blog.chenzhaoqiang.com/2017/03/03/perl%E6%A8%A1%E5%9D%97%E6%8E%A8%E8%8D%9003%5B%E4%B8%89%5D-Storable/"/>
    <id>http://blog.chenzhaoqiang.com/2017/03/03/perl模块推荐03[三]-Storable/</id>
    <published>2017-03-02T22:32:56.000Z</published>
    <updated>2018-04-04T10:23:07.163Z</updated>
    
    <content type="html"><![CDATA[<h4 id="perl模块推荐-三-Storable"><a href="#perl模块推荐-三-Storable" class="headerlink" title="perl模块推荐[三]-Storable"></a>perl模块推荐[三]-Storable</h4><h5 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h5><p>Storable 一劳永逸，对perl中的数据结构即存<strong>store</strong>即用<strong>retrieve</strong>。<strong>nstore</strong> 可以跨平台，兼容性更好。<br>storable 模块可以用神奇来形容，能存储和解析各种perl的数据结构。一次解析，永久使用的目的。</p><h5 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h5><p>hash表的存储。我有一份数据，是key-value的形式存储在文本中。这份数据我要经常使用。</p><h5 id="step1转存成storable格式"><a href="#step1转存成storable格式" class="headerlink" title="step1转存成storable格式"></a>step1转存成storable格式</h5><p><strong>store</strong><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> Storable <span class="string">qw (store)</span>;</span><br><span class="line"><span class="keyword">my</span> %hash;</span><br><span class="line"><span class="keyword">while</span>(&lt;DATA&gt;)</span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">my</span>($key,$value)=$_=~<span class="regexp">/(\S+)/g</span>;</span><br><span class="line">  $hash&#123;$key&#125;=$value;</span><br><span class="line">&#125;</span><br><span class="line">store \%hash,<span class="string">"1.str"</span>; <span class="comment">#生成一个新文件1.str</span></span><br><span class="line">__DATA__</span><br><span class="line">A 11</span><br><span class="line">B  112</span><br><span class="line">C  444</span><br></pre></td></tr></table></figure></p><h5 id="setp2-获取hash数据结构"><a href="#setp2-获取hash数据结构" class="headerlink" title="setp2 获取hash数据结构"></a>setp2 获取hash数据结构</h5><p><strong>retrieve</strong><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> Storable <span class="string">qw(retrieve)</span>;</span><br><span class="line"><span class="keyword">my</span> $hash_ref=retrieve(<span class="string">'1.str'</span>);</span><br><span class="line"><span class="keyword">print</span> $hash_ref-&gt;&#123;C&#125;;</span><br><span class="line"><span class="comment"># 4444</span></span><br></pre></td></tr></table></figure></p><p>同理，数组，对象都是可以存储的。存储和获得的都是引用。</p><h6 id="nstore-和-store的异同"><a href="#nstore-和-store的异同" class="headerlink" title="nstore 和 store的异同"></a>nstore 和 store的异同</h6><p>两者都可以用来保存perl中的数据结构。</p><ul><li>store 是按照常规的byte order 字节序保存的。</li><li>nstore 是按照net order 网络字节序保存的。</li></ul><p><strong>网络字节顺序是TCP/IP中规定好的一种数据表示格式，它与具体的CPU类型、操作系统等无关，从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。</strong></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;perl模块推荐-三-Storable&quot;&gt;&lt;a href=&quot;#perl模块推荐-三-Storable&quot; class=&quot;headerlink&quot; title=&quot;perl模块推荐[三]-Storable&quot;&gt;&lt;/a&gt;perl模块推荐[三]-Storable&lt;/h4&gt;&lt;h5
      
    
    </summary>
    
    
      <category term="perl模块" scheme="http://blog.chenzhaoqiang.com/tags/perl%E6%A8%A1%E5%9D%97/"/>
    
      <category term="perl" scheme="http://blog.chenzhaoqiang.com/tags/perl/"/>
    
  </entry>
  
</feed>
