200 OK is a standard successful HTTP server response. It means that the client’s request (e.g., from a browser) was successfully processed, and the server is delivering the requested data.
The user receives content without errors, and the page or application functions properly. If Code 200 is accompanied by data, the browser or program processes and displays it to the user.
GET / HTTP/1.1 Host: go0x.com Accept: */* User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
<!DOCTYPE html> <html class="theme-next mist use-motion" lang="zh-Hans"> <head> <meta charset="UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/> <meta name="theme-color" content="#222"> <meta http-equiv="Cache-Control" content="no-transform" /> <meta http-equiv="Cache-Control" content="no-siteapp" /> <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" /> <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css"> <link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" /> <link href="/css/main.css?v=5.1.2" rel="stylesheet" type="text/css" /> <meta name="keywords" content="Hexo, NexT" /> <link rel="alternate" href="/atom.xml" title="烂橘子 - go0x.com" type="application/atom+xml" /> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.1.2" /> <meta name="description" content="专注于技术,享受编程带来的快乐"> <meta property="og:type" content="website"> <meta property="og:title" content="烂橘子 - go0x.com"> <meta property="og:url" content="http://go0x.com/index.html"> <meta property="og:site_name" content="烂橘子 - go0x.com"> <meta property="og:description" content="专注于技术,享受编程带来的快乐"> <meta property="og:locale" content="zh-Hans"> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="烂橘子 - go0x.com"> <meta name="twitter:description" content="专注于技术,享受编程带来的快乐"> <script type="text/javascript" id="hexo.configurations"> var NexT = window.NexT || {}; var CONFIG = { root: '/', scheme: 'Mist', sidebar: {"position":"left","display":"post","offset":12,"offset_float":12,"b2t":false,"scrollpercent":false,"onmobile":false}, fancybox: true, tabs: true, motion: true, duoshuo: { userId: '0', author: '博主' }, algolia: { applicationID: '', apiKey: '', indexName: '', hits: {"per_page":10}, labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"} } }; </script> <link rel="canonical" href="http://go0x.com/"/> <title>烂橘子 - go0x.com</title> <script type="text/javascript"> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?819d6814f8470b2aba6ed162aac6bef3"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </head> <body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans"> <div class="container sidebar-position-left page-home "> <div class="headband"></div> <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader"> <div class="header-inner"><div class="site-brand-wrapper"> <div class="site-meta "> <div class="custom-logo-site-title"> <a href="/" class="brand" rel="start"> <span class="logo-line-before"><i></i></span> <span class="site-title">烂橘子 - go0x.com</span> <span class="logo-line-after"><i></i></span> </a> </div> <p class="site-subtitle">ZERO to ONE</p> </div> <div class="site-nav-toggle"> <button> <span class="btn-bar"></span> <span class="btn-bar"></span> <span class="btn-bar"></span> </button> </div> </div> <nav class="site-nav"> <ul id="menu" class="menu"> <li class="menu-item menu-item-home"> <a href="/" rel="section"> <i class="menu-item-icon fa fa-fw fa-home"></i> <br /> 首页 </a> </li> <li class="menu-item menu-item-categories"> <a href="/categories/" rel="section"> <i class="menu-item-icon fa fa-fw fa-th"></i> <br /> 分类 </a> </li> <li class="menu-item menu-item-archives"> <a href="/archives/" rel="section"> <i class="menu-item-icon fa fa-fw fa-archive"></i> <br /> 归档 </a> </li> <li class="menu-item menu-item-tags"> <a href="/tags/" rel="section"> <i class="menu-item-icon fa fa-fw fa-tags"></i> <br /> 标签 </a> </li> <li class="menu-item menu-item-about"> <a href="/about/" rel="section"> <i class="menu-item-icon fa fa-fw fa-user"></i> <br /> 关于 </a> </li> <li class="menu-item menu-item-search"> <a href="javascript:;" class="popup-trigger"> <i class="menu-item-icon fa fa-search fa-fw"></i> <br /> 搜索 </a> </li> </ul> <div class="site-search"> <div class="popup search-popup local-search-popup"> <div class="local-search-header clearfix"> <span class="search-icon"> <i class="fa fa-search"></i> </span> <span class="popup-btn-close"> <i class="fa fa-times-circle"></i> </span> <div class="local-search-input-wrapper"> <input autocomplete="off" placeholder="搜索..." spellcheck="false" type="text" id="local-search-input"> </div> </div> <div id="local-search-result"></div> </div> </div> </nav> </div> </header> <main id="main" class="main"> <div class="main-inner"> <div class="content-wrap"> <div id="content" class="content"> <section id="posts" class="posts-expand"> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://go0x.com/posts/73ea24f2/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="Rotten Orange"> <meta itemprop="description" content=""> <meta itemprop="image" content="/images/avatar.jpg"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="烂橘子 - go0x.com"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/posts/73ea24f2/" itemprop="url">利用rip寄存器实现循环</a></h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建于" itemprop="dateCreated datePublished" datetime="2019-12-24T13:30:01+08:00"> 2019-12-24 </time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/posts/73ea24f2/#comments" itemprop="discussionUrl"> <span class="post-comments-count disqus-comment-count" data-disqus-identifier="posts/73ea24f2/" itemprop="commentCount"></span> </a> </span> <span id="/posts/73ea24f2/" class="leancloud_visitors" data-flag-title="利用rip寄存器实现循环"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-eye"></i> </span> <span class="post-meta-item-text">阅读次数 </span> <span class="leancloud-visitors-count"></span> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>想要循环调用一个函数,其实有很多种方法,除了以下常见实现方式(for ,while),还可以通过修改rip寄存器来实现循环,文章末尾会介绍具体的案例。</p> <h2 id="常见循环实现"><a href="#常见循环实现" class="headerlink" title="常见循环实现"></a>常见循环实现</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 1. for</span></span><br><span class="line"><span class="keyword">for</span> (;;) {</span><br><span class="line"> loop();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 2. while</span></span><br><span class="line"><span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> loop();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 3. do while</span></span><br><span class="line"><span class="keyword">do</span> {</span><br><span class="line"> loop();</span><br><span class="line">} <span class="keyword">while</span> (<span class="literal">true</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 4. goto</span></span><br><span class="line">label:</span><br><span class="line"> loop();</span><br><span class="line"> <span class="keyword">goto</span> label;</span><br></pre></td></tr></table></figure> <h2 id="rip实现循环"><a href="#rip实现循环" class="headerlink" title="rip实现循环"></a>rip实现循环</h2><p>先来看一段代码</p> <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// loop.c</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">loop</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">long</span> i = <span class="number">111</span>;</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"in loop: %p\n"</span>, &i);</span><br><span class="line"> <span class="comment">// 关键代码</span></span><br><span class="line"> *(&i+<span class="number">2</span>) -= <span class="number">5</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span>* argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">long</span> i = <span class="number">110</span>;</span><br><span class="line"> loop();</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"before loop: %p\n"</span>, &i);</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure> <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></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 执行</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> clang loop.c</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> ./a.out</span></span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">in loop: 0x7ffee225f848</span><br><span class="line">^C</span><br></pre></td></tr></table></figure> <p>为什么会出现这种效果?让我们先了解一下程序的执行过程。</p> <h3 id="运行时栈"><a href="#运行时栈" class="headerlink" title="运行时栈"></a>运行时栈</h3><p>main函数中调用loop,调用堆栈如下图所示:<br><img src="https://i.loli.net/2019/12/24/Orp843FZzL5yIoY.jpg" alt="stack _1_.jpg"><br>在main函数的栈帧中可以看到,会将loop函数(例子中没有参数)参数入栈,随后保存PC(即main中printf的地址)。通过call指令实现将PC值push到栈中,并将PC设置为loop函数的地址。loop执行后调用ret指令,从栈中保存的返回地址恢复到PC中,从而main函数继续执行。</p> <blockquote> <p>PC (program counter), 程序计数器,在x86-64中,用%rip寄存器表示。<br>The instruction pointer register points to the memory address which the processor will next attempt to execute.</p> </blockquote> <h3 id="反汇编"><a href="#反汇编" class="headerlink" title="反汇编"></a>反汇编</h3><p>现在我们大致了解了程序执行时栈的变化过程,要想实现loop函数循环,只要将saved PC在栈中的值改为loop()这条指令的地址。接下来,让我们看看a.out的关键部分的反汇编代码。</p> <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"><span class="meta">#</span><span class="bash"> objdump反汇编a.out</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> objdump -D a.out > a.obj</span></span><br></pre></td></tr></table></figure> <p><img src="https://i.loli.net/2019/12/24/FD198mlPCnTcBjS.png" alt="反汇编.png"></p> <p>27行汇编 callq调用loop的时候,会将下一条指令(leaq)的地址写入栈中,同时将PC设置为loop的地址,实现调用loop的效果,callq和leaq的地址相差5,在loop函数中,我们可以通过变量i来寻找saved PC的在栈中的地址,从来达到loop返回后,继续执行loop的效果。</p> <figure class="highlight c"><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"># &i+<span class="number">2</span>是saved PC的地址</span><br><span class="line"># 只要将栈中的数据改为callq的地址即可</span><br><span class="line">*(&i+<span class="number">2</span>) -= <span class="number">5</span>;</span><br></pre></td></tr></table></figure> <h2 id="案例-go-defer实现"><a href="#案例-go-defer实现" class="headerlink" title="案例-go defer实现"></a>案例-go defer实现</h2><p>在函数ret之前,调用deferreturn,deferreturn会循环调用,检查defer函数是否全部调用完成。</p> <figure class="highlight c"><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></pre></td><td class="code"><pre><span class="line">runtime.jmpdefer:</span><br><span class="line"> <span class="number">104f</span>890: <span class="number">48</span> <span class="number">8b</span> <span class="number">54</span> <span class="number">24</span> <span class="number">08</span> movq <span class="number">8</span>(%rsp), %rdx</span><br><span class="line"> <span class="number">104f</span>895: <span class="number">48</span> <span class="number">8b</span> <span class="number">5</span>c <span class="number">24</span> <span class="number">10</span> movq <span class="number">16</span>(%rsp), %rbx</span><br><span class="line"> <span class="number">104f</span>89a: <span class="number">48</span> <span class="number">8</span>d <span class="number">63</span> f8 leaq <span class="number">-8</span>(%rbx), %rsp</span><br><span class="line"> <span class="number">104f</span>89e: <span class="number">48</span> <span class="number">8b</span> <span class="number">6</span>c <span class="number">24</span> f8 movq <span class="number">-8</span>(%rsp), %rbp</span><br><span class="line"> <span class="number">104f</span>8a3: <span class="number">48</span> <span class="number">83</span> <span class="number">2</span>c <span class="number">24</span> <span class="number">05</span> subq $<span class="number">5</span>, (%rsp) <span class="comment">// 修改saved PC</span></span><br><span class="line"> 104f8a8: 48 8b 1a movq (%rdx), %rbx</span><br><span class="line"> <span class="number">104f</span>8ab: ff e3 jmpq *%rbx</span><br><span class="line"> <span class="number">104f</span>8ad: cc int3</span><br><span class="line"> <span class="number">104f</span>8ae: cc int3</span><br><span class="line"> <span class="number">104f</span>8af: cc int3</span><br><span class="line"></span><br><span class="line">runtime.deferreturn:</span><br><span class="line"> <span class="number">10264</span>a0: <span class="number">48</span> <span class="number">83</span> ec <span class="number">48</span> subq $<span class="number">72</span>, %rsp</span><br><span class="line"> <span class="number">10264</span>a4: <span class="number">48</span> <span class="number">89</span> <span class="number">6</span>c <span class="number">24</span> <span class="number">40</span> movq %rbp, <span class="number">64</span>(%rsp)</span><br><span class="line"> <span class="number">10264</span>a9: <span class="number">48</span> <span class="number">8</span>d <span class="number">6</span>c <span class="number">24</span> <span class="number">40</span> leaq <span class="number">64</span>(%rsp), %rbp</span><br><span class="line"> <span class="number">10264</span>ae: <span class="number">65</span> <span class="number">48</span> <span class="number">8b</span> <span class="number">04</span> <span class="number">25</span> a0 <span class="number">08</span> <span class="number">00</span> <span class="number">00</span> movq %gs:<span class="number">2208</span>, %rax</span><br><span class="line"> <span class="number">10264b</span>7: <span class="number">48</span> <span class="number">8b</span> <span class="number">48</span> <span class="number">28</span> movq <span class="number">40</span>(%rax), %rcx</span><br><span class="line"> ...</span><br><span class="line"> <span class="number">1026534</span>: <span class="number">48</span> <span class="number">8</span>d <span class="number">44</span> <span class="number">24</span> <span class="number">50</span> leaq <span class="number">80</span>(%rsp), %rax</span><br><span class="line"> <span class="number">1026539</span>: <span class="number">48</span> <span class="number">89</span> <span class="number">44</span> <span class="number">24</span> <span class="number">38</span> movq %rax, <span class="number">56</span>(%rsp)</span><br><span class="line"> <span class="number">102653</span>e: <span class="number">48</span> <span class="number">8b</span> <span class="number">44</span> <span class="number">24</span> <span class="number">20</span> movq <span class="number">32</span>(%rsp), %rax</span><br><span class="line"> <span class="number">1026543</span>: <span class="number">48</span> <span class="number">89</span> <span class="number">04</span> <span class="number">24</span> movq %rax, (%rsp)</span><br><span class="line"> <span class="number">1026547</span>: <span class="number">48</span> <span class="number">8b</span> <span class="number">44</span> <span class="number">24</span> <span class="number">38</span> movq <span class="number">56</span>(%rsp), %rax</span><br><span class="line"> <span class="number">102654</span>c: <span class="number">48</span> <span class="number">89</span> <span class="number">44</span> <span class="number">24</span> <span class="number">08</span> movq %rax, <span class="number">8</span>(%rsp)</span><br><span class="line"> <span class="number">1026551</span>: e8 <span class="number">3</span>a <span class="number">93</span> <span class="number">02</span> <span class="number">00</span> callq <span class="number">168762</span> <runtime.jmpdefer></span><br><span class="line"> <span class="number">1026556</span>: <span class="number">48</span> <span class="number">8b</span> <span class="number">6</span>c <span class="number">24</span> <span class="number">40</span> movq <span class="number">64</span>(%rsp), %rbp</span><br><span class="line"> <span class="number">102655b</span>: <span class="number">48</span> <span class="number">83</span> c4 <span class="number">48</span> addq $<span class="number">72</span>, %rsp</span><br><span class="line"> <span class="number">102655f</span>: c3 retq</span><br><span class="line"> ...</span><br></pre></td></tr></table></figure> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://go0x.com/posts/7f6b281c/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="Rotten Orange"> <meta itemprop="description" content=""> <meta itemprop="image" content="/images/avatar.jpg"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="烂橘子 - go0x.com"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/posts/7f6b281c/" itemprop="url">go get代理</a></h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建于" itemprop="dateCreated datePublished" datetime="2018-11-27T18:08:04+08:00"> 2018-11-27 </time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/posts/7f6b281c/#comments" itemprop="discussionUrl"> <span class="post-comments-count disqus-comment-count" data-disqus-identifier="posts/7f6b281c/" itemprop="commentCount"></span> </a> </span> <span id="/posts/7f6b281c/" class="leancloud_visitors" data-flag-title="go get代理"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-eye"></i> </span> <span class="post-meta-item-text">阅读次数 </span> <span class="leancloud-visitors-count"></span> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>平时在用go get命令下载依赖时,经常会遇到类似</p> <blockquote> <p>package google.golang.org/grpc/encoding/gzip: unrecognized import path “google.golang.org/grpc/encoding/gzip” (https fetch: Get <a href="https://google.golang.org/grpc/encoding/gzip?go-get=1" target="_blank" rel="external">https://google.golang.org/grpc/encoding/gzip?go-get=1</a>: dial tcp 216.239.37.1:443: i/o timeout)</p> </blockquote> <p>的问题,其实是这些资源被墙,所幸的是有很多使用代理的方式解决了这个问题。</p> <p>以<em>google.golang.org/grpc/encoding/gzip</em>为例:</p> <h2 id="设置git代理"><a href="#设置git代理" class="headerlink" title="设置git代理"></a>设置git代理</h2><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"><span class="meta">$</span><span class="bash"> git config [--global] http.proxy http://proxy.example.com:port</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> go get <span class="string">"google.golang.org/grpc/encoding/gzip"</span></span></span><br></pre></td></tr></table></figure> <h2 id="shell环境变量"><a href="#shell环境变量" class="headerlink" title="shell环境变量"></a>shell环境变量</h2><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"><span class="meta">#</span><span class="bash"> socks</span></span><br><span class="line">http_proxy=socks5://127.0.0.1:1080 go get "google.golang.org/grpc/encoding/zip"</span><br><span class="line"><span class="meta">#</span><span class="bash"> http</span></span><br><span class="line">http_proxy=http://127.0.0.1:1080 go get "google.golang.org/grpc/encoding/gzip"</span><br></pre></td></tr></table></figure> <h2 id="VPN"><a href="#VPN" class="headerlink" title="VPN"></a>VPN</h2><p>那就直接<em>go get “google.golang.org/grpc/encoding/gzip”</em>吧</p> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://go0x.com/posts/24287160/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="Rotten Orange"> <meta itemprop="description" content=""> <meta itemprop="image" content="/images/avatar.jpg"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="烂橘子 - go0x.com"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/posts/24287160/" itemprop="url">佛祖包邮,永无BUG</a></h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建于" itemprop="dateCreated datePublished" datetime="2018-01-10T20:02:04+08:00"> 2018-01-10 </time> </span> <span class="post-category" > <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-folder-o"></i> </span> <span class="post-meta-item-text">分类于</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"> <a href="/categories/Linux-Unix/" itemprop="url" rel="index"> <span itemprop="name">Linux/Unix</span> </a> </span> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/posts/24287160/#comments" itemprop="discussionUrl"> <span class="post-comments-count disqus-comment-count" data-disqus-identifier="posts/24287160/" itemprop="commentCount"></span> </a> </span> <span id="/posts/24287160/" class="leancloud_visitors" data-flag-title="佛祖包邮,永无BUG"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-eye"></i> </span> <span class="post-meta-item-text">阅读次数 </span> <span class="leancloud-visitors-count"></span> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>在知乎闲逛时看到某回答中有个”<strong>佛祖保佑,永无BUG</strong>“的注释,便想着何不在登陆linux时可以显示出来,并且加上金光闪闪的颜色。</p> <p>修改/etc/motd文件,加入如下内容:</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></pre></td><td class="code"><pre><span class="line">^[[1;33m[1;01m[1;05m</span><br><span class="line"> _ooOoo_</span><br><span class="line"> o8888888o</span><br><span class="line"> 88" . "88</span><br><span class="line"> (| -_- |)</span><br><span class="line"> O\ = /O</span><br><span class="line"> ____/`---'\____</span><br><span class="line"> .' \\| |// `.</span><br><span class="line"> / \\||| : |||// \</span><br><span class="line"> / _||||| -:- |||||- \</span><br><span class="line"> | | \\\ - /// | |</span><br><span class="line"> | \_| ''\---/'' | |</span><br><span class="line"> \ .-\__ `-` ___/-. /</span><br><span class="line"> ___`. .' /--.--\ `. . __</span><br><span class="line"> ."" '< `.___\_<|>_/___.' >'"".</span><br><span class="line"> | | : `- \`.;`\ _ /`;.`/ - ` : | |</span><br><span class="line"> \ \ `-. \_ __\ /__ _/ .-` / /</span><br><span class="line"> ======`-.____`-.___\_____/___.-`____.-'======</span><br><span class="line"> `=---='</span><br><span class="line"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</span><br><span class="line"> 佛祖保佑 永无BUG</span><br><span class="line"> 佛曰:</span><br><span class="line"> 写字楼里写字间,写字间里程序员;</span><br><span class="line"> 程序人员写程序,又拿程序换酒钱。</span><br><span class="line"> 酒醒只在网上坐,酒醉还来网下眠;</span><br><span class="line"> 酒醉酒醒日复日,网上网下年复年。</span><br><span class="line"> 但愿老死电脑间,不愿鞠躬老板前;</span><br><span class="line"> 奔驰宝马贵者趣,公交自行程序员。</span><br><span class="line"> 别人笑我忒疯癫,我笑自己命太贱;</span><br><span class="line"> 不见满街漂亮妹,哪个归得程序员?</span><br><span class="line">^[[1;0m</span><br></pre></td></tr></table></figure> <p>效果图:<br><img src="http://p2dvxr53o.bkt.clouddn.com/fozubaoyou.gif" alt="fozubaoyou"></p> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://go0x.com/posts/4a17b156/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="Rotten Orange"> <meta itemprop="description" content=""> <meta itemprop="image" content="/images/avatar.jpg"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="烂橘子 - go0x.com"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/posts/4a17b156/" itemprop="url">Hello World</a></h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建于" itemprop="dateCreated datePublished" datetime="2017-11-15T20:05:56+08:00"> 2017-11-15 </time> </span> <span class="post-category" > <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-folder-o"></i> </span> <span class="post-meta-item-text">分类于</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"> <a href="/categories/我的杂谈/" itemprop="url" rel="index"> <span itemprop="name">我的杂谈</span> </a> </span> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/posts/4a17b156/#comments" itemprop="discussionUrl"> <span class="post-comments-count disqus-comment-count" data-disqus-identifier="posts/4a17b156/" itemprop="commentCount"></span> </a> </span> <span id="/posts/4a17b156/" class="leancloud_visitors" data-flag-title="Hello World"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-eye"></i> </span> <span class="post-meta-item-text">阅读次数 </span> <span class="leancloud-visitors-count"></span> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>Welcome to <a href="https://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="external">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="external">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="external">GitHub</a>.</p> <h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><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">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure> <p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="external">Writing</a></p> <h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><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">$ hexo server</span><br></pre></td></tr></table></figure> <p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="external">Server</a></p> <h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><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">$ hexo generate</span><br></pre></td></tr></table></figure> <p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="external">Generating</a></p> <h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><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">$ hexo deploy</span><br></pre></td></tr></table></figure> <p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="external">Deployment</a></p> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> </section> </div> </div> <div class="sidebar-toggle"> <div class="sidebar-toggle-line-wrap"> <span class="sidebar-toggle-line sidebar-toggle-line-first"></span> <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span> <span class="sidebar-toggle-line sidebar-toggle-line-last"></span> </div> </div> <aside id="sidebar" class="sidebar"> <div class="sidebar-inner"> <section class="site-overview sidebar-panel sidebar-panel-active"> <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person"> <img class="site-author-image" itemprop="image" src="/images/avatar.jpg" alt="Rotten Orange" /> <p class="site-author-name" itemprop="name">Rotten Orange</p> <p class="site-description motion-element" itemprop="description">专注于技术,享受编程带来的快乐</p> </div> <nav class="site-state motion-element"> <div class="site-state-item site-state-posts"> <a href="/archives/"> <span class="site-state-item-count">4</span> <span class="site-state-item-name">日志</span> </a> </div> <div class="site-state-item site-state-categories"> <a href="/categories/index.html"> <span class="site-state-item-count">2</span> <span class="site-state-item-name">分类</span> </a> </div> <div class="site-state-item site-state-tags"> <a href="/tags/index.html"> <span class="site-state-item-count">5</span> <span class="site-state-item-name">标签</span> </a> </div> </nav> <div class="feed-link motion-element"> <a href="/atom.xml" rel="alternate"> <i class="fa fa-rss"></i> RSS </a> </div> <div class="links-of-author motion-element"> <span class="links-of-author-item"> <a href="https://github.com/mosqd" target="_blank" title="GitHub"> <i class="fa fa-fw fa-github"></i> GitHub </a> </span> </div> <div class="links-of-blogroll motion-element links-of-blogroll-inline"> <div class="links-of-blogroll-title"> <i class="fa fa-fw fa-globe"></i> 友情链接 </div> <ul class="links-of-blogroll-list"> <li class="links-of-blogroll-item"> <a href="https://coolshell.cn/" title="coolshell" target="_blank">coolshell</a> </li> <li class="links-of-blogroll-item"> <a href="http://mindhacks.cn/" title="刘未鹏" target="_blank">刘未鹏</a> </li> <li class="links-of-blogroll-item"> <a href="http://nicksxs.me/" title="nicksxs" target="_blank">nicksxs</a> </li> </ul> </div> </section> </div> </aside> </div> </main> <footer id="footer" class="footer"> <div class="footer-inner"> <div class="copyright" > © <span itemprop="copyrightYear">2021</span> <span class="with-love"> <i class="fa fa-heart"></i> </span> <span class="author" itemprop="copyrightHolder">Rotten Orange</span> </div> <div class="powered-by"> 由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动 </div> <div class="theme-info"> 主题 - <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next"> NexT.Mist </a> </div> </div> </footer> <div class="back-to-top"> <i class="fa fa-arrow-up"></i> </div> </div> <script type="text/javascript"> if (Object.prototype.toString.call(window.Promise) !== '[object Function]') { window.Promise = null; } </script> <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script> <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script> <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script> <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script> <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script> <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script> <script type="text/javascript" src="/js/src/utils.js?v=5.1.2"></script> <script type="text/javascript" src="/js/src/motion.js?v=5.1.2"></script> <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.2"></script> <script type="text/javascript" src="/js/src/post-details.js?v=5.1.2"></script> <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.2"></script> <script id="dsq-count-scr" src="https://rorange.disqus.com/count.js" async></script> <script type="text/javascript"> // Popup Window; var isfetched = false; var isXml = true; // Search DB path; var search_path = "search.xml"; if (search_path.length === 0) { search_path = "search.xml"; } else if (/json$/i.test(search_path)) { isXml = false; } var path = "/" + search_path; // monitor main search box; var onPopupClose = function (e) { $('.popup').hide(); $('#local-search-input').val(''); $('.search-result-list').remove(); $('#no-result').remove(); $(".local-search-pop-overlay").remove(); $('body').css('overflow', ''); } function proceedsearch() { $("body") .append('<div class="search-popup-overlay local-search-pop-overlay"></div>') .css('overflow', 'hidden'); $('.search-popup-overlay').click(onPopupClose); $('.popup').toggle(); var $localSearchInput = $('#local-search-input'); $localSearchInput.attr("autocapitalize", "none"); $localSearchInput.attr("autocorrect", "off"); $localSearchInput.focus(); } // search function; var searchFunc = function(path, search_id, content_id) { 'use strict'; // start loading animation $("body") .append('<div class="search-popup-overlay local-search-pop-overlay">' + '<div id="search-loading-icon">' + '<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' + '</div>' + '</div>') .css('overflow', 'hidden'); $("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center'); $.ajax({ url: path, dataType: isXml ? "xml" : "json", async: true, success: function(res) { // get the contents from search data isfetched = true; $('.popup').detach().appendTo('.header-inner'); var datas = isXml ? $("entry", res).map(function() { return { title: $("title", this).text(), content: $("content",this).text(), url: $("url" , this).text() }; }).get() : res; var input = document.getElementById(search_id); var resultContent = document.getElementById(content_id); var inputEventFunction = function() { var searchText = input.value.trim().toLowerCase(); var keywords = searchText.split(/[\s\-]+/); if (keywords.length > 1) { keywords.push(searchText); } var resultItems = []; if (searchText.length > 0) { // perform local searching datas.forEach(function(data) { var isMatch = false; var hitCount = 0; var searchTextCount = 0; var title = data.title.trim(); var titleInLowerCase = title.toLowerCase(); var content = data.content.trim().replace(/<[^>]+>/g,""); var contentInLowerCase = content.toLowerCase(); var articleUrl = decodeURIComponent(data.url); var indexOfTitle = []; var indexOfContent = []; // only match articles with not empty titles if(title != '') { keywords.forEach(function(keyword) { function getIndexByWord(word, text, caseSensitive) { var wordLen = word.length; if (wordLen === 0) { return []; } var startPosition = 0, position = [], index = []; if (!caseSensitive) { text = text.toLowerCase(); word = word.toLowerCase(); } while ((position = text.indexOf(word, startPosition)) > -1) { index.push({position: position, word: word}); startPosition = position + wordLen; } return index; } indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false)); indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false)); }); if (indexOfTitle.length > 0 || indexOfContent.length > 0) { isMatch = true; hitCount = indexOfTitle.length + indexOfContent.length; } } // show search results if (isMatch) { // sort index by position of keyword [indexOfTitle, indexOfContent].forEach(function (index) { index.sort(function (itemLeft, itemRight) { if (itemRight.position !== itemLeft.position) { return itemRight.position - itemLeft.position; } else { return itemLeft.word.length - itemRight.word.length; } }); }); // merge hits into slices function mergeIntoSlice(text, start, end, index) { var item = index[index.length - 1]; var position = item.position; var word = item.word; var hits = []; var searchTextCountInSlice = 0; while (position + word.length <= end && index.length != 0) { if (word === searchText) { searchTextCountInSlice++; } hits.push({position: position, length: word.length}); var wordEnd = position + word.length; // move to next position of hit index.pop(); while (index.length != 0) { item = index[index.length - 1]; position = item.position; word = item.word; if (wordEnd > position) { index.pop(); } else { break; } } } searchTextCount += searchTextCountInSlice; return { hits: hits, start: start, end: end, searchTextCount: searchTextCountInSlice }; } var slicesOfTitle = []; if (indexOfTitle.length != 0) { slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle)); } var slicesOfContent = []; while (indexOfContent.length != 0) { var item = indexOfContent[indexOfContent.length - 1]; var position = item.position; var word = item.word; // cut out 100 characters var start = position - 20; var end = position + 80; if(start < 0){ start = 0; } if (end < position + word.length) { end = position + word.length; } if(end > content.length){ end = content.length; } slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent)); } // sort slices in content by search text's count and hits' count slicesOfContent.sort(function (sliceLeft, sliceRight) { if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) { return sliceRight.searchTextCount - sliceLeft.searchTextCount; } else if (sliceLeft.hits.length !== sliceRight.hits.length) { return sliceRight.hits.length - sliceLeft.hits.length; } else { return sliceLeft.start - sliceRight.start; } }); // select top N slices in content var upperBound = parseInt('1'); if (upperBound >= 0) { slicesOfContent = slicesOfContent.slice(0, upperBound); } // highlight title and content function highlightKeyword(text, slice) { var result = ''; var prevEnd = slice.start; slice.hits.forEach(function (hit) { result += text.substring(prevEnd, hit.position); var end = hit.position + hit.length; result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>'; prevEnd = end; }); result += text.substring(prevEnd, slice.end); return result; } var resultItem = ''; if (slicesOfTitle.length != 0) { resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>"; } else { resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>"; } slicesOfContent.forEach(function (slice) { resultItem += "<a href='" + articleUrl + "'>" + "<p class=\"search-result\">" + highlightKeyword(content, slice) + "...</p>" + "</a>"; }); resultItem += "</li>"; resultItems.push({ item: resultItem, searchTextCount: searchTextCount, hitCount: hitCount, id: resultItems.length }); } }) }; if (keywords.length === 1 && keywords[0] === "") { resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>' } else if (resultItems.length === 0) { resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>' } else { resultItems.sort(function (resultLeft, resultRight) { if (resultLeft.searchTextCount !== resultRight.searchTextCount) { return resultRight.searchTextCount - resultLeft.searchTextCount; } else if (resultLeft.hitCount !== resultRight.hitCount) { return resultRight.hitCount - resultLeft.hitCount; } else { return resultRight.id - resultLeft.id; } }); var searchResultList = '<ul class=\"search-result-list\">'; resultItems.forEach(function (result) { searchResultList += result.item; }) searchResultList += "</ul>"; resultContent.innerHTML = searchResultList; } } if ('auto' === 'auto') { input.addEventListener('input', inputEventFunction); } else { $('.search-icon').click(inputEventFunction); input.addEventListener('keypress', function (event) { if (event.keyCode === 13) { inputEventFunction(); } }); } // remove loading animation $(".local-search-pop-overlay").remove(); $('body').css('overflow', ''); proceedsearch(); } }); } // handle and trigger popup window; $('.popup-trigger').click(function(e) { e.stopPropagation(); if (isfetched === false) { searchFunc(path, 'local-search-input', 'local-search-result'); } else { proceedsearch(); }; }); $('.popup-btn-close').click(onPopupClose); $('.popup').click(function(e){ e.stopPropagation(); }); $(document).on('keyup', function (event) { var shouldDismissSearchPopup = event.which === 27 && $('.search-popup').is(':visible'); if (shouldDismissSearchPopup) { onPopupClose(); } }); </script> <script src="https://cdn1.lncld.net/static/js/av-core-mini-0.6.4.js"></script> <script>AV.initialize("rWbiTXM1MYp1GbHl8Ev3jclR-gzGzoHsz", "mD63QNYhx0zL1D6XDvt7LKWX");</script> <script> function showTime(Counter) { var query = new AV.Query(Counter); var entries = []; var $visitors = $(".leancloud_visitors"); $visitors.each(function () { entries.push( $(this).attr("id").trim() ); }); query.containedIn('url', entries); query.find() .done(function (results) { var COUNT_CONTAINER_REF = '.leancloud-visitors-count'; if (results.length === 0) { $visitors.find(COUNT_CONTAINER_REF).text(0); return; } for (var i = 0; i < results.length; i++) { var item = results[i]; var url = item.get('url'); var time = item.get('time'); var element = document.getElementById(url); $(element).find(COUNT_CONTAINER_REF).text(time); } for(var i = 0; i < entries.length; i++) { var url = entries[i]; var element = document.getElementById(url); var countSpan = $(element).find(COUNT_CONTAINER_REF); if( countSpan.text() == '') { countSpan.text(0); } } }) .fail(function (object, error) { console.log("Error: " + error.code + " " + error.message); }); } function addCount(Counter) { var $visitors = $(".leancloud_visitors"); var url = $visitors.attr('id').trim(); var title = $visitors.attr('data-flag-title').trim(); var query = new AV.Query(Counter); query.equalTo("url", url); query.find({ success: function(results) { if (results.length > 0) { var counter = results[0]; counter.fetchWhenSave(true); counter.increment("time"); counter.save(null, { success: function(counter) { var $element = $(document.getElementById(url)); $element.find('.leancloud-visitors-count').text(counter.get('time')); }, error: function(counter, error) { console.log('Failed to save Visitor num, with error message: ' + error.message); } }); } else { var newcounter = new Counter(); /* Set ACL */ var acl = new AV.ACL(); acl.setPublicReadAccess(true); acl.setPublicWriteAccess(true); newcounter.setACL(acl); /* End Set ACL */ newcounter.set("title", title); newcounter.set("url", url); newcounter.set("time", 1); newcounter.save(null, { success: function(newcounter) { var $element = $(document.getElementById(url)); $element.find('.leancloud-visitors-count').text(newcounter.get('time')); }, error: function(newcounter, error) { console.log('Failed to create'); } }); } }, error: function(error) { console.log('Error:' + error.code + " " + error.message); } }); } $(function() { var Counter = AV.Object.extend("Counter"); if ($('.leancloud_visitors').length == 1) { addCount(Counter); } else if ($('.post-title-link').length > 1) { showTime(Counter); } }); </script> </body> </html>