<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>逝殇_Vizard...</title>
  <subtitle>我以为人生很漫长,匆匆翻看,却再也无法逆转</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://yoursite.com/"/>
  <updated>2018-12-15T11:02:51.309Z</updated>
  <id>http://yoursite.com/</id>
  
  <author>
    <name>_Vizard战国</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>iOS 项目依赖</title>
    <link href="http://yoursite.com/2018/12/13/iOS-%E9%A1%B9%E7%9B%AE%E4%BE%9D%E8%B5%96/"/>
    <id>http://yoursite.com/2018/12/13/iOS-项目依赖/</id>
    <published>2018-12-13T05:52:01.000Z</published>
    <updated>2018-12-15T11:02:51.309Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://timgsa.baidu.com/timg?image&amp;quality=80&amp;size=b9999_10000&amp;sec=1544690808560&amp;di=e744ae0aab733f62617d7d255518996f&amp;imgtype=0&amp;src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farchive%2F272bbcff3895c247e43346431cdca7f4ceb10f3d.jpg" alt=""></p>
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>  前言总是废话的，说的一堆有的没的的，不过人生不就是这样吗，兜兜转转，磨磨唧唧；慢慢的得到，慢慢的失去；<br>  时常在想，如果还在杭州，没有换工作回来是一种怎么样的生活。原来我并不聪明，也不睿智。四年前的妖尾终结篇，而今重新开始；<br>  如果人生也能在想停的时候停一下，那多好。</p>
<h3 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h3><pre><code>一直想对自己的项目做依赖的设置，虽然这模式没什么卵用，但是在实际用到时候，眼睛看着舒服，心情就好
有什么比心情好更重要呢。所以还是做一下吧
已有项目名：Badminton
需要添加的工具类（就是做成被依赖方的&quot;小明&quot;）
</code></pre><h4 id="步骤："><a href="#步骤：" class="headerlink" title="步骤："></a>步骤：</h4><h5 id="1-在当前项目上-File-》new-》project，如下图"><a href="#1-在当前项目上-File-》new-》project，如下图" class="headerlink" title="1.在当前项目上 File-》new-》project，如下图"></a>1.在当前项目上 File-》new-》project，如下图</h5><p><img src="https://ws4.sinaimg.cn/large/006tNbRwgy1fy53870i14j30vg0ps7wh.jpg" alt=""></p>
<h5 id="2-选择-Cocoa-Touch-Static-Library"><a href="#2-选择-Cocoa-Touch-Static-Library" class="headerlink" title="2.选择 Cocoa Touch Static Library"></a>2.选择 Cocoa Touch Static Library</h5><p><img src="https://ws1.sinaimg.cn/large/006tNbRwgy1fy539an1lnj314k0t811f.jpg" alt=""></p>
<h5 id="3-然后填写项目名，这里用的是Tools，接着就下一步"><a href="#3-然后填写项目名，这里用的是Tools，接着就下一步" class="headerlink" title="3.然后填写项目名，这里用的是Tools，接着就下一步"></a>3.然后填写项目名，这里用的是Tools，接着就下一步</h5><p><img src="https://ws1.sinaimg.cn/large/006tNbRwgy1fy53c89ktxj30so0ekdgw.jpg" alt=""></p>
<h5 id="4-这时候注意了，这个就厉害了【把新建的这个-project-拖进到和主项目一个文件夹里，你懂我啥意思吧，不懂？看下图】"><a href="#4-这时候注意了，这个就厉害了【把新建的这个-project-拖进到和主项目一个文件夹里，你懂我啥意思吧，不懂？看下图】" class="headerlink" title="4.这时候注意了，这个就厉害了【把新建的这个 project 拖进到和主项目一个文件夹里，你懂我啥意思吧，不懂？看下图】"></a>4.这时候注意了，这个就厉害了【把新建的这个 project 拖进到和主项目一个文件夹里，你懂我啥意思吧，不懂？看下图】</h5><p><img src="https://ws4.sinaimg.cn/large/006tNbRwgy1fy53fkgxqzj30n40fwjtl.jpg" alt=""></p>
<h5 id="5-选择-addFile-to"><a href="#5-选择-addFile-to" class="headerlink" title="5.选择 addFile to"></a>5.选择 addFile to</h5><p><img src="https://ws4.sinaimg.cn/large/006tNbRwgy1fy53upedi4j30eu0qwkbw.jpg" alt=""></p>
<h5 id="6-选择xcodeproj"><a href="#6-选择xcodeproj" class="headerlink" title="6.选择xcodeproj"></a>6.选择xcodeproj</h5><p><img src="https://ws3.sinaimg.cn/large/006tNbRwgy1fy54b6oovzj30nq0dodhb.jpg" alt=""></p>
<h4 id="然后就这个鬼样子了"><a href="#然后就这个鬼样子了" class="headerlink" title="然后就这个鬼样子了"></a>然后就这个鬼样子了</h4><p><img src="https://ws2.sinaimg.cn/large/006tNbRwgy1fy542z0tshj30gs0o8wv9.jpg" alt=""></p>
<h4 id="还不够，接下来还有几步骤需要做："><a href="#还不够，接下来还有几步骤需要做：" class="headerlink" title="还不够，接下来还有几步骤需要做："></a>还不够，接下来还有几步骤需要做：</h4><pre><code>来到 build phase 里
</code></pre><p> <img src="https://ws2.sinaimg.cn/large/006tNbRwgy1fy544kewjqj30im0kwt9q.jpg" alt=""></p>
<h4 id="接着需要特别注意的来了"><a href="#接着需要特别注意的来了" class="headerlink" title="接着需要特别注意的来了"></a>接着需要特别注意的来了</h4><p><img src="https://ws4.sinaimg.cn/large/006tNbRwgy1fy546bmvdtj314e0u0anj.jpg" alt=""></p>
<h3 id="如果上面的都做对了那基本就成功了，这就是在现有的项目中设置依赖，进行拆分，让自己看上去爽的”项目依赖”"><a href="#如果上面的都做对了那基本就成功了，这就是在现有的项目中设置依赖，进行拆分，让自己看上去爽的”项目依赖”" class="headerlink" title="如果上面的都做对了那基本就成功了，这就是在现有的项目中设置依赖，进行拆分，让自己看上去爽的”项目依赖”"></a>如果上面的都做对了那基本就成功了，这就是在现有的项目中设置依赖，进行拆分，让自己看上去爽的”项目依赖”</h3>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;https://timgsa.baidu.com/timg?image&amp;amp;quality=80&amp;amp;size=b9999_10000&amp;amp;sec=1544690808560&amp;amp;di=e744ae0aab733f62617d7d2555
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>WX_small_app的反编译探究</title>
    <link href="http://yoursite.com/2018/09/05/WX-small-app%E7%9A%84%E5%8F%8D%E7%BC%96%E8%AF%91%E6%8E%A2%E7%A9%B6/"/>
    <id>http://yoursite.com/2018/09/05/WX-small-app的反编译探究/</id>
    <published>2018-09-05T09:28:17.000Z</published>
    <updated>2018-09-05T10:12:49.685Z</updated>
    
    <content type="html"><![CDATA[<h3 id="小甜甜开篇"><a href="#小甜甜开篇" class="headerlink" title="小甜甜开篇"></a>小甜甜开篇</h3><p><img src="https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=1202706137,1648700884&amp;fm=173&amp;app=25&amp;f=JPEG?w=611&amp;h=437&amp;s=3A81C203562A7315449D15BD03008024" alt=""></p>
<h4 id="最近想喊朋友一起搞-mac-的微信朋友圈，他说他在搞小程序，试试水；什么？小程序，不是16年就开始了吗，半死不拉活的还搞啊；"><a href="#最近想喊朋友一起搞-mac-的微信朋友圈，他说他在搞小程序，试试水；什么？小程序，不是16年就开始了吗，半死不拉活的还搞啊；" class="headerlink" title="最近想喊朋友一起搞 mac 的微信朋友圈，他说他在搞小程序，试试水；什么？小程序，不是16年就开始了吗，半死不拉活的还搞啊；"></a>最近想喊朋友一起搞 mac 的微信朋友圈，他说他在搞小程序，试试水；什么？小程序，不是16年就开始了吗，半死不拉活的还搞啊；</h4><h4 id="我这个人就喜欢和朋友一起搞事情，跟着朋友一起搞事情。想办法研究研究怎么反编译微信小程序；"><a href="#我这个人就喜欢和朋友一起搞事情，跟着朋友一起搞事情。想办法研究研究怎么反编译微信小程序；" class="headerlink" title="我这个人就喜欢和朋友一起搞事情，跟着朋友一起搞事情。想办法研究研究怎么反编译微信小程序；"></a>我这个人就喜欢和朋友一起搞事情，跟着朋友一起搞事情。想办法研究研究怎么反编译微信小程序；</h4><h4 id="想想办法，干她一炮。我们想仿写一个小程序的时候，前思后想，不如直接来份源码实在；其实小程序的文件是放在微信服务器上的，通过下载到手机上然后做一些不可描述的事情。"><a href="#想想办法，干她一炮。我们想仿写一个小程序的时候，前思后想，不如直接来份源码实在；其实小程序的文件是放在微信服务器上的，通过下载到手机上然后做一些不可描述的事情。" class="headerlink" title="想想办法，干她一炮。我们想仿写一个小程序的时候，前思后想，不如直接来份源码实在；其实小程序的文件是放在微信服务器上的，通过下载到手机上然后做一些不可描述的事情。"></a>想想办法，干她一炮。我们想仿写一个小程序的时候，前思后想，不如直接来份源码实在；其实小程序的文件是放在微信服务器上的，通过下载到手机上然后做一些不可描述的事情。</h4><h3 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h3><pre><code>node 运行环境，以前安装过的可以忽略
反编译的脚本-大神已写好（https://github.com/qwerty472123/wxappUnpacker）
Android 模拟器（mac 我用的是网易木木）
</code></pre><h3 id="详细步骤："><a href="#详细步骤：" class="headerlink" title="详细步骤："></a>详细步骤：</h3><p>微信小程序的格式就是: .wxapkg<br>.wxapkg是一个二进制文件，有其自己的一套结构。<br>使用模拟器下个微信，然后下个 re文件管理器，然后登陆之后搜一个小程序。<br>这里以12306为例子，搜完之后点击进入12306的小程序如下图：<br><img src="https://ws4.sinaimg.cn/large/006tNbRwgy1fuyt93i2h8j30ly178gw2.jpg" alt=""><br>好了，现在可以直接切回模拟器的桌面了，然后点击 RE 文件管理器。<br>这里需要知道wxapkg 存放的目录在哪：<br>/data/data/com.tencent.mm/MicroMsg/一串32位的16进制字符串文件夹/appbrand/pkg/<br>就抵达了目的文件夹</p>
<p><img src="https://ws1.sinaimg.cn/large/006tNbRwgy1fuytc8va5nj30ly178771.jpg" alt=""><br>上图是压缩过的，不然发送不到电脑上。<br>压缩之前的操作<br><img src="https://ws3.sinaimg.cn/large/006tNbRwgy1fuytdk3anuj30ly178jvg.jpg" alt=""><br>然后发送之<br><img src="https://ws2.sinaimg.cn/large/006tNbRwgy1fuytej4cyyj30ly178gqo.jpg" alt=""></p>
<h3 id="接下来厉害了，要反编译了，这里也是坑最多的地方"><a href="#接下来厉害了，要反编译了，这里也是坑最多的地方" class="headerlink" title="接下来厉害了，要反编译了，这里也是坑最多的地方"></a>接下来厉害了，要反编译了，这里也是坑最多的地方</h3><p>1.反编译的脚本，git clone xxx.git 到本地电脑上<br>2.npm install 安装依赖（提示，这里可能会有坑，怎么提示你就怎么搞就行，比如她让你三长一短你就 npm 满足她）<br>3.最后  你懂我啥意思吧</p>
<pre><code>vizard@VD-DragondeMacBook-Pro:~/WebstormProjects/nodejs-scr/wxappUnpacker$     node wuWxapkg.js /Users/vizard/Downloads/_-831339257_102.wxapkg
</code></pre><h3 id="最后-上图-像平常一样就可以了"><a href="#最后-上图-像平常一样就可以了" class="headerlink" title="最后 上图 像平常一样就可以了"></a>最后 上图 像平常一样就可以了</h3><p> <img src="https://ws2.sinaimg.cn/large/006tNbRwgy1fuytkmem60j30bw0hot9v.jpg" alt=""><br> <img src="https://ws2.sinaimg.cn/large/006tNbRwgy1fuytlhokokj30y80fc7ae.jpg" alt=""></p>
<h4 id="最后的最后，我想去成都找一个属于我的小甜甜"><a href="#最后的最后，我想去成都找一个属于我的小甜甜" class="headerlink" title="最后的最后，我想去成都找一个属于我的小甜甜"></a>最后的最后，我想去成都找一个属于我的小甜甜</h4><p><img src="https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=2201782222,3168036318&amp;fm=173&amp;app=25&amp;f=JPEG?w=274&amp;h=491&amp;s=C281F3075C13C3D836A9ED9E0300E001" alt=""></p>
]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;小甜甜开篇&quot;&gt;&lt;a href=&quot;#小甜甜开篇&quot; class=&quot;headerlink&quot; title=&quot;小甜甜开篇&quot;&gt;&lt;/a&gt;小甜甜开篇&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=12
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>学 vue 之前不来了解下 es6？</title>
    <link href="http://yoursite.com/2018/07/31/%E5%AD%A6-vue-%E4%B9%8B%E5%89%8D%E4%B8%8D%E6%9D%A5%E4%BA%86%E8%A7%A3%E4%B8%8B-es6%EF%BC%9F/"/>
    <id>http://yoursite.com/2018/07/31/学-vue-之前不来了解下-es6？/</id>
    <published>2018-07-31T01:35:57.000Z</published>
    <updated>2018-08-01T09:10:25.495Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://wx1.sinaimg.cn/mw690/72cd9985gy1ft9l8hv8k6j20qo103wlc.jpg" alt=""></p>
<h4 id="最近-vue-很火，是不是准备开始学习了？但是你会发现有一些语法不懂，这可咋整"><a href="#最近-vue-很火，是不是准备开始学习了？但是你会发现有一些语法不懂，这可咋整" class="headerlink" title="最近 vue 很火，是不是准备开始学习了？但是你会发现有一些语法不懂，这可咋整"></a>最近 vue 很火，是不是准备开始学习了？但是你会发现有一些语法不懂，这可咋整</h4><h4 id="别方丈，来看看吧。虽然-vue-的学习是平滑的但是是建立在你熟悉-es6语法的前提下"><a href="#别方丈，来看看吧。虽然-vue-的学习是平滑的但是是建立在你熟悉-es6语法的前提下" class="headerlink" title="别方丈，来看看吧。虽然 vue 的学习是平滑的但是是建立在你熟悉 es6语法的前提下"></a>别方丈，来看看吧。虽然 vue 的学习是平滑的但是是建立在你熟悉 es6语法的前提下</h4><h4 id="接下来我们就聊聊ES6那些可爱的新特性吧"><a href="#接下来我们就聊聊ES6那些可爱的新特性吧" class="headerlink" title="接下来我们就聊聊ES6那些可爱的新特性吧"></a>接下来我们就聊聊ES6那些可爱的新特性吧</h4><h3 id="1-变量声明const和let"><a href="#1-变量声明const和let" class="headerlink" title="1.变量声明const和let"></a>1.变量声明const和let</h3><p>在ES6之前，我们都是用var关键字声明变量。无论声明在何处，都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)。这就是<strong>函数变量提升</strong>例如:</p>
<pre><code> function aa() {
if(flag) {
    var test = &apos;hello man&apos;
} else {
    console.log(test)
}
}
</code></pre><p>以上的代码实际上是：</p>
<pre><code>function aa() {
var test // 变量提升，函数最顶部
if(flag) {
    test = &apos;hello man&apos;
} else {
    //此处访问 test 值为 undefined
    console.log(test)
}
//此处访问 test 值为 undefined
  }
