<body style="">
<div class="head-top-line"></div>
<div class="header-box">
<div class="pisces">
<header class="header  ">
<div class="blog-header box-shadow-wrapper bg-color " id="header">
<div class="nav-toggle" id="nav_toggle">
<div class="toggle-box">
<div class="line line-top"></div>
<div class="line line-center"></div>
<div class="line line-bottom"></div>
</div>
</div>
<div class="site-meta">
<div class="site-title">
<a href="/" class="brand" style="opacity: 1; top: 0px;">
<span>YouDieInADream</span>
</a>
</div>
<p class="subtitle" style="opacity: 1; top: 0px;">You die in a dream.</p>
</div>
<nav class="site-nav" id="site_nav">
<ul id="nav_ul">
<li class="nav-item nav-item-active" style="opacity: 1; transform: translateY(0px);">
<a href="/" target="_self">
<i class="fa fa-globe"></i> 主页
</a>
</li>
<li class="nav-item" style="opacity: 1; transform: translateY(0px);">
<a href="/archives" target="_self">
<i class="fa fa-globe"></i> 归档
</a>
</li>
<li class="nav-item" style="opacity: 1; transform: translateY(0px);">
<a href="/tag/diary" target="_self">
<i class="fa fa-globe"></i> 随笔
</a>
</li>
<li class="nav-item" style="opacity: 1; transform: translateY(0px);">
<a href="https://blog.shunzi.tech/post/tools" target="_self">
<i class="fa fa-globe"></i> 导航
</a>
</li>
<li class="nav-item" style="opacity: 1; transform: translateY(0px);">
<a href="/tags" target="_self">
<i class="fa fa-globe"></i> 标签
</a>
</li>
<li class="nav-item" style="opacity: 1; transform: translateY(0px);">
<a href="/post/about" target="_self">
<i class="fa fa-globe"></i> 关于
</a>
</li>
<li id="fa_search" class="nav-item" style="opacity: 1; transform: translateY(0px);">
<a href="javascript:void(0);">
<i class="fa fa-search"></i> <span class="language" data-lan="search">搜索</span>
</a>
</li>
</ul>
</nav>
</div>
</header>
</div>
<script type="text/javascript"> 
 
  let showNav = true;

  let navToggle = document.querySelector('#nav_toggle'),
  siteNav = document.querySelector('#site_nav');
  
  function navClick() {
    let sideBar = document.querySelector('.sidebar');
    let navUl = document.querySelector('#nav_ul');
    navToggle.classList.toggle('nav-toggle-active');
    siteNav.classList.toggle('nav-menu-active');
    if (siteNav.classList.contains('nav-menu-active')) {
      siteNav.style = "height: " + (navUl.children.length * 42) +"px !important";
    } else {
      siteNav.style = "";
    }
  }

  navToggle.addEventListener('click',navClick);  
</script>
</div>
<div class="main-continer">
<div class="section-layout pisces ">
<div class="section-layout-wrapper">
<div id="sidebarMeta" class="sidebar" style="margin-top: 461px; opacity: 1; display: block;">
<div class="sidebar-wrapper box-shadow-wrapper bg-color">
<div class="sidebar-item">
<img class="site-author-image right-motion" src="/images/avatar.png">
<p class="site-author-name">Elvis Zhang</p>
<div class="site-description right-motion">
<p>The easy way or the right way.</p>
</div>
</div>
<div class="sidebar-item side-item-stat right-motion">
<div class="sidebar-item-box">
<a href="/archives/">
<span class="site-item-stat-count">136</span>
<span class="site-item-stat-name language" data-lan="article">文章</span>
</a>
</div>
<div class="sidebar-item-box">
<a href="/tags/">
<span class="site-item-stat-count">44</span>
<span class="site-item-stat-name language" data-lan="tag">标签</span>
</a>
</div>
</div>
<div class="sidebar-item">
<span class="site-item-rss">
<i class="fa fa-rss"></i>
<a href="https://blog.shunzi.tech/atom.xml" target="_blank">RSS</a>
</span>
</div>
<div class="sidebar-item sidebar-item-social">
<div class="social-item">
<a href="https://github.com/zjs1224522500">
<i class="fa fa-github" title="github"></i>
</a>
</div>
</div>
</div>
</div>
<script type="text/javascript">
  let sidebarMeta = document.querySelector('#sidebarMeta');
  let scheme = 'pisces';
  let sidebarWrapper = document.querySelector('.sidebar-wrapper');
  if (sidebarMeta && (scheme === 'pisces' || scheme === 'gemini')) {
    document.addEventListener('scroll', function(e) {
      if (document.scrollingElement.scrollTop > parseInt(sidebarMeta.style.marginTop) + 10) {
        sidebarWrapper.classList.add('home-sidebar-fixed')
      } else {
        sidebarWrapper.classList.remove('home-sidebar-fixed')
      }
    });
  }
  </script>
