<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>东行不西游</title>
  
  <subtitle>风在前,无惧!</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://dangbowen.com/"/>
  <updated>2020-05-03T13:54:46.605Z</updated>
  <id>https://dangbowen.com/</id>
  
  <author>
    <name>Bowen</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>断更2个月了</title>
    <link href="https://dangbowen.com/diary/642906e2.html"/>
    <id>https://dangbowen.com/diary/642906e2.html</id>
    <published>2019-11-04T02:01:55.000Z</published>
    <updated>2020-05-03T13:54:46.605Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>断更2个月意味着少写了8篇博客,年底前补完,不过这2个月可没有去玩~又是到了职业规划的重要一步</p></blockquote><a id="more"></a><h2 id="工作"><a href="#工作" class="headerlink" title="工作"></a>工作</h2><p>职业规划完成了目前看来最重要的一步.这一步对我太重要了,太关键了.让我知道了自己的长处短处和时间的宝贵.很庆幸自己能在目前的阶段发现自身的问题.不过也很遗憾觉得自己发现的太晚了.</p><ol><li>时间的利用效率低  </li><li>技术的积累不够专,驳杂没深度</li><li>想学的太多,都是这一榔头那一棒子的,没有规划</li></ol><h2 id="生活"><a href="#生活" class="headerlink" title="生活"></a>生活</h2><blockquote><p>厨艺</p></blockquote><p>做了一个新疆炒米粉,感觉还可以.但是最近停了做饭,发现一直做饭会上瘾,不做饭后就真的很少会再进厨房.不过也和生活方式有关.</p><p>其他没啥好记录的.因为这短时间重心都是在工作.</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;断更2个月意味着少写了8篇博客,年底前补完,不过这2个月可没有去玩~又是到了职业规划的重要一步&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="diary" scheme="https://dangbowen.com/categories/diary/"/>
    
    
      <category term="life" scheme="https://dangbowen.com/tags/life/"/>
    
  </entry>
  
  <entry>
    <title>mac 10.14.76 Mojave系统安装nginx,php,mysql</title>
    <link href="https://dangbowen.com/php/84c1c2fb.html"/>
    <id>https://dangbowen.com/php/84c1c2fb.html</id>
    <published>2019-08-16T21:41:41.000Z</published>
    <updated>2019-08-16T14:56:36.150Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>mac 10.14.76 Mojave系统自带的php为7.1.3如果只是简单调试php代码的环境已经足以.几分钟内即可搭建完整的lnmp环境</p></blockquote><a id="more"></a><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>新入手一台mbp,所以需要装一个简单的lnmp跑一些简单的php脚本,Mojave系统自带<code>php</code>是7.1.3已经完全符合使用要求,只需要简单的改下配置即可,<code>nginx</code>和<code>mysql</code>更是直接使用<code>brew</code> 直接安装就行.但是brew install 不同版本的软件的时候已经更改为 php@71 而不是 php71这种,所以不确定的时候一定要先 brew search php|mysql 查看一下.</p><h2 id="nginx"><a href="#nginx" class="headerlink" title="nginx"></a>nginx</h2><figure class="highlight zsh"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 用mac 的包管理 brew 安装nginx</span></span><br><span class="line">$ brew install nginx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动nginx</span></span><br><span class="line">$ sudo nginx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑nginx配置文件, 先改一下和项目路径 安装完nginx后配置文件默认就在 /usr/local/etc/nginx 下</span></span><br><span class="line">$ sudo vi /usr/<span class="built_in">local</span>/etc/nginx/nginx.conf</span><br><span class="line">http &#123;</span><br><span class="line">    ...</span><br><span class="line"></span><br><span class="line">    <span class="comment">#gzip  on;</span></span><br><span class="line">    autoindex on; <span class="comment"># 开启文件浏览</span></span><br><span class="line">    autoindex_exact_size off; <span class="comment"># 显示kb大小</span></span><br><span class="line">    autoindex_localtime on;  <span class="comment"># 显示修改时间</span></span><br><span class="line"></span><br><span class="line">    ...</span><br><span class="line"></span><br><span class="line">    server&#123;</span><br><span class="line">        listen       80;</span><br><span class="line">        server_name  localhost;</span><br><span class="line">        ...</span><br><span class="line">        location / &#123;</span><br><span class="line">                    root   /www; <span class="comment">#php脚本位置</span></span><br><span class="line">                    index  index.html index.htm;</span><br><span class="line">                &#125;</span><br><span class="line">        ...</span><br><span class="line">        location ~ \.php$ &#123;</span><br><span class="line">                    root           /www;</span><br><span class="line">                    fastcgi_pass   127.0.0.1:9000;</span><br><span class="line">                    fastcgi_index  index.php;</span><br><span class="line">                   <span class="comment"># fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; #自带的注释掉 改成下面的</span></span><br><span class="line">                    fastcgi_param  SCRIPT_FILENAME  <span class="variable">$document_root</span><span class="variable">$fastcgi_script_name</span>; <span class="comment"># 这个是解析php的</span></span><br><span class="line">                    include        fastcgi_params;</span><br><span class="line">                &#125;</span><br><span class="line">    &#125;</span><br><span class="line">wq!</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重新加载配置</span></span><br><span class="line">$ sudo nginx -s reload</span><br><span class="line"></span><br><span class="line"><span class="comment"># nginx的几个命令 重新加载配置|重启|停止|退出</span></span><br><span class="line">$ sudo nginx -s reload|reopen|stop|quit</span><br></pre></td></tr></table></figure><h2 id="php"><a href="#php" class="headerlink" title="php"></a>php</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 直接用系统自带的php,配置文件在 /private/etc下 先更改下log的位置</span></span><br><span class="line">$ sudo vi /private/etc/php-fpm.conf</span><br><span class="line">error_log = /usr/<span class="built_in">local</span>/var/<span class="built_in">log</span>/php-fpm.log <span class="comment">#换成这个地址,不然启动会报一个日志的错</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制一个 php-fpm的配置文件 不然启动报错找不到conf</span></span><br><span class="line">$ <span class="built_in">cd</span> /private/etc/php-fpm.d/</span><br><span class="line">$ sudo cp www.conf.default www.conf</span><br><span class="line"></span><br><span class="line"><span class="comment">#启动php-fpm</span></span><br><span class="line">$ sudo php-fpm</span><br></pre></td></tr></table></figure><h2 id="mysql"><a href="#mysql" class="headerlink" title="mysql"></a>mysql</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># brew安装mysql, 成功后注意一下末尾有很重要的信息,我就是没看仔细 耽误了一会功夫</span></span><br><span class="line">$ brew install mysql@5.7</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">We<span class="string">'ve installed your MySQL database without a root password. To secure it run:</span></span><br><span class="line"><span class="string">    mysql_secure_installation  #初始化mysql的root 密码</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">MySQL is configured to only allow connections from localhost by default</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">To connect run:</span></span><br><span class="line"><span class="string">    mysql -uroot</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">mysql@5.7 is keg-only, which means it was not symlinked into /usr/local,</span></span><br><span class="line"><span class="string">because this is an alternate version of another formula.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">If you need to have mysql@5.7 first in your PATH run:</span></span><br><span class="line"><span class="string">  echo '</span><span class="built_in">export</span> PATH=<span class="string">"/usr/local/opt/mysql@5.7/bin:<span class="variable">$PATH</span>"</span><span class="string">' &gt;&gt; ~/.zshrc  # 我用的zsh 所以需要把环境变量更新到配置文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">For compilers to find mysql@5.7 you may need to set:</span></span><br><span class="line"><span class="string">  export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"</span></span><br><span class="line"><span class="string">  export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">For pkg-config to find mysql@5.7 you may need to set:</span></span><br><span class="line"><span class="string">  export PKG_CONFIG_PATH="/usr/local/opt/mysql@5.7/lib/pkgconfig"</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">To have launchd start mysql@5.7 now and restart at login:</span></span><br><span class="line"><span class="string">  brew services start mysql@5.7 #brew services 管理 启动</span></span><br><span class="line"><span class="string">Or, if you don'</span>t want/need a background service you can just run:</span><br><span class="line">  /usr/<span class="built_in">local</span>/opt/mysql@5.7/bin/mysql.server start <span class="comment"># 这个是用mysql直接启动</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#zsh下需要先增加环境变量</span></span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"'</span> &gt;&gt; ~/.zshrc</span><br><span class="line">$ <span class="built_in">source</span> ~/.zshrc</span><br><span class="line"></span><br><span class="line"><span class="comment">#启动mysql</span></span><br><span class="line">$ /usr/<span class="built_in">local</span>/opt/mysql@5.7/bin/mysql.server start</span><br><span class="line"></span><br><span class="line"><span class="comment">#初始化密码</span></span><br><span class="line">$ mysql_secure_installation</span><br><span class="line">按照提示设置即可</span><br><span class="line"></span><br><span class="line"><span class="comment">#登录mysql 输入上一步设置的 密码</span></span><br><span class="line">$ mysql -uroot -p</span><br></pre></td></tr></table></figure><h2 id="各个步骤容易出现的问题"><a href="#各个步骤容易出现的问题" class="headerlink" title="各个步骤容易出现的问题"></a>各个步骤容易出现的问题</h2><ol><li>苹果系统自带php-fpm启动报错<code>No pool defined</code> <code>failed to post process the configuration</code> <code>FPM initialization failed</code></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#具体错误</span></span><br><span class="line">$  /etc  sudo php-fpm        </span><br><span class="line">No <span class="built_in">log</span> handling enabled - using stderr logging</span><br><span class="line">Created directory: /var/db/net-snmp</span><br><span class="line">Created directory: /var/db/net-snmp/mib_indexes</span><br><span class="line">[16-Aug-2019 20:36:21] WARNING: Nothing matches the include pattern <span class="string">'/private/etc/php-fpm.d/*.conf'</span> from /private/etc/php-fpm.conf at line 125.</span><br><span class="line">[16-Aug-2019 20:36:21] ERROR: No pool defined. at least one pool section must be specified <span class="keyword">in</span> config file</span><br><span class="line">[16-Aug-2019 20:36:21] ERROR: failed to post process the configuration</span><br><span class="line">[16-Aug-2019 20:36:21] ERROR: FPM initialization failed</span><br><span class="line"></span><br><span class="line"><span class="comment">#解决方案:</span></span><br><span class="line">$ <span class="built_in">cd</span> /private/etc/php-fpm.d/</span><br><span class="line">$ sudo cp www.conf.default www.conf</span><br><span class="line"><span class="comment"># 重新启动php-fpm即可</span></span><br><span class="line">$ sudo php-fpm</span><br></pre></td></tr></table></figure><ol start="2"><li><p>mysql 启动报错 <code>ERROR 2002 (HY000): Can&#39;t connect to local MySQL server through socket &#39;/tmp/mysql.sock&#39; (2)</code></p><p> 这是由于<code>brew install mysql@5.7</code>后没有启动<code>mysql</code>服务导致的,所以解决方案是直接启动<code>mysql</code>服务就好:</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ /usr/<span class="built_in">local</span>/opt/mysql@5.7/bin/mysql.server start</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;mac 10.14.76 Mojave系统自带的php为7.1.3如果只是简单调试php代码的环境已经足以.几分钟内即可搭建完整的lnmp环境&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="php" scheme="https://dangbowen.com/categories/php/"/>
    
    
      <category term="php" scheme="https://dangbowen.com/tags/php/"/>
    
      <category term="nginx" scheme="https://dangbowen.com/tags/nginx/"/>
    
      <category term="mysql" scheme="https://dangbowen.com/tags/mysql/"/>
    
  </entry>
  
  <entry>
    <title>短视频领域里的分享</title>
    <link href="https://dangbowen.com/Career/yixia/3d93082c.html"/>
    <id>https://dangbowen.com/Career/yixia/3d93082c.html</id>
    <published>2019-08-14T22:13:52.000Z</published>
    <updated>2019-11-03T17:56:49.204Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>从当初选择短视频领域后,我已经参与了大大小小和视频类相关的app已经有好几个.这个系列主要是想把这部分经历沉淀一下</p></blockquote><a id="more"></a><h2 id="初次接触"><a href="#初次接触" class="headerlink" title="初次接触"></a>初次接触</h2><p>接触第一个短视频是在15年的夏天,那会还在用小米手机,朋友圈看有人分享了小咖秀的视频,就下载了一个,还顺带玩了一上午,当时安卓的版本很简陋,功能只有注册登录收藏发布和一个首页列表.当时收藏了2个视频,一个用脚模仿开枪的,另一个是个面部表情特丰富的一个达人.当时哪能想到会有机会没加入到小咖秀的项目中呢~</p><h2 id="加入团队"><a href="#加入团队" class="headerlink" title="加入团队"></a>加入团队</h2><p>17年的6月进了小咖秀的组,当时来是觉得短视频偏娱乐,项目前景不会差,而且公司又是这个领域里的龙头企业,简直不能太合适.但是从<code>小咖秀</code>诞生到1年后的巅峰, 再到3年后的跌出榜单, 包含了团队里太多的欢笑与苦涩, 也凝聚了太多人的心血和付出,我也非常荣幸的能参与到这其中的一部分.</p><h2 id="竞品"><a href="#竞品" class="headerlink" title="竞品"></a>竞品</h2><p>当时抖音势头凶猛,而且增速已然成为现象级的产品,加上冠名了综艺和各大明星的合作,无时无刻都在扩大影响力.这些都真实威胁到了老牌的前几个短视频项目.短视频+对口型表演是小咖秀的核心玩法,抖音的核心玩法就是短视频+音乐舞蹈.后者的场景更多,并不局限内容场景.而且4G流量的费用不断降低和手机拍照越来越好,更是降低了短视频的参与成本.几百块的手机拍照已经比17年之前的几千块的手机更加清晰,功能更强大,所以一个产品的衰落是多方因素.这个也算是我得到的经验之一.</p><h2 id="技术"><a href="#技术" class="headerlink" title="技术"></a>技术</h2><p>ffmpeg是真的强大.python也很好用.还能说点什么积累呢?想起来以后再补充</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;从当初选择短视频领域后,我已经参与了大大小小和视频类相关的app已经有好几个.这个系列主要是想把这部分经历沉淀一下&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="Career" scheme="https://dangbowen.com/categories/Career/"/>
    
      <category term="yixia" scheme="https://dangbowen.com/categories/Career/yixia/"/>
    
    
      <category term="Career" scheme="https://dangbowen.com/tags/Career/"/>
    
  </entry>
  
  <entry>
    <title>排序算法-快速排序</title>
    <link href="https://dangbowen.com/algorithm/sort/2f44d825.html"/>
    <id>https://dangbowen.com/algorithm/sort/2f44d825.html</id>
    <published>2019-07-19T17:05:36.000Z</published>
    <updated>2019-08-14T13:01:53.971Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>图灵奖得主C. A. R. Hoare(托尼·霍尔)于1960时提出来的排序算法,使用非常广泛,速度也很快</p></blockquote><a id="more"></a><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>总结为:给每一步的基准值找到它正确索引位置的过程.<br>首先,选一个基准值(可以选第一个,可以选最后一个,可以选中间,本文选第一个),根据和基准值比大小分割成左边分区(比基准值小)和右边分区(比基准值大),利用<code>分而治之</code>递归处理左右两个分区(将每个分区再重复选基准值和分区),最终达到每个分区只有一个元素的时候即为<code>基准条件</code>(返回分区合并后的列表),<code>归纳条件</code>为分区的头和尾的游标不相等.这里需要仔细理解下分区递归处理.</p><h2 id="实现过程"><a href="#实现过程" class="headerlink" title="实现过程"></a>实现过程</h2><p>先实现原地快速排序的方法, 给定一个无序列表 <code>[3, 4, 1, 2, 5]</code>, 还需要为了左右开始遍历列表行程分区的2个游标 i(左侧) 和 j(右侧):</p><ol><li><p>选定初始值为数组第一个元素 (选拔该次排序列表的基准值条件)</p><p> 基准值: 3</p><p> 列表:<code>[3, 4, 1, 2, 5]</code></p></li><li><p>从列表末端向左侧开始进行对比,如果比基准值大就继续找(目的是把无序列表按照基准值为分界线分成左右2个分区),比基准值小的说明该位置的元素应该分配到基准值的左侧,而此时基准值已经被取走了,相当于左侧第一个元素的位置是空的,于是把该值赋予到左侧第一个</p><p> 基准值: 3</p><p> 小于基准值的元素: 2</p><p> 列表:<code>[2, 4, 1, 2(右侧游标j), 5]</code></p></li><li><p>因为找到了比基准值小的元素并且进行了重新赋值,所以现在2 的位置上相当于是空的(因为已经把2赋予给了列表第一个), 所以需要从左侧开始找比基准值大的元素.找到了 4 后进行和上一轮的游标j的值进行赋值操作</p><p> 基准值: 3</p><p> 大于基准值的元素: 4</p><p> 列表: <code>[2, 4(i位置), 1, 4(j上一轮位置,进行赋值为4), 5]</code></p></li><li><p>左侧已经找到了比基准值大的,所以又轮到右侧继续从 4 的索引位置开始向左寻找,并且找到了 1 比基准值小.进行和上一轮的i索引的值进行赋值操作</p><p> 基准值: 3</p><p> 小于基准值的元素: 1</p><p> 列表: <code>[2, 1(i上一轮位置), 1(此时j位置), 4, 5]</code></p></li><li><p>i像右侧开始比大小时 i 和 j 已经相等了,说明已经遍历完所有元素,这个时候把基准值赋值到 i 和 j 的共同位置即可完成此次的排序</p><p> 基准值: 3</p><p> 列表: <code>[2, 1, 3, 4, 5]</code><br>这一轮已经进行完 分区的操作 以基准值 3 分为了 <code>[2,1]</code> 和 <code>[4, 5]</code><br>接下来的操作就是把这2个继续 按照 步骤操作,直到每个分区只有一个元素的时候就完成了所有列表的排序</p></li></ol><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">quickSort</span><span class="params">(list:<span class="string">'list'</span>, start, end)</span>-&gt;list:</span></span><br><span class="line">    k = start  <span class="comment">#记录初始位置的游标</span></span><br><span class="line">    j = end    <span class="comment">#记录结束位置的游标</span></span><br><span class="line">    <span class="keyword">if</span> start &lt; end:  <span class="comment"># 基准条件 最外层的list分区里有2个索引, 因为至少2个元素才能进行排序</span></span><br><span class="line">        init = list[k]  <span class="comment">#初始化一个start位置的元素当基准值,最后需要填充到 j = k 索引的位置上</span></span><br><span class="line">        <span class="keyword">while</span> j != k: <span class="comment">#左右两侧不相等就说明2个游标未遍历完所有元素</span></span><br><span class="line">            <span class="keyword">while</span> j &gt; k <span class="keyword">and</span> list[j] &gt;= init: <span class="comment">#遍历右侧的条件</span></span><br><span class="line">                j -= <span class="number">1</span></span><br><span class="line">            list[k] = list[j] <span class="comment">#进行赋值操作</span></span><br><span class="line">            <span class="keyword">while</span> k &lt; j <span class="keyword">and</span> list[k] &lt;= init: <span class="comment">#遍历左侧的条件</span></span><br><span class="line">                k += <span class="number">1</span></span><br><span class="line">            list[j] = list[k] <span class="comment">#进行赋值操作</span></span><br><span class="line">        list[j] = init <span class="comment">#该分区已经全部赋值完,把基准位置的值填入 j = k 的索引</span></span><br><span class="line">        quickSort(list, start, k<span class="number">-1</span>) <span class="comment">#把该列表里的左右分区递归的进行处理</span></span><br><span class="line">        quickSort(list, k+<span class="number">1</span>, end) <span class="comment">#把该列表里的左右分区递归的进行处理</span></span><br><span class="line">    <span class="keyword">return</span> list <span class="comment">#分区已经只有一个元素了</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#空间复杂度高,但是理解非常简单</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">quickSort</span><span class="params">(list:<span class="string">'list'</span>)</span>-&gt;list:</span></span><br><span class="line">    <span class="keyword">if</span> len(list)&lt;<span class="number">2</span>:  <span class="comment">#基准条件 </span></span><br><span class="line">        <span class="keyword">return</span> list</span><br><span class="line">    init = list[<span class="number">0</span>]   <span class="comment">#选基准值</span></span><br><span class="line">    left = [val <span class="keyword">for</span> val <span class="keyword">in</span> list[<span class="number">1</span>:] <span class="keyword">if</span> val &lt;= init] <span class="comment">#比大小选出来左侧分区</span></span><br><span class="line">    right = [val <span class="keyword">for</span> val <span class="keyword">in</span> list[<span class="number">1</span>:] <span class="keyword">if</span> val &gt; init] <span class="comment">#比大小选出来左侧分区</span></span><br><span class="line">    <span class="keyword">return</span> quickSort(left) + [init] + quickSort(right) <span class="comment">#递归处理 left 和 right分区</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;图灵奖得主C. A. R. Hoare(托尼·霍尔)于1960时提出来的排序算法,使用非常广泛,速度也很快&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="algorithm" scheme="https://dangbowen.com/categories/algorithm/"/>
    
      <category term="sort" scheme="https://dangbowen.com/categories/algorithm/sort/"/>
    
    
      <category term="algorithm" scheme="https://dangbowen.com/tags/algorithm/"/>
    
  </entry>
  
  <entry>
    <title>排序算法-直接选择排序</title>
    <link href="https://dangbowen.com/algorithm/sort/18e3fa36.html"/>
    <id>https://dangbowen.com/algorithm/sort/18e3fa36.html</id>
    <published>2019-07-18T11:37:08.000Z</published>
    <updated>2019-08-14T13:01:53.971Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>通过直接选择排序可以初步明白时间复杂度和空间复杂度的概念,以及直接选择排序的思路</p></blockquote><a id="more"></a><h2 id="实现过程"><a href="#实现过程" class="headerlink" title="实现过程"></a>实现过程</h2><p>现将一步一步的展现一个无序集合<code>[2,1,5,3,7]</code>进行直接选择排序(本文升序)的过程.首先将该集合分为2个部分,第一个部分为有序集合,第二个部分为无序集合,那么此时有序集合是空的<code>[]</code>,而无序集合为<code>[2,1,5,3,7]</code>,通过依次<strong>遍历原集合</strong>(<code>[2,1,5,3,7]</code>)的每一个元素记为A,循环的每个元素都去和无序集合里的每个值(<strong>遍历无序集合</strong>)进行<strong>对比</strong>,找到<strong>当次无序集合</strong>里的最小值(需要遍历<strong>此时的</strong>无序集合)B,然后交换A和B的位置,这样B就能进入到有序集合,A被交换到了无序集合里.具体过程如下:</p><ol><li><p>开始遍历原集合(此时有序集合为<code>[]</code>,无序集合为<code>[2,1,5,3,7]</code>),将集合中的第1个元素取出<code>[2]</code>,然后开始和剩下的无序集合(<code>[1,5,3,7]</code>)进行对比,不和全部无序集合对比是因为自身和自身对比没意义,所以我们从无序集合的第2个开始进行比大小,我们找到了<code>[1,5,3,7]</code>里的<code>[1]</code>,然后进行交换(2和1进行交换),此时<strong>原集合变为</strong><code>[1,2,5,3,7]</code></p></li><li><p>此时遍历出集合第2个元素(此时有序集合为<code>[1]</code>,无序集合为<code>[2,5,3,7]</code>),将无序集合中的第1个元素取出<code>[2]</code> (因为被交换所以第2次又是2,例子没选好,懒得改了),然后开始和剩下的无序集合(<code>[5,3,7]</code>)进行对比,我们从此时的无序集合<code>[2,5,3,7]</code>的第2个开始进行比大小,我们发现<code>[2,5,3,7]</code>里没有比2还小的元素了,所以不用进行交换,因为此时的2就是这一轮最小的元素,此时<strong>原集合变为</strong><code>[1,2,5,3,7]</code></p></li><li><p>此时遍历出集合第3个元素(此时有序集合为<code>[1,2]</code>,无序集合为<code>[5,3,7]</code>),将无序集合中的第一个元素取出<code>[5]</code> ,然后开始和剩下的无序集合(<code>[3,7]</code>)进行对比,我们从此时的无序集合<code>[5,3,7]</code>的第二个开始进行比大小,我们找到了<code>[3,7]</code>里比5还小的元素<code>[3]</code>,所以两个进行交换,此时<strong>原集合变为</strong><code>[1,2,3,5,7]</code></p></li><li><p>此时遍历出集合第4个元素(此时有序集合为<code>[1,2,3]</code>,无序集合为<code>[5,7]</code>),将无序集合中的第一个元素取出<code>[5]</code> ,然后开始和剩下的无序集合(<code>[7]</code>)进行对比,我们从此时的无序集合<code>[5,7]</code>的第二个开始进行比大小,我们发现<code>[7]</code>里没有比5还小的元素了,所以不用进行交换,因为此时的5就是这一轮最小的元素,此时<strong>原集合变为</strong><code>[1,2,3,5,7]</code></p></li><li><p>此时遍历出集合第5个元素(此时有序集合为<code>[1,2,3,5]</code>,无序集合为<code>[7]</code>),将无序集合中的第一个元素取出<code>[7]</code> ,然后开始和剩下的无序集合(<code>[]</code>)进行对比,我们从此时的无序集合已经是空集合了,所以不用进行交换,因为此时的7就是这一轮最小的元素,此时<strong>原集合变为</strong><code>[1,2,3,5,7]</code></p></li><li><p>此时集合已经排序完毕,排序结果就是最后的有序集合<code>[1,2,3,5,7]</code>,无序集合里已经没有元素了.</p></li></ol><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>通过例子可以看出,集合有多少个元素就得遍历多少遍,所以需要第1个关键值,记录遍历集合的游标(记为i),在遍历元素的同时需要去找当前无序集合里的最小值,所以还需要2个关键游标,当前最小元素的游标(k),无序集合里的游标(j). 通过遍历集合我们先获取到当前  默认最小元素的游标 k 的值, 然后在无序集合遍历寻找比 k 的值 还小的值,把无序集合的当前的j赋值给k一直更新到无序集合遍历完毕, 这个时候如果 k 不等于初始值了,说明无序集合里有最小值的出现,交换k(已经更新为无序集合里最小值的游标)和i(第1层遍历的游标)的值,然后游标i进入下一轮的循环.</p><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">selectSort</span><span class="params">(list: <span class="string">'list'</span>)</span> -&gt; list:</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> range(len(list)):            <span class="comment">#循环目标列表,此时的i为遍历集合的游标</span></span><br><span class="line">        k = i                             <span class="comment">#把当前游标选为默认的最小元素的游标</span></span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> range(i+<span class="number">1</span>, len(list)):   <span class="comment">#用k的值,去和当前无序集合里的每一个值进行对比,所以要循环此时的无序集合,因为无序集合里的第一个和游标i的值相等,所以没有进行比大小的意义,所以循环是从无序集合里的i+1开始</span></span><br><span class="line">            <span class="keyword">if</span> list[j] &lt; list[k]:         <span class="comment">#进行k的值和无序集合里j的值比大小</span></span><br><span class="line">                k = j                     <span class="comment">#如果发现无序集合里有更小的,那就更新k的值(k是每轮当中最小值的游标,初始值是和无序集合里第1个相等)</span></span><br><span class="line">        <span class="keyword">if</span> k != i:                        <span class="comment">#如果k的最终值已经和k的初始值i不一致了,说明无序集合里有最小值</span></span><br><span class="line">           list[k],list[i] = list[i], list[k] <span class="comment">#那么就要交换2个游标的值</span></span><br><span class="line">    <span class="keyword">return</span> list                           <span class="comment">#返回排好序的list</span></span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>空间复杂度为O(1),因为是在原数组内进行不断的交换,没有额外的空间占用.时间复杂度为O(n²),因为有嵌套循环,抛去常数后为n²的复杂度.直接选择排序只需要好好理解游标的概念即可.</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;通过直接选择排序可以初步明白时间复杂度和空间复杂度的概念,以及直接选择排序的思路&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="algorithm" scheme="https://dangbowen.com/categories/algorithm/"/>
    
      <category term="sort" scheme="https://dangbowen.com/categories/algorithm/sort/"/>
    
    
      <category term="algorithm" scheme="https://dangbowen.com/tags/algorithm/"/>
    
  </entry>
  
  <entry>
    <title>redis常用数据结构命令</title>
    <link href="https://dangbowen.com/redis/commands/ae747e39.html"/>
    <id>https://dangbowen.com/redis/commands/ae747e39.html</id>
    <published>2019-07-08T19:49:28.000Z</published>
    <updated>2019-08-14T13:01:53.973Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>redis作为一款高性能key-value数据库,还拥有持久化,多种数据类型,数据备份(主从)等优势,我们本篇先说结构和常用命令和使用场景</p></blockquote><a id="more"></a><h2 id="基础部分"><a href="#基础部分" class="headerlink" title="基础部分"></a>基础部分</h2><h3 id="1-string类型"><a href="#1-string类型" class="headerlink" title="1.string类型"></a>1.string类型</h3><p>string主要用于记录字符串类型的缓存数据,常用于存储对象,计数器,设计锁,字符串等<br><strong>常用命令:</strong><br><figure class="highlight shell"><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">get set mget mset getset setex psetex </span><br><span class="line">setnx msetnx</span><br><span class="line">incr decr incby decrby incrbyfloat  </span><br><span class="line">getrange setrange setbit getbit append</span><br></pre></td></tr></table></figure></p><p><strong>使用场景:</strong><br><code>get set mget mset</code>常见于普通kv存储的业务命,<code>getset</code>是简化了get后再set的操作,<code>setex psetex</code>是把 set 和 expire / pexpire 简化成一个命令了,<code>set</code>现在已经支持多参数设置了,(最下面的<code>总结</code>会说明一些场 景下为什么使用简化的命令会提升性能,但是实际生产环境下需要结合业务和开发规范来决定)<br><code>setnx msetnx</code> 是redis实现锁的一个重要命令(<code>set</code>命令已经支持多参数设置可以实现设置锁且设置超时,避免死锁的风险),业务场景里可以通过该命令实现简单的互斥锁,也可以构建复杂的分布式锁.这里不展开<br><code>incr decr incby decrby incrbyfloat</code> 常见于计数器业务,或者信号量<br><code>getrange setrange append</code>常见业务逻辑很少用,特殊下的业务场景应该会比较方便,理解其命令用法即可<br><code>setbit getbit</code> 这2个命令也是特殊场景下的,实际生产之中我只在构建用户历史记录当中用过,不展开</p><h3 id="2-list类型"><a href="#2-list类型" class="headerlink" title="2.list类型"></a>2.list类型</h3><p>list常用于构建简单的任务队列<br><strong>常用命令:</strong><br><figure class="highlight shell"><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">rpush lpush rpop lpop brpop blpop</span><br><span class="line">rpoplpush brpoplpush</span><br><span class="line">llen lindex lrange ltrim lset</span><br></pre></td></tr></table></figure></p><p><strong>使用场景:</strong><br><code>rpush lpush rpop lpop brpop blpop</code>队列的 入队 出队 基本操作, brpop属于阻塞pop,队列没有值的时候会等待到超时或出现值<br><code>rpoplpush brpoplpush</code> 构建双队列,保活队列常用命令,因为list并没有完整的消息队列功能,所以需要自己设计ack机制,这个时候就需要用到rpoplpush 保证 item 被消费的时候即使出现崩溃,或者异常能把item重新导入到任务队列里继续处理,把数据丢失做到最低<br><code>llen lindex lrange ltrim lset</code> 辅助队列的一些命令,比如业务逻辑涉及到定期裁剪,那就会用到 llen 和 ltrim,如果裁剪还有规则就会用到lrange</p><h3 id="3-set类型"><a href="#3-set类型" class="headerlink" title="3.set类型"></a>3.set类型</h3><p>set常用于需要使用集合的业务场景,比如存放需要存储观看记录,存储ip,存储手机号,存储手机号等等<br><strong>常用命令:</strong><br><figure class="highlight shell"><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">sadd spop sismember srandmember</span><br><span class="line">scard smove srem smembers</span><br><span class="line">sdiff sdiffstore sinter sinterstore sunion sunionstore</span><br></pre></td></tr></table></figure></p><p><strong>使用场景:</strong><br><code>sadd spop sismember srandmember</code>属于基本set操作,此pop是随机移除,srandmember是随机返回一个成员不移除<br><code>scard smove srem smembers</code>根据业务来控制set大小,或者其他有删除逻辑会用到这些命令<br><code>sdiff sdiffstore sinter sinterstore sunion sunionstore</code>redis内部实现了差集,交集,并集的操作,但是实际生产环境里不建议使用这些命令,因为redis属于单线程应用,如果一个交集命令非常耗时会阻塞其他客户端的命令</p><h3 id="4-zset类型"><a href="#4-zset类型" class="headerlink" title="4.zset类型"></a>4.zset类型</h3><p>zset使用场景非常丰富且高效,比如处理排行榜,用作处理队列业务,适用排序功能的业务场景,仅用2个zset结构可以构成一个支持多人订阅消息,还能保证不丢数据的功能,可以用于聊天室业务场景.<br><strong>常用命令:</strong><br><figure class="highlight shell"><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">zadd zcard zincrby zcount zscore zrank</span><br><span class="line">zrevrank zrange zrevrange zrangebyscore zrevrangebyscore </span><br><span class="line">zrem zremrangebyrank zremrangebyscore </span><br><span class="line">zinterstore zunionstore</span><br><span class="line">zlexcount zrangebylex zremrangebylex</span><br></pre></td></tr></table></figure></p><p><strong>使用场景:</strong><br><code>zadd zcard zincrby zcount zscore zrank</code> zset常用命令,其中zincrby是个成员incr操作的,适合用作排行榜的自增操作<br><code>zrevrank zrange zrevrange zrangebyscore zrevrangebyscore</code> 通过索引,分数正序倒序截取zset数据用<br><code>zrem zremrangebyrank zremrangebyscore</code>裁剪zset的常用命令<br><code>zinterstore zunionstore</code>集合运算<br><code>zlexcount zrangebylex zremrangebylex</code>这是一个骚功能,用于 自动识别场景, 比如通讯录里输入张开头 程序返回张开头的所有联系人, 就是用这几个命令实现的,具体做法是 ascall 表 z 的下一位是 <code>{</code>那么就可以 定位 <code>张{</code> 就可以把张开头的人全部截取到</p><h3 id="5-hash类型"><a href="#5-hash类型" class="headerlink" title="5.hash类型"></a>5.hash类型</h3><p>hash结构多用于存储对象,存储用户登录token,购物车等业务场景均适用<br><strong>常用命令:</strong><br><figure class="highlight shell"><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">hset hget hmset hmget hdel hlen hexists hincrby hincrbyfloat hsetnx</span><br><span class="line">hkeys hvals hgetall</span><br></pre></td></tr></table></figure></p><p><strong>使用场景:</strong><br><code>hset hget hmset hmget hdel hlen hexists hincrby hincrbyfloat hsetnx</code>常用操作命令<br><code>hkeys hvals hgetall</code> 在hash特别大的时候 hgetall 会造成阻塞, 所以可以用 hkeys 和 hvals 结合使用</p><h3 id="其他常用命令"><a href="#其他常用命令" class="headerlink" title="其他常用命令"></a>其他常用命令</h3><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">type rename del sort expire</span><br></pre></td></tr></table></figure><p>常用的改名,删除键,设置过期时间(单位:秒)</p><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>实际生产当中最常用的数据类型就是string,包括string可以代替set,zset,hash结构.因为string的速度是最快的,对redis的cpu没有什么消耗,越复杂的结构对redis性能越有影响,而redis是一个单线程应用,如果某个客户端进行复杂结构的运算, 比如 set 和 zset 进行大数量的集合运算,排序等等,就会造成其他客户端阻塞,从而引发更多的问题出现,所以当结构能优化成string时,最好用string,可以把逻辑运算的成本放在业务机器上.</p><p>其他结构也需要结合业务来慎重使用,避免热key或者慢查询的情况出现,高并发场景下需要结合业务做多层缓存,碎片化缓存看情况而合并成大缓存,提高响应性能,其他想到什么再写进来.</p><p><img src="https://img-blog.csdnimg.cn/20190714141737991.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hcnZpbmJveQ==,size_16,color_FFFFFF,t_70" alt="常用操作命令的思维导图"></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;redis作为一款高性能key-value数据库,还拥有持久化,多种数据类型,数据备份(主从)等优势,我们本篇先说结构和常用命令和使用场景&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="redis" scheme="https://dangbowen.com/categories/redis/"/>
    
      <category term="commands" scheme="https://dangbowen.com/categories/redis/commands/"/>
    
    
      <category term="redis" scheme="https://dangbowen.com/tags/redis/"/>
    
  </entry>
  
  <entry>
    <title>线性代数复习</title>
    <link href="https://dangbowen.com/math/74d71323.html"/>
    <id>https://dangbowen.com/math/74d71323.html</id>
    <published>2019-05-05T17:05:11.000Z</published>
    <updated>2019-08-14T13:01:53.972Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>最近在看机器学习部分发现线性代数里的很多名词和性质都完全忘记了,找了一个国外的教材复习了下</p></blockquote><a id="more"></a><h2 id="复习过程"><a href="#复习过程" class="headerlink" title="复习过程"></a>复习过程</h2><p>最近看了2本书, 一本是乔希·维茨金的 [学习之道],一本番茄工作法,都是说如何高效成为一个领域的优秀者,但是问题是生活之中不可确定的因素太多了,非常容易打断计划和安排,所以结合这2本书的内容发现自己还应该遵循一条,当务之急就赶紧做,不要去纠结是不是在规定时间内完成后要休息什么的,不光要赶紧做,还要连续做,举个例子,今晚要看线性代数,那么在晚饭后休息后就立马开始看,即使超过了番茄时间也要看,因为不知道下一刻会发生什么就打断了学习的计划,所以别死板守着这些高效的方法来安排学习,别让制定计划的时间超过学习的时间,断断续续3周才把线性代数比较笼统的复习了一下.也是因为不断的实践自己实际学习的效率.</p><h2 id="线性代数结合几何的思维导图"><a href="#线性代数结合几何的思维导图" class="headerlink" title="线性代数结合几何的思维导图"></a>线性代数结合几何的思维导图</h2><p><img src="/images/线性代数.png" alt="线性代数"></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;最近在看机器学习部分发现线性代数里的很多名词和性质都完全忘记了,找了一个国外的教材复习了下&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="math" scheme="https://dangbowen.com/categories/math/"/>
    
    
      <category term="线性代数" scheme="https://dangbowen.com/tags/%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0/"/>
    
  </entry>
  
  <entry>
    <title>断更5个月的原因</title>
    <link href="https://dangbowen.com/diary/3fb389a1.html"/>
    <id>https://dangbowen.com/diary/3fb389a1.html</id>
    <published>2019-04-09T23:03:02.000Z</published>
    <updated>2019-11-03T18:17:47.561Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>此次博客断更5个月,其中有自己的懒惰,也有外部很多因素,各占一半,不过还好,想更新的内容都被记录在各种文档里了</p></blockquote><a id="more"></a><h2 id="工作"><a href="#工作" class="headerlink" title="工作"></a>工作</h2><p>从时间线重新捋一下这5个月发生的事</p><p><strong>[11月/18年]</strong>  </p><blockquote><p>开始对推荐系统感兴趣  </p></blockquote><p>产生这个想法是因为自己之前的几个项目中推荐系统的实现只是少量的借助了一些推荐算法,推荐系统的的优化又对产品的体验和各项数据影响十分巨大,所以我想很好的了解下目前主流的推荐系统都是如何完成推荐工作.  </p><p><strong>[12月/18年]</strong>  </p><blockquote><p>买了两本推荐系统的书<br>工作变动,调入新的项目组  </p></blockquote><p>网上的博客或者资料大部分都是作者记录的一些关键点,对于初学者还是找几本书全面系统的了解下会更有帮助,在各大论坛里确定了2本我觉得当时对我能迅速了解推荐系统的书<br>工作上发生重要变动,进入新的项目组,并且占用了空余时间来支撑项目.</p><p><strong>[1月/19年]</strong>  </p><blockquote><p>为支撑项目加班,一月累计加班时长85小时,累<br>所幸项目之初就申请负责推荐系统的实现,事实证明哪怕完成一个简单的推荐系统也不是一个容易的事</p></blockquote><p>18年1月做直播答题,加班的很疯狂.半夜2点多是常态,19年又是这个样子,感觉1月份特别不友好<br>新项目里负责的推荐和推荐算法没有太大关系,因为没有大数据的支撑,且由于人员紧张,只有我一个人来实现整个推荐系统,包括了推荐库,推荐逻辑,上报日志的处理,用户滤重.虽然没有用到什么推荐算法,但是也差不多实现了针对用户的喜好来推荐.发现还是在实际项目中会学习的更快一点,因为遇到的问题都会直接影响用户体验,所以要考虑的更周全一点.所幸全部联调上线后并没有出过线上bug.  </p><p><strong>[2月/19年]</strong>  </p><blockquote><p>新项目占用了绝大部分时间,剩余时间只想休息</p></blockquote><p>过完年后回来就是不停的优化推荐方案,优化推荐接口的响应时长,在这其中又加深了jmeter的操作能力,xhprof的性能调优,redis的性能瓶颈分析,布隆过滤器,最终结果就是平均800ms的延时最终控制在了300ms左右.</p><p><strong>[3月/19年]</strong>  </p><blockquote><p>项目开始进入稳定迭代,有时间整理和继续学习推荐相关</p></blockquote><p>项目进入稳定迭代了,终于有空余的时间了,但是部门也调整了上班作息,相当于每天被压缩了3个小时的空余时间,心累.周末时不时也得处理点问题,不过还好,项目终于接入大数据团队了.</p><p><strong>[4月/19年]</strong>  </p><blockquote><p>发现想买新书,因为已买的实体书太多了,买了一个kindle.</p></blockquote><p>想买几本书,发现家里实体书已经很多了,就买了一个kindle,希望能一直用它看书,看完的第一本是<code>番茄工作法图解</code>,想科学的改善下仅有的空余时间的利用率</p><hr><p>记得当时只是简单的在谷歌百度搜索推荐系统相关的博客,搜索推荐算法的实例,发现和机器学习有关联,于是又了解了下机器学习相关的,发现优质的学习资料大多是英文,可是自己英文又不好,又想看看如何提升英语水平,但是看了一阵觉得这不是当务之急,于是尽量看翻译版的论文和资料,又发现里面用到了很多高数,线性代数,概率论的知识,于是立即下单买了这几本书教材,一复习傻逼了,符号都认不全了,下定决心要好好搞一搞高数了,找了一本国外的教材,发现实体书实在太多,买了一个kindle,但是发现kindle看这种教材很不方便,看公式看代码分页特别不舒服,但是先这样吧.学习不就是这么一步一步被耽误了么,还是吃鸡来的更刺激一点,没事还是多吃吃鸡,多出去逛逛街</p><h2 id="生活"><a href="#生活" class="headerlink" title="生活"></a>生活</h2><blockquote><p>滑雪  </p></blockquote><p>18/19雪季终于从只会后刃推坡的初学者到能双脚换刃上中级道了,还教会了两个表弟,一个同事推坡.19年的目标是自由换刃外加刷几个地方的雪场,别的都好就是雪票太烧钱,不过滑雪本身还是很爽的一件事,能忘记很多事情.</p><blockquote><p>厨艺</p></blockquote><p>最近新学了一个黄焖鸡,味道还不错<br>去了一个粤菜馆,吃了道爆炒水潺,入口即化的肉,口感非常不错</p><blockquote><p>摄影</p></blockquote><p>开始看相关技巧,打算夏天出图,单反都放好几年没用过了.罪过罪过.</p><blockquote><p>股票</p></blockquote><p>投资和投机在有些时候是没差别的,但是股票能放大自身的很多弱点,比如贪婪和恐惧,贪婪更多的收益却恐惧更大的风险,这方面还需要继续磨练和学习.</p><h2 id="END"><a href="#END" class="headerlink" title="END"></a>END</h2><p>对于18年开始的互联网寒冬什么的,有过焦虑,也有过迷茫,但是想想别的行业不都有这种经历么,保持学习的心态就好了.</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;此次博客断更5个月,其中有自己的懒惰,也有外部很多因素,各占一半,不过还好,想更新的内容都被记录在各种文档里了&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="diary" scheme="https://dangbowen.com/categories/diary/"/>
    
    
      <category term="life" scheme="https://dangbowen.com/tags/life/"/>
    
  </entry>
  
  <entry>
    <title>如何一条Mediainfo --Inform语句同时获取视频参数和音频参数多个Parameters</title>
    <link href="https://dangbowen.com/server/cdb35a50.html"/>
    <id>https://dangbowen.com/server/cdb35a50.html</id>
    <published>2018-11-09T17:17:17.000Z</published>
    <updated>2019-08-14T13:01:53.973Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>mediainfo是一个能获取多媒体文件详细信息的软件,包括内容信息,视频信息,音频信息,文本信息等,有了它我们可以查看视频的宽高,比例,播放时长,音轨,比特率等等信息</p></blockquote><a id="more"></a><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>参考<a href="https://dangbowen.com/php/extension/77969671.html">php-mediainfo</a>教程安装mediainfo并实际操作栗子看能否正确调用mediainfo命令</p><h2 id="命令详解"><a href="#命令详解" class="headerlink" title="命令详解"></a>命令详解</h2><p>先让我们看下一个普通视频文件的信息都包含哪些<br><figure class="highlight shell"><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 class="meta">$</span><span class="bash"> mediainfo <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span></span><br><span class="line">General</span><br><span class="line">Complete name                            : http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv</span><br><span class="line">Format                                   : Flash Video</span><br><span class="line">File size                                : 500 KiB</span><br><span class="line">Duration                                 : 11 s 711 ms</span><br><span class="line">Overall bit rate                         : 350 kb/s</span><br><span class="line">Tagged date                              : UTC 2011-02-27 11:00:33</span><br><span class="line">Tagging application                      : inlet media FLVTool2 v1.0.6 - http://www.inlet-media.de/flvtool2</span><br><span class="line"></span><br><span class="line">Video</span><br><span class="line">Format                                   : AVC</span><br><span class="line">Format/Info                              : Advanced Video Codec</span><br><span class="line">Format profile                           : Main@L2.1</span><br><span class="line">Format settings                          : CABAC / 3 Ref Frames</span><br><span class="line">Format settings, CABAC                   : Yes</span><br><span class="line">Format settings, ReFrames                : 3 frames</span><br><span class="line">Codec ID                                 : 7</span><br><span class="line">Duration                                 : 11 s 711 ms</span><br><span class="line">Width                                    : 426 pixels</span><br><span class="line">Height                                   : 240 pixels</span><br><span class="line">Display aspect ratio                     : 16:9</span><br><span class="line">Frame rate mode                          : Constant</span><br><span class="line">Frame rate                               : 30.000 FPS</span><br><span class="line">Original frame rate                      : 29.970 (29970/1000) FPS</span><br><span class="line">Color space                              : YUV</span><br><span class="line">Chroma subsampling                       : 4:2:0</span><br><span class="line">Bit depth                                : 8 bits</span><br><span class="line">Scan type                                : Progressive</span><br><span class="line"></span><br><span class="line">Audio</span><br><span class="line">Format                                   : AAC</span><br><span class="line">Format/Info                              : Advanced Audio Codec</span><br><span class="line">Format profile                           : LC</span><br><span class="line">Codec ID                                 : 10-2</span><br><span class="line">Duration                                 : 11 s 702 ms</span><br><span class="line">Channel(s)                               : 2 channels</span><br><span class="line">Channel positions                        : Front: L R</span><br><span class="line">Sampling rate                            : 22.05 kHz</span><br><span class="line">Frame rate                               : 21.533 FPS (1024 SPF)</span><br><span class="line">Compression mode                         : Lossy</span><br></pre></td></tr></table></figure></p><p>能看到格式,size大小,宽,高,duration等等常用信息,让我们一一用mediainfo命令来获取</p><p>获取文件格式<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ mediainfo --Inform=<span class="string">"General;%Format%"</span> <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span><br><span class="line">Flash Video</span><br></pre></td></tr></table></figure></p><p>返回的是general下的format信息,比如你要的是video下的format信息呢<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ mediainfo --Inform=<span class="string">"Video;%Format%"</span> <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span><br><span class="line">AVC</span><br></pre></td></tr></table></figure></p><p>这会拿到的是Video信息下的format,切记这里获取参数的大小写是严格区分的.这2个栗子可以发现如果想获取mediainfo各个参数的信息是先找到 分类名(类似General,Video,Audio)-&gt;参数(Format,Width这种),格式就是 用mediainfo的Inform</p><p><strong><code>mediainfo --Inform=&quot;分类名;%参数名%&quot; &#39;http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv&#39;</code></strong></p><p>这个格式记住可以获取你想要的任何参数</p><p>让我们来练习一下:<br>套用格式获取duration信息<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ mediainfo --Inform=<span class="string">"Video;%Duration%"</span> <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span><br><span class="line">11711</span><br></pre></td></tr></table></figure></p><p>我们可以看到取出来的播放时长单位是毫秒,而不是秒.</p><p>再来尝试一下获取文件大小:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ mediainfo --Inform=<span class="string">"General;%File size%"</span> <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span><br></pre></td></tr></table></figure></p><p>??? 为什么返回值是空呢,格式没有错却无法获得文件的大小.<br>因为在显示的参数都是格式化后的,所以你会看到File size之间是有空格的,如果想获得文件大小应该替换成FileSize<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ mediainfo --Inform=<span class="string">"General;%FileSize%"</span> <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span><br><span class="line">512000</span><br></pre></td></tr></table></figure></p><p>此时就顺利获取到了文件大小,那如何知道各个参数的真正参数名呢,用这个命令可以获取所有的详细参数的真实参数名<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ mediainfo --Info-Parameters</span><br><span class="line">General</span><br><span class="line">Count                     : Count of objects available <span class="keyword">in</span> this stream</span><br><span class="line">Status                    : bit field (0=IsAccepted, 1=IsFilled, 2=IsUpdated, 3=IsFinished)</span><br><span class="line">StreamCount               : Count of streams of that kind available</span><br><span class="line">StreamKind                : Stream <span class="built_in">type</span> name</span><br><span class="line">StreamKind/String         : Stream <span class="built_in">type</span> name</span><br><span class="line">....此处省略剩余行信息</span><br></pre></td></tr></table></figure></p><p>参数显示的太多,不方便我们查找,我们可以输出到一个txt文件里<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ mediainfo --Info-Parameters &gt; mediainfo_parameters.txt</span><br></pre></td></tr></table></figure></p><p>打开<code>mediainfo_parameters.txt</code>可以搜索<code>FileSize</code><br>那行显示 <code>FileSize                  : File size in bytes</code>,同理我们根据这个可以获得你所需要的参数信息</p><p>看到这里你可能已经能熟练使用这个命令获取单个参数值,但是实际场景中可能获取的参数是多个的<br>例如:同时获取视频的宽,高,播放时长?<br>很简单每个参数都用<code>%%</code>包裹起来然后每个参数用<code>,</code>分割即可,命令如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ mediainfo --Inform=<span class="string">"Video;%Width%,%Height%,%Duration%"</span> <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span><br><span class="line">426,240,11711</span><br></pre></td></tr></table></figure></p><p>此时我们可以一条语句获得视频的宽,高,播放时长信息,这里的 <strong>逗号</strong> 可以替换别的字符,你可以用空格,|等可以自行尝试一下,反正解析数据的时候对应好相应的字符就行.简单例子:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ mediainfo --Inform=<span class="string">"Video;%Width%|%Height%|%Duration%"</span> <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span><br><span class="line">426|240|11711</span><br></pre></td></tr></table></figure></p><p>看到这里,你已经会用一条命令获取一个分类下的多个参数信息了,那么如果是要求同时获取视频的宽,高,播放时长,音频的format多个参数信息可以么?<br>这个问题当初也困扰了我一阵,命令各种尝试之下终无解,最后发现mediainfo的inform命令是支持文件执行的.例子如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#编辑一个文本放 一行命令</span></span><br><span class="line">vi 1.txt</span><br><span class="line">Video;%Width%|%Height%|%Duration%</span><br><span class="line">wq</span><br><span class="line"><span class="comment">#命令调用该文本</span></span><br><span class="line">$ mediainfo --Inform=<span class="string">"file://1.txt"</span> <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span><br><span class="line">426|240|11711</span><br><span class="line"></span><br><span class="line"><span class="comment">#修改文本命令如下</span></span><br><span class="line">vi 1.txt</span><br><span class="line">Video;%Width%,%Height%,%Duration%,</span><br><span class="line">Audio;%Format%</span><br><span class="line">wq</span><br><span class="line"><span class="comment">#重新执行命令</span></span><br><span class="line">$ mediainfo --Inform=<span class="string">"file://1.txt"</span> <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span><br><span class="line">426,240,11711,AAC</span><br></pre></td></tr></table></figure></p><p>此时可以看到一条命令已经可以获得视频的宽高播放时长和音频的format信息</p><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>有的人会想为什么一定要一条命令这么费劲巴拉的处理问题呢?多一条命令也不会多慢?<br>当你处理几条,几十条视频数据的时候你用多条命令获取这些参数可能影响不大,因为数据量太小.但是实际问题你可能一次要处理上十万条数据,甚至上百万,上千万个数据时,那么精简的一条命令可以缩短脚本的响应时间,提高任务的执行速度,尽量减小了系统开销,这是在生产环境实际处理数据后的一点经验.</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;mediainfo是一个能获取多媒体文件详细信息的软件,包括内容信息,视频信息,音频信息,文本信息等,有了它我们可以查看视频的宽高,比例,播放时长,音轨,比特率等等信息&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="server" scheme="https://dangbowen.com/categories/server/"/>
    
    
      <category term="mediainfo" scheme="https://dangbowen.com/tags/mediainfo/"/>
    
  </entry>
  
  <entry>
    <title>php-MediaInfo获取媒体信息</title>
    <link href="https://dangbowen.com/php/extension/77969671.html"/>
    <id>https://dangbowen.com/php/extension/77969671.html</id>
    <published>2018-11-07T16:15:58.000Z</published>
    <updated>2019-08-14T13:01:53.973Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>php获取视频时长?获取音轨信息?获取媒体文件的详细信息?<br>php-mediainfo了解一下</p></blockquote><a id="more"></a><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ol><li><p>本机或者服务器必须有medainfo<br>linux</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo apt-get install mediainfo</span><br></pre></td></tr></table></figure><p>mac</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew install mediainfo</span><br></pre></td></tr></table></figure><p>测试软件是否可用,可以在<strong><a href="http://samples.mplayerhq.hu/" rel="external nofollow noopener noreferrer" target="_blank">mplayer提供的各种媒体文件</a></strong>用来测试</p><figure class="highlight shell"><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 class="meta">$</span><span class="bash"> mediainfo <span class="string">'http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv'</span></span></span><br><span class="line">General</span><br><span class="line">Complete name                            : http://samples.mplayerhq.hu/FLV/Enigma_Principles_of_Lust-part.flv</span><br><span class="line">Format                                   : Flash Video</span><br><span class="line">File size                                : 500 KiB</span><br><span class="line">Duration                                 : 11 s 711 ms</span><br><span class="line">Overall bit rate                         : 350 kb/s</span><br><span class="line">Tagged date                              : UTC 2011-02-27 11:00:33</span><br><span class="line">Tagging application                      : inlet media FLVTool2 v1.0.6 - http://www.inlet-media.de/flvtool2</span><br><span class="line"></span><br><span class="line">Video</span><br><span class="line">Format                                   : AVC</span><br><span class="line">Format/Info                              : Advanced Video Codec</span><br><span class="line">Format profile                           : Main@L2.1</span><br><span class="line">Format settings                          : CABAC / 3 Ref Frames</span><br><span class="line">Format settings, CABAC                   : Yes</span><br><span class="line">Format settings, ReFrames                : 3 frames</span><br><span class="line">Codec ID                                 : 7</span><br><span class="line">Duration                                 : 11 s 711 ms</span><br><span class="line">Width                                    : 426 pixels</span><br><span class="line">Height                                   : 240 pixels</span><br><span class="line">Display aspect ratio                     : 16:9</span><br><span class="line">Frame rate mode                          : Constant</span><br><span class="line">Frame rate                               : 30.000 FPS</span><br><span class="line">Original frame rate                      : 29.970 (29970/1000) FPS</span><br><span class="line">Color space                              : YUV</span><br><span class="line">Chroma subsampling                       : 4:2:0</span><br><span class="line">Bit depth                                : 8 bits</span><br><span class="line">Scan type                                : Progressive</span><br><span class="line"></span><br><span class="line">Audio</span><br><span class="line">Format                                   : AAC</span><br><span class="line">Format/Info                              : Advanced Audio Codec</span><br><span class="line">Format profile                           : LC</span><br><span class="line">Codec ID                                 : 10-2</span><br><span class="line">Duration                                 : 11 s 702 ms</span><br><span class="line">Channel(s)                               : 2 channels</span><br><span class="line">Channel positions                        : Front: L R</span><br><span class="line">Sampling rate                            : 22.05 kHz</span><br><span class="line">Frame rate                               : 21.533 FPS (1024 SPF)</span><br><span class="line">Compression mode                         : Lossy</span><br></pre></td></tr></table></figure></li></ol><p>当你能看到上面显示的各种信息时说明你的环境已安装mediainfo</p><h2 id="安装php-mediainfo"><a href="#安装php-mediainfo" class="headerlink" title="安装php-mediainfo"></a>安装php-mediainfo</h2><ol><li><p>github: <strong><a href="https://github.com/mhor/php-mediainfo" rel="external nofollow noopener noreferrer" target="_blank">php-mediainfo</a></strong></p></li><li><p><strong>composer</strong>安装如下</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ composer require mhor/php-mediainfo</span><br></pre></td></tr></table></figure></li></ol><h2 id="实际使用过程"><a href="#实际使用过程" class="headerlink" title="实际使用过程"></a>实际使用过程</h2><ol><li><p>使用之前仔细看github中的readme中的Extra里面有这么一个提示:<strong>Support new mediainfo version (&gt;=17.10)</strong> 所以在初始化类的时候需如下:</p><figure class="highlight php"><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">$mediaInfo = <span class="keyword">new</span> MediaInfo();</span><br><span class="line">$mediaInfo-&gt;setConfig(<span class="string">'use_oldxml_mediainfo_output_format'</span>, <span class="keyword">true</span>);<span class="comment">//这句必须加,因为目前的mediainfo版本早超过17.1,所以需要主动申明下config的格式</span></span><br><span class="line">$mediaInfoContainer = $mediaInfo-&gt;getInfo(<span class="string">'music.mp3'</span>);</span><br></pre></td></tr></table></figure><p>现在百度和谷歌大部分的php-mediainfo资料都是16年左右的,当时mediainfo版本没有到17.1所以你如果按照他们的实际过程操作会提示错误,由于我在操作的时候根据错误提示修改了包的源码,虽然数据顺利取到了,但是宽高和duration数值都是个位数(仅发现的bug),我还纳闷这么成熟的包应该不会有这样的bug,最后仔细看了下readme文件,发现尾部这个提示后才觉得自作聪明要不得,这个坑因为自己瞎改源码耽误了小一个小时.</p></li><li><p>初始化类并处理返回值获得文件大小代码,$url是可以为远程文件或者本地文件</p><figure class="highlight php"><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">$mediaInfo = <span class="keyword">new</span> MediaInfo();</span><br><span class="line">$mediaInfo-&gt;setConfig(<span class="string">'use_oldxml_mediainfo_output_format'</span>, <span class="keyword">true</span>);</span><br><span class="line">$mediaInfoContainer = $mediaInfo-&gt;getInfo($url);</span><br><span class="line"><span class="comment">//打印下 $mediaInfoContainer 变量,你就可以获取所有关于媒体信息的详细数据</span></span><br><span class="line">$jsonInfo = json_encode($mediaInfoContainer);</span><br><span class="line">$jsonInfo = json_decode($jsonInfo);</span><br><span class="line">$general = $jsonInfo-&gt;general;</span><br><span class="line"><span class="comment">//获取文件的size大小 单位是 bit,general是基础信息</span></span><br><span class="line">$data[<span class="string">'size'</span>] = $general-&gt;file_size-&gt;bit;</span><br></pre></td></tr></table></figure></li><li><p>获取文件format,可以用来逻辑判断 视频 还是 音频 还是 图片 来取对应信息,比如图片是没有duration字段的,视频和音频是包含音轨信息的等.</p><figure class="highlight php"><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">$ext = $general-&gt;format-&gt;shortName;</span><br><span class="line"><span class="keyword">if</span> ($ext == <span class="string">'GIF'</span> <span class="keyword">or</span> $ext == <span class="string">'JPEG'</span> <span class="keyword">or</span> $ext == <span class="string">'PNG'</span>)&#123;</span><br><span class="line">    <span class="comment">//图片宽高 size $jsonInfo-&gt;images的结果是数组</span></span><br><span class="line">    $image_info = $jsonInfo-&gt;images[<span class="number">0</span>];</span><br><span class="line">    $data[<span class="string">'width'</span>] = $image_info-&gt;width-&gt;absoluteValue ?: <span class="number">0</span>;</span><br><span class="line">    $data[<span class="string">'height'</span>] = $image_info-&gt;height-&gt;absoluteValue ?: <span class="number">0</span>;</span><br><span class="line">&#125; <span class="keyword">elseif</span> ($ext == <span class="string">'MPEG-4'</span>) &#123;</span><br><span class="line">    <span class="comment">//mp4格式文件 先获取音轨数</span></span><br><span class="line">    $data[<span class="string">'audio_count'</span>] = $general-&gt;count_of_audio_streams ?: <span class="number">0</span>;</span><br><span class="line">    <span class="comment">//$jsonInfo-&gt;videos获得是视频信息的数组,因为视频文件里有可多包含多个视频轨道</span></span><br><span class="line">    $video_info = $jsonInfo-&gt;videos[<span class="number">0</span>];</span><br><span class="line">    <span class="comment">//获取第一个视频的时长</span></span><br><span class="line">    $data[<span class="string">'duration'</span>] = $video_info-&gt;duration-&gt;milliseconds ?: <span class="number">0</span>;</span><br><span class="line">    <span class="comment">//获取第一个视频的宽</span></span><br><span class="line">    $data[<span class="string">'width'</span>] = $video_info-&gt;width-&gt;absoluteValue ?: <span class="number">0</span>;</span><br><span class="line">    <span class="comment">//获取第一个视频的高</span></span><br><span class="line">    $data[<span class="string">'height'</span>] = $video_info-&gt;height-&gt;absoluteValue ?: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>  php-mediainfo是php处理媒体信息的一个扩展包,如果是日常处理媒体信息的脚本,我们可以直接调用mediainfo命令来获取各种想要的信息,详情可以看这篇博客<strong><a href="https://dangbowen.com/server/cdb35a50.html">Mediainfo命令实操记录</a></strong></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;php获取视频时长?获取音轨信息?获取媒体文件的详细信息?&lt;br&gt;php-mediainfo了解一下&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="php" scheme="https://dangbowen.com/categories/php/"/>
    
      <category term="扩展" scheme="https://dangbowen.com/categories/php/extension/"/>
    
    
      <category term="mediainfo" scheme="https://dangbowen.com/tags/mediainfo/"/>
    
      <category term="php" scheme="https://dangbowen.com/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>30分钟快速搭建hexo3.7.0 + next主题6.4教程(持续更新最新版)</title>
    <link href="https://dangbowen.com/hexo/ad0bedc4.html"/>
    <id>https://dangbowen.com/hexo/ad0bedc4.html</id>
    <published>2018-10-21T16:45:14.000Z</published>
    <updated>2019-08-14T13:01:53.972Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>30分钟即可完成一个带评论、打赏、搜索、RSS、分类、标签等功能的博客<br>高效的搭建让博主更加专注于内容的生产</p></blockquote><a id="more"></a><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ol><li>必须安装git和node,官网有各平台详细的安装过程</li></ol><ul><li><a href="https://nodejs.org" rel="external nofollow noopener noreferrer" target="_blank">Node.js</a></li><li><a href="https://git-scm.com" rel="external nofollow noopener noreferrer" target="_blank">Git</a></li></ul><ol start="2"><li>准备一张头像和网站favicon </li></ol><ul><li>200*200方形或圆形头像 (<em>用来显示作者头像</em>)</li><li>32*32的favicon (<em>浏览器打开网站标签的一个ico</em>)</li></ul><ol start="3"><li>hexo全局的图标配置信息均来自<a href="https://fontawesome.com/v4.7.0/icons" rel="external nofollow noopener noreferrer" target="_blank">fontawesome</a></li><li>所有的配置项在修改的时候一定要记住 <strong>冒号</strong> 后是有一个空格的,不然保存后 在执行 <code>hexo server</code> 会失败</li></ol><hr><h2 id="开始安装"><a href="#开始安装" class="headerlink" title="开始安装"></a>开始安装</h2><p>git和node安装完后进入到博客的文件夹内,执行下面代码(<em>均在终端操作</em>)<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-cli -g  <span class="comment">#全局安装hexo命令</span></span><br><span class="line">$ hexo init blog           <span class="comment">#在当前目录下,初始化hexo一个名为blog项目</span></span><br><span class="line">$ <span class="built_in">cd</span> blog                  <span class="comment">#进入该目录</span></span><br><span class="line">$ git <span class="built_in">clone</span> https://github.com/theme-next/hexo-theme-next themes/next <span class="comment">#安装next主题</span></span><br><span class="line">$ npm install              <span class="comment">#安装项目必备插件</span></span><br><span class="line">$ hexo server              <span class="comment">#本地启动项目</span></span><br></pre></td></tr></table></figure></p><p>如果以上步骤均正确可以 <a href="http://localhost:4000" rel="external nofollow noopener noreferrer" target="_blank">点击即可看到博客首页</a> 或 浏览器输入 <code>localhost:4000</code> 即可看到博客首页,如不能请检查之前的步骤是否正确,此时你已经完成了50%的工作</p><hr><blockquote><p>先找到 <strong><font size="2" color="blue">站点配置文件</font></strong> <code>blog/_config.yml</code><br><strong>重要提示</strong>:修改每一个配置的时候都可以刷新页面观看修改结果,如果不显示可以在终端的博客目录执行<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ hexo clean</span><br><span class="line">$ hexo server</span><br></pre></td></tr></table></figure></p></blockquote><h2 id="站点配置"><a href="#站点配置" class="headerlink" title="站点配置"></a>站点配置</h2><ol><li><p><strong>先设置hexo的next主题</strong><br>找到<code>theme</code>后修改为:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">theme: next <span class="comment">#配置成刚下载的next主题</span></span><br></pre></td></tr></table></figure></li><li><p><strong>配置hexo网站相关信息</strong><br>找到site的设置 按下面备注修改相关信息</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Site</span></span><br><span class="line">title: 东行不西游  <span class="comment">#网站标题</span></span><br><span class="line">subtitle: 风在前,无惧!  <span class="comment">#网站副标题</span></span><br><span class="line">description: 心猿不定，意马四驰  <span class="comment">#描述,介绍网站的</span></span><br><span class="line">keywords: python,php,mysql,滑雪,摄影 <span class="comment">#网站的关键字</span></span><br><span class="line">author: Bowen <span class="comment">#博主姓名</span></span><br><span class="line">language: zh-CN <span class="comment">#语言  zh-CN 是简体中文</span></span><br><span class="line">timezone: UTC <span class="comment">#时区</span></span><br></pre></td></tr></table></figure></li><li><p><strong>设置hexo永久链接</strong><br>设置永久链接的目的是为了便于分享和seo优化.这样别人收藏地址后不会出现链接失效</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"><span class="comment"># URL</span></span><br><span class="line">url: https://dangbowen.com <span class="comment">#网站的首页地址</span></span><br><span class="line">root: / <span class="comment">#网站的根目录设置</span></span><br><span class="line">permalink: :year/:month/:day/:title.html <span class="comment"># 这种 </span></span><br><span class="line">设置的url表现为<span class="number">2018</span>/<span class="number">10</span>/<span class="number">18</span>/hello-world.html 样式</span><br></pre></td></tr></table></figure><p>默认链接样式可修改为 (permalink配置只能有一种,关闭某种开头加 #)</p><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">permalink:</span> <span class="symbol">:category/</span><span class="symbol">:title</span>.html <span class="comment">#用分类和博客title当做url地址</span></span><br></pre></td></tr></table></figure></li><li><p><strong>设置hexo中的默认分类</strong><br>找到 <code>Category &amp; Tag</code></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="comment"># Category &amp; Tag</span></span><br><span class="line">default_category: default  <span class="comment">#这里设置一个默认分类名称,如果第3条永久链接设置为 permalink: category/:title/ 那么没有分类的博客就会被放在default这个分类下进行归档</span></span><br></pre></td></tr></table></figure></li></ol><p><strong>额外配置:hexo如何配置git信息</strong>(可跳过!后续新开一贴详细介绍)<br>github和coding都提供page服务,这样我们就可以把博客静态资源发布到这2个仓库,然后用域名来访问博客,所有人都可以通过浏览器来观看你的博客.双仓库格式如下:_<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></pre></td><td class="code"><pre><span class="line">deploy:</span><br><span class="line">  type: git</span><br><span class="line">  repo:</span><br><span class="line">      github: https://github.com/&#123;your_name&#125;/&#123;your_name&#125;.github.io,master <span class="comment">#github 提供page的服务要求仓库名必须为 &#123;your_name&#125;.github.io 格式 比如你的github用户名为 abc 那么你必须建立一个 abc.github.io仓库</span></span><br><span class="line">      coding: https://git.coding.net/&#123;your_name&#125;/&#123;your_name&#125;.git,master <span class="comment">#coding要求page服务的仓库名为 用户名 一样 .例如:用户名为abc 仓库名也必须为abc</span></span><br></pre></td></tr></table></figure></p><hr><blockquote><p>先找到 <strong><font size="2" color="red">主题配置文件</font></strong> <code>blog/themes/next/_config.yml</code> ,修改配置的时候都可以刷新页面观看修改结果,如果不显示可以在终端的博客目录执行<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ hexo clean</span><br><span class="line">$ hexo server</span><br></pre></td></tr></table></figure></p></blockquote><h2 id="主题配置"><a href="#主题配置" class="headerlink" title="主题配置"></a>主题配置</h2><ol><li><p><strong>配置hexo网站的favicon</strong><br>把准备好的favicon放在 <code>blog/themes/next/source/images/</code>下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">favicon:</span><br><span class="line">  small: /images/favicon<span class="number">-16</span>x16-next.png <span class="comment">#把favicon名修改成你自己的</span></span><br><span class="line">  medium: /images/favicon<span class="number">-32</span>x32-next.png</span><br></pre></td></tr></table></figure></li><li><p><strong>配置hexo中的tag,categories菜单</strong><br>默认菜单只开启了首页和归档,hexo所有图标均来自<a href="https://fontawesome.com/v4.7.0/icons" rel="external nofollow noopener noreferrer" target="_blank">fontawesome</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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">menu: <span class="comment">#菜单设置为 菜单名: /菜单目录 || 菜单图标名字</span></span><br><span class="line">  home: / || home </span><br><span class="line">  about: /about/ || user</span><br><span class="line">  tags: /tags/ || tags</span><br><span class="line">  categories: /categories/ || th</span><br><span class="line">  archives: /archives/ || archive</span><br><span class="line">  commonweal: /<span class="number">404</span>/ || heartbeat</span><br><span class="line"></span><br><span class="line">menu_settings:</span><br><span class="line">  icons: true  <span class="comment">#显示图标</span></span><br><span class="line">  badges: true  <span class="comment">#显示统计信息</span></span><br></pre></td></tr></table></figure></li><li><p><strong>手动生成hexo菜单对应文件</strong><br>新菜单开启后是没有对应文件的,所以要手动生成about,tags,categories和404页面,这里我们将404替换成腾讯的公益页面<br>新建about页面</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> blog</span><br><span class="line">$ hexo new page about <span class="comment">#about就是普通的布局一般用来介绍站点信息和博主信息等</span></span><br></pre></td></tr></table></figure><p>新建一个tags页面</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">$ cd blog</span><br><span class="line">$ hexo new page tags</span><br></pre></td></tr></table></figure><p>找到tags文件 <code>blog/source/tags/index.md</code> 编辑它,在头部修改为</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: All tags</span><br><span class="line">date: <span class="number">2018</span><span class="number">-10</span><span class="number">-01</span> <span class="number">13</span>:<span class="number">58</span>:<span class="number">44</span> <span class="comment">#时间随意</span></span><br><span class="line">type: <span class="string">"tags"</span> <span class="comment">#类型一定要为tags</span></span><br><span class="line">comments: false <span class="comment">#提示找个页面不需要评论,后续评论插件那里会详细介绍</span></span><br><span class="line">---</span><br></pre></td></tr></table></figure><p>新建一个categories页面</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">$ cd blog</span><br><span class="line">$ hexo new page categories</span><br></pre></td></tr></table></figure><p>找到categories文件 <code>blog/source/categories/index.md</code> 编辑它,在头部修改为</p> <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 分类</span><br><span class="line">date: <span class="number">2018</span><span class="number">-10</span><span class="number">-15</span> <span class="number">00</span>:<span class="number">03</span>:<span class="number">57</span></span><br><span class="line">type: <span class="string">"categories"</span></span><br><span class="line">comments: false</span><br><span class="line">---</span><br></pre></td></tr></table></figure><p>新建一个404页面</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">$ cd blog</span><br><span class="line">$ hexo new page <span class="number">404</span></span><br></pre></td></tr></table></figure><p>找到404文件 <code>blog/source/404/index.md</code> 编辑它,内容全部替换成如下</p><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><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">title</span>&gt;</span>404<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js"</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span> <span class="attr">homePageUrl</span>=<span class="string">"/"</span> <span class="attr">homePageName</span>=<span class="string">"返回"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span> </span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><p><strong>配置hexo本地搜索</strong><br>安装插件,终端进入 <code>cd blog</code> 后执行:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-generator-searchdb --save</span><br></pre></td></tr></table></figure><p><strong>主题配置文件</strong>如下:</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">local_search:</span><br><span class="line">  enable: true</span><br><span class="line">  trigger: auto</span><br><span class="line">  top_n_per_article: <span class="number">1</span></span><br><span class="line">  unescape: false</span><br></pre></td></tr></table></figure><p><strong>站点配置文件</strong>新添加如下代码:</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">search:</span><br><span class="line">  path: search.xml</span><br><span class="line">  field: post</span><br><span class="line">  format: html</span><br><span class="line">  limit: <span class="number">100</span></span><br></pre></td></tr></table></figure></li><li><p><strong>设置hexo中的rss订阅</strong><br>rss需要安装一个插件,终端进入 <code>cd blog</code> 后执行:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-generator-feed --save</span><br></pre></td></tr></table></figure><p>刷新主页就可以看到rss</p></li><li><p><strong>配置hexo站点的footer信息</strong><br>底部footer可以开关显示hexo版权,theme版权,还有建站时间等个性化配置</p><figure class="highlight"><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">footer:</span><br><span class="line">  since: <span class="number">2015</span>   <span class="comment">#建站开始时间</span></span><br><span class="line">  icon:</span><br><span class="line">    name: user  <span class="comment">#设置 建站初始时间和至今时间中间的图标 默认是一个'小人像'更改user为heart可以变成一个'心'</span></span><br><span class="line">    color: <span class="string">"#808080"</span> <span class="comment">#更改图标的颜色 红色为 '#ff0000'</span></span><br><span class="line">  powered:</span><br><span class="line">    enable: true <span class="comment">#是否开启hexo驱动</span></span><br><span class="line">    version: true <span class="comment">#是否开启hexo版本号</span></span><br><span class="line">  theme:</span><br><span class="line">    enable: true <span class="comment">#是否开启theme驱动</span></span><br><span class="line">    version: true <span class="comment">#是否开启主题版本号</span></span><br><span class="line">  custom_text: Hosted by &lt;a target="_blank" rel="external nofollow" href="https://pages.coding.me"&gt;&lt;b&gt;Coding Pages&lt;/b&gt;&lt;/a&gt; #这里的底部标识是为了添加coding page服务时的版权声明 打开注释就可以看到底部有一个 hosted by coding pages</span><br></pre></td></tr></table></figure></li><li><p><strong>配置hexo中next主题样式选择</strong><br>next一共提供了4种首页样式,按照自己喜好选择一个,切记选择一个其他主题后其他的主题之前一定要加上#</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"><span class="comment"># Schemes</span></span><br><span class="line">scheme: Muse</span><br><span class="line"><span class="comment">#scheme: Mist</span></span><br><span class="line"><span class="comment">#scheme: Pisces</span></span><br><span class="line"><span class="comment">#scheme: Gemini</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo网站next主题侧边栏宽度,头像信息,头像设置圆形和头像旋转</strong></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></pre></td><td class="code"><pre><span class="line">sidebar:</span><br><span class="line">  position: left  <span class="comment">#选择pisces 或者 gemini 主题是 可以 选择侧边栏 位置 调整左边或者右边</span></span><br><span class="line">  <span class="comment">#position: right</span></span><br><span class="line">  width: <span class="number">300</span>   <span class="comment"># muse mist 主题 可以控制侧边栏的宽度 </span></span><br><span class="line">  display: post   <span class="comment">#如果是muse mist 主题 可以选择 侧边栏弹出动作  post 是 只在内容页弹出</span></span><br><span class="line">  <span class="comment">#display: always  #全局弹出</span></span><br><span class="line">  <span class="comment">#display: hide    #全局隐藏侧边栏 右下角有角标唤出</span></span><br><span class="line">  <span class="comment">#display: remove  #移除侧边栏</span></span><br><span class="line">avatar:</span><br><span class="line">  url: /images/avatar.gif  <span class="comment">#设置头像资源的位置</span></span><br><span class="line">  rounded: false  <span class="comment">#开启圆形头像</span></span><br><span class="line">  opacity: <span class="number">1</span>    <span class="comment">#不透明的比例  0 就是完全透明</span></span><br><span class="line">  rotated: false  <span class="comment">#开启旋转</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题的社交信息和友链配置</strong></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></pre></td><td class="code"><pre><span class="line">social: <span class="comment">#和菜单设置格式一样  社交名字: 社交url || 社交图标 ,图标信息还是[fontawesome](https://fontawesome.com/v4.7.0/icons)</span></span><br><span class="line">  GitHub: https://github.com/yourname || github</span><br><span class="line">  E-Mail: mailto:yourname@gmail.com || envelope</span><br><span class="line">  Google: https://plus.google.com/yourname || google</span><br><span class="line"></span><br><span class="line">social_icons:</span><br><span class="line">  enable: true  <span class="comment">#显示社交图标</span></span><br><span class="line">  icons_only: false <span class="comment">#只显示图标的开关</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Blog rolls</span></span><br><span class="line">links_icon: link  <span class="comment">#友链的图标 参考上文</span></span><br><span class="line">links_title: Links <span class="comment">#友链的title  比如你可以更改为 友情链接</span></span><br><span class="line">links_layout: block <span class="comment">#友链摆放的样式,按块 一行一个</span></span><br><span class="line"><span class="comment">#links_layout: inline #按线摆放,一行很多个 切记 同时只能一种样式</span></span><br><span class="line">links:</span><br><span class="line">  Title: http://example.com/  <span class="comment">#友链的地址</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题首页文章不展示全文显示摘要,自动截取摘要和点击阅读全文跳转顶部</strong></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">scroll_to_more: true  <span class="comment">#点击阅读全文后是否跳到&lt;!--more--&gt;标记处,设为false时点击阅读全文可以从头阅读</span></span><br><span class="line">auto_excerpt: <span class="comment">#是否自动截取摘要</span></span><br><span class="line">  enable: false <span class="comment">#设置为true则自动截取150字当做首页摘要</span></span><br><span class="line">  length: <span class="number">150</span>   <span class="comment">#自动截取的字数</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题首页文章属性显示创建时间,修改时间,分类</strong></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></pre></td><td class="code"><pre><span class="line">post_meta:</span><br><span class="line">  item_text: false  <span class="comment"># 设为true 可以一行显示 文章的所有属性</span></span><br><span class="line">  created_at: true  <span class="comment">#显示创建时间</span></span><br><span class="line">  updated_at:</span><br><span class="line">    enabled: true   <span class="comment">#显示修改的时间</span></span><br><span class="line">    another_day: true <span class="comment">#设true时 如果创建时间和修改时间一样则显示一个时间</span></span><br><span class="line">  categories: true  <span class="comment">#显示分类信息</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中的next增加页面阅读统计,字数统计,阅读时长</strong><br>新增<code>busuanzi</code>阅读统计</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">busuanzi_count:</span><br><span class="line">  enable: false  <span class="comment">#设true 开启</span></span><br><span class="line">  total_visitors: true  <span class="comment">#总阅读人数 uv数</span></span><br><span class="line">  total_visitors_icon: user  <span class="comment">#阅读总人数的图标</span></span><br><span class="line">  total_views: true  <span class="comment">#总阅读次数 pv数</span></span><br><span class="line">  total_views_icon: eye  <span class="comment">#阅读总次数的图标</span></span><br><span class="line">  post_views: true <span class="comment">#开启内容阅读次数</span></span><br><span class="line">  post_views_icon: eye <span class="comment">#内容页阅读数的图标</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">$ npm install hexo-symbols-count-time --save</span><br></pre></td></tr></table></figure><p><strong>主题配置信息</strong>如下:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">symbols_count_time:</span><br><span class="line">  separated_meta: true  <span class="comment"># false 会显示一行</span></span><br><span class="line">  item_text_post: true  <span class="comment"># 显示属性名称,设为false后只显示图标和统计数字,不显示属性的文字</span></span><br><span class="line">  item_text_total: true <span class="comment">#底部footer是否显示字数统计属性文字</span></span><br><span class="line">  awl: <span class="number">4</span> <span class="comment">#计算字数的一个设置,没设置过</span></span><br><span class="line">  wpm: <span class="number">275</span> <span class="comment">#一分钟阅读的字数</span></span><br></pre></td></tr></table></figure><p><strong>站点配置</strong>新增如下:</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></pre></td><td class="code"><pre><span class="line">symbols_count_time:</span><br><span class="line"> <span class="comment">#文章内是否显示</span></span><br><span class="line">  symbols: true</span><br><span class="line">  time: true</span><br><span class="line"> <span class="comment"># 网页底部是否显示</span></span><br><span class="line">  total_symbols: true</span><br><span class="line">  total_time: true</span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题给内容页里的代码块新增</strong>复制<strong>按钮</strong></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">codeblock:</span><br><span class="line">  copy_button:</span><br><span class="line">    enable: false <span class="comment">#增加复制按钮的开关</span></span><br><span class="line">    show_result: false <span class="comment">#点击复制完后是否显示 复制成功 结果提示</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题文章主页配置微信公众号</strong></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"><span class="comment"># Wechat Subscriber</span></span><br><span class="line">wechat_subscriber:</span><br><span class="line">  enabled: true</span><br><span class="line">  qcode: /images/wechat-qcode.jpg <span class="comment">#微信公众号的二维码</span></span><br><span class="line">  description: 这是我的公众号  <span class="comment">#公众号描述文字</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题配置微信,支付宝打赏</strong></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"><span class="comment"># Reward</span></span><br><span class="line">reward_comment: 一毛也是爱~  <span class="comment">#打赏描述</span></span><br><span class="line">wechatpay: /images/wechat_pay.png <span class="comment">#微信支付的二维码图片地址</span></span><br><span class="line">alipay: /images/ali_pay.png  <span class="comment">#支付宝的地址</span></span><br><span class="line"><span class="comment">#bitcoin: /images/bitcoin.png #这个是设置比特币的...</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题新增 相关文章推荐</strong><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">$ npm install hexo-related-popular-posts --save</span><br></pre></td></tr></table></figure><p>主题配置信息如下:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">related_posts:</span><br><span class="line">  enable: true</span><br><span class="line">  title: 相关文章推荐 <span class="comment"># 属性的命名</span></span><br><span class="line">  display_in_home: false <span class="comment">#false代表首页不显示</span></span><br><span class="line">  params:</span><br><span class="line">    maxCount: <span class="number">5</span> <span class="comment">#最多5条</span></span><br><span class="line">    <span class="comment">#PPMixingRate: 0.0 #可以看github上 这个相关度介绍</span></span><br><span class="line">    <span class="comment">#isDate: true #是否显示 日期</span></span><br><span class="line">    <span class="comment">#isImage: false #是否显示配图</span></span><br><span class="line">    isExcerpt: false <span class="comment">#是否显示摘要</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题的文章原创申明</strong><br>给每一个原创文章开启版权保护</p><figure class="highlight"><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">post_copyright:</span><br><span class="line">  enable: true <span class="comment">#设置true就开启了</span></span><br><span class="line">  license: &lt;a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="external nofollow" target="_blank"&gt;CC BY-NC-SA 4.0&lt;/a&gt;</span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题更改code高亮样式</strong></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">highlight_theme: normal <span class="comment">#可选值为 normal | night | night eighties | night blue | night bright 这几个挑一个喜欢的</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题添加评论-Valine</strong><br>点击官网<a href="https://leancloud.cn" rel="external nofollow noopener noreferrer" target="_blank">leancloud</a>注册账号,获取自己的appid,appkey,再看<a href="https://valine.js.org" rel="external nofollow noopener noreferrer" target="_blank">valine</a>官网设置下自己的leancloud</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">valine:</span><br><span class="line">  enable: true <span class="comment"># 开启评论</span></span><br><span class="line">  appid:  ~~~  <span class="comment"># 刚申请 leancloud 的 appid</span></span><br><span class="line">  appkey:  ~~~ <span class="comment"># 刚生情 leancloud 的 appkey</span></span><br><span class="line">  notify: false <span class="comment"># 是否邮件推送 详情看 https://github.com/xCss/Valine/wiki</span></span><br><span class="line">  verify: false <span class="comment"># </span></span><br><span class="line">  placeholder: Just go go <span class="comment"># 评论框里的placeholder信息</span></span><br><span class="line">  avatar: mm <span class="comment"># gravatar style</span></span><br><span class="line">  guest_info: nick,mail,link <span class="comment"># custom comment header</span></span><br><span class="line">  pageSize: <span class="number">10</span> <span class="comment"># 一页显示的评论条数</span></span><br><span class="line">  visitor: false <span class="comment">#</span></span><br></pre></td></tr></table></figure></li><li><p><strong>hexo中next主题配置网页body背景动态效果<br>4个效果同时只能开启一个</strong></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">canvas_nest: false</span><br><span class="line">three_waves: false</span><br><span class="line">canvas_lines: false</span><br><span class="line">canvas_sphere: false</span><br></pre></td></tr></table></figure></li></ol><hr><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><ol><li>为什么<code>hexo server</code>报错?<br>检查最近修改的配置文件中的各个配置项冒号后是否有空格,某些样式选择是否唯一</li><li>为什么menu设置完后,点击各个菜单无效,href=””现象?<br>检查站点配置文件<code>relative_link: false</code> 如为true 改为 false即可</li></ol><h2 id="最后的最后"><a href="#最后的最后" class="headerlink" title="最后的最后"></a>最后的最后</h2><p>由于6.4比5.x多了很多以前个性定制的配置,使得个性化的配置操作简单很多,不用修改样式和源码即可完成以前的定制效果,所以主题的更新还是要看个人的需求,如果功能够用的情况下还是保证创作博客为主,毕竟内容才是最能吸引读者的,共勉.</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;30分钟即可完成一个带评论、打赏、搜索、RSS、分类、标签等功能的博客&lt;br&gt;高效的搭建让博主更加专注于内容的生产&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="hexo" scheme="https://dangbowen.com/categories/hexo/"/>
    
    
      <category term="hexo" scheme="https://dangbowen.com/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>Hello World!</title>
    <link href="https://dangbowen.com/diary/1c291ca3.html"/>
    <id>https://dangbowen.com/diary/1c291ca3.html</id>
    <published>2018-10-08T12:42:29.000Z</published>
    <updated>2019-08-14T13:01:53.972Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>写在开始编程前的一些话,也记录一些编程以外的事!<br>  与君共勉!</p></blockquote><a id="more"></a><p>写博客对我来说真的是一件很费劲巴拉的事.从14年开始到现在断断续续的搭建了4次,其实最后完整的站也就是WordPress,和现在这个,之前失败的经历无一不是把时间浪费在纠结细节而忽略最初的目的,既想要漂亮的后台编辑界面,还想要酷炫的前端,可惜我是一个后端开发,在选择前端组件上,轻微的强迫症让我吃尽苦头(改来改去,选来选去).甚至当年在看到阮一峰等人的博客时,心里想的更多的是这个博客居然这么简陋</p><p>所幸这几年想记录的、想分享的东西都存在书签和笔记里了,加上自己这几年的编程经历也有了一点点小小的积累,希望这些博客能够帮助到你!</p><p>  放一张笔记截图<br><img src="https://wx2.sinaimg.cn/large/b3e14f02ly1fwbbbwyd0yj21kw0w0b2a.jpg" alt="笔记截图"></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;写在开始编程前的一些话,也记录一些编程以外的事!&lt;br&gt;  与君共勉!&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="diary" scheme="https://dangbowen.com/categories/diary/"/>
    
    
      <category term="life" scheme="https://dangbowen.com/tags/life/"/>
    
  </entry>
  
</feed>