</code></pre><h5 id="所以不用关心flag是否为-true-or-false。实际上，无论如何-test-都会被创建声明。"><a href="#所以不用关心flag是否为-true-or-false。实际上，无论如何-test-都会被创建声明。" class="headerlink" title="所以不用关心flag是否为 true or false。实际上，无论如何 test 都会被创建声明。"></a>所以不用关心flag是否为 true or false。实际上，无论如何 test 都会被创建声明。</h5><h4 id="接下来ES6主角登场："><a href="#接下来ES6主角登场：" class="headerlink" title="接下来ES6主角登场："></a>接下来ES6主角登场：</h4><p>我们通常用 let 和 const 来声明，let 表示变量、const 表示常量。let 和 const 都是块级作用域。怎么理解这个块级作用域？</p>
<p><code>在一个函数内部</code></p>
<p><code>在一个代码块内部</code></p>
<pre><code>说白了只要在{}花括号内的代码块即可以认为 let 和 const 的作用域。
</code></pre><p>看下面代码：</p>
<pre><code>function aa() {
if(flag) {
   let test = &apos;hello man&apos;
} else {
    //test 在此处访问不到
    console.log(test)
}
}
</code></pre><p>  let 的作用域是在它所在当前代码块，但不会被提升到当前函数的最顶部。<br> 再来说说 const<br> const 声明的变量必须提供一个值，而且会被认为是常量，意思就是它的值被设置完成后就不能再修改了。</p>
<pre><code>const name = &apos;lux&apos;
name = &apos;joe&apos; // 再次赋值此时会报错
</code></pre><p>还有，如果 const 的是一个对象，对象所包含的值是可以被修改的。抽象一点儿说，就是对象所指向的地址不能改变，而变量成员是可以修改的。</p>
<pre><code>const student = { name: &apos;cc&apos; }
// 没毛病
student.name = &apos;yy&apos;
// 如果这样子就会报错了
student  = { name: &apos;yy&apos; }
</code></pre><p>说说TDZ(暂时性死区)，想必你早有耳闻。</p>
<pre><code>{
    console.log(value) // 报错
    let value = &apos;lala&apos;
}
</code></pre><h5 id="我们都知道，JS引擎扫描代码时，如果发现变量声明，用-var-声明变量时会将声明提升到函数或全局作用域的顶部。但是-let-或者-const，会将声明关进一个小黑屋也是TDZ-暂时性死区-，只有执行到变量声明这句语句时，变量才会从小黑屋被放出来，才能安全使用这个变量。"><a href="#我们都知道，JS引擎扫描代码时，如果发现变量声明，用-var-声明变量时会将声明提升到函数或全局作用域的顶部。但是-let-或者-const，会将声明关进一个小黑屋也是TDZ-暂时性死区-，只有执行到变量声明这句语句时，变量才会从小黑屋被放出来，才能安全使用这个变量。" class="headerlink" title="我们都知道，JS引擎扫描代码时，如果发现变量声明，用 var 声明变量时会将声明提升到函数或全局作用域的顶部。但是 let 或者 const，会将声明关进一个小黑屋也是TDZ(暂时性死区)，只有执行到变量声明这句语句时，变量才会从小黑屋被放出来，才能安全使用这个变量。"></a>我们都知道，JS引擎扫描代码时，如果发现变量声明，用 var 声明变量时会将声明提升到函数或全局作用域的顶部。但是 let 或者 const，会将声明关进一个小黑屋也是TDZ(暂时性死区)，只有执行到变量声明这句语句时，变量才会从小黑屋被放出来，才能安全使用这个变量。</h5><p>哦了，说一道面试题</p>
<pre><code>var funcs = []
for (var i = 0; i &lt; 10; i++) {
    funcs.push(function() { console.log(i) })
}
funcs.forEach(function(func) {
    func()
})
</code></pre><p>这样的面试题是大家很常见，很多同学一看就知道输出十次10<br>但是如果我们想依次输出0到9呢？<br>有两种解决方法，直接看一下代码：</p>
<pre><code>    // ES5知识，我们可以利用“立即调用函数”解决这个问题
var funcs = []
for (var i = 0; i &lt; 10; i++) {
    funcs.push(
      (function(value) {
        return function() {
            console.log(value)
        }
    })(i)
  )
}
funcs.forEach(function(func) {
    func()
})

// 再来看看es6怎么处理的
const funcs = []
for (let i = 0; i &lt; 10; i++) {
    funcs.push(function() {
        console.log(i)
    })
}
funcs.forEach(func =&gt; func())
</code></pre><p>达到相同的效果，ES6 简洁的解决方案是不是更让你心动！！！</p>
<h3 id="2-字符串"><a href="#2-字符串" class="headerlink" title="2.字符串"></a>2.字符串</h3><p>先聊聊模板字符串😋<br>ES6模板字符简直是开发者的福音啊，解决了 ES5 在字符串功能上的痛点。</p>
<p>第一个用途，基本的字符串格式化。将表达式嵌入字符串中进行拼接。用${}来界定。</p>
<pre><code> //ES5
var name = &apos;lux&apos;
console.log(&apos;hello&apos; + name)
//es6
const name = &apos;lux&apos;
console.log(`hello ${name}`) //hello lux
</code></pre><p>第二个用途，在ES5时我们通过反斜杠()来做多行字符串或者字符串一行行拼接。ES6反引号(``)直接搞定。</p>
<pre><code>// ES5
var msg = &quot;Hi \
man!
&quot;
// ES6
const template = `&lt;div&gt;
    &lt;span&gt;hello world&lt;/span&gt;
&lt;/div&gt;`
</code></pre><p>  对于字符串 ES6+ 当然也提供了很多厉害也很有意思的方法😊 说几个常用的</p>
<pre><code>// 1.includes：判断是否包含然后直接返回布尔值
const str = &apos;hahay&apos;
console.log(str.includes(&apos;y&apos;)) // true

// 2.repeat: 获取字符串重复n次
const str = &apos;he&apos;
console.log(str.repeat(3)) // &apos;hehehe&apos;
//如果你带入小数, Math.floor(num) 来处理
// s.repeat(3.1) 或者 s.repeat(3.9) 都当做成 s.repeat(3) 来处理

// 3. startsWith 和 endsWith 判断是否以 给定文本 开始或者结束
const str =  &apos;hello world!&apos;
console.log(str.startsWith(&apos;hello&apos;)) // true
console.log(str.endsWith(&apos;!&apos;)) // true