<div class="section-box pisces">
<section class="section bg-color posts-expand slide-down-in">
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/InifniFS/"> InfiniFS: An Efficient Metadata Service for Large-Scale Distributed Filesystems </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2022-04-05 11:40:00">2022-04-05</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/28O_3Ah6P/"> <span>文件系统</span> </a>、
<a href="https://blog.shunzi.tech/tag/5uQUdLlSC/"> <span>Paper</span> </a>、
<a href="https://blog.shunzi.tech/tag/3zCwFWPHxH/">
<span>存储</span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>23<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>6482<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">

<p></p><blockquote>
<ul>
<li>InfiniFS: An Efficient Metadata Service for Large-Scale Distributed Filesystems</li>
<p>
</p><div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/InifniFS/" rel="contents">
阅读全文 »
</a>
</div>
</ul></blockquote></div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/6.NULL-1-ModernCMake/"> Modern CMake </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2021-12-31 16:37:41">2021-12-31</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/wAFV_pvXZ/">
<span>cs-course</span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>64<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>12707<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">

<blockquote>
<ul>
<li>个人认为也可以包含在 6.NULL 系列的 CMake 教程</li>
</ul>
</blockquote>
<div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/6.NULL-1-ModernCMake/" rel="contents">
阅读全文 »
</a>
</div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/6.NULL-1-shell/"> Shell </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2021-12-30 16:37:41">2021-12-30</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/wAFV_pvXZ/">
<span>cs-course</span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>18<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>3787<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">
<blockquote>
<ul>
<li>6.NULL: Shell 扩展介绍</li>
</ul>
</blockquote>
<div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/6.NULL-1-shell/" rel="contents">
阅读全文 »
</a>
</div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/6.NULL/"> 6.NULL: The Missing Semester of Your CS Education </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2021-12-28 16:37:41">2021-12-28</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/wAFV_pvXZ/">
<span>cs-course</span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>83<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>21199<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">
<blockquote>
<ul>
<li>6.NULL: The Missing Semester of Your CS Education 原课程总结</li>
</ul>
</blockquote>