// 4. padStart 和 padEnd 填充字符串，应用场景：时分秒
setInterval(() =&gt; {
    const now = new Date()
    const hours = now.getHours().toString()
    const minutes = now.getMinutes().toString()
    const seconds = now.getSeconds().toString()
    console.log(`${hours.padStart(2, 0)}:${minutes.padStart(2, 0)}:${seconds.padStart(2, 0)}`)
}, 1000)
</code></pre><p>关于模板字符串现在比较常出现的面试题有两道。同学们不妨写试试看？</p>
<p>模拟一个模板字符串的实现。</p>
<pre><code> let address = &apos;北京海淀区&apos;
let name = &apos;lala&apos;
let str = &apos;${name}在${address}上班...&apos;
// 模拟一个方法 myTemplate(str) 最终输出 &apos;lala在北京海淀区上班...&apos;
function myTemplate(str) {
    // try it
}
console.log(myTemplate(str)) // lala在北京海淀区上班...
</code></pre><p>实现标签化模板(自定义模板规则)。</p>
<pre><code> const name = &apos;cc&apos;
const gender = &apos;male&apos;
const hobby = &apos;basketball&apos;
// 实现tag最终输出 &apos;姓名：**cc**，性别：**male**，爱好：**basketball**&apos;
function tag(strings) {
    // do it
}
const str = tag`姓名：${name}，性别：${gender}，爱好：${hobby}`
console.log(str) // &apos;姓名：**cc**，性别：**male**，爱好：**basketball**&apos;
</code></pre><h3 id="3-函数"><a href="#3-函数" class="headerlink" title="3.函数"></a>3.函数</h3><p>函数默认参数</p>
<p>在ES5我们给函数定义参数默认值是怎么样？</p>
<pre><code>function action(num) {
    num = num || 200
    //当传入num时，num为传入的值
    //当没传入参数时，num即有了默认值200
    return num
}
</code></pre><p>但细心观察的同学们肯定会发现，num传入为0的时候就是false，但是我们实际的需求就是要拿到num = 0，此时num = 200 明显与我们的实际想要的效果明显不一样</p>
<p>ES6为参数提供了默认值。在定义函数时便初始化了这个参数，以便在参数没有被传递进去时使用。</p>
<pre><code>function action(num = 200) {
    console.log(num)
}
action(0) // 0
action() //200
action(300) //300
</code></pre><p>箭头函数</p>
<p>ES6很有意思的一部分就是函数的快捷写法。也就是箭头函数。</p>
<p>箭头函数最直观的三个特点。</p>
<p>不需要 function 关键字来创建函数<br>省略 return 关键字<br>继承当前上下文的 this 关键字<br>//例如：</p>
<pre><code>[1,2,3].map(x =&gt; x + 1)
</code></pre><p>//等同于：</p>
<pre><code>     [1,2,3].map((function(x){
    return x + 1
}).bind(this))
</code></pre><p>说个小细节。</p>
<p>当你的函数有且仅有一个参数的时候，是可以省略掉括号的。当你函数返回有且仅有一个表达式的时候可以省略{} 和 return；例如:</p>
<pre><code>var people = name =&gt; &apos;hello&apos; + name
//参数name就没有括号
</code></pre><p>作为参考</p>
<pre><code>var people = (name, age) =&gt; {
    const fullName = &apos;hello&apos; + name
    return fullName
}
//如果缺少()或者{}就会报错
</code></pre><p>要不整一道笔试题？哈哈哈哈哈哈哈哈。我不管我先上代码了</p>
<pre><code>// 请使用ES6重构以下代码

var calculate = function(x, y, z) {
  if (typeof x != &apos;number&apos;) { x = 0 }
  if (typeof y != &apos;number&apos;) { y = 6 }

  var dwt = x % y
  var result

  if (dwt == z) { result = true }
  if (dwt != z) { result = false }

  return result
}
const calculate = (x, y, z) =&gt; {
  x = typeof x !== &apos;number&apos; ? 0 : x
  y = typeof y !== &apos;number&apos; ? 6 : y
  return x % y === z
}
</code></pre><h3 id="4-拓展的对象功能"><a href="#4-拓展的对象功能" class="headerlink" title="4.拓展的对象功能"></a>4.拓展的对象功能</h3><p>对象初始化简写</p>
<p>ES5我们对于对象都是以键值对的形式书写，是有可能出现键值对重名的。例如：</p>
<pre><code>function people(name, age) {
    return {
        name: name,
        age: age
    };
}
</code></pre><p>键值对重名，ES6可以简写如下：</p>
<pre><code>function people(name, age) {
    return {
        name,
        age
    };
}
</code></pre><p>ES6 同样改进了为对象字面量方法赋值的语法。ES5为对象添加方法：</p>
<pre><code>const people = {
    name: &apos;lux&apos;,
    getName: function() {
        console.log(this.name)
    }
}
</code></pre><p>ES6通过省略冒号与 function 关键字，将这个语法变得更简洁</p>
<pre><code>const people = {
    name: &apos;lux&apos;,
    getName () {
        console.log(this.name)
    }
}
</code></pre><p>ES6 对象提供了 Object.assign()这个方法来实现浅复制。<br>Object.assign() 可以把任意多个源对象自身可枚举的属性拷贝给目标对象，然后返回目标对象。第一参数即为目标对象。在实际项目中，我们为了不改变源对象。一般会把目标对象传为{}</p>
<pre><code>const objA = { name: &apos;cc&apos;, age: 18 }
const objB = { address: &apos;beijing&apos; }
const objC = {} // 这个为目标对象
const obj = Object.assign(objC, objA, objB)

// 我们将 objA objB objC obj 分别输出看看
console.log(objA)   // { name: &apos;cc&apos;, age: 18 }
console.log(objB) // { address: &apos;beijing&apos; }
console.log(objC) // { name: &apos;cc&apos;, age: 18, address: &apos;beijing&apos; }
console.log(obj) // { name: &apos;cc&apos;, age: 18, address: &apos;beijing&apos; }

// 是的，目标对象ObjC的值被改变了。
// so，如果objC也是你的一个源对象的话。请在objC前面填在一个目标对象{}
Object.assign({}, objC, objA, objB)
</code></pre><h3 id="5-更方便的数据访问–解构"><a href="#5-更方便的数据访问–解构" class="headerlink" title="5.更方便的数据访问–解构"></a>5.更方便的数据访问–解构</h3><p>数组和对象是JS中最常用也是最重要表示形式。为了简化提取信息，ES6新增了解构，这是将一个数据结构分解为更小的部分的过程</p>
<p>ES5我们提取对象中的信息形式如下：</p>
<pre><code>const people = {
    name: &apos;lux&apos;,
    age: 20
}
const name = people.name
const age = people.age
console.log(name + &apos; --- &apos; + age)
</code></pre><p>是不是觉得很熟悉，没错，在ES6之前我们就是这样获取对象信息的，一个一个获取。现在，解构能让我们从对象或者数组里取出数据存为变量，例如</p>
<pre><code>//对象
const people = {
    name: &apos;lux&apos;,
    age: 20
}
const { name, age } = people
console.log(`${name} --- ${age}`)
//数组
const color = [&apos;red&apos;, &apos;blue&apos;]
const [first, second] = color
console.log(first) //&apos;red&apos;
console.log(second) //&apos;blue&apos;
</code></pre><p>要不来点儿面试题，看看自己的掌握情况？</p>
<pre><code>// 请使用 ES6 重构一下代码

// 第一题
var jsonParse = require(&apos;body-parser&apos;).jsonParse

// 第二题
var body = request.body
var username = body.username
var password = body.password

// 1.
import { jsonParse } from &apos;body-parser&apos;
// 2.
const { body, body: { username, password } } = request
</code></pre><h3 id="6-Spread-Operator-展开运算符"><a href="#6-Spread-Operator-展开运算符" class="headerlink" title="6.Spread Operator 展开运算符"></a>6.Spread Operator 展开运算符</h3><p>ES6中另外一个好玩的特性就是Spread Operator 也是三个点儿…接下来就展示一下它的用途。</p>
<p>组装对象或者数组</p>
<pre><code>//数组
const color = [&apos;red&apos;, &apos;yellow&apos;]
const colorful = [...color, &apos;green&apos;, &apos;pink&apos;]
console.log(colorful) //[red, yellow, green, pink]

//对象
const alp = { fist: &apos;a&apos;, second: &apos;b&apos;}
const alphabets = { ...alp, third: &apos;c&apos; }
console.log(alphabets) //{ &quot;fist&quot;: &quot;a&quot;, &quot;second&quot;: &quot;b&quot;, &quot;third&quot;: &quot;c&quot;
</code></pre><p>}<br>有时候我们想获取数组或者对象除了前几项或者除了某几项的其他项</p>
<pre><code>//数组
const number = [1,2,3,4,5]
const [first, ...rest] = number
console.log(rest) //2,3,4,5
//对象
const user = {
    username: &apos;lux&apos;,
    gender: &apos;female&apos;,
    age: 19,
    address: &apos;peking&apos;
}
const { username, ...rest } = user
console.log(rest) //{&quot;address&quot;: &quot;peking&quot;, &quot;age&quot;: 19, &quot;gender&quot;: &quot;female&quot;
</code></pre><p>}<br>对于 Object 而言，还可以用于组合成新的 Object 。(ES2017 stage-2 proposal) 当然如果有重复的属性名，右边覆盖左边</p>
<pre><code>const first = {
    a: 1,
    b: 2,
    c: 6,
}
const second = {
    c: 3,
    d: 4
}
const total = { ...first, ...second }
console.log(total) // { a: 1, b: 2, c: 3, d: 4 }
</code></pre><h3 id="7-import-和-export"><a href="#7-import-和-export" class="headerlink" title="7.import 和 export"></a>7.import 和 export</h3><p>import导入模块、export导出模块</p>
<pre><code>    //全部导入
    import people from &apos;./example&apos;

    //有一种特殊情况，即允许你将整个模块当作单一对象进行导入
    //该模块的所有导出都会作为对象的属性存在
    import * as example from &quot;./example.js&quot;
    console.log(example.name)
    console.log(example.age)
    console.log(example.getName())

    //导入部分
    import {name, age} from &apos;./example&apos;

// 导出默认, 有且只有一个默认
export default App

// 部分导出
export class App extend Component {};
</code></pre><h4 id="以前有人问我，导入的时候有没有大括号的区别是什么。下面是我在工作中的总结："><a href="#以前有人问我，导入的时候有没有大括号的区别是什么。下面是我在工作中的总结：" class="headerlink" title="以前有人问我，导入的时候有没有大括号的区别是什么。下面是我在工作中的总结："></a>以前有人问我，导入的时候有没有大括号的区别是什么。下面是我在工作中的总结：</h4><pre><code>1.当用export default people导出时，就用 import people 导入（不带大括号）

2.一个文件里，有且只能有一个export default。但可以有多个export。

3.当用export name 时，就用import { name }导入（记得带上大括号）

4.当一个文件里，既有一个export default people, 又有多个export name 或者 export age时，导入就用 import people, { name, age }

5.当一个文件里出现n多个 export 导出很多模块，导入时除了一个一个导入，也可以用import * as example
</code></pre><h2 id="8-Promise"><a href="#8-Promise" class="headerlink" title="8. Promise"></a>8. Promise</h2><p>在promise之前代码过多的回调或者嵌套，可读性差、耦合度高、扩展性低。通过Promise机制，扁平化的代码机构，大大提高了代码可读性；用同步编程的方式来编写异步代码，保存线性的代码逻辑，极大的降低了代码耦合性而提高了程序的可扩展性。<br>说白了就是用同步的方式去写异步代码。</p>
<p>发起异步请求</p>
<pre><code>fetch(&apos;/api/todos&apos;)
  .then(res =&gt; res.json())
  .then(data =&gt; ({ data }))
  .catch(err =&gt; ({ err }));
</code></pre><p>今天看到一篇关于面试题的很有意思。</p>
<pre><code>setTimeout(function() {
  console.log(1)
}, 0);
new Promise(function executor(resolve) {
  console.log(2);
  for( var i=0 ; i&lt;10000 ; i++ ) {
    i == 9999 &amp;&amp; resolve();
  }
  console.log(3);
}).then(function() {
  console.log(4);
});
console.log(5);
</code></pre><p>Excuse me？这个前端面试在搞事！</p>
<p>当然以上promise的知识点，这个只是冰山一角。需要更多地去学习了解一下。</p>
<h3 id="9-Generators"><a href="#9-Generators" class="headerlink" title="9.Generators"></a>9.Generators</h3><p>生成器（ generator）是能返回一个迭代器的函数。生成器函数也是一种函数，最直观的表现就是比普通的function多了个星号*，在其函数体内可以使用yield关键字,有意思的是函数会在每个yield后暂停。</p>
<p>这里生活中有一个比较形象的例子。咱们到银行办理业务时候都得向大厅的机器取一张排队号。你拿到你的排队号，机器并不会自动为你再出下一张票。也就是说取票机“暂停”住了，直到下一个人再次唤起才会继续吐票。</p>
<p>OK。说说迭代器。当你调用一个generator时，它将返回一个迭代器对象。这个迭代器对象拥有一个叫做next的方法来帮助你重启generator函数并得到下一个值。next方法不仅返回值，它返回的对象具有两个属性：done和value。value是你获得的值，done用来表明你的generator是否已经停止提供值。继续用刚刚取票的例子，每张排队号就是这里的value，打印票的纸是否用完就这是这里的done。</p>
<pre><code>// 生成器
function *createIterator() {
    yield 1;
    yield 2;
    yield 3;
}