<div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/6.NULL/" rel="contents">
阅读全文 »
</a>
</div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/ChameleonDB/"> ChameleonDB: a Key-value Store for Optane Persistent Memory </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2021-09-28 16:37:41">2021-09-28</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/5uQUdLlSC/"> <span>Paper</span> </a>、
<a href="https://blog.shunzi.tech/tag/3zCwFWPHxH/"> <span>存储</span> </a>、
<a href="https://blog.shunzi.tech/tag/_jfuTNqah/">
<span>LSM</span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>29<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>7825<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">
<blockquote>
<ul>
<li>该篇文章来自于 EuroSys2021 - ChameleonDB: a Key-value Store for Optane Persistent Memory</li>
</ul>
</blockquote>
<div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/ChameleonDB/" rel="contents">
阅读全文 »
</a>
</div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/X-Engine/"> X-Engine: An Optimized Storage Engine for Large-scale E-commerce Transaction Processing </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2021-08-30 16:37:41">2021-08-30</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/5uQUdLlSC/"> <span>Paper</span> </a>、
<a href="https://blog.shunzi.tech/tag/3zCwFWPHxH/"> <span>存储</span> </a>、
<a href="https://blog.shunzi.tech/tag/_jfuTNqah/">
<span>LSM</span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>27<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>7591<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">
<blockquote>
<ul>
<li>该篇文章来自于 SIGMOD19: X-Engine: An Optimized Storage Engine for Large-scale E-commerce Transaction Processing</li>
</ul>
</blockquote>
<div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/X-Engine/" rel="contents">
阅读全文 »
</a>
</div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/CRP-Fine-Grained-Three-Other/"> Cache Replacement Policies - Fine-Grained Other </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2021-08-20 17:40:00">2021-08-20</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/9msH-lUaA/"> <span>缓存</span> </a>、
<a href="https://blog.shunzi.tech/tag/la-n8a0mo/">
<span>读书笔记</span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>5<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>1181<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">
<blockquote>
<ul>
<li>Cache Replacement Policies - Fine-Grained Other</li>
</ul>
</blockquote>
<div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/CRP-Fine-Grained-Three-Other/" rel="contents">
阅读全文 »
</a>
</div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/CRP-Fine-Grained-Two-Classification/"> Cache Replacement Policies - Fine-Grained Classification </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2021-08-20 16:40:00">2021-08-20</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/9msH-lUaA/"> <span>缓存</span> </a>、
<a href="https://blog.shunzi.tech/tag/la-n8a0mo/">
<span>读书笔记</span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>14<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>3845<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">
<blockquote>
<ul>
<li>Cache Replacement Policies - Fine-Grained Classification</li>
</ul>
</blockquote>
<div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/CRP-Fine-Grained-Two-Classification/" rel="contents">
阅读全文 »
</a>
</div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/CRP-Fine-Grained-One-Reuse-Distance/"> Cache Replacement Policies - Fine-Grained Reuse Distance </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2021-08-20 15:40:00">2021-08-20</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/9msH-lUaA/"> <span>缓存</span> </a>、
<a href="https://blog.shunzi.tech/tag/la-n8a0mo/">
<span>读书笔记</span>
</a>
</span>
<span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>7<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>1853<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">
<blockquote>
<ul>
<li>Cache Replacement Policies - Fine-Grained Reuse Distance</li>
</ul>
</blockquote>
<div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/CRP-Fine-Grained-One-Reuse-Distance/" rel="contents">
阅读全文 »
</a>
</div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post-list-box post box-shadow-wrapper" style="opacity: 1; display: block; transform: translateY(0px);">
<div class="article-wrapper bg-color">
<section class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="https://blog.shunzi.tech/post/CRP-Coarse-Grained-Three-Hybrid/"> Cache Replacement Policies - Coarse-Grained Hybrid </a>
</h1>
<div class="post-meta">
<span class="meta-item pc-show">
<i class="fa fa-calendar-o"></i>
<span class="language" data-lan="publish">发布于</span>
<span class="publish-time" data-t="2021-08-20 14:40:00">2021-08-20</span>
<span class="post-meta-divider pc-show">|</span>
</span>
<span class="meta-item">
<i class="fa fa-folder-o"></i>
<span class="pc-show language" data-lan="category-in">标签:</span>
<a href="https://blog.shunzi.tech/tag/9msH-lUaA/"> <span>缓存</span> </a>、
<a href="https://blog.shunzi.tech/tag/la-n8a0mo/">
<span>读书笔记</span>
</a>
</span>
 <span class="post-meta-divider">|</span>
<span class="meta-item">
<i class="fa fa-clock-o"></i>
<span>5<span class="language" data-lan="minute">分钟</span></span>
</span>
<span class="meta-item">
<span class="post-meta-divider">|</span>
<i class="fa fa-file-word-o"></i>
<span>1223<span class="pc-show language" data-lan="words">字数</span></span>
</span>
</div>
</section>
<div class="post-body">
<blockquote>
<ul>
<li>Cache Replacement Policies - Coarse-Grained Hybrid</li>
</ul>
</blockquote>
<div class="post-button text-center">
<a class="btn language" data-lan="read-more" href="https://blog.shunzi.tech/post/CRP-Coarse-Grained-Three-Hybrid/" rel="contents">
阅读全文 »
</a>
</div>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<div class="page bg-color" style="opacity: 1; display: block; transform: translateY(0px);">
<ul class="pagination-ul">

<li class="pagination-li pagination-active">
<a href="/">1</a>
</li>
<li class="pagination-li ">
<a href="/page/2">
2
</a>
</li>
<li class="pagination-li ">
<a href="/page/3">
3
</a>
</li>
<li class="pagination-li ">
<a href="/page/4">
4
</a>
</li>
<li class="pagination-li">
…
</li>
<li class="pagination-li">
<a href="/page/14">
14
</a>
</li>
<li class="pagination-dir">
<a href="/page/2">
<i class="fa fa-angle-right"></i>
</a>
</li>
</ul>
</div>
</section>
</div>
</div>
</div>
<div class="footer-box">
<footer class="footer">

<span id="busuanzi_container_site_pv" style="display: inline;">浏览数:<span id="busuanzi_value_site_pv">8394</span> 次</span>
<span class="post-meta-divider">|</span>
<span id="busuanzi_container_site_uv" style="display: inline;">访客数:<span id="busuanzi_value_site_uv">4808</span> 人</span>
<script type="text/javascript">
      BirthDay = new Date('');
      if (BirthDay.getTime()) {
        function runTime() {
          str = "";
          today = new Date();
          timeold = today.getTime() - BirthDay.getTime();
          msPerDay = 24 * 60 * 60 * 1000;
          e_daysold = timeold / msPerDay;
          daysold = Math.floor(e_daysold);
          str += daysold + "天";
          return str;
        }
        setInterval(function () {
          $("#run_time").html(runTime());
        }, 1000);
      } else {
        document.querySelector('.footer').removeChild(document.querySelector('#runTimeBox'));
      }
    </script>