// 生成器能像正规函数那样被调用，但会返回一个迭代器
let iterator = createIterator();

console.log(iterator.next().value); // 1
console.log(iterator.next().value); // 2
console.log(iterator.next().value); // 3
</code></pre><p>那生成器和迭代器又有什么用处呢？</p>
<p>围绕着生成器的许多兴奋点都与异步编程直接相关。异步调用对于我们来说是很困难的事，我们的函数并不会等待异步调用完再执行，你可能会想到用回调函数，（当然还有其他方案比如Promise比如Async/await）。</p>
<p>生成器可以让我们的代码进行等待。就不用嵌套的回调函数。使用generator可以确保当异步调用在我们的generator函数运行一下行代码之前完成时暂停函数的执行。</p>
<p>那么问题来了，咱们也不能手动一直调用next()方法，你需要一个能够调用生成器并启动迭代器的方法。就像这样子的</p>
<pre><code>function run(taskDef) { //taskDef即一个生成器函数

    // 创建迭代器，让它在别处可用
    let task = taskDef();

    // 启动任务
    let result = task.next();

    // 递归使用函数来保持对 next() 的调用
    function step() {

        // 如果还有更多要做的
        if (!result.done) {
            result = task.next();
            step();
        }
    }

    // 开始处理过程
    step();

}
</code></pre><p>生成器与迭代器最有趣、最令人激动的方面，或许就是可创建外观清晰的异步操作代码。你不必到处使用回调函数，而是可以建立貌似同步的代码，但实际上却使用 yield 来等待异步操作结束。<br>总结</p>
<p>ES6新特性远不止于此，但对于我们日常的开发来说。这算不上全部，但是能算得上是高频使用了。当然还有很有好玩有意思的特性。比如一些数组的新方法、class…等等。包括用set处理数组去重问题等等。我和我的小伙伴们都惊呆了!</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;https://wx1.sinaimg.cn/mw690/72cd9985gy1ft9l8hv8k6j20qo103wlc.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;最近-vue-很火，是不是准备开始学习了？但是你会发现有一些语法不懂，这可咋整&quot;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>vue 初体验</title>
    <link href="http://yoursite.com/2018/03/21/vue-%E5%88%9D%E4%BD%93%E9%AA%8C/"/>
    <id>http://yoursite.com/2018/03/21/vue-初体验/</id>
    <published>2018-03-21T15:15:26.000Z</published>
    <updated>2018-03-21T15:24:17.870Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fpkup25cmrj31hc1401cs.jpg" alt=""></p>
<h3 id="vue-的利器脚手架的安装npm-install-g-vue-cli-如果权限有问题就输入"><a href="#vue-的利器脚手架的安装npm-install-g-vue-cli-如果权限有问题就输入" class="headerlink" title="vue 的利器脚手架的安装npm install -g vue-cli,如果权限有问题就输入"></a>vue 的利器脚手架的安装npm install -g vue-cli,如果权限有问题就输入</h3><pre><code>sudo npm install -g vue-cli
</code></pre><h4 id="几秒过后安装完成-在终端输入-vue检查是否安装成功"><a href="#几秒过后安装完成-在终端输入-vue检查是否安装成功" class="headerlink" title="几秒过后安装完成,在终端输入 vue检查是否安装成功;"></a>几秒过后安装完成,在终端输入 vue检查是否安装成功;</h4><pre><code>vue list 查看都有什么模板
</code></pre><h4 id="接着选定一个目录-进行如下操作"><a href="#接着选定一个目录-进行如下操作" class="headerlink" title="接着选定一个目录,进行如下操作"></a>接着选定一个目录,进行如下操作</h4><pre><code>vue init webpack sell
这里的 sell 是项目的名字接着会有一些选择的地方

? Project name sell
? Project description sell app
? Author Dragon_Zin &lt; xxxxx@qq.com&gt;
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Set up unit tests No
? Setup e2e tests with Nightwatch? No
? Should we run `npm install` for you after the project has been created? (recom
mended) npm
</code></pre><h3 id="成功之后的温馨提示"><a href="#成功之后的温馨提示" class="headerlink" title="成功之后的温馨提示:"></a>成功之后的温馨提示:</h3><pre><code>To get started:

cd sell
npm run dev
</code></pre><p><a href="http://localhost:8081" target="_blank" rel="external">http://localhost:8081</a><br>成功访问这里即可</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;https://ws2.sinaimg.cn/large/006tNc79gy1fpkup25cmrj31hc1401cs.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;vue-的利器脚手架的安装npm-install-g-vue-cli-如果权限有
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>IDEA Maven配置和新建 web 项目</title>
    <link href="http://yoursite.com/2018/01/17/IDEA-Maven%E9%85%8D%E7%BD%AE%E5%92%8C%E6%96%B0%E5%BB%BA-web-%E9%A1%B9%E7%9B%AE/"/>
    <id>http://yoursite.com/2018/01/17/IDEA-Maven配置和新建-web-项目/</id>
    <published>2018-01-17T12:35:21.000Z</published>
    <updated>2018-01-17T12:54:23.511Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://5b0988e595225.cdn.sohucs.com/images/20170909/be60e460a07449adbc6e367ff67f7585.jpeg" alt=""></p>
<h3 id="Mac-下-idea-配置-maven"><a href="#Mac-下-idea-配置-maven" class="headerlink" title="Mac 下 idea 配置 maven:"></a>Mac 下 idea 配置 maven:</h3><h4 id="1-maven的安装"><a href="#1-maven的安装" class="headerlink" title="1.maven的安装"></a>1.maven的安装</h4><pre><code>前往Apache Maven官网点击apache-maven-3.3.9-bin.zip链接下载3.3.9的版本即可。下载后我将该目录放到/Users/codingBoy/的目录下，文件名为apache-maven-3.3.9。这样我们便成功安装好maven管理工具，但这还不够，还需要设置maven环境变量。
</code></pre><h4 id="2-配置maven环境变量"><a href="#2-配置maven环境变量" class="headerlink" title="2.配置maven环境变量"></a>2.配置maven环境变量</h4><p>  打开终端，退到根目录/Users/Vizard/，输入命令:$ vi ~/.bash_profile打开bash_profile文件,然后添加如下两行代码:</p>
<pre><code>export M2_HOME=/Users/Vizard/apache-maven-3.3.9
export PATH=$PATH:$M2_HOME/bin
</code></pre><p> 然后继续退回到根目录，输入$ source ~/.bash_profile使bash_profile文件添加的内容即刻生效。<br>接下来在终端输入mvn -v,若出现如下内容，说明你的maven管理工具成功安装并成功配置:</p>
<pre><code>Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /Users/vizard/apache-maven-3.3.9
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: &quot;mac os x&quot;, version: &quot;10.13.1&quot;, arch: &quot;x86_64&quot;, family: &quot;mac&quot;
VD-DragondeMacBook-Pro:~ vizard$
</code></pre><p>到此，Maven在mac系统下的安装和配置即完成。</p>
<h4 id="当你兴高采烈的建立maven-web项目却发现-卡在Generating-Project-in-Batch-mode上"><a href="#当你兴高采烈的建立maven-web项目却发现-卡在Generating-Project-in-Batch-mode上" class="headerlink" title="当你兴高采烈的建立maven web项目却发现,卡在Generating Project in Batch mode上?"></a>当你兴高采烈的建立maven web项目却发现,卡在Generating Project in Batch mode上?</h4><h3 id="解决方法就是："><a href="#解决方法就是：" class="headerlink" title="解决方法就是："></a>解决方法就是：</h3><pre><code>1.直接从浏览器上下载该文件；http://repo.maven.apache.org/maven2/archetype-catalog.xml

2.然后复制到.m2/repository/org/apache/maven/archetype/archetype-catalog/3.1
下面；