<div class="poweredby">
Powered by <a href="https://github.com/getgridea/gridea" target="_blank">Gridea</a>
</div>
</footer>
<div class="pisces back-to-top" id="back_to_top">
<i class="fa fa-arrow-up"></i>
<span class="scrollpercent"> <span id="back_to_top_text">0</span>% </span>
</div>
<div class="bg-img">
<img src="https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master/paperwall_1.jpg">
</div>
</div>
<script type="text/javascript">
  let sideBarOpen = "sidebar-open";
  let body = document.body;
  let back2Top = document.querySelector("#back_to_top"),
    back2TopText = document.querySelector("#back_to_top_text"),
    drawerBox = document.querySelector("#drawer_box"),
    rightSideBar = document.querySelector(".sidebar"),
    viewport = document.querySelector("body");

  function scrollAnimation(currentY, targetY) {
    let needScrollTop = targetY - currentY;
    let _currentY = currentY;
    setTimeout(() => {
      const dist = Math.ceil(needScrollTop / 10);
      _currentY += dist;
      window.scrollTo(_currentY, currentY);
      if (needScrollTop > 10 || needScrollTop < -10) {
        scrollAnimation(_currentY, targetY);
      } else {
        window.scrollTo(_currentY, targetY);
      }
    }, 1);
  }

  back2Top.addEventListener("click", function (e) {
    scrollAnimation(document.scrollingElement.scrollTop, 0);
    e.stopPropagation();
    return false;
  });

  window.addEventListener("scroll", function (e) {
    let percent =
      (document.scrollingElement.scrollTop /
        (document.scrollingElement.scrollHeight -
          document.scrollingElement.clientHeight)) *
      100;
    if (percent > 1 && !back2Top.classList.contains("back-top-active")) {
      back2Top.classList.add("back-top-active");
    }
    if (percent == 0) {
      back2Top.classList.remove("back-top-active");
    }
    if (back2TopText) {
      back2TopText.textContent = Math.floor(percent);
    }
  });

  let hasCacu = false;
  window.addEventListener("resize", function (e) {
    calcuHeight();
  });

  function calcuHeight() {
    // 动态调整站点概览高度
    if (
      (!hasCacu && back2Top.classList.contains("pisces")) ||
      back2Top.classList.contains("gemini")
    ) {
      let sideBar = document.querySelector(".sidebar");
      let navUl = document.querySelector("#site_nav");
      sideBar.style =
        "margin-top:" + (navUl.offsetHeight + navUl.offsetTop + 15) + "px;";
      hasCacu = true;
    }
  }
  calcuHeight();

  let open = false,
    MOTION_TIME = 300,
    RIGHT_MOVE_DIS = "320px";

  if (drawerBox) {
    let rightMotions = document.querySelectorAll(".right-motion");
    let right = drawerBox.classList.contains("right");

    let transitionDir = right
      ? "transition.slideRightIn"
      : "transition.slideLeftIn";

    let openProp, closeProp;
    if (right) {
      openProp = {
        paddingRight: RIGHT_MOVE_DIS,
      };
      closeProp = {
        paddingRight: "0px",
      };
    } else {
      openProp = {
        paddingLeft: RIGHT_MOVE_DIS,
      };
      closeProp = {
        paddingLeft: "0px",
      };
    }

    drawerBox.onclick = function () {
      open = !open;
      jQuery.Velocity(rightSideBar, "stop");
      jQuery.Velocity(viewport, "stop");
      jQuery.Velocity(rightMotions, "stop");
      if (open) {
        jQuery.Velocity(
          rightSideBar,
          {
            width: RIGHT_MOVE_DIS,
          },
          {
            duration: MOTION_TIME,
            begin: function () {
              jQuery.Velocity(rightMotions, transitionDir, {});
            },
          }
        );
        jQuery.Velocity(viewport, openProp, {
          duration: MOTION_TIME,
        });
      } else {
        jQuery.Velocity(
          rightSideBar,
          {
            width: "0px",
          },
          {
            duration: MOTION_TIME,
            begin: function () {
              jQuery.Velocity(rightMotions, {
                opacity: 0,
              });
            },
          }
        );
        jQuery.Velocity(viewport, closeProp, {
          duration: MOTION_TIME,
        });
      }
      for (let i = 0; i < drawerBox.children.length; i++) {
        drawerBox.children[i].classList.toggle("muse-line");
      }
      drawerBox.classList.toggle(sideBarOpen);
    };
  }

  // 链接跳转
  let newWindow = "false";
  if (newWindow === "true") {
    let links = document.querySelectorAll(".post-body a");
    links.forEach((item) => {
      if (!item.classList.contains("btn")) {
        item.setAttribute("target", "_blank");
      }
    });
  }

  let faSearch = document.querySelector("#fa_search");
  faSearch &&
    faSearch.addEventListener("click", function () {
      document.querySelector("#search_mask").style = "";
    });

  // 代码高亮
  hljs.initHighlightingOnLoad();

  // 离开当前页title变化
  var leaveTitle = "";
  var normal_title = document.title;
  if (leaveTitle) {
    document.addEventListener("visibilitychange", function () {
      if (document.visibilityState == "hidden") {
        normal_title = document.title;
        document.title = leaveTitle;
      } else {
        document.title = normal_title;
      }
    });
  }
</script>
<link rel="stylesheet" href="/media/css/jquery.fancybox.css">
<script src="/media/js/jquery.fancybox.js" type="text/javascript"></script>
<script type="text/javascript">
  let images = document.querySelectorAll(".section img");
  images.forEach((image) => {
    var parent = image.parentElement;
    var next = image.nextElementSibling;
    parent.removeChild(image);
    var aelem = document.createElement("a");
    aelem.href = image.src;
    aelem.dataset["fancybox"] = "images";
    aelem.dataset["rel"] = "fancybox-button";
    aelem.classList.add("fancybox");
    aelem.appendChild(image);
    parent.insertBefore(aelem, next);
  });
</script>
</div>

<div class="search-mask" id="search_mask" style="display: none;">
<div class="search-box">
<div class="search-title">
<i class="fa fa-search"></i>
<div class="input-box">
<input id="search" type="text" class="language" data-lan="search" placeholder="搜索">
</div>
<i id="close" class="fa fa-times-circle"></i>
</div>
<div class="stat-box">
<span id="stat_count">0</span><span class="language" data-lan="stat">条相关条目，使用了</span><span id="stat_times">0</span><span class="language" data-lan="stat-time">毫秒</span>
<hr>
</div>
<div class="result" id="result">














































































































































</div>
<div class="page">
<div id="page_ul"></div>
</div>
</div>
</div>
<script type="text/javascript">
  !function () {
    let searchMask = document.querySelector('#search_mask');
    let result = document.querySelector('#result');
    let items = document.querySelectorAll('.item');
    let searchBox = document.querySelector('#search');
    let statCount = document.querySelector('#stat_count');
    let statTimes = document.querySelector('#stat_times');
    let pageUl = document.querySelector('#page_ul');
    let close = document.querySelector('#close');
    
    close.addEventListener('click', function() {
      searchMask.style = 'display: none;'
    })

    let finds = [];
    let contents = [];
    let pageSize = 10;
    items.forEach(item => {
      let a = item.querySelector('a');
      contents.push({
        title: a.innerText,
        details: a.dataset.c,
        link: a.href
      })
      item.remove();
    })

    function insertStr(soure, start, count) {
      let newStr = soure.substr(start, count);
      return soure.slice(0, start) + '<em>' + newStr + '</em>' + soure.slice(start + count);
    }

    pageUl.addEventListener('click', function(event) {
      let target = event.target;
      if (target.__proto__ === HTMLSpanElement.prototype) {
        appendResults(parseInt(target.dataset.i));
      }
    })

    function appendResults(index) {
      let htmlResult = '';
      let start = index || 0;
      let end = Math.min(start + pageSize, finds.length);
      for (let i = start; i < end; i++) {
        const current = finds[i];
        let html = current.title;
        let sum = 0;
        let positions = current.positions;
        positions.forEach(position => {
          html = insertStr(html, position.start + sum, position.count);
          sum += 9;
        })
        htmlResult += `<div class="item"><a class="result-title" href="${current.link}">${html}</a></div>`;
      }
      result.innerHTML = htmlResult;
      pageUl.innerHTML = '';
      let count = finds.length / pageSize;
      let lis = '';
      if (start !== 0) {
        lis += `<span class="fa fa-angle-left" data-i='${start - 1}'></span>`;
      }
      for (let i = 0; i < count; i++) {
        lis += `<span class='${i === start?'current':''}' data-i='${i}'>${i+1}</span>`;     
      }
      if (start+1 < count) {
        lis += `<span class="fa fa-angle-right" data-i='${start+1}'></span>`;  
      }
      pageUl.innerHTML = lis;
    }

    function search(delay) {
      let timer = null
      return function () {
        clearTimeout(timer)
        timer = setTimeout(() => {
          let start = Date.now();
          let segments = searchBox.value.split(' ').filter(c => c != '');
          if (segments.length <= 0) {
            return;
          }
          finds = [];
          let htmlResult = '';
          contents.forEach(content => {
            let title = content.title;
            let positions = [];
            let find = false;
            segments.forEach((segment) => {
              if (content.title.includes(segment)) {
                find = true;
                positions.push({
                  start: content.title.indexOf(segment),
                  count: segment.length
                })
              } else if (content.details.includes(segment)) {
                find = true;
              }
            });
            if (find) {
              finds.push({
                title: content.title,
                link: content.link,
                positions
              });
            }
          })
          appendResults(0);
          statCount.textContent = finds.length;
          statTimes.textContent = Date.now() - start;
        }, delay)
      }
    }
    searchBox.addEventListener('input', search(200));
  }()
</script>
<input hidden="" id="copy">
<script type="text/javascript">
  !function () {
    let times = document.querySelectorAll('.publish-time');
    for (let i = 0; i < times.length; i++) {
      let date = times[i].dataset.t;
      let time = Math.floor((new Date().getTime() - new Date(date).getTime()) / 1000);
      if (time < 60) {
        str = time + '秒之前';
      } else if (time < 3600) {
        str = Math.floor(time / 60) + '分钟之前';
      } else if (time >= 3600 && time < 86400) {
        str = Math.floor(time / 3600) + '小时之前';
      } else if (time >= 86400 && time < 259200) {
        str = Math.floor(time / 86400) + '天之前';
      } else {
        str = times[i].textContent;
      }
      times[i].textContent = str;
    }
  }();