3.然后在偏好设置-runner -VM Options上加上增加参数-DarchetypeCatalog=local即可。
</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://5b0988e595225.cdn.sohucs.com/images/20170909/be60e460a07449adbc6e367ff67f7585.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;Mac-下-idea-配置-ma
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>mmp-小程序</title>
    <link href="http://yoursite.com/2018/01/04/mmp/"/>
    <id>http://yoursite.com/2018/01/04/mmp/</id>
    <published>2018-01-04T15:36:54.000Z</published>
    <updated>2018-01-04T15:44:19.776Z</updated>
    
    <content type="html"><![CDATA[<h4 id="微信小程序的swiper组件是滑块视图容器，也就是说平常我们看到的轮播图就可以用它来做，"><a href="#微信小程序的swiper组件是滑块视图容器，也就是说平常我们看到的轮播图就可以用它来做，" class="headerlink" title="微信小程序的swiper组件是滑块视图容器，也就是说平常我们看到的轮播图就可以用它来做，"></a>微信小程序的swiper组件是滑块视图容器，也就是说平常我们看到的轮播图就可以用它来做，</h4><h4 id="不过这个组件有很多样式是固定的，但是，有时候我们的设计稿的面板指示点是需要个性化的，"><a href="#不过这个组件有很多样式是固定的，但是，有时候我们的设计稿的面板指示点是需要个性化的，" class="headerlink" title="不过这个组件有很多样式是固定的，但是，有时候我们的设计稿的面板指示点是需要个性化的，"></a>不过这个组件有很多样式是固定的，但是，有时候我们的设计稿的面板指示点是需要个性化的，</h4><h4 id="那么如何去修改swiper组件的面板指示点的样式呢？最近在使用swiper的时候也在想这个，"><a href="#那么如何去修改swiper组件的面板指示点的样式呢？最近在使用swiper的时候也在想这个，" class="headerlink" title="那么如何去修改swiper组件的面板指示点的样式呢？最近在使用swiper的时候也在想这个，"></a>那么如何去修改swiper组件的面板指示点的样式呢？最近在使用swiper的时候也在想这个，</h4><h4 id="最后发现在调试的时候，可以看到他的选择器。"><a href="#最后发现在调试的时候，可以看到他的选择器。" class="headerlink" title="最后发现在调试的时候，可以看到他的选择器。"></a>最后发现在调试的时候，可以看到他的选择器。</h4><p><img src="https://i.loli.net/2018/01/04/5a4e479e3f53a.png" alt=""></p>
<h3 id="轮播图是这样的"><a href="#轮播图是这样的" class="headerlink" title="轮播图是这样的"></a>轮播图是这样的</h3><p><img src="https://i.loli.net/2018/01/04/5a4e47ec0670d.png" alt=""></p>
<pre><code>&lt;swiper class=&quot;swiper-box&quot; indicator-dots=&quot;{{ indicatordots }}&quot; autoplay=&quot;{{ autoplay }}&quot;&gt;
&lt;block wx:for=&quot;{{ swiperItem }}&quot;&gt;
    &lt;swiper-item&gt;
        &lt;navigator url=&quot;{{ item.linkUrl }}&quot;&gt;
            &lt;image class=&quot;slide-image&quot; src=&quot;{{ item.imgUrl }}&quot;&gt;&lt;/image&gt;
        &lt;/navigator&gt;
    &lt;/swiper-item&gt;
&lt;/block&gt;
&lt;/swiper&gt;
</code></pre><h3 id="对应的-wxss中"><a href="#对应的-wxss中" class="headerlink" title="对应的.wxss中:"></a>对应的.wxss中:</h3><pre><code>.swiper-box .wx-swiper-dots.wx-swiper-dots-horizontal{
  margin-bottom: 2rpx;
}
.swiper-box .wx-swiper-dot{
 width:40rpx;
 display: inline-flex;
 height: 10rpx;
 margin-left: 20rpx;
 justify-content:space-between;
}
.swiper-box .wx-swiper-dot::before{
 content: &apos;&apos;;
 flex-grow: 1;
 background: rgba(255,255,255,0.8);
 border-radius: 8rpx
}
.swiper-box .wx-swiper-dot-active::before{
 background:rgba(244,0,0,0.8);
}
</code></pre><h3 id="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></a>最终效果</h3><p><img src="https://i.loli.net/2018/01/04/5a4e48a046d0d.png" alt=""></p>
<h4 id="好久没写了差点忘记hexo-的命令"><a href="#好久没写了差点忘记hexo-的命令" class="headerlink" title="好久没写了差点忘记hexo 的命令"></a>好久没写了差点忘记hexo 的命令</h4><p>hexo new “–”<br>hexo clean<br>hexo g<br>hexo s<br>hexo d</p>
]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;微信小程序的swiper组件是滑块视图容器，也就是说平常我们看到的轮播图就可以用它来做，&quot;&gt;&lt;a href=&quot;#微信小程序的swiper组件是滑块视图容器，也就是说平常我们看到的轮播图就可以用它来做，&quot; class=&quot;headerlink&quot; title=&quot;微信小程
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Yo 票-我的12306</title>
    <link href="http://yoursite.com/2017/08/10/Yo-%E7%A5%A8-%E6%88%91%E7%9A%8412306/"/>
    <id>http://yoursite.com/2017/08/10/Yo-票-我的12306/</id>
    <published>2017-08-10T13:35:38.000Z</published>
    <updated>2017-08-10T14:09:36.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id=""><a href="#" class="headerlink" title=""></a><img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fieyihq01pj31fy0uqgqm.jpg" alt=""></h2><p><img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fieyj9v22pj30yo0uu0wm.jpg" alt=""></p>
<h4 id="说道掌上12306订票客户端-Yo-票-的前世今生"><a href="#说道掌上12306订票客户端-Yo-票-的前世今生" class="headerlink" title="说道掌上12306订票客户端(Yo 票)的前世今生"></a>说道掌上12306订票客户端(Yo 票)的前世今生</h4><pre><code>从字母验证码开始说起,到现在的找你妹验证码;
从之前的外包到现在依然外包给阿里;
从普通的数据结构到加密之后的结构;
从只是截图上传到 App Store 到自由灵活切图;
从还是个大学生开始到毕业工作三年多....
</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;&quot;&gt;&lt;a href=&quot;#&quot; class=&quot;headerlink&quot; title=&quot;&quot;&gt;&lt;/a&gt;&lt;img src=&quot;https://ws4.sinaimg.cn/large/006tKfTcgy1fieyihq01pj31fy0uqgqm.jpg&quot; alt=&quot;&quot;&gt;&lt;/
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>关于Charles虽然在同一个局域网但是证书按不了</title>
    <link href="http://yoursite.com/2017/07/29/%E5%85%B3%E4%BA%8ECharles%E8%99%BD%E7%84%B6%E5%9C%A8%E5%90%8C%E4%B8%80%E4%B8%AA%E5%B1%80%E5%9F%9F%E7%BD%91%E4%BD%86%E6%98%AF%E8%AF%81%E4%B9%A6%E6%8C%89%E4%B8%8D%E4%BA%86/"/>
    <id>http://yoursite.com/2017/07/29/关于Charles虽然在同一个局域网但是证书按不了/</id>
    <published>2017-07-29T04:58:52.000Z</published>
    <updated>2017-07-29T05:01:01.000Z</updated>
    
    <content type="html"><![CDATA[<h4 id="首先要确认两点"><a href="#首先要确认两点" class="headerlink" title="首先要确认两点:"></a>首先要确认两点:</h4><pre><code>1.手机的代理地址设置正确了,这个一般都应没问题
2.确认手机和电脑是在同一个局域网中,并且 Charles 是打开的状态;
</code></pre><h5 id="那么接下来如果你手机浏览器访问-chls-pro-ssl-还是打不开的话"><a href="#那么接下来如果你手机浏览器访问-chls-pro-ssl-还是打不开的话" class="headerlink" title="那么接下来如果你手机浏览器访问 chls.pro/ssl 还是打不开的话:"></a>那么接下来如果你手机浏览器访问 chls.pro/ssl 还是打不开的话:</h5><pre><code>就重启路由器去吧
屡试不爽
</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;首先要确认两点&quot;&gt;&lt;a href=&quot;#首先要确认两点&quot; class=&quot;headerlink&quot; title=&quot;首先要确认两点:&quot;&gt;&lt;/a&gt;首先要确认两点:&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;1.手机的代理地址设置正确了,这个一般都应没问题
2.确认手机和电脑是在同一个局
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>your account 有问题</title>
    <link href="http://yoursite.com/2017/07/29/your-account-%E6%9C%89%E9%97%AE%E9%A2%98/"/>
    <id>http://yoursite.com/2017/07/29/your-account-有问题/</id>
    <published>2017-07-29T02:14:33.000Z</published>
    <updated>2017-07-29T02:22:22.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Your-account-already-has-a-signing-certificate-for-this-machine-but-it-is-not-present-in-your-keychain-To-create-a-new-one-you-must-first-revoke-the-existing-certificate"><a href="#Your-account-already-has-a-signing-certificate-for-this-machine-but-it-is-not-present-in-your-keychain-To-create-a-new-one-you-must-first-revoke-the-existing-certificate" class="headerlink" title="Your account already has a signing certificate for this machine but it is not present in your keychain. To create a new one, you must first revoke the existing certificate."></a>Your account already has a signing certificate for this machine but it is not present in your keychain. To create a new one, you must first revoke the existing certificate.</h3><h3 id="不管是团队开发还是个人换电脑经常会遇到这样的问题那么到底解决办法都有什么呢-今天就来彻底的扫除这个问题"><a href="#不管是团队开发还是个人换电脑经常会遇到这样的问题那么到底解决办法都有什么呢-今天就来彻底的扫除这个问题" class="headerlink" title="不管是团队开发还是个人换电脑经常会遇到这样的问题那么到底解决办法都有什么呢,今天就来彻底的扫除这个问题;"></a>不管是团队开发还是个人换电脑经常会遇到这样的问题那么到底解决办法都有什么呢,今天就来彻底的扫除这个问题;</h3><h4 id="xcode证书管理出现这个错误解决方法："><a href="#xcode证书管理出现这个错误解决方法：" class="headerlink" title="xcode证书管理出现这个错误解决方法："></a>xcode证书管理出现这个错误解决方法：</h4><pre><code>简单点的直接按照Xcode的提示Revoke掉，然后新建证书，
如果不想Revoke可以叫拥有证书的人导出P12文件，
然后安装也可以解决，还有一种方法就是下面的方法：
1.点击Xcode，选择Preferences
2.选择 Accounts，如果没登录，就登陆自己的账号，然后双击团队的名字那一栏，就是红色框框那一栏
3.在弹出的界面左下角，点击+号，选iOS Development，就可以解决这问
</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;Your-account-already-has-a-signing-certificate-for-this-machine-but-it-is-not-present-in-your-keychain-To-create-a-new-one-you-must-
    
    </summary>
    
      <category term="开发技术" scheme="http://yoursite.com/categories/%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF/"/>
    
    
      <category term="iOS 开发" scheme="http://yoursite.com/tags/iOS-%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>RN 操蛋的经历</title>
    <link href="http://yoursite.com/2017/06/08/RN-%E6%93%8D%E8%9B%8B%E7%9A%84%E7%BB%8F%E5%8E%86/"/>
    <id>http://yoursite.com/2017/06/08/RN-操蛋的经历/</id>
    <published>2017-06-08T14:42:16.000Z</published>
    <updated>2017-07-29T02:20:56.000Z</updated>
    
    <content type="html"><![CDATA[<p>balabala</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;balabala&lt;/p&gt;

    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Python 图片转符号图</title>
    <link href="http://yoursite.com/2017/05/24/Python-%E5%9B%BE%E7%89%87%E8%BD%AC%E7%AC%A6%E5%8F%B7%E5%9B%BE/"/>
    <id>http://yoursite.com/2017/05/24/Python-图片转符号图/</id>
    <published>2017-05-24T15:00:41.000Z</published>
    <updated>2017-05-24T15:23:56.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="先上图-如果用的是-mac-的时候打开-txt-文件时候-com-图就可以清楚的显示了"><a href="#先上图-如果用的是-mac-的时候打开-txt-文件时候-com-图就可以清楚的显示了" class="headerlink" title="先上图,如果用的是 mac 的时候打开 txt 文件时候 com + -图就可以清楚的显示了"></a>先上图,如果用的是 mac 的时候打开 txt 文件时候 com + -图就可以清楚的显示了</h3><p><img src="https://ws3.sinaimg.cn/small/006tNc79gy1ffwuilq31nj312c0yqe2f.jpg" alt=""><br><img src="https://ws3.sinaimg.cn/small/006tNc79gy1ffwug730fcj30ya1781he.jpg" alt=""></p>
<h4 id="下面上代码吧"><a href="#下面上代码吧" class="headerlink" title="下面上代码吧"></a>下面上代码吧</h4><pre><code>#!/usr/bin/python
# -*- coding: UTF-8 -*-
from PIL import Image
import os

serarr = &apos;&apos;&apos;@#$%&amp;?*aeoc=&lt;{[(/l|!-_:;,.&quot;&apos;^~` &apos;&apos;&apos;
count = len(serarr)


def toText(image_file):  # 此函数不能输入 gif 文件
image_file = image_file.convert(&quot;L&quot;)  # 转灰度
asd = &apos;&apos;  # 储存字符串
for h in range(0, image_file.size[1]):  # h
    for w in range(0, image_file.size[0]):  # w
        gray = image_file.getpixel((w, h))
        asd = asd + serarr[int(gray / (256 / (count)))]
    asd = asd + &apos;\r\n&apos;
return asd


def toText2(image_file):
asd = &apos;&apos;  # 储存字符串
for h in range(0, image_file.size[1]):  # h
    for w in range(0, image_file.size[0]):  # w
        r, g, b = image_file.getpixel((w, h))
        gray = int(r * 0.299 + g * 0.587 + b * 0.114)
        asd = asd + serarr[int(gray / (256 / (count)))]
    asd = asd + &apos;\r\n&apos;
return asd


image_file = Image.open(&quot;Unknown.jpg&quot;)  # 打开图片
image_file = image_file.resize((int(image_file.size[0] * 0.9), int(image_file.size[1] * 0.5)))  # 调整图片大小
print
u&apos;Info:&apos;, image_file.size[0], &apos; &apos;, image_file.size[1], &apos; &apos;, count

tmp = open(&apos;tmp.txt&apos;, &apos;w&apos;)
tmp.write(toText(image_file))
tmp.close()
</code></pre><p>用 PyCharm 好用些<br>图形化界面还没搞出来,下次</p>
]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;先上图-如果用的是-mac-的时候打开-txt-文件时候-com-图就可以清楚的显示了&quot;&gt;&lt;a href=&quot;#先上图-如果用的是-mac-的时候打开-txt-文件时候-com-图就可以清楚的显示了&quot; class=&quot;headerlink&quot; title=&quot;先上图,如果
    
    </summary>
    
      <category term="开发技术" scheme="http://yoursite.com/categories/%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF/"/>
    
    
      <category term="Python 开发" scheme="http://yoursite.com/tags/Python-%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>iOS8的estimatedRowHeight 说好的幸福</title>
    <link href="http://yoursite.com/2017/05/23/iOS8%E7%9A%84estimatedRowHeight-%E8%AF%B4%E5%A5%BD%E7%9A%84%E5%B9%B8%E7%A6%8F/"/>
    <id>http://yoursite.com/2017/05/23/iOS8的estimatedRowHeight-说好的幸福/</id>
    <published>2017-05-23T12:18:00.000Z</published>
    <updated>2017-05-24T15:25:04.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="一展离愁"><a href="#一展离愁" class="headerlink" title="一展离愁"></a>一展离愁</h3><p>那些年iOS并没有像Android那样6的相对布局，一些老猴咬着jj猛然搞一个Frame模型，一个model模型；当网络请求到数据时候就处理一把数据把model里装一个frame模型用来保存那些动态不固定的高度；然后在model对cell赋值的时候调用heightcell那个tableview的代理方法，然后再把计算好的值给cell。好瘠薄麻烦。<br><img src="http://upload-images.jianshu.io/upload_images/931214-b911beb79cf7c842.gif?imageMogr2/auto-orient/strip" alt="cell_freedom.gif"></p>
<h3 id="简单点，装逼的方式简单点"><a href="#简单点，装逼的方式简单点" class="headerlink" title="简单点，装逼的方式简单点"></a>简单点，装逼的方式简单点</h3><p>有位大侠可能也觉得这他妈计算太烦人，能不能让我简单的装逼。<br>于是就有了那个GitHub上很有名的框架<br>UITableView+FDTemplateLayoutCell<br>听说可以适配iOS8以下，也是6的一逼；但是我的app以及目前我司的app不需要关心iOS8以下（我相信都是这样）。<br>那么还是来把苹果给我们的estimatedRowHeight玩6了吧</p>
<h3 id="你又不是个演员，别设计那么多模式"><a href="#你又不是个演员，别设计那么多模式" class="headerlink" title="你又不是个演员，别设计那么多模式"></a>你又不是个演员，别设计那么多模式</h3><p>当拿到UED给的图或者跟产品敲定需求的时候，不少人都会说我曹，干嘛设计那么复杂，能不能有规律的简洁易用？可是理想很美好。那么还是动手操练起来吧。</p>
<h4 id="特斯拉用swift开车成为可能："><a href="#特斯拉用swift开车成为可能：" class="headerlink" title="特斯拉用swift开车成为可能："></a>特斯拉用swift开车成为可能：</h4><p>首先确定效果图上的每一个cell控件的个数，然后分析一下他们之间的位置关系；接着理清位置关系那么开始拖线or用masonry写布局了。</p>
<h2 id="原理剖析："><a href="#原理剖析：" class="headerlink" title="原理剖析："></a>原理剖析：</h2><pre><code>其实我们在做的事就是类似Android中的相对布局，我们要知道谁挨着谁
大部分控件不设置宽高内容是会自适应的，same as label imageview，uibutton等。
那么也就是说我们只要告诉cell它里面的contentview的高度，
然后再确定好contentview中控件之间的相对位置就可以了。
说白了也就是要让contentview直到自己要多高，然后告诉cell；
</code></pre><p>如果不了解masonry，应该都了解了的。不了解的说不过去的，不要光开车不学习了。<br>地址：<br><a href="https://github.com/Easyzhan/A_Auto_Cell_Fucker" target="_blank" rel="external">https://github.com/Easyzhan/A_Auto_Cell_Fucker</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;一展离愁&quot;&gt;&lt;a href=&quot;#一展离愁&quot; class=&quot;headerlink&quot; title=&quot;一展离愁&quot;&gt;&lt;/a&gt;一展离愁&lt;/h3&gt;&lt;p&gt;那些年iOS并没有像Android那样6的相对布局，一些老猴咬着jj猛然搞一个Frame模型，一个model模型；当网络请求
    
    </summary>
    
      <category term="开发技术" scheme="http://yoursite.com/categories/%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF/"/>
    
    
      <category term="iOS 开发" scheme="http://yoursite.com/tags/iOS-%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>iOS 导航栏属性 透明属性translucent 偏移64 滑动视图内容自动向下偏移的问题总结</title>
    <link href="http://yoursite.com/2017/05/19/iOS-%E5%AF%BC%E8%88%AA%E6%A0%8F%E5%B1%9E%E6%80%A7-%E9%80%8F%E6%98%8E%E5%B1%9E%E6%80%A7translucent-%E5%81%8F%E7%A7%BB64-%E6%BB%91%E5%8A%A8%E8%A7%86%E5%9B%BE%E5%86%85%E5%AE%B9%E8%87%AA%E5%8A%A8%E5%90%91%E4%B8%8B%E5%81%8F%E7%A7%BB%E7%9A%84%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93/"/>
    <id>http://yoursite.com/2017/05/19/iOS-导航栏属性-透明属性translucent-偏移64-滑动视图内容自动向下偏移的问题总结/</id>
    <published>2017-05-19T11:55:12.000Z</published>
    <updated>2017-05-24T15:25:04.000Z</updated>
    
    <content type="html"><![CDATA[<h4 id="translucent属性"><a href="#translucent属性" class="headerlink" title="translucent属性:"></a>translucent属性:</h4><p>百度翻译:半透明的,透亮的,有光泽的;<br>该属性控制的是导航栏的半透明属性,直接影响到的是视图控制器中视图的frame中0点的位置</p>
<p>如果设置如下:<br>(1)</p>
<pre><code>self.navigationController.navigationBar.translucent = NO;

self.view.bounds.size.height 变为原高度 - 64;
</code></pre><p>如果表视图的尺寸设置为屏幕大小的话,在 IOS7以上的系统中,默认使用 屏幕尺寸为原来大小 即给表视图设置了667的高度,会因为这个属性而偏移到屏幕外面:</p>
<p>如果在这种情况下,给导航栏设置背景图片,透明图片(没有影响),如果给导航栏设置一张非透明的背景图片(被平铺),如果给导航栏设置背景颜色(无效);</p>
<p>在</p>
<pre><code>self.navigationController.navigationBar.translucent = NO;的前提下,如果想要视图的0点还是有屏幕左上角开始 而不是从(0,64)开始,那么就需要做的的就是设置另外一个属性
</code></pre><p>如果设置如下:<br>(2)</p>
<pre><code>self.navigationController.navigationBar.translucent = YES;

self.view.bounds.size.height 变为原高度 - 64;
</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;translucent属性&quot;&gt;&lt;a href=&quot;#translucent属性&quot; class=&quot;headerlink&quot; title=&quot;translucent属性:&quot;&gt;&lt;/a&gt;translucent属性:&lt;/h4&gt;&lt;p&gt;百度翻译:半透明的,透亮的,有光泽的;&lt;br&gt;该
    
    </summary>
    
      <category term="开发技术" scheme="http://yoursite.com/categories/%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF/"/>
    
    
      <category term="iOS 开发" scheme="http://yoursite.com/tags/iOS-%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>unrecognized selector的异常</title>
    <link href="http://yoursite.com/2017/05/18/unrecognized-selector%E7%9A%84%E5%BC%82%E5%B8%B8/"/>
    <id>http://yoursite.com/2017/05/18/unrecognized-selector的异常/</id>
    <published>2017-05-18T13:20:30.000Z</published>
    <updated>2017-05-24T15:25:04.000Z</updated>
    
    <content type="html"><![CDATA[<!-- ![](http://ww3.sinaimg.cn/large/006tKfTcgy1ffpty74nmdj30pw0hejuk.jpg) -->
<h3 id="unrecognized-selector的异常之前的三次拯救"><a href="#unrecognized-selector的异常之前的三次拯救" class="headerlink" title="unrecognized selector的异常之前的三次拯救:"></a>unrecognized selector的异常之前的三次拯救:</h3><h4 id="1-Method-resolution"><a href="#1-Method-resolution" class="headerlink" title="1. Method resolution"></a>1. Method resolution</h4><p>objc运行时会调用+resolveInstanceMethod:或者<br> +resolveClassMethod:，让你有机会提供一个函数实现。<br> 如果你添加了函数，那运行时系统就会重新启动一次消息发送的过程，<br> 否则 ，运行时就会移到下一步，消息转发（Message Forwarding）。</p>
<h4 id="2-Fast-forwarding"><a href="#2-Fast-forwarding" class="headerlink" title="2. Fast forwarding"></a>2. Fast forwarding</h4><p>如果目标对象实现了-forwardingTargetForSelector:，<br>Runtime 这时就会调用这个方法，<br>给你把这个消息转发给其他对象的机会。<br> 只要这个方法返回的不是nil和self，整个消息发送的过程就会被重启，<br> 当然发送的对象会变成你返回的那个对象。<br> 否则，就会继续Normal Fowarding。<br>  这里叫Fast，只是为了区别下一步的转发机制。<br>  因为这一步不会创建任何新的对象，<br>  但下一步转发会创建一个NSInvocation对象，所以相对更快点。</p>
<h4 id="3-Normal-forwarding"><a href="#3-Normal-forwarding" class="headerlink" title="3. Normal forwarding"></a>3. Normal forwarding</h4><p>这一步是Runtime最后一次给你挽救的机会。<br>首先它会发送-methodSignatureForSelector:<br>消息获得函数的参数和返回值类型。<br>如果-methodSignatureForSelector:返回nil，<br>Runtime则会发出-doesNotRecognizeSelector:<br>消息，程序这时也就挂掉了。<br>如果返回了一个函数签名，Runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象。</p>
]]></content>
    
    <summary type="html">
    
      &lt;!-- ![](http://ww3.sinaimg.cn/large/006tKfTcgy1ffpty74nmdj30pw0hejuk.jpg) --&gt;
&lt;h3 id=&quot;unrecognized-selector的异常之前的三次拯救&quot;&gt;&lt;a href=&quot;#unrecogniz
    
    </summary>
    
      <category term="开发技术" scheme="http://yoursite.com/categories/%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF/"/>
    
    
      <category term="iOS 开发" scheme="http://yoursite.com/tags/iOS-%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>开始一个项目之前的思考</title>
    <link href="http://yoursite.com/2017/05/17/thinkStart/"/>
    <id>http://yoursite.com/2017/05/17/thinkStart/</id>
    <published>2017-05-17T04:35:37.000Z</published>
    <updated>2017-05-24T15:17:40.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://timgsa.baidu.com/timg?image&amp;quality=80&amp;size=b9999_10000&amp;sec=1495006385145&amp;di=a0b78ebef4ddb744c8476053e29e8adc&amp;imgtype=0&amp;src=http%3A%2F%2Fimgres.roboo.com%2Fgroup7%2FM00%2FEA%2FFE%2FwKhkDFf_woCAABTgAACqp_qaNtQ458.jpg" target="_blank" rel="external">https://timgsa.baidu.com/timg?image&amp;quality=80&amp;size=b9999_10000&amp;sec=1495006385145&amp;di=a0b78ebef4ddb744c8476053e29e8adc&amp;imgtype=0&amp;src=http%3A%2F%2Fimgres.roboo.com%2Fgroup7%2FM00%2FEA%2FFE%2FwKhkDFf_woCAABTgAACqp_qaNtQ458.jpg</a></p>
<h3 id="1-确定编码风格"><a href="#1-确定编码风格" class="headerlink" title="1.确定编码风格"></a>1.确定编码风格</h3><p>风格无对错</p>
<p>OC的<br><a href="https://github.com/NYTimes/objective-c-style-guide" target="_blank" rel="external">https://github.com/NYTimes/objective-c-style-guide</a></p>
<p>swift<br><a href="https://github.com/futurice/ios-good-practices" target="_blank" rel="external">https://github.com/futurice/ios-good-practices</a></p>
<h3 id="2-在写代码之前确定应用程序的架构"><a href="#2-在写代码之前确定应用程序的架构" class="headerlink" title="2.在写代码之前确定应用程序的架构"></a>2.在写代码之前确定应用程序的架构</h3><p>是MVC+ 还是MVVM,还是MVP</p>
<h3 id="3-确定应用的目录结构"><a href="#3-确定应用的目录结构" class="headerlink" title="3.确定应用的目录结构"></a>3.确定应用的目录结构</h3><p><img src="http://ww4.sinaimg.cn/large/006tNbRwgy1ffo9jbkxahj30jk04wq33.jpg" alt=""><br>有人说按着架构MVC,MVVM的形式来,有的又说按照模块来<br>个人认为,小的项目按架构来结构清晰,大型的最好还是按模块来<br>这样方便管理</p>
<h3 id="4-三方框架-依赖的管理"><a href="#4-三方框架-依赖的管理" class="headerlink" title="4.三方框架,依赖的管理"></a>4.三方框架,依赖的管理</h3><p>用pod还是carthage<br>CocoaPods的目的是对用户简单，但是Carthage对用户来说是灵活的、不干涉的。<br>不幸的是，Carthage的最大的缺点是—-只支持iOS8及以后版本。</p>
<h3 id="5-确定切换环境的方式"><a href="#5-确定切换环境的方式" class="headerlink" title="5.确定切换环境的方式"></a>5.确定切换环境的方式</h3><p>在企业开发时候不应该直接用生产环境直接进行开发,二十分为开发环境,测试环境,stable环境这样</p>
<h3 id="6-设置合适的证书"><a href="#6-设置合适的证书" class="headerlink" title="6.设置合适的证书"></a>6.设置合适的证书</h3><p>当团队开发时候,不要随便fix issue</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://timgsa.baidu.com/timg?image&amp;amp;quality=80&amp;amp;size=b9999_10000&amp;amp;sec=1495006385145&amp;amp;di=a0b78ebef4ddb744c8476053e29
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Node.js简单爬虫</title>
    <link href="http://yoursite.com/2017/05/16/Node-js%E7%AE%80%E5%8D%95%E7%88%AC%E8%99%AB/"/>
    <id>http://yoursite.com/2017/05/16/Node-js简单爬虫/</id>
    <published>2017-05-16T13:22:42.000Z</published>
    <updated>2017-05-24T15:25:04.000Z</updated>
    
    <content type="html"><![CDATA[<!-- ![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494951406852&di=367280f924db4e53682be228cea63f93&imgtype=0&src=http%3A%2F%2Fimg.7xz.com%2Fimg%2Fpicimg%2F201612%2F20161230153304_954cb14589aa8cb8868.jpg) -->
<p>最近在看 Node.js的书,不得不佩服作者的创造力;遂踩着前人的脚印<br>及时充电,手把手教你写一个简单的爬虫;</p>
<h3 id="准备好了吗-撒-一库哟"><a href="#准备好了吗-撒-一库哟" class="headerlink" title="准备好了吗 撒,一库哟"></a>准备好了吗 撒,一库哟</h3><pre><code>cd 到你的Coding 目录下
新建一个文件夹
接着进入这个文件夹中,安装 express
npm install express --registry=https://registry.npm.taobao.org
npm install superagent --save
npm install cheerio --save
touch app.js
</code></pre><h4 id="superagent-和-cheerio是什么"><a href="#superagent-和-cheerio是什么" class="headerlink" title="superagent 和 cheerio是什么?"></a>superagent 和 cheerio是什么?</h4><p>superagent它是一个强大并且可读性很好的轻量级ajaxAPI，<br>是一个关于HTTP方面的一个库，而且它可以将链式写法玩的出神入化。<br>可以理解成一个 Node.js 版的 jquery，<br>用来从网页中以 css selector 取数据，使用方式跟 jquery 一样一样的。</p>
<h5 id="接下来就是在-app-js-中写代码了-准备工作已经完成-比如这里爬取的是-cNodejs-优秀的-node-社区"><a href="#接下来就是在-app-js-中写代码了-准备工作已经完成-比如这里爬取的是-cNodejs-优秀的-node-社区" class="headerlink" title="接下来就是在 app.js 中写代码了,准备工作已经完成,比如这里爬取的是 cNodejs(优秀的 node 社区)"></a>接下来就是在 app.js 中写代码了,准备工作已经完成,比如这里爬取的是 cNodejs(优秀的 node 社区)</h5><pre><code>var express = require(&apos;express&apos;);
var superagent = require(&apos;superagent&apos;);
var cheerio = require(&apos;cheerio&apos;);


var app = express();

app.get(&apos;/&apos;, function(req, res, next) {
 // 用 superagent 去抓取 https://cnodejs.org/ 的内容
superagent.get(&apos;https://cnodejs.org/&apos;)
  .end(function(err, sres) {
    // 常规的错误处理
    if (err) {
      return next(err);
    }
    var items = [];
    // sres.text 里面存储着网页的 html 内容，将它传给 cheerio.load，习惯性地命名为 `$`
    // 接下来就可以使用熟悉的 jquery 操作了
    var $ = cheerio.load(sres.text);
    $(&apos;#topic_list .cell&apos;).each(function(index, element) {
      var $img = $(element).find(&apos;img&apos;);
      var $topic = $(element).find(&apos;.topic_title&apos;);
      items.push({
        author: $img.attr(&apos;title&apos;),
        title: $topic.attr(&apos;title&apos;),
        href: $topic.attr(&apos;href&apos;)
      });
    });
    res.send(items);
  });
});

app.listen(3000, function() {
 console.log(&apos;app is listening at port 3000&apos;);
});
</code></pre><h4 id="接着上面的终端里输入-node-app-js"><a href="#接着上面的终端里输入-node-app-js" class="headerlink" title="接着上面的终端里输入 node app.js"></a>接着上面的终端里输入 node app.js</h4><p>然后就可以在<a href="http://localhost:3000中看到抓取的数据了" target="_blank" rel="external">http://localhost:3000中看到抓取的数据了</a><br>如下图所示:<br><img src="http://ww4.sinaimg.cn/large/006tNbRwgy1ffnj88n5d8j30s2122dmg.jpg" alt=""></p>
]]></content>
    
    <summary type="html">
    
      &lt;!-- ![](https://timgsa.baidu.com/timg?image&amp;quality=80&amp;size=b9999_10000&amp;sec=1494951406852&amp;di=367280f924db4e53682be228cea63f93&amp;imgtype=0&amp;src
    
    </summary>
    
      <category term="开发技术" scheme="http://yoursite.com/categories/%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF/"/>
    
    
      <category term="NodeJS" scheme="http://yoursite.com/tags/NodeJS/"/>
    
  </entry>
  
  <entry>
    <title>永恒之蓝(勒索蠕虫)修复指南</title>
    <link href="http://yoursite.com/2017/05/15/%E6%B0%B8%E6%81%92%E4%B9%8B%E8%93%9D-%E5%8B%92%E7%B4%A2%E8%A0%95%E8%99%AB-%E4%BF%AE%E5%A4%8D%E6%8C%87%E5%8D%97/"/>
    <id>http://yoursite.com/2017/05/15/永恒之蓝-勒索蠕虫-修复指南/</id>
    <published>2017-05-15T11:57:46.000Z</published>
    <updated>2017-05-19T15:00:16.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://timgsa.baidu.com/timg?image&amp;quality=80&amp;size=b9999_10000&amp;sec=1494860682820&amp;di=0f1fb4769f245c3ebba2960ff4653627&amp;imgtype=0&amp;src=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fw%253D580%2Fsign%3D6e5b3ae0af345982c58ae59a3cf5310b%2F26508435e5dde7116969ed62a5efce1b9c16619a.jpg" alt=""><br>本次威胁主要影响以下操作系统: 桌面版本操作系统:</p>
<pre><code>Windows 2000
Windows XP
Windows Vista
Windows7
Windows8
Windows8.1
Windows10
</code></pre><p>为了确保周一开机时公司电脑和服务器免遭病毒感染或避免更大范围的传播，<br>技术部制定了本文档，用于指导公司小伙伴 根据指南内容进行安全操作。<br>我们选用了 360 勒索蠕虫漏洞修复工具，此修复工具集成免疫、 SMB 服务关闭和各系统下 MS17-010 漏洞检测与修复于一体。<br>可在离线网络环境下一键式修复系统存在的 MS17-010 漏洞，根本解决勒索蠕虫利用 MS17-010 漏洞带来的安全隐患。<br>另外近期网络安全事故频发，Windows 电脑需要安装金山毒霸或者 360 杀毒。</p>
<h4 id="第一步、修复工具及补丁包安装"><a href="#第一步、修复工具及补丁包安装" class="headerlink" title="第一步、修复工具及补丁包安装:"></a>第一步、修复工具及补丁包安装:</h4><p>公司内网下载:点击下载 xxx.zip (公司内网地址)<br>外网下载: 点击下载 <a href="http://down.b.360.cn/EternalBlueFix.zip" target="_blank" rel="external">http://down.b.360.cn/EternalBlueFix.zip</a> 下图为补丁包目录，根据自己系统版本和位数进行选择安装。<br><img src="http://ww3.sinaimg.cn/large/006tKfTcgy1ffmaxcc6djj30oo0iw79x.jpg" alt=""></p>
<h4 id="二、关闭-445-端口操作。"><a href="#二、关闭-445-端口操作。" class="headerlink" title="二、关闭 445 端口操作。"></a>二、关闭 445 端口操作。</h4><p>在 Windows 系统右键点击“我的电脑”，在“服务和应用程序”下的服务项中双击“Server”，<br>在出现的 Server 属性 页面中对“启动类型”选择禁用，并点击“停止”按钮关闭服务。<br>操作成功后，建议重启系统以确保生效。</p>
<p><img src="http://ww3.sinaimg.cn/large/006tKfTcgy1ffmazv3zrrj30u00ieted.jpg" alt=""></p>
<h4 id="三、关闭-139-端口操作"><a href="#三、关闭-139-端口操作" class="headerlink" title="三、关闭 139 端口操作"></a>三、关闭 139 端口操作</h4><pre><code>1、右键任务栏网络图标或开打控制面板找到“网络与共享中心”选项;
2、点击“更改适配器设置”;
3、右键本地连接或无线连接的“属性”;
4、打开”Intelnet 协议版本 4(TCP/IPV4)”，可参加下图操作步骤。
最后一定要点击“确定”进行保存操作。
</code></pre><p><img src="http://ww1.sinaimg.cn/large/006tKfTcgy1ffmb2fxbisj31380nkafr.jpg" alt=""></p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;https://timgsa.baidu.com/timg?image&amp;amp;quality=80&amp;amp;size=b9999_10000&amp;amp;sec=1494860682820&amp;amp;di=0f1fb4769f245c3ebba2960ff4
    
    </summary>
    
      <category term="技术支持" scheme="http://yoursite.com/categories/%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81/"/>
    
    
      <category term="技术支持" scheme="http://yoursite.com/tags/%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81/"/>
    
  </entry>
  
  <entry>
    <title>fastlane的使用</title>
    <link href="http://yoursite.com/2017/05/12/fastlane%E7%9A%84%E4%BD%BF%E7%94%A8/"/>
    <id>http://yoursite.com/2017/05/12/fastlane的使用/</id>
    <published>2017-05-12T12:41:51.000Z</published>
    <updated>2017-05-12T14:22:38.000Z</updated>
    
    <content type="html"><![CDATA[<h4 id="对于一个iOS-APP的发布上线，一般来说都需要经历"><a href="#对于一个iOS-APP的发布上线，一般来说都需要经历" class="headerlink" title="对于一个iOS APP的发布上线，一般来说都需要经历:"></a>对于一个iOS APP的发布上线，一般来说都需要经历:</h4><p>编译打包 -&gt; 截图 -&gt; 填写一些说明文字 -&gt; 上传ipa到itunes connect -&gt; 提交供审核。<br>每次都要进行这么多“繁琐”的步骤，对于某些步骤可能一次还不能执行成功需要等着界面提示上传错误然后手动重新再来一次。</p>
<p>在日常开发中，打包也是最后上线不可缺少的环节，如果需要生成ipa文件通常需要在Xcode里<br>点击Product -&gt; Archive，然后在弹出来的Organizer中选择导出什么类型(ad hoc/enterprise)的包。对于大项目来说动辄编译十分钟以上的来说，一天打几个包就差不多过去了。</p>
<p>为了解决这些问题，Felix Krause大神写了一个工具集fastlane。<br>fastlane是一套使用Ruby写的自动化工具集，用于iOS和Android自动化打包和发布.</p>
<p><img src="http://blog.devzeng.com/images/ios-fastlane-in-action/fastlane-logo.png" alt="image"></p>
<h2 id="fastlane-的安装"><a href="#fastlane-的安装" class="headerlink" title="fastlane 的安装"></a>fastlane 的安装</h2><h4 id="1-首先确保安装的-xcode-命令行是最新的"><a href="#1-首先确保安装的-xcode-命令行是最新的" class="headerlink" title="1.首先确保安装的 xcode 命令行是最新的"></a>1.首先确保安装的 xcode 命令行是最新的</h4><p>   如果尚未安装可使用下面命令安装</p>
<pre><code>xcode-select --install
</code></pre><h4 id="2-安装fastlane"><a href="#2-安装fastlane" class="headerlink" title="2.安装fastlane"></a>2.安装fastlane</h4><pre><code>    sudo gem install fastlane
部分人的mac会提示
*ERROR:  While executing gem ... (Errno::EPERM)
               Operation not permitted - /usr/bin/rougify
               *
</code></pre><p>  原因正如提示所说,可以使用下面的命令进行安装</p>
<pre><code>sudo gem install -n /usr/local/bin fastlane
</code></pre><h4 id="当出现如下一大坨时候表示安装成功了"><a href="#当出现如下一大坨时候表示安装成功了" class="headerlink" title="当出现如下一大坨时候表示安装成功了."></a>当出现如下一大坨时候表示安装成功了.</h4><p> <img src="http://ww1.sinaimg.cn/large/006tNbRwgy1ffivh5ki06j30wi0p4gue.jpg" alt=""></p>
<h4 id="3-fastlane组件"><a href="#3-fastlane组件" class="headerlink" title="3.fastlane组件"></a>3.fastlane组件</h4><p> fastlane是一个工具集，包含了我们日常开发中上线时需要的大部分操作。比如gym/deliver等。下面对每个工具进行介绍：</p>
<pre><code>名称    说明
deliver    自动上传截图，APP的元数据，二进制(ipa)文件到iTunes Connect
snapshot    自动截图（基于Xcode7的UI test）
frameit    可以把截的图片自动套上一层外边框
pem    自动生成、更新推送配置文件
 sigh    用来创建、更新、下载、修复Provisioning Profile的工具
 produce    如果你的产品还没在iTunes Connect(iTC)或者Apple Developer Center(ADC)建立，produce可以自动帮你完成这些工作
 cert    自动创建管理iOS代码签名证书
 pilot    管理TestFlight的测试用户，上传二进制文件
 boarding    建立一个添加测试用户界面，发给测试者，可自行添加邮件地址，并同步到iTunes Connect(iTC)
gym    自动化编译打包工具
match    证书和配置文件管理工具
scan    自动运行测试工具，并且可以生成漂亮的HTML报告
</code></pre><h4 id="4-fastlane核心概念"><a href="#4-fastlane核心概念" class="headerlink" title="4.fastlane核心概念"></a>4.fastlane核心概念</h4><p>在运行fastlane命令行工具的时候，会读取当前目录下面的fastlane文件夹里面的Fastfile配置文件。里面定义了一个个的lane，下面是官方提供的一个示例：</p>
<pre><code>lane :beta do
increment_build_number
cocoapods
match
testflight
sh &quot;./customScript.sh&quot;
slack
end
</code></pre><p>像<em>increment_build_number</em>、<em>cocoapods</em>这样的一条命令都是一个action，<br>由这样的一个个action组成了一个lane（lane中可以调用其他的lane)。</p>
<h2 id="fastlane实战"><a href="#fastlane实战" class="headerlink" title="fastlane实战"></a>fastlane实战</h2><h4 id="1、初始化"><a href="#1、初始化" class="headerlink" title="1、初始化"></a>1、初始化</h4><p>在项目的根目录下面，执行fastlane init命令开始初始化。<br>在执行的过程中会要求填写一些项目的资料，如Apple ID等，fastlane会自动检测当前目录下项目的App Name和App Identifier，可以选择自行输入这些信息。初始化完成会在当前目录下面生成一个fastlane的文件夹。</p>
<p><img src="http://blog.devzeng.com/images/ios-fastlane-in-action/fastlane-init.png" alt=""></p>
<p>最重要的两个文件就是Appfile和Fastfile，主要的说明如下：</p>
<p>（1）Appfile里面存放了App的基本信息包括app_identifier、apple_id、team_id等，如果在init的时候输入了正确的apple_id和密码会自动获取team_id。</p>
<p>（2）Fastfile是最重要的一个文件，在这个里面可以编写和定制我们的自动化脚本，所有的流程控制功能都写在这个文件里面。</p>
<p>说明：</p>
<p>（1）如果在init的时候选择了在iTunes Connect创建App，那么fastlane会调用produce进行初始化，如果没有创建后续可以手动执行produce init进行创建。如果没有在初始化的时候选择执行produce流程当然deliver也不会执行，后面可以使用deliver init运行是一样的。</p>
<p>（2）在iTunes Connect中成功创建App之后，fastlane文件夹里面会生成一个Deliverfile的文件。Deliverfile文件主要是deliver的一些配置信息。</p>
<h4 id="2、Fastfile文件"><a href="#2、Fastfile文件" class="headerlink" title="2、Fastfile文件"></a>2、Fastfile文件</h4><p>Fastfile文件的主要结构如下所示：</p>
<pre><code>fastlane_version &quot;2.14.2&quot;
default_platform :ios

platform :ios do
before_all do
       cocoapods
  end

  lane :test do
  end

  lane :beta do
  end

  lane :release do
  end

  after_all do |lane|

  end

  error do |lane, exception|

          end
end
</code></pre><p>说明：</p>
<p>（1）fastlane_version：指定fastlane使用的最小版本<br>（2）default_platform：指定当前默认的平台，可以选择ios/android/mac<br>（3）before_all：在执行每一个lane之前都会调用这部分的内容<br>（4）after_all：在每个lane执行完成之后都会执行这部分的内容<br>（5）error：每个lane执行出错就会执行这部分的内容<br>（6）desc：对lane的描述，fastlane会自动将desc的内容生成说明文档<br>（7）lane：定义一个lane(任务)，可以理解为一个函数，我们在执行的时候使用fastlane [ios] lane名称</p>
<h4 id="3、Fastfile文件的编写"><a href="#3、Fastfile文件的编写" class="headerlink" title="3、Fastfile文件的编写"></a>3、Fastfile文件的编写</h4><pre><code>lane :release do |option|
#根据传入参数version设置app的版本号
increment_version_number(version_number: option[:version])
#自动增加build号
increment_build_number
#证书签名
sigh
#编译打包
scheme_name = option[:scheme]
configuration = &apos;Release&apos;
version = get_info_plist_value(path: &quot;./#{scheme_name}/Info.plist&quot;, key: &quot;CFBundleShortVersionString&quot;)
build = get_info_plist_value(path: &quot;./#{scheme_name}/Info.plist&quot;, key: &quot;CFBundleVersion&quot;)
output_directory = File.expand_path(&quot;..&quot;, Dir.pwd) + File::Separator + &apos;build&apos;
output_name = &quot;#{scheme_name}_#{configuration}_#{version}_#{build}_#{Time.now.strftime(&apos;%Y%m%d%H%M%S&apos;)}.ipa&quot;
gym(scheme: scheme_name, clean: true, export_method:&apos;appstore&apos;, configuration: configuration, output_directory: output_directory, output_name: output_name)
 end
</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;对于一个iOS-APP的发布上线，一般来说都需要经历&quot;&gt;&lt;a href=&quot;#对于一个iOS-APP的发布上线，一般来说都需要经历&quot; class=&quot;headerlink&quot; title=&quot;对于一个iOS APP的发布上线，一般来说都需要经历:&quot;&gt;&lt;/a&gt;对于一个iOS
    
    </summary>
    
      <category term="开发技术" scheme="http://yoursite.com/categories/%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF/"/>
    
    
      <category term="iOS 开发" scheme="http://yoursite.com/tags/iOS-%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>惆怅甚至于迷茫</title>
    <link href="http://yoursite.com/2017/05/11/%E8%BF%99%E8%BF%B7%E9%9B%BE%E5%88%B0%E5%BA%95%E6%80%8E%E4%B9%88%E5%86%B2%E7%A0%B4/"/>
    <id>http://yoursite.com/2017/05/11/这迷雾到底怎么冲破/</id>
    <published>2017-05-11T09:05:00.000Z</published>
    <updated>2017-05-12T14:24:19.000Z</updated>
    
    <content type="html"><![CDATA[<p>想不明白,这是不是也算一种遇人不淑</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;想不明白,这是不是也算一种遇人不淑&lt;/p&gt;

    
    </summary>
    
      <category term="意乱情迷" scheme="http://yoursite.com/categories/%E6%84%8F%E4%B9%B1%E6%83%85%E8%BF%B7/"/>
    
    
      <category term="iOS 开发" scheme="http://yoursite.com/tags/iOS-%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>iOS 10 Charles 抓 HTTPS 的包的</title>
    <link href="http://yoursite.com/2017/05/11/%E5%AE%89%E5%BE%97%E5%B9%BF%E5%8E%A6%E5%8D%83%E4%B8%87%E9%97%B4/"/>
    <id>http://yoursite.com/2017/05/11/安得广厦千万间/</id>
    <published>2017-05-11T08:50:15.000Z</published>
    <updated>2017-05-12T14:16:08.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="这里只说与之前不同的地方-不说之前的-mobile-证书安装之类的"><a href="#这里只说与之前不同的地方-不说之前的-mobile-证书安装之类的" class="headerlink" title="这里只说与之前不同的地方,不说之前的 mobile 证书安装之类的:"></a>这里只说与之前不同的地方,不说之前的 mobile 证书安装之类的:</h3><h3 id="当你想-iOS10以下的一样设置完发现还是不能在-iOS10上抓-HTTPS-百感交集啊"><a href="#当你想-iOS10以下的一样设置完发现还是不能在-iOS10上抓-HTTPS-百感交集啊" class="headerlink" title="当你想 iOS10以下的一样设置完发现还是不能在 iOS10上抓 HTTPS 百感交集啊"></a>当你想 iOS10以下的一样设置完发现还是不能在 iOS10上抓 HTTPS 百感交集啊</h3><h4 id="解决办法"><a href="#解决办法" class="headerlink" title="解决办法:"></a>解决办法:</h4><pre><code>来到设置-&gt;关于本机-&gt;证书信任设置
</code></pre><p><img src="http://ww2.sinaimg.cn/large/006tKfTcgy1ffhqmimwyxj309w0hmdgc.jpg" alt=""></p>
]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;这里只说与之前不同的地方-不说之前的-mobile-证书安装之类的&quot;&gt;&lt;a href=&quot;#这里只说与之前不同的地方-不说之前的-mobile-证书安装之类的&quot; class=&quot;headerlink&quot; title=&quot;这里只说与之前不同的地方,不说之前的 mobile 
    
    </summary>
    
      <category term="开发技术" scheme="http://yoursite.com/categories/%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF/"/>
    
    
      <category term="iOS 开发" scheme="http://yoursite.com/tags/iOS-%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
</feed>