</script>
<script type="text/javascript">
  let language = '';
  if (language !== '') {
    let map = new Map();
    if (language === 'en') {
      map.set('search', 'Search');
      map.set('category', 'Categories');
      map.set('article', 'Articles');
      map.set('tag', 'Tags');
      map.set('top', 'Top');
      map.set('publish', 'published');
      map.set('minute', ' minutes');
      map.set('read-more', 'Read More');
      map.set('view', 'View');
      map.set('words', ' words');
      map.set('category-in', 'category in');
      map.set('preview', 'Meta');
      map.set('index', 'Toc');
      map.set('no-archives', "You haven't created yet");
      map.set('archives', " articles in total");
      map.set('cloud-tags', " tags in total");
      map.set('copyright', "Copyright: ");
      map.set('author', "Author: ");
      map.set('link', "Link: ");
      map.set('leave-message', "Leave a message");
      map.set('format', "Links Format");
      map.set('site-name', "Name: ");
      map.set('site-link', "Link: ");
      map.set('site-desc', "Desc: ");
      map.set('stat', " related results, taking ");
      map.set('stat-time', " ms");
      map.set('site-img', "Image: ");
    }

    if (map.size > 0) {
      let lanElems = document.querySelectorAll('.language');
      lanElems.forEach(elem => {
        let lan = elem.dataset.lan, text = map.get(lan);
        if (elem.__proto__ === HTMLInputElement.prototype) {
          elem.placeholder = text
        } else {
          if (elem.dataset.count) {
            text = elem.dataset.count + text;
          }
          elem.textContent = text;
        }
      })
    }
  }

  window.Clipboard = (function (window, document, navigator) {
    var textArea,
      copy;

    // 判断是不是ios端
    function isOS() {
      return navigator.userAgent.match(/ipad|iphone/i);
    }
    //创建文本元素
    function createTextArea(text) {
      textArea = document.createElement('textArea');
      textArea.value = text;
      textArea.style.width = 0;
      textArea.style.height = 0;
      textArea.clientHeight = 0;
      textArea.clientWidth = 0;
      document.body.appendChild(textArea);
    }
    //选择内容
    function selectText() {
      var range,
        selection;

      if (isOS()) {
        range = document.createRange();
        range.selectNodeContents(textArea);
        selection = window.getSelection();
        selection.removeAllRanges();
        selection.addRange(range);
        textArea.setSelectionRange(0, 999999);
      } else {
        textArea.select();
      }
    }

    //复制到剪贴板
    function copyToClipboard() {
      try {
        document.execCommand("Copy")
      } catch (err) {
        alert("复制错误！请手动复制！")
      }
      document.body.removeChild(textArea);
    }

    copy = function (text) {
      createTextArea(text);
      selectText();
      copyToClipboard();
    };

    return {
      copy: copy
    };
  })(window, document, navigator);

  function copyCode(e) {
    if (e.srcElement.tagName === 'SPAN' && e.srcElement.classList.contains('copy-code')) {
      let code = e.currentTarget.querySelector('code');
      var text = code.innerText;
      if (e.srcElement.textContent === '复制成功') {
        return;
      }
      e.srcElement.textContent = '复制成功';
      (function (elem) {
        setTimeout(() => {
          if (elem.textContent === '复制成功') {
            elem.textContent = '复制代码'
          }
        }, 1000);
      })(e.srcElement)
      Clipboard.copy(text);
    }
  }

  let pres = document.querySelectorAll('pre');
  pres.forEach(pre => {
    let code = pre.querySelector('code');
    let copyElem = document.createElement('span');
    copyElem.classList.add('copy-code');
    copyElem.textContent = '复制代码';
    pre.appendChild(copyElem);
    pre.onclick = copyCode
  })

</script>
<script src="/media/js/motion.js" type="text/javascript"></script>
<script src="https://fastly.jsdelivr.net/gh/cferdinandi/smooth-scroll/dist/smooth-scroll.polyfills.min.js" type="text/javascript"></script>
<script type="text/javascript">
    var scroll = new SmoothScroll('a[href*="#"]', {
      speed: 200
    });
  </script>
</body>