<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>GSmoke</title>
    <description>欢迎来到我的个人站~</description>
    <link>https://gsmoke.github.io//</link>
    <atom:link href="https://gsmoke.github.io//feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 08 Jun 2018 09:15:03 +0000</pubDate>
    <lastBuildDate>Fri, 08 Jun 2018 09:15:03 +0000</lastBuildDate>
    <generator>Jekyll v3.7.3</generator>
    
      <item>
        <title>苦逼代码，幸福程序员</title>
        <description>&lt;p&gt;　　对于大家来说，Wifi 应该是一个很熟悉的词了，我们每天都可能在使用 Wifi 热点。Wifi 除了能给我们提供热点之外同时还有定位的作用， 现在移动设备的对用户的隐私保护是越来越严格了，就如定位功能，必须要经过设备用户的授权才能使用 Location 给这台设备定位。这些严格的隐私政策对用户起到到保护作用，但对开发人员却是一种阻碍，在产品强需求的情况下用户是会授权的，如地图类应用，但是另外一些没有对定位强需求的产品，用户可能就不会给你授权了，这是我们可以考虑下 Wifi 定位了。&lt;/p&gt;

&lt;h3 id=&quot;wifi-定位原理&quot;&gt;Wifi 定位原理&lt;/h3&gt;

&lt;p&gt;　　当我们使用手机扫面 Wifi 的时候，其实就可以定位到这台手机的位置信息了。每个 Wifi 路由开启后，都会不停的往四周发射信号，我们把 Wifi 路由想象成太阳以某种频度不停的往周围发射电磁波，电磁波会因距离的削弱，同时也会因为物体阻挡而削弱。例子就是我们在离 Wifi 路由器同样远的位置，有些地方信号强度高有些地方信号强度低。路由同时也叫 Wifi 热点（或者 Wifi AP：Access Point）。每一个 Wifi 路由器都会有一个 BSSID，很多人都管这个 BSSID 叫 MAC 地址（其实 BSSID 并不是 MAC 地址），BSSID 设定了一般就不会在变也不会重复，也就意味着是全球唯一的，这是路由制造的规则，既然有规则那么就会有不遵守规则的人，文章结尾会介绍不遵守规则的人是如何害人害己的。&lt;/p&gt;

&lt;p&gt;　　刚才提到的 BSSID，在 Wifi 路由器的发射中是可以检测到的，同时 Wifi 路由信号还伴随着，SSID(路由器的名称：如XX的Wifi)、signalStrength（手机接收到Wifi的信号强度）及其它信息。看到这里你应该知道如何使用Wifi定位的了，条件：唯一不变的BSSID 和 手机到路由器的信号强度。思路：Wifi 信号是有范围的，我们假设这个范围就是10米为半径的一个圆(实际情况根据Wifi路由厂商和路由器周围环境而定)，我们去采集一些Wifi热点回来，某家水果店的 Wifi、某家餐馆的 Wifi 等等，我们自己去采集的我们肯定知道他们的具体位置，及刚才提到的 Wifi 中的信息：BSSID、SSID、signalStrength，再把他们存入数据库，采集的人可以很多：专业采集人员、出租车司机、快递员等等，他们经常穿梭于大街小巷，其实我们每个人都是Wifi数据库的采集人员，我们的手机厂商每天都在默默的采集着我们的位置信息，iPhone手机系统设置里就可以看到你今天去哪了，你的Wifi连接过哪些设备也是知道的。时间越久Wifi数据库信息越丰富，最终会发现每个BSSID会对应多个SSID和signalStrength，因为SSID是可以修改的，signalStrength是由于在这个Wifi热点的周围不同位置采集的，所以信号强度也不同。采集的信号强度越多，给BSSID也就是这个Wifi热点的定位就越精准。&lt;/p&gt;

&lt;p&gt;　　现在如果我去一个陌生的地方，我打开手机扫描周围的 Wifi 刚好扫描到了一个或几个，我把这个 Wifi 信息（BSSID）传给服务器，服务器通过这个 BSSID 去数据库查找，就能直接匹配到对应的位置，返回给我。如果匹配不到则表示这里没人来采集过 Wifi 信息，或者是这个 Wifi 热点是最近布置的，采集人员还没来得及采集。服务器可以把这些未采集到的先分类后期统一规划。&lt;/p&gt;

&lt;p&gt;　　Wifi 定位整体功能是需要服务端来配合的，也就表示必须要有网络环境才行。其实移动端(手机、Pad等)也可以独立完成，不过对技术和设备硬件要求会高很多，全球的 Wifi 热点是一个很庞大的数据量，需要经过高精度的无损压缩后放在内存很大的手机里才行，或许多年以后可以实现吧(即使技术上能实现了，对于产品和研发来说收益、风险、和工作量又是一场PK)&lt;/p&gt;

&lt;h3 id=&quot;ios-申请获取-wifi-列表权限&quot;&gt;iOS 申请获取 Wifi 列表权限&lt;/h3&gt;

&lt;p&gt;　　知道了原理有啥用呢，能实现么？好吧现在就遇到问题了，移动设备如今主要是 Andorid 和 iOS, Android 上可以直接扫描 Wifi 列表获取相关信息，自己去网上找找, 所以说会原理不一定会技术实现，我也就只能讲讲 iOS 的技术实现了。              &lt;br /&gt;
　　iOS 上获取 Wifi 列表其实也有很大限制，在 iOS 9 以前是不能获取Wifi列表的，只能获取当前连接的 Wifi 信息，也就表示只有连接了 Wifi 才能定位，刚才文章说到的场景是，我在一个陌生的原理，拿出手机扫描 Wifi ，也就是我并没连接那里的 Wifi（我不知道密码我怎么连啊）。Apple 在 iOS 9 以后，提供了获取Wifi列表的API，但是获取Wifi列表是有门槛的，主要步骤有：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;1、向 Apple 申请开发 Network Extension 权限&lt;/li&gt;
    &lt;li&gt;2、申请包含 Network Extension 的描述文件&lt;/li&gt;
    &lt;li&gt;3、配置 Info.plist&lt;/li&gt;
    &lt;li&gt;4、配置 entitlements&lt;/li&gt;
    &lt;li&gt;5、iOS 获取 Wifi 列表代码实现&lt;/li&gt;
    &lt;li&gt;6、获取Wifi列表回调&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;1向-apple-申请开发-network-extension-权限&quot;&gt;1、向 Apple 申请开发 Network Extension 权限&lt;/h3&gt;

&lt;p&gt;　　首先要先写封邮件给 &lt;a href=&quot;mailto:networkextension@apple.com&quot;&gt;networkextension@apple.com&lt;/a&gt; ，问苹果要开发 Network Extension 的权限。   &lt;br /&gt;
苹果收到邮件后会自动回复邮件，在 &lt;a href=&quot;https://developer.apple.com/contact/network-extension/&quot;&gt;https://developer.apple.com/contact/network-extension/&lt;/a&gt; 里面填写申请表格，内容包括：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Organization：               

Company / Product URL:             

What's your product's target market?              

What's your company's primary function?             

Describe your application and how it will use the Network Extension framework.            

What type of entitlement are you requesting?                     

。。。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;申请后大概两周左右能收到 Aplle的 确认信，如：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Hi,

Thanks for your interest in the Network Extension APIs.

We added a new template containing the Network Extension entitlements to your team.

。。。。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;2申请包含-network-extension-的描述文件&quot;&gt;2、申请包含 Network Extension 的描述文件&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/PastedGraphic.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;选择包含 Network Extension 的描述文件，后点击下载，下载完成双击描述文件。&lt;/p&gt;

&lt;h3 id=&quot;3配置-infoplist&quot;&gt;3、配置 Info.plist&lt;/h3&gt;

&lt;p&gt;Xcode Info.plist 里 Required background modes 添加 一个 network-authentication(item)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/infoplist.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;4配置-entitlements&quot;&gt;4、配置 entitlements&lt;/h3&gt;

&lt;p&gt;Demo.entitlements（Demo是项目名称） 里添加 Key-Value: com.apple.developer.networking.HotspotHelper -&amp;gt; YES&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/entitlement.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;5ios-获取-wifi-列表代码实现&quot;&gt;5、iOS 获取 Wifi 列表代码实现&lt;/h3&gt;

&lt;p&gt;导入头文件&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#import &amp;lt;NetworkExtension/NetworkExtension.h&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;代码实现&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- (void)getWifiList {

	if (![[[UIDevice currentDevice] systemVersion] floatValue] &amp;gt;= 9.0) {return;}
	dispatch_queue_t queue = dispatch_queue_create(&quot;com.leopardpan.HotspotHelper&quot;, 0);
	[NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
		if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
			for (NEHotspotNetwork* network  in cmd.networkList) {
				NSLog(@&quot;network.SSID = %@&quot;,network.SSID);
			}
		}
	}];
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;kNEHotspotHelperCommandTypeFilterScanList： 表示扫描到 Wifi 列表信息。&lt;/p&gt;

&lt;p&gt;NEHotspotNetwork 里有如下信息：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;SSID：Wifi 名称&lt;/li&gt;
    &lt;li&gt;BSSID：站点的 MAC 地址&lt;/li&gt;
    &lt;li&gt;signalStrength： Wifi信号强度，该值在0.0-1.0之间&lt;/li&gt;
    &lt;li&gt;secure：网络是否安全 (不需要密码的 Wifi，该值为 false)&lt;/li&gt;
    &lt;li&gt;autoJoined： 设备是否自动连接该 Wifi，目前测试自动连接以前连过的 Wifi 的也为 false 。&lt;/li&gt;
    &lt;li&gt;justJoined：网络是否刚刚加入&lt;/li&gt;
    &lt;li&gt;chosenHelper：HotspotHelper是否为网络的所选助手&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://developer.apple.com/reference/networkextension/nehotspotnetwork&quot;&gt;官方文档连接&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;6获取wifi列表回调&quot;&gt;6、获取Wifi列表回调&lt;/h3&gt;

&lt;p&gt;当你把上面的代码写完，并成功运行项目后，发现并没有Wifi列表的回调。因为你还没刷新Wifi列表，你需要：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;打开手机系统设置 -&amp;gt; WLAN -&amp;gt; 系统 Wifi 列表加载出来时，上面代码部分才会回调，才能获取到 Wifi 列表。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/WLAN.png&quot; height=&quot;360&quot; width=&quot;200&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这个时候你就能看到控制台源源不断的Log。&lt;/p&gt;

&lt;h3 id=&quot;注意事项&quot;&gt;注意事项&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;1、获取Wifi列表功能由于是需要申请后台权限，所以能后台激活App(应用程序)，而且激活后App的进程能存活几个小时。&lt;/li&gt;
  &lt;li&gt;2、整个获取Wifi列表不需要App用户授权，也就是在App用户无感知下获取设备的Wifi列表信息，使用时请正当使用。&lt;/li&gt;
  &lt;li&gt;3、Wifi列表获取 NetworkExtension 是 iOS 9以后才出的，目前 iOS 9 已经覆盖很广了。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下面付一张来自 &lt;a href=&quot;https://www.talkingdata.com/index/#/device/os/zh_CN&quot;&gt;TalkingData 对iOS操作系统的统计报表&lt;/a&gt;，时间：2017-01-03&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/systemVersion.png&quot; height=&quot;280&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;qa&quot;&gt;Q&amp;amp;A&lt;/h3&gt;

&lt;p&gt;在操作过程或者文章有问题的话欢迎在 &lt;a href=&quot;http://baixin.io/2017/01/iOS_Wifilist/&quot;&gt;原文&lt;/a&gt; 里提问或指正。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;使用 Demo 我就不提供了，你如果没有申请 NetworkExtension 权限，提供了 Demo 你也无法使用。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;参考资源：&lt;a href=&quot;http://stackoverflow.com/questions/31704292/nehotspothelper-networkextension-api-ios9-0&quot;&gt;NEHotspotHelper NetworkExtension API iOS9.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
转载请注明：&lt;a href=&quot;http://baixin&quot;&gt;潘柏信的博客&lt;/a&gt; » &lt;a href=&quot;http://baixin.io/2017/01/iOS_Wifilist/&quot;&gt;Wifi 定位原理及 iOS Wifi 列表获取&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 08 Jun 2018 00:00:00 +0000</pubDate>
        <link>https://gsmoke.github.io//2018/06/08/iOS_Wifilist/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2018/06/08/iOS_Wifilist/</guid>
        
        <category>iOS</category>
        
        
        <category>iOS</category>
        
      </item>
    
      <item>
        <title>Wifi 定位原理及 iOS Wifi 列表获取</title>
        <description>&lt;p&gt;　　对于大家来说，Wifi 应该是一个很熟悉的词了，我们每天都可能在使用 Wifi 热点。Wifi 除了能给我们提供热点之外同时还有定位的作用， 现在移动设备的对用户的隐私保护是越来越严格了，就如定位功能，必须要经过设备用户的授权才能使用 Location 给这台设备定位。这些严格的隐私政策对用户起到到保护作用，但对开发人员却是一种阻碍，在产品强需求的情况下用户是会授权的，如地图类应用，但是另外一些没有对定位强需求的产品，用户可能就不会给你授权了，这是我们可以考虑下 Wifi 定位了。&lt;/p&gt;

&lt;h3 id=&quot;wifi-定位原理&quot;&gt;Wifi 定位原理&lt;/h3&gt;

&lt;p&gt;　　当我们使用手机扫面 Wifi 的时候，其实就可以定位到这台手机的位置信息了。每个 Wifi 路由开启后，都会不停的往四周发射信号，我们把 Wifi 路由想象成太阳以某种频度不停的往周围发射电磁波，电磁波会因距离的削弱，同时也会因为物体阻挡而削弱。例子就是我们在离 Wifi 路由器同样远的位置，有些地方信号强度高有些地方信号强度低。路由同时也叫 Wifi 热点（或者 Wifi AP：Access Point）。每一个 Wifi 路由器都会有一个 BSSID，很多人都管这个 BSSID 叫 MAC 地址（其实 BSSID 并不是 MAC 地址），BSSID 设定了一般就不会在变也不会重复，也就意味着是全球唯一的，这是路由制造的规则，既然有规则那么就会有不遵守规则的人，文章结尾会介绍不遵守规则的人是如何害人害己的。&lt;/p&gt;

&lt;p&gt;　　刚才提到的 BSSID，在 Wifi 路由器的发射中是可以检测到的，同时 Wifi 路由信号还伴随着，SSID(路由器的名称：如XX的Wifi)、signalStrength（手机接收到Wifi的信号强度）及其它信息。看到这里你应该知道如何使用Wifi定位的了，条件：唯一不变的BSSID 和 手机到路由器的信号强度。思路：Wifi 信号是有范围的，我们假设这个范围就是10米为半径的一个圆(实际情况根据Wifi路由厂商和路由器周围环境而定)，我们去采集一些Wifi热点回来，某家水果店的 Wifi、某家餐馆的 Wifi 等等，我们自己去采集的我们肯定知道他们的具体位置，及刚才提到的 Wifi 中的信息：BSSID、SSID、signalStrength，再把他们存入数据库，采集的人可以很多：专业采集人员、出租车司机、快递员等等，他们经常穿梭于大街小巷，其实我们每个人都是Wifi数据库的采集人员，我们的手机厂商每天都在默默的采集着我们的位置信息，iPhone手机系统设置里就可以看到你今天去哪了，你的Wifi连接过哪些设备也是知道的。时间越久Wifi数据库信息越丰富，最终会发现每个BSSID会对应多个SSID和signalStrength，因为SSID是可以修改的，signalStrength是由于在这个Wifi热点的周围不同位置采集的，所以信号强度也不同。采集的信号强度越多，给BSSID也就是这个Wifi热点的定位就越精准。&lt;/p&gt;

&lt;p&gt;　　现在如果我去一个陌生的地方，我打开手机扫描周围的 Wifi 刚好扫描到了一个或几个，我把这个 Wifi 信息（BSSID）传给服务器，服务器通过这个 BSSID 去数据库查找，就能直接匹配到对应的位置，返回给我。如果匹配不到则表示这里没人来采集过 Wifi 信息，或者是这个 Wifi 热点是最近布置的，采集人员还没来得及采集。服务器可以把这些未采集到的先分类后期统一规划。&lt;/p&gt;

&lt;p&gt;　　Wifi 定位整体功能是需要服务端来配合的，也就表示必须要有网络环境才行。其实移动端(手机、Pad等)也可以独立完成，不过对技术和设备硬件要求会高很多，全球的 Wifi 热点是一个很庞大的数据量，需要经过高精度的无损压缩后放在内存很大的手机里才行，或许多年以后可以实现吧(即使技术上能实现了，对于产品和研发来说收益、风险、和工作量又是一场PK)&lt;/p&gt;

&lt;h3 id=&quot;ios-申请获取-wifi-列表权限&quot;&gt;iOS 申请获取 Wifi 列表权限&lt;/h3&gt;

&lt;p&gt;　　知道了原理有啥用呢，能实现么？好吧现在就遇到问题了，移动设备如今主要是 Andorid 和 iOS, Android 上可以直接扫描 Wifi 列表获取相关信息，自己去网上找找, 所以说会原理不一定会技术实现，我也就只能讲讲 iOS 的技术实现了。              &lt;br /&gt;
　　iOS 上获取 Wifi 列表其实也有很大限制，在 iOS 9 以前是不能获取Wifi列表的，只能获取当前连接的 Wifi 信息，也就表示只有连接了 Wifi 才能定位，刚才文章说到的场景是，我在一个陌生的原理，拿出手机扫描 Wifi ，也就是我并没连接那里的 Wifi（我不知道密码我怎么连啊）。Apple 在 iOS 9 以后，提供了获取Wifi列表的API，但是获取Wifi列表是有门槛的，主要步骤有：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;1、向 Apple 申请开发 Network Extension 权限&lt;/li&gt;
    &lt;li&gt;2、申请包含 Network Extension 的描述文件&lt;/li&gt;
    &lt;li&gt;3、配置 Info.plist&lt;/li&gt;
    &lt;li&gt;4、配置 entitlements&lt;/li&gt;
    &lt;li&gt;5、iOS 获取 Wifi 列表代码实现&lt;/li&gt;
    &lt;li&gt;6、获取Wifi列表回调&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;1向-apple-申请开发-network-extension-权限&quot;&gt;1、向 Apple 申请开发 Network Extension 权限&lt;/h3&gt;

&lt;p&gt;　　首先要先写封邮件给 &lt;a href=&quot;mailto:networkextension@apple.com&quot;&gt;networkextension@apple.com&lt;/a&gt; ，问苹果要开发 Network Extension 的权限。   &lt;br /&gt;
苹果收到邮件后会自动回复邮件，在 &lt;a href=&quot;https://developer.apple.com/contact/network-extension/&quot;&gt;https://developer.apple.com/contact/network-extension/&lt;/a&gt; 里面填写申请表格，内容包括：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Organization：               

Company / Product URL:             

What's your product's target market?              

What's your company's primary function?             

Describe your application and how it will use the Network Extension framework.            

What type of entitlement are you requesting?                     

。。。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;申请后大概两周左右能收到 Aplle的 确认信，如：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Hi,

Thanks for your interest in the Network Extension APIs.

We added a new template containing the Network Extension entitlements to your team.

。。。。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;2申请包含-network-extension-的描述文件&quot;&gt;2、申请包含 Network Extension 的描述文件&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/PastedGraphic.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;选择包含 Network Extension 的描述文件，后点击下载，下载完成双击描述文件。&lt;/p&gt;

&lt;h3 id=&quot;3配置-infoplist&quot;&gt;3、配置 Info.plist&lt;/h3&gt;

&lt;p&gt;Xcode Info.plist 里 Required background modes 添加 一个 network-authentication(item)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/infoplist.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;4配置-entitlements&quot;&gt;4、配置 entitlements&lt;/h3&gt;

&lt;p&gt;Demo.entitlements（Demo是项目名称） 里添加 Key-Value: com.apple.developer.networking.HotspotHelper -&amp;gt; YES&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/entitlement.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;5ios-获取-wifi-列表代码实现&quot;&gt;5、iOS 获取 Wifi 列表代码实现&lt;/h3&gt;

&lt;p&gt;导入头文件&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#import &amp;lt;NetworkExtension/NetworkExtension.h&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;代码实现&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- (void)getWifiList {

	if (![[[UIDevice currentDevice] systemVersion] floatValue] &amp;gt;= 9.0) {return;}
	dispatch_queue_t queue = dispatch_queue_create(&quot;com.leopardpan.HotspotHelper&quot;, 0);
	[NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
		if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
			for (NEHotspotNetwork* network  in cmd.networkList) {
				NSLog(@&quot;network.SSID = %@&quot;,network.SSID);
			}
		}
	}];
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;kNEHotspotHelperCommandTypeFilterScanList： 表示扫描到 Wifi 列表信息。&lt;/p&gt;

&lt;p&gt;NEHotspotNetwork 里有如下信息：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;SSID：Wifi 名称&lt;/li&gt;
    &lt;li&gt;BSSID：站点的 MAC 地址&lt;/li&gt;
    &lt;li&gt;signalStrength： Wifi信号强度，该值在0.0-1.0之间&lt;/li&gt;
    &lt;li&gt;secure：网络是否安全 (不需要密码的 Wifi，该值为 false)&lt;/li&gt;
    &lt;li&gt;autoJoined： 设备是否自动连接该 Wifi，目前测试自动连接以前连过的 Wifi 的也为 false 。&lt;/li&gt;
    &lt;li&gt;justJoined：网络是否刚刚加入&lt;/li&gt;
    &lt;li&gt;chosenHelper：HotspotHelper是否为网络的所选助手&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://developer.apple.com/reference/networkextension/nehotspotnetwork&quot;&gt;官方文档连接&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;6获取wifi列表回调&quot;&gt;6、获取Wifi列表回调&lt;/h3&gt;

&lt;p&gt;当你把上面的代码写完，并成功运行项目后，发现并没有Wifi列表的回调。因为你还没刷新Wifi列表，你需要：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;打开手机系统设置 -&amp;gt; WLAN -&amp;gt; 系统 Wifi 列表加载出来时，上面代码部分才会回调，才能获取到 Wifi 列表。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/WLAN.png&quot; height=&quot;360&quot; width=&quot;200&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这个时候你就能看到控制台源源不断的Log。&lt;/p&gt;

&lt;h3 id=&quot;注意事项&quot;&gt;注意事项&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;1、获取Wifi列表功能由于是需要申请后台权限，所以能后台激活App(应用程序)，而且激活后App的进程能存活几个小时。&lt;/li&gt;
  &lt;li&gt;2、整个获取Wifi列表不需要App用户授权，也就是在App用户无感知下获取设备的Wifi列表信息，使用时请正当使用。&lt;/li&gt;
  &lt;li&gt;3、Wifi列表获取 NetworkExtension 是 iOS 9以后才出的，目前 iOS 9 已经覆盖很广了。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下面付一张来自 &lt;a href=&quot;https://www.talkingdata.com/index/#/device/os/zh_CN&quot;&gt;TalkingData 对iOS操作系统的统计报表&lt;/a&gt;，时间：2017-01-03&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/Wifilist/systemVersion.png&quot; height=&quot;280&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;qa&quot;&gt;Q&amp;amp;A&lt;/h3&gt;

&lt;p&gt;在操作过程或者文章有问题的话欢迎在 &lt;a href=&quot;http://baixin.io/2017/01/iOS_Wifilist/&quot;&gt;原文&lt;/a&gt; 里提问或指正。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;使用 Demo 我就不提供了，你如果没有申请 NetworkExtension 权限，提供了 Demo 你也无法使用。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;参考资源：&lt;a href=&quot;http://stackoverflow.com/questions/31704292/nehotspothelper-networkextension-api-ios9-0&quot;&gt;NEHotspotHelper NetworkExtension API iOS9.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
转载请注明：&lt;a href=&quot;http://baixin&quot;&gt;潘柏信的博客&lt;/a&gt; » &lt;a href=&quot;http://baixin.io/2017/01/iOS_Wifilist/&quot;&gt;Wifi 定位原理及 iOS Wifi 列表获取&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 03 Jan 2017 00:00:00 +0000</pubDate>
        <link>https://gsmoke.github.io//2017/01/03/iOS_Wifilist/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2017/01/03/iOS_Wifilist/</guid>
        
        <category>iOS</category>
        
        
        <category>iOS</category>
        
      </item>
    
      <item>
        <title>Jekyll搭建个人博客</title>
        <description>&lt;h3 id=&quot;介绍&quot;&gt;介绍&lt;/h3&gt;

&lt;p&gt;　Jekyll 是一个简单的博客形态的静态站点生产机器。它有一个模版目录，其中包含原始文本格式的文档，通过 Markdown （或者 Textile） 以及 Liquid 转化成一个完整的可发布的静态网站，你可以发布在任何你喜爱的服务器上。Jekyll 也可以运行在 GitHub Page 上，也就是说，你可以使用 GitHub 的服务来搭建你的项目页面、博客或者网站，而且是完全免费的&lt;/p&gt;

&lt;p&gt;　使用 Jekyll 搭建博客之前要确认下本机环境，Git 环境（用于部署到远端）、&lt;a href=&quot;http://www.ruby-lang.org/en/downloads/&quot;&gt;Ruby&lt;/a&gt; 环境（Jekyll 是基于 Ruby 开发的）、包管理器 &lt;a href=&quot;http://rubygems.org/pages/download&quot;&gt;RubyGems&lt;/a&gt;              &lt;br /&gt;
　　如果你是 Mac 用户，你就需要安装 Xcode 和 Command-Line Tools了。下载方式 Preferences → Downloads → Components。&lt;/p&gt;

&lt;p&gt;　　Jekyll 是一个免费的简单静态网页生成工具，可以配合第三方服务例如： Disqus（评论）、多说(评论) 以及分享 等等扩展功能，Jekyll 可以直接部署在 Github（国外） 或 Coding（国内） 上，可以绑定自己的域名。&lt;a href=&quot;http://jekyll.bootcss.com/&quot;&gt;Jekyll中文文档&lt;/a&gt;、&lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll英文文档&lt;/a&gt;、&lt;a href=&quot;http://jekyllthemes.org/&quot;&gt;Jekyll主题列表&lt;/a&gt;。&lt;/p&gt;

&lt;h3 id=&quot;jekyll-环境配置&quot;&gt;Jekyll 环境配置&lt;/h3&gt;

&lt;p&gt;安装 jekyll&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ gem install jekyll     
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;创建博客&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jekyll new myBlog    
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;进入博客目录&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cd myBlog  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;启动本地服务&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在浏览器里输入： &lt;a href=&quot;http://localhost:4000&quot;&gt;http://localhost:4000&lt;/a&gt;，就可以看到你的博客效果了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/jekyll/image1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;遇到的问题：&lt;/p&gt;

&lt;p&gt;so easy !&lt;/p&gt;

&lt;h3 id=&quot;目录结构&quot;&gt;目录结构&lt;/h3&gt;
&lt;p&gt;　
　Jekyll 的核心其实是一个文本转换引擎。它的概念其实就是： 你用你最喜欢的标记语言来写文章，可以是 Markdown，也可以是 Textile,或者就是简单的 HTML, 然后 Jekyll 就会帮你套入一个或一系列的布局中。在整个过程中你可以设置URL路径, 你的文本在布局中的显示样式等等。这些都可以通过纯文本编辑来实现，最终生成的静态页面就是你的成品了。&lt;/p&gt;

&lt;p&gt;一个基本的 Jekyll 网站的目录结构一般是像这样的：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.
├── _config.yml
├── _includes
|   ├── footer.html
|   └── header.html
├── _layouts
|   ├── default.html
|   ├── post.html
|   └── page.html
├── _posts
|   └── 2016-10-08-welcome-to-jekyll.markdown
├── _sass
|   ├── _base.scss
|   ├── _layout.scss
|   └── _syntax-highlighting.scss
├── about.md
├── css
|   └── main.scss
├── feed.xml
└── index.html

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这些目录结构以及具体的作用可以参考 &lt;a href=&quot;http://jekyll.com.cn/docs/structure/&quot;&gt;官网文档&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;进入 _config.yml 里面，修改成你想看到的信息，重新 jekyll server ，刷新浏览器就可以看到你刚刚修改的信息了。&lt;/p&gt;

&lt;p&gt;到此，博客初步搭建算是完成了，&lt;/p&gt;

&lt;h3 id=&quot;博客部署到远端&quot;&gt;博客部署到远端&lt;/h3&gt;

&lt;p&gt;　我这里讲的是部署到 Github Page 创建一个 github 账号，然后创建一个跟你账户名一样的仓库，如我的 github 账户名叫 &lt;a href=&quot;https://github.com/yujianbin&quot;&gt;yujianbin&lt;/a&gt;，我的 github 仓库名就叫 &lt;a href=&quot;https://github.com/yujianbin/yujianbin.github.io&quot;&gt;yujianbin.github.io&lt;/a&gt;，创建好了之后，把刚才建立的 myBlog 项目 push 到 username.github.io仓库里去（username指的是你的github用户名），检查你远端仓库已经跟你本地 myBlog 同步了，然后你在浏览器里输入 username.github.io ，就可以访问你的博客了。&lt;/p&gt;

&lt;h3 id=&quot;编写文章&quot;&gt;编写文章&lt;/h3&gt;

&lt;p&gt;　　所有的文章都是 _posts 目录下面，文章格式为 mardown 格式，文章文件名可以是 .mardown 或者 .md。&lt;/p&gt;

&lt;p&gt;　　编写一篇新文章很简单，你可以直接从 _posts/ 目录下复制一份出来 &lt;code class=&quot;highlighter-rouge&quot;&gt;2016-10-16-welcome-to-jekyll副本.markdown&lt;/code&gt; ，修改名字为 2016-10-16-article1.markdown ，注意：文章名的格式前面必须为 2016-10-16- ，日期可以修改，但必须为 年-月-日- 格式，后面的 article1 是整个文章的连接 URL，如果文章名为中文，那么文章的连接URL就会变成这样的：http://baixin.io/2015/08/%E6%90%AD%E5/ ， 所以建议文章名最好是英文的或者阿拉伯数字。 双击 2016-10-16-article1.markdown 打开&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
---
layout: post
title:  &quot;Welcome to Jekyll!&quot;
date:   2016-10-16 11:29:08 +0800
categories: jekyll update
---

正文...

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;title: 显示的文章名， 如：title: 我的第一篇文章                  &lt;br /&gt;
date:  显示的文章发布日期，如：date: 2016-10-16                        &lt;br /&gt;
categories: tag标签的分类，如：categories: 随笔&lt;/p&gt;

&lt;p&gt;注意：文章头部格式必须为上面的，…. 就是文章的正文内容。&lt;/p&gt;

&lt;p&gt;我写文章使用的是 Sublime Text2 编辑器，如果你对 markdown 语法不熟悉的话，可以看看&lt;a href=&quot;https://www.zybuluo.com/&quot;&gt;作业部落的教程&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;使用我的博客模板&quot;&gt;使用我的博客模板&lt;/h3&gt;

&lt;p&gt;虽然博客部署完成了，你会发现博客太简单不是你想要的，如果你喜欢我的模板的话，可以使用我的模板。&lt;/p&gt;

&lt;p&gt;首先你要获取的我博客，&lt;a href=&quot;https://github.com/yujianbin/yujianbin.github.io.git&quot;&gt;Github项目地址&lt;/a&gt;，你可以直接&lt;a href=&quot;https://github.com/yujianbin/yujianbin.github.io/archive/master.zip&quot;&gt;点击下载博客&lt;/a&gt;，进去yujianbin.github.io/ 目录下， 使用命令部署本地服务&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jekyll server   
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;如果你本机没配置过任何jekyll的环境可能会报错&quot;&gt;如果你本机没配置过任何jekyll的环境，可能会报错&lt;/h3&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/Users/xxxxxxxx/.rvm/rubies/ruby-2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- bundler (LoadError)
	from /Users/xxxxxxxx/.rvm/rubies/ruby-2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
	from /Users/xxxxxxxx/.rvm/gems/ruby-2.2.2/gems/jekyll-3.3.0/lib/jekyll/plugin_manager.rb:34:in `require_from_bundler'
	from /Users/xxxxxxxx/.rvm/gems/ruby-2.2.2/gems/jekyll-3.3.0/exe/jekyll:9:in `&amp;lt;top (required)&amp;gt;'
	from /Users/xxxxxxxx/.rvm/gems/ruby-2.2.2/bin/jekyll:23:in `load'
	from /Users/xxxxxxxx/.rvm/gems/ruby-2.2.2/bin/jekyll:23:in `&amp;lt;main&amp;gt;'
	from /Users/xxxxxxxx/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in `eval'
	from /Users/xxxxxxxx/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in `&amp;lt;main&amp;gt;'

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;原因： 没有安装 bundler ，执行安装 bundler 命令&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
$ gem install bundler

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;提示：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Fetching: bundler-1.13.5.gem (100%)
Successfully installed bundler-1.13.5
Parsing documentation for bundler-1.13.5
Installing ri documentation for bundler-1.13.5
Done installing documentation for bundler after 5 seconds
1 gem installed

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;再次执行 $ jekyll server  ，提示&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
Could not find proper version of jekyll (3.1.1) in any of the sources
Run `bundle install` to install missing gems.

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;跟着提示运行命令&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ bundle install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这个时候你可能会发现 bundle install 运行卡主不动了。&lt;/p&gt;

&lt;p&gt;如果很长时间都没任何提示的话，你可以尝试修改 gem 的 source&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
$ gem sources --remove https://rubygems.org/

$ gem sources -a http://gems.ruby-china.org/

$ gem sources -l


*** CURRENT SOURCES ***

http://gems.ruby-china.org/

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;再次执行命令 $ bundle install，发现开始有动静了&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
。。。
Installing jekyll-watch 1.3.1
Installing jekyll 3.1.1
Bundle complete! 3 Gemfile dependencies, 17 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;bundler安装完成，后再次启动本地服务&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jekyll server

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;继续报错&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Configuration file: /Users/apple/Documents/GitHub/yujianbin.github.io/_config.yml
       Deprecation: The 'gems' configuration option has been renamed to 'plugins'. Please update your config file accordingly.
  Dependency Error: Yikes! It looks like you don't have jekyll-sitemap or one of its dependencies installed. In order to use Jekyll as currently configured, you'll need to install this gem. The full error message from Ruby is: 'Unable to activate jekyll-3.8.1, because i18n-1.0.1 conflicts with i18n (~&amp;gt; 0.7)' If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/!
jekyll 3.8.1 | Error:  jekyll-sitemap

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;表示 当前的 jekyll 版本是 3.1.1 ，无法使用 jekyll-sitemap&lt;/p&gt;

&lt;p&gt;解决方法有两个&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;1、打开当前目录下的 _config.yml 文件，把 gems: [jekyll-paginate,jekyll-sitemap] 换成 gems: [jekyll-paginate] ，也就是去掉jekyll-sitemap。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;2、升级 jekyll 版本，我当前的是 jekyll 3.1.2 。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;修改完成后保存配置，再次执行&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ jekyll server

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;提示&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;appledeMacBook-Pro:yujianbin.github.io apple$ jekyll serve
Configuration file: /Users/apple/Documents/GitHub/yujianbin.github.io/_config.yml
       Deprecation: The 'gems' configuration option has been renamed to 'plugins'. Please update your config file accordingly.
            Source: /Users/apple/Documents/GitHub/yujianbin.github.io
       Destination: /Users/apple/Documents/GitHub/yujianbin.github.io/_site
 Incremental build: disabled. Enable with --incremental
      Generating...
                    done in 0.519 seconds.
 Auto-regeneration: enabled for '/Users/apple/Documents/GitHub/yujianbin.github.io'
    Server address: http://127.0.0.1:4000
  Server running... press ctrl-c to stop.

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;表示本地服务部署成功。&lt;/p&gt;

&lt;p&gt;在浏览器输入 &lt;a href=&quot;127.0.0.1:4000&quot;&gt;127.0.0.1:4000&lt;/a&gt; ， 就可以看到&lt;a href=&quot;https://yujianbin.github.io&quot;&gt;github.io&lt;/a&gt;博客效果了。&lt;/p&gt;

&lt;h3 id=&quot;修改成你自己的博客&quot;&gt;修改成你自己的博客&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;如果你想使用我的模板请把 _posts/ 目录下的文章都去掉。&lt;/li&gt;
    &lt;li&gt;修改 _config.yml 文件里面的内容为你自己的。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;然后使用 git push 到你自己的仓库里面去，检查你远端仓库，在浏览器输入 username.github.io 就会发现，你有一个漂亮的主题模板了。&lt;/p&gt;

&lt;h3 id=&quot;为什么要是用-jekyll&quot;&gt;为什么要是用 Jekyll&lt;/h3&gt;

&lt;p&gt;使用了 Jekyll 你会发现如果你想使用多台电脑发博客都很方便，只要把远端 github 仓库里的博客 clone 下来，写文章后再提交就可以了，&lt;/p&gt;
</description>
        <pubDate>Fri, 14 Oct 2016 00:00:00 +0000</pubDate>
        <link>https://gsmoke.github.io//2016/10/14/jekyll_tutorials1/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2016/10/14/jekyll_tutorials1/</guid>
        
        <category>博客</category>
        
        
      </item>
    
      <item>
        <title>Python自动化测试iOS项目</title>
        <description>&lt;p&gt;作为一个开发人员，为了保证自己的代码的健壮，写单元测试是必不可少的环节，然而最痛快的是每天去手动跑一遍所有的case。那么什么能帮我们解决这些繁琐的操作呢，大家应该会想到自动化测试脚本了，是的，我们可以借助脚本来完成全自动化测试，下面是我列的每天脚本自动执行流程：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;1、&lt;code class=&quot;highlighter-rouge&quot;&gt;pull&lt;/code&gt; git仓库里面的最新代码到本地。&lt;/li&gt;
    &lt;li&gt;2、然后打包成&lt;code class=&quot;highlighter-rouge&quot;&gt;App&lt;/code&gt;。&lt;/li&gt;
    &lt;li&gt;3、安装到模拟器上。&lt;/li&gt;
    &lt;li&gt;4、运行App，执行单元测试，生成测试数据并保存到本地。&lt;/li&gt;
    &lt;li&gt;5、脚本读取测试数据，邮件发送给相关人员。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;当这些全自动化后，可以大大减少开发人员的维护成本，即使每次项目里面有新增模块后，增加测试case就行了，下面会介绍自动测试这5步具体怎么去执行，整个脚本是使用Python写的，代码很少功能也很简单，但这已经可以帮我们完成基本的自动化测试了，这就是脚本的强大之处，选择Pyhton纯属个人喜好，最近也在学习Python，当然了最终使用什么语言看你自己。&lt;/p&gt;

&lt;h3 id=&quot;python执行shell命令完成测试&quot;&gt;python执行shell命令完成测试&lt;/h3&gt;

&lt;p&gt;首先确认本机上安装了&lt;code class=&quot;highlighter-rouge&quot;&gt;git&lt;/code&gt; 和 &lt;code class=&quot;highlighter-rouge&quot;&gt;python&lt;/code&gt; 。  &lt;br /&gt;
脚本判断本地是否存在项目，不存在则使用命令 &lt;code class=&quot;highlighter-rouge&quot;&gt;git clone ...&lt;/code&gt; ，存在则使用命令 &lt;code class=&quot;highlighter-rouge&quot;&gt;git pull ...&lt;/code&gt; 。     &lt;br /&gt;
这些在Linux的命令都可以使用脚本来完成的，python的 &lt;code class=&quot;highlighter-rouge&quot;&gt;os.popen()&lt;/code&gt; 方法 就是可以在Linux上执行shell命令。   &lt;br /&gt;
&lt;strong&gt;例如：&lt;/strong&gt;  把下面这段代码添加到一个 test.py 的文件里，然后在终端上执行 &lt;code class=&quot;highlighter-rouge&quot;&gt;python test.py&lt;/code&gt; 命令你就会看到，你的当前目录下正在下载我的博客了。&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;import os

os.popen('git clone https://github.com/leopardpan/leopardpan.github.io.git')   

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;git pull 。。。 更新代码也是一样的。&lt;/p&gt;

&lt;p&gt;接下来的打包、安装、运行都是使用python执行shell命令&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;把iOS项目打包成App，下面的 &lt;code class=&quot;highlighter-rouge&quot;&gt;Demo&lt;/code&gt; 是项目的名字&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;os.popen(‘xcodebuild -project Demo.xcodeproj -target Demo -configuration Debug -sdk iphonesimulator’)&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;这行脚本运行完成后，你就会发现同会生成一个 &lt;code class=&quot;highlighter-rouge&quot;&gt;build&lt;/code&gt; 的文件夹。&lt;br /&gt;
Debug参数表示现在是Debug模式，如果Xcode里面改成Release了，这里需要改成Release。&lt;br /&gt;
xcodebuild 命令是 Xcode Command Line Tools 的一部分。通过调用这个命令，可以完成 iOS 工程的编译，打包和签名过程。可以使用 xcodebuild –help 来看看具体有哪些功能。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;打开iOS模拟器，这里运行的是&lt;code class=&quot;highlighter-rouge&quot;&gt;iPhone 6 Plus&lt;/code&gt; 你也可以换成其它型号的模拟器&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;os.popen(‘xcrun instruments -w “iPhone 6 Plus”’)&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;把刚才打包生成的App安装到模拟器上&lt;/strong&gt;    &lt;br /&gt;
在安装之前要先卸载App,不然你运行的永远是最初安装的那个，后来安装的不会覆盖之前的，卸载App&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;os.popen(‘xcrun simctl uninstall booted com.test.Demo’)&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;booted 后面接的是 &lt;code class=&quot;highlighter-rouge&quot;&gt;Bundle Identifier&lt;/code&gt;，我的是 com.test.Demo，然后再安装App&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;os.popen(‘xcrun simctl install booted build/Debug-iphonesimulator/Demo.app ‘)&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;booted 后面接的是.app的路径，我打包的时候的是Debug，所以这个的文件夹名称是Debug-iphonesimulator。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;在模拟器里运行App&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;os.popen(‘xcrun simctl launch booted com.test.Demo’)&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;booted 后面接的是 &lt;code class=&quot;highlighter-rouge&quot;&gt;Bundle Identifier&lt;/code&gt;，我的是 com.test.Demo。&lt;/p&gt;

&lt;p&gt;到目前为止，你就会发现你的项目已经运行起来了，你可以在项目是Debug模式下一启动就执行单元测试，然后把对应的测试数据保存到本地为data.json。然后在使用python脚本读取测试文件的数据，最终使用邮件发送给相关人员，pyhton读取数据很简单，一行代码就行&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;data = open(‘data.json’).read()&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;data里面就是json字符串，为了脚本操作简单，我在存储的时候直接把json格式的转成了字符串类型。&lt;/p&gt;

&lt;h3 id=&quot;python发送邮件&quot;&gt;python发送邮件&lt;/h3&gt;

&lt;p&gt;我使用的是SMTP进行邮件发送的，SMTP是发送邮件的协议，Python内置对SMTP的支持，可以发送纯文本邮件、HTML邮件以及带附件的邮件。&lt;/p&gt;

&lt;p&gt;Python对SMTP支持有smtplib和email两个模块，email负责构造邮件，smtplib负责发送邮件，具体代码如下：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

def format_addr(self,s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

def send_mail(self, mail, message, title):
	from_addr = 'leopardpan@163.com'
	password = ''
	to_addr = mail
	smtp_server = 'smtp.163.com'

	msg = MIMEText(message, 'plain', 'utf-8')
	msg['From'] = self.format_addr(u'自动化测试邮件 &amp;lt;%s&amp;gt;' % from_addr)
	msg['To'] = self.format_addr(u'管理员 &amp;lt;%s&amp;gt;' % to_addr)
	msg['Subject'] = Header(title, 'utf-8').encode()

	server = smtplib.SMTP(smtp_server, 25)
	server.set_debuglevel(1)
	server.login(from_addr, password)
	server.sendmail(from_addr, [to_addr], msg.as_string())
	server.quit()

send_mail('leopardpan@icloud.com','正文','标题')
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;from_addr是发送方的邮箱地址，password是开通SMTP时输入的密码   &lt;br /&gt;
smtp_server是smtp的服务，如果你的from_addr是gamil.com，那么就要写成smtp_server = ‘smtp.gmail.com’ 了。&lt;/p&gt;

&lt;p&gt;方法 send_mail(self, mail, message, title): 有四个参数，第一个不用传，第二个参数是收信人的邮箱，第三个是邮件的正文，第四个是邮件的标题，方法调用格式： &lt;code class=&quot;highlighter-rouge&quot;&gt;send_mail('leopardpan@icloud.com','正文','标题')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;注意：发送方的邮箱必须要开通SMTP功能才行，否则会报错&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;SMTPSenderRefused: (550, ‘User has no permission’, ‘leopardpan@163.com’)&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;163的SMTP开通，需要你登录网易邮箱，然后点击顶部的设置就会出现&lt;code class=&quot;highlighter-rouge&quot;&gt;POP3/SMTP/IMAP&lt;/code&gt;，点击之后，勾选选择开启，这个时候需要你输入密码，记住这个密码就是上面代码中的&lt;code class=&quot;highlighter-rouge&quot;&gt;password&lt;/code&gt;，如果你都完成的话，你把上面的代码拷贝出现，把邮箱修改成你自己的，使用 pyhton 运行一下吧。&lt;/p&gt;

&lt;p&gt;上面的几个流程结合起来就可以实现一个简单的自动化测试了，如果你有什么建议和意见欢迎讨论。&lt;/p&gt;

&lt;p&gt;参考链接：
&lt;a href=&quot;http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832745198026a685614e7462fb57dbf733cc9f3ad000&quot;&gt;SMTP发送邮件&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;转载请注明：&lt;a href=&quot;http://baixin&quot;&gt;潘柏信的博客&lt;/a&gt; » &lt;a href=&quot;http://baixin.io/2016/08/PythonTestAutomationiOS/&quot;&gt;点击阅读原文&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 04 Aug 2016 00:00:00 +0000</pubDate>
        <link>https://gsmoke.github.io//2016/08/04/PythonTestAutomationiOS/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2016/08/04/PythonTestAutomationiOS/</guid>
        
        <category>python</category>
        
        
        <category>python</category>
        
      </item>
    
      <item>
        <title>老司机带你剖析无码统计</title>
        <description>&lt;p&gt;　　无需开发介入，也可以统计移动App上按钮的点击次数，简称 &lt;code class=&quot;highlighter-rouge&quot;&gt;无码统计&lt;/code&gt; ，只要是跟App开发相关的同学，相信都对埋点统计有些了解，特别是针对开发人员来说，做代码埋点统计基本上是看不到直接收益也是开发人员最不愿做的一件事，这篇文章讲的就是如何让开发人员摆脱代码埋点的痛苦。&lt;/p&gt;

&lt;p&gt;　　文章主要分为：使用场景、实现原理、适用范围、使用详情四个模块，不管你是产品，还是开发人员又或者是运营人员都适合读这篇文章。&lt;/p&gt;

&lt;p&gt;　　在App开发过程中我们应该都有过类似的需求：想统计某些按钮的点击次数。例如，我们开发了一个注册模块，注册流程有些复杂，整个注册功能开发完成后，我们想知道到底有没有用户使用注册功能，而又有多少用户使用？&lt;/p&gt;

&lt;p&gt;有什么方式能知道呢？&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;后台看注册系统?    &lt;br /&gt;
　有些麻烦，需要后台去数据库里查看，还要做成数据可视化的才方便看。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;查看注册按钮的点击情况?   &lt;br /&gt;
　这是最直观的。 主看看两块就行，注册按钮的点击次数 和 提交注册按钮的点击次数，如果发现注册按钮被点击多次（如1W次），而提交注册的点击次数却只有几次，这就可以反映出，很多用户看到的我们的注册流程太复杂，然后选择放弃注册了。同样的道理，我们通过同样的方式可以验证我们其它的功能模块是否有用户经常使用，从而来重新规划我们的设计需求。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;　　一整个功能模块的完成涉及到 产品、UI设计、开发、测试 等几个部分，资源和人力的消耗还是挺大的，所以我们在开发过程是否继续维护这些功能模块，还是开发新功能是要经过慎重衡量，而衡量这些最有说服力的依据就是用户的使用数据，这些数据来源是刚才说的 按钮的点击次数，页面的停留时长 等等。&lt;/p&gt;

&lt;h3 id=&quot;使用场景&quot;&gt;使用场景&lt;/h3&gt;

&lt;p&gt;　　分析用户App的使用情况当然是直接用数据说话，那么想知道某些按钮的点击次数，就一定需要App的开发人员去具体的按钮点击方法里面埋点才行，有的公司有自己的一套完整的统计埋点系统，有的公司是使用第三方统计，最终都是可以看到按钮的点击次数的，不管怎么样想知道按钮的点击必须要App的开发人员亲自去写代码埋点才行，而这篇文章主要讲的是 &lt;code class=&quot;highlighter-rouge&quot;&gt;无码统计&lt;/code&gt; 按钮点击次数。也就是不需要开发介入，我们就能知道按钮的点击了，开发人员只要负责他的业务开发就行，下面是一张 &lt;code class=&quot;highlighter-rouge&quot;&gt;传统埋点&lt;/code&gt; 统计和 &lt;code class=&quot;highlighter-rouge&quot;&gt;灵动分析&lt;/code&gt; 统计，灵动是TalkingData的SDK无码统计的一个功能。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/codeless/image01.png&quot; height=&quot;300&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;p&gt;先大致讲下左边 &lt;code class=&quot;highlighter-rouge&quot;&gt;传统&lt;/code&gt; 埋点统计流程&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;首先需要制定埋点需求、设计埋点方案，需求有了后就去找开发沟通，埋点需求的讨论，双方确认需求通过后，然后准备需求文档，开发再根据文档来写具体的埋点代码。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;代码写完后，App打包给测试人员，测试人员进行测试，同时还要对埋点参数的数据安全审核，参数是否有包含公司敏感信息。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;测试通过后就需要上线了，这个过程一般是开发人员去完成的。iOS需要提交到AppStore上，以前大家都知道，一个审核周期就是一两周，还有随时被拒的可能，现在虽然周期变短了，但审核也还是挺严格的（走快捷通道的除外）。Android需要在各个渠道上重新发布，也是很麻烦的。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;如果前面几部都顺利完成了的话，接下来就等待用户更新了，如果埋点统计功能跟其它新功能一起上线的话，我们更新就有理由了，如果仅仅这一版仅仅只是埋点统计功能，那么让用户更新App的理由又是一件头疼的事情了，不管怎么样经常让用户更新App多少会对用户用些影响的。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;最终的结果应该是部分用户更新了App，那么我们能统计到按钮点击的用户了就只是更新了App的这一部分用户了，而且他们更新的时间是不一样的，最终我们终于可以看需求上的埋点统计了。&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;再看看右边 &lt;code class=&quot;highlighter-rouge&quot;&gt;灵动&lt;/code&gt; 统计流程&lt;/p&gt;

&lt;p&gt;同样需要制定需求，但是需求方可以直接根据自己的需求去使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;灵动&lt;/code&gt; 了，使用了灵动就可以直接看按钮的点击率了，这个过程不需要开发介入，也不需要用户去更新App。&lt;/p&gt;

&lt;p&gt;　　从这张图可以看出，不需要开发人员介入，可以开发成功，提高开发效率，而且埋点也很灵活，需求人员（可以是产品，也可以是运营）可以直接使用灵动，也不需要用户更新，那么数据反馈会比传统埋点快很多，使用了就可以立即生效，需求方的观察周期也缩短了，能更灵活的做出决策。&lt;/p&gt;

&lt;h3 id=&quot;实现原理&quot;&gt;实现原理&lt;/h3&gt;

&lt;p&gt;　　上面大致介绍了下 &lt;code class=&quot;highlighter-rouge&quot;&gt;灵动&lt;/code&gt; 能给我们解决什么问题，这里讲的是 &lt;code class=&quot;highlighter-rouge&quot;&gt;灵动&lt;/code&gt; 是通过什么样的技术手段实现，这里可能对于开发人员来说更喜欢，大家先看一张灵动使用时的一个交互&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/codeless/image02.png&quot; height=&quot;300&quot; width=&quot;500&quot; /&gt;&lt;/p&gt;

&lt;p&gt;　　这张图分成两部分看，先看上面，一个用户在操作Client和PC，Client和PC通讯是通过一个Wss的服务器建立的长连接，这是灵动调试时的一个交互。       &lt;br /&gt;
　　也就是说，用户使用灵动分析时，需要一个安装自己App的移动设备，这个App必须要集成TalkingData的统计分析SDK才行，SDK初始化时的AppID是在TalkingData创建应用时分配的。另一端用户要打开TalkingData的灵动网页，在App启动的时候摇一摇手机，然后就可以建立一个wss的长连接了。用户就可以直接在网页上给按钮添加监听事件了，添加完成后，在手机上点击该按钮，网页上就会提示被点击，调试完成后点击全部生效，配置数据就会保存到下面https的服务器。       &lt;br /&gt;
　　我们的所有用户在启动App的时候，都可以从https服务器里获取到这套配置，客户端根据这套配置找到具体的按钮，监听点击事件，当按钮被点击后，就可以统计到了。&lt;/p&gt;

&lt;p&gt;接下来再看看灵动调试过程中数据是具体怎么进行数据交互的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/codeless/image03.png&quot; height=&quot;300&quot; width=&quot;500&quot; /&gt;&lt;/p&gt;

&lt;p&gt;　　可以看到App客户端和Web端交互主要分为四部分：&lt;code class=&quot;highlighter-rouge&quot;&gt;设备信息&lt;/code&gt; 、 &lt;code class=&quot;highlighter-rouge&quot;&gt;App基本结构&lt;/code&gt; 、&lt;code class=&quot;highlighter-rouge&quot;&gt;控件绑定配置&lt;/code&gt; 、&lt;code class=&quot;highlighter-rouge&quot;&gt;按钮点击信息&lt;/code&gt; ，&lt;code class=&quot;highlighter-rouge&quot;&gt;设备信息&lt;/code&gt; 主要是用来确认设备是调试者的设备，因为其它的终端用户也可能会误触发调试，&lt;code class=&quot;highlighter-rouge&quot;&gt;App基本结构&lt;/code&gt;是用来在Web上展示移动App的，然后在Web上绑定了控件，就会把&lt;code class=&quot;highlighter-rouge&quot;&gt;控件绑定配置&lt;/code&gt;发送给客户端，客户端根据配置监听绑定，当终端用户点击控件后，客户端就会把&lt;code class=&quot;highlighter-rouge&quot;&gt;按钮点击信息&lt;/code&gt;传给Web端，Web显示控件被点击。&lt;/p&gt;

&lt;p&gt;　　再回头看看实现原理的第一张图片，调试完成数据就会从WSS的长连接服务器存储到HTTPS的服务器，此后其它终端用户只要在再次启动App就能获取到埋点配置了，SDK根据埋点配置去找到具体的控件(按钮)，监听点击，当用户点击控件时就可以调用自定义埋点的方法，之后的数据处理就跟自定义埋点是一样的原理了。   &lt;br /&gt;
　　可能有同学会有疑问，所有的App每次启动的时候都会去获取埋点配置，是不是会很耗流量？ 答案是不会的，服务器在没有埋点配置的时候每次将获取不到信息，那么将不会有什么流量消耗。如果服务器有配置了，App才会有些流量消耗的，而且这些配置信息是经过压缩的，所以流量消耗也不大，App获取到了配置之后就会做本地缓存，服务器配置不变的情况下再次获取配置也不会有流量的消耗，只有在下一次运营人员修改了新的控件绑定时才会消耗一些流量。 所以整个无码统计对终端用户的流量的影响是很小的。    &lt;br /&gt;
　　你也可以参考这套逻辑试试自己也部署这么一套无码统计，之后就不用再担心运营给的埋点统计需求了，让他们自己去用无码统计吧。&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;转载请注明：&lt;a href=&quot;http://baixin&quot;&gt;潘柏信的博客&lt;/a&gt; » &lt;a href=&quot;http://baixin.io/2016/07/Codeless/&quot;&gt;点击阅读原文&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Fri, 15 Jul 2016 00:00:00 +0000</pubDate>
        <link>https://gsmoke.github.io//2016/07/15/Codeless/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2016/07/15/Codeless/</guid>
        
        <category>技术</category>
        
        
      </item>
    
      <item>
        <title>Git教程</title>
        <description>&lt;h3 id=&quot;介绍&quot;&gt;介绍&lt;/h3&gt;

&lt;p&gt;　　Git是做项目的版本管理，你也可以称它们为版本管理工具。假如现在你有一个文件夹，里面可以是项目，也可以是你的个人笔记(如我这个博客)，或者是你的简历、毕业设计等等，都可以使用git来管理。&lt;/p&gt;

&lt;p&gt;　　目前常用的版本控制器有Git和SVN，即使这两个你没有全用过，至少也会听过，我这里以Git为例，个人比较喜欢Git，你也可以看看这篇文章：&lt;a href=&quot;http://www.worldhello.net/2012/04/12/why-git-is-better-than-svn.html&quot;&gt;为什么Git比SVN好&lt;/a&gt;。我使用的是Mac，Mac上没自带Git环境，但是作为iOS开发者，我安装Xcode的时候，Xcode里是有自带Git的，所以我不需要考虑怎么去安装Git了。&lt;/p&gt;

&lt;h3 id=&quot;安装git&quot;&gt;安装Git&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;在Mac OS X上安装Git&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;提供两种方法参考：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;1、通过homebrew安装Git，具体方法请参考&lt;a href=&quot;http://brew.sh/&quot;&gt;homebrew的文档&lt;/a&gt;    &lt;br /&gt;
2、直接从AppStore安装Xcode，Xcode集成了Git，不过默认没有安装，你需要运行Xcode。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;在Windows上安装Git&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;从&lt;a href=&quot;https://git-for-windows.github.io&quot;&gt;https://git-for-windows.github.io&lt;/a&gt; 下载，然后按默认选项安装即可，安装完成后，在开始菜单里找到“Git”-&amp;gt;“Git Bash”，蹦出一个类似命令行窗口的东西，就说明Git安装成功！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;配置git&quot;&gt;配置Git&lt;/h3&gt;

&lt;p&gt;安装完成后，还需要最后一步设置，在命令行输入：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;$ git config –global user.name “Your Name”&lt;/li&gt;
    &lt;li&gt;$ git config –global user.email “email@example.com”&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;“Your Name”： 是每次提交时所显示的用户名，因为Git是分布式版本控制系统，当我们push到远端时，就需要区分每个提交记录具体是谁提交的，这个”Your Name”就是最好的区分。&lt;/p&gt;

&lt;p&gt;“email@example.com”： 是你远端仓库的email&lt;/p&gt;

&lt;p&gt;–global：用了这个参数，表示你这台机器上所有的Git仓库都会使用这个配置，当然我们也可以对某个仓库指定不同的用户名和Email地址。&lt;/p&gt;

&lt;h3 id=&quot;开始使用-建立仓库&quot;&gt;开始使用-建立仓库：&lt;/h3&gt;

&lt;p&gt;你在目标文件夹下使命令：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;git init  （创建.git文件）&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;就会创建一个 &lt;code class=&quot;highlighter-rouge&quot;&gt;.git&lt;/code&gt; 隐藏文件，相当于已经建立了一个本地仓库。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;添加到暂存区：&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;git add .   （全部添加到暂存区）&lt;/li&gt;
    &lt;li&gt;git commit -m ‘ first commit’  （提交暂存区的记录到本地仓库）&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;其它&quot;&gt;其它&lt;/h3&gt;

&lt;p&gt;git branc 查看时如出现&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;(HEAD detached at analytics_v2)&lt;/li&gt;
    &lt;li&gt;dev&lt;/li&gt;
    &lt;li&gt;master&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;代表现在已经进入一个临时的HEAD，可以使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;git checkout -b temp&lt;/code&gt; 创建一个 temp branch，这样临时HEAD上修改的东西就不会被丢掉了。
然后切换到 dev 分支上，在使用 git branch merge temp，就可以把 temp 分支上的代码合并到 dev 上了。&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;转载请注明：&lt;a href=&quot;http://baixin&quot;&gt;潘柏信的博客&lt;/a&gt; » &lt;a href=&quot;http://baixin.io/2016/07/GitTutorial/&quot;&gt;点击阅读原文&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Wed, 13 Jul 2016 00:00:00 +0000</pubDate>
        <link>https://gsmoke.github.io//2016/07/13/GitTutorial/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2016/07/13/GitTutorial/</guid>
        
        <category>工具</category>
        
        
      </item>
    
      <item>
        <title>iOS开发迎来机器学习的春天---TensorFlow</title>
        <description>&lt;div align=&quot;center&quot;&gt;
	&lt;img src=&quot;/images/posts/tfimg/logo.jpg&quot; height=&quot;300&quot; width=&quot;500&quot; /&gt;  
&lt;/div&gt;

&lt;p&gt;　　&lt;code class=&quot;highlighter-rouge&quot;&gt;人工智能&lt;/code&gt;、&lt;code class=&quot;highlighter-rouge&quot;&gt;机器学习&lt;/code&gt;都已走进了我们的日常，尤其是愈演愈热的大数据更是跟我们的生活息息相关，做 &lt;code class=&quot;highlighter-rouge&quot;&gt;人工智能&lt;/code&gt;、&lt;code class=&quot;highlighter-rouge&quot;&gt;数据挖掘&lt;/code&gt;的人在其他人眼中感觉是很高大上的，总有一种遥不可及的感觉，在我司也经常会听到数据科学部的同事们提到 &lt;code class=&quot;highlighter-rouge&quot;&gt;机器学习&lt;/code&gt;、&lt;code class=&quot;highlighter-rouge&quot;&gt;数据挖掘&lt;/code&gt; 之类的词。但这些名词真的跟我们移动开发就没直接关系了吗？           &lt;br /&gt;
　　作为移动开发者来说，无时无刻不被这些名词狠狠地敲打着脆弱的内心。💢 💢 💢  何时才能够将&lt;code class=&quot;highlighter-rouge&quot;&gt;机器学习&lt;/code&gt;、&lt;code class=&quot;highlighter-rouge&quot;&gt;深度学习&lt;/code&gt;应用在移动端，敲响移动端&lt;code class=&quot;highlighter-rouge&quot;&gt;机器学习&lt;/code&gt;工业化的大门呢？&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;想象一下，某一天你身处一个完全陌生的环境，周围都是陌生的事物，而运行在iPhone的某个APP却对这个环境了如指掌，你要做的就是打开这个APP，输入你需要了解的事物，iPhone告诉你这个事物的信息，你也就没有了陌生事物了。世界就在眼前！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;如下图：&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;
	&lt;img src=&quot;/images/posts/tfimg/image02.png&quot; height=&quot;300&quot; width=&quot;480&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;上面物体的识别准确率还是蛮不错的，基本识别出了键盘（49%的概率）、鼠标（46%的概率）和水杯（24%的概率）。&lt;/p&gt;

&lt;p&gt;但是在某些事物的识别准确度方便却差强人意，比如下图：&lt;/p&gt;

&lt;div align=&quot;center&quot;&gt;
　　&lt;img src=&quot;/images/posts/tfimg/image01.png&quot; height=&quot;300&quot; width=&quot;320&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;　　iPhone 6被识别成了iPod（59%的概率），而iPod的却是不怎么敢认（10%的概率）。想想最崩溃的估计是iPhone 6了，身价直接被降了好几个等级。&lt;/p&gt;

&lt;div align=&quot;center&quot;&gt;
　　&lt;img src=&quot;/images/posts/tfimg/wq.jpg&quot; height=&quot;320&quot; width=&quot;240&quot; /&gt;  
&lt;/div&gt;

&lt;p&gt;　　上面的例子来自于TensorFlow官方iOSDemo，暂且不评述TensorFlow的识别准确度如何，毕竟它还年轻，但是仅凭其识别能力的体现，也给机器学习在移动端的运用带来了无限的可能。&lt;/p&gt;

&lt;h3 id=&quot;一tensorflow简称tf&quot;&gt;一、TensorFlow（简称TF）&lt;/h3&gt;

&lt;p&gt;　　去年，Google资深系统专家Jeff Dean在湾区机器学习大会上隆重介绍了其第二代深度学习系统&lt;a href=&quot;http://www.tensorflow.org/&quot;&gt;TensorFlow&lt;/a&gt;，一时间网络上针对TensorFlow的文章铺天盖地，&lt;a href=&quot;http://www.leiphone.com/news/201511/UDLyNds2oSTwM2yZ.html&quot;&gt;揭秘TensorFlow：Google开源到底开的是什么？&lt;/a&gt;、&lt;a href=&quot;http://www.leiphone.com/news/201511/Voza1pFNQB4bzKdR.html&quot;&gt;Google开源TensorFlow系统，这背后都有什么门道？&lt;/a&gt;、&lt;a href=&quot;http://www.zhihu.com/question/37243838&quot;&gt;如何评价Google发布的第二代深度学习系统TensorFlow?&lt;/a&gt;等等文章，TensorFlow的燎原之火一直在燃烧蔓延着，其&lt;a href=&quot;https://github.com/tensorflow/tensorflow&quot;&gt;GitHub上的开源库&lt;/a&gt;在此文撰写时，也已经被&lt;code class=&quot;highlighter-rouge&quot;&gt;star：27550&lt;/code&gt;，&lt;code class=&quot;highlighter-rouge&quot;&gt;fork：11054&lt;/code&gt;了。🔥 🔥 🔥 🔥 🔥&lt;/p&gt;

&lt;p&gt;不负众望，Google一直宣称平台移植性非常好的TensorFlow，终于在2016年6月27日，发布0.9版本，宣布移动端支持。&lt;a href=&quot;https://developers.googleblog.com/2016/06/tensorflow-v09-now-available-with.html&quot;&gt;TensorFlow v0.9 now available with improved mobile support&lt;/a&gt;( 有墙💢 )，同时也给出了移动端的&lt;a href=&quot;https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/ios_examples&quot;&gt;Demo&lt;/a&gt;，对于代码为生的程序员，身处大数据处理为主导的&lt;a href=&quot;http://www.talkingdata.com/&quot;&gt;TalkingData&lt;/a&gt;，也小试身手了一把，下载TensorFlow源码，查看编译指南，开始跳坑、填坑之路，也成就了此篇拙文的产生。&lt;/p&gt;

&lt;h3 id=&quot;二从tensorflow到ios静态库&quot;&gt;二、从TensorFlow到iOS静态库&lt;/h3&gt;

&lt;p&gt;对于iOS平台下如何使用TensorFlow，TensorFlow给出了详细的编译脚本命令，详情请查看&lt;a href=&quot;https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile&quot;&gt;官方文档的命令&lt;/a&gt;。&lt;/p&gt;

&lt;h5 id=&quot;第一步-工具准备&quot;&gt;第一步. 工具准备&lt;/h5&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;工欲善其事必先利其器&lt;/code&gt;，在开始编译工作之前，需要准备一些编译所必须的工具：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://brew.sh/&quot;&gt;Homebrew&lt;/a&gt;: Mac os x 上包管理工具，具体使用方法可参考&lt;a href=&quot;http://brew.sh/index_zh-cn.html&quot;&gt;Doc&lt;/a&gt;。&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ /usr/bin/ruby -e &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;Homebrew安装好之后，依次安装三个辅助性编译工具：&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ brew install libtool   
$ brew install autoconf   
$ brew install automake   
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;三个工具的含义，请参考：&lt;a href=&quot;https://en.wikipedia.org/wiki/GNU_Libtool&quot;&gt;https://en.wikipedia.org/wiki/GNU_Libtool&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5 id=&quot;第二步-克隆tensorflow&quot;&gt;第二步. 克隆TensorFlow&lt;/h5&gt;

&lt;p&gt;Google以&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot;&gt;Apache 2.0&lt;/a&gt;开源协议将TensorFlow开源在&lt;a href=&quot;https://github.com/tensorflow/tensorflow&quot;&gt;GitHub&lt;/a&gt;上，我们可以直接使用TensorFlow源码。&lt;/p&gt;

&lt;p&gt;在任意你想存放TensorFlow源码的地方（建议不要放在桌面。^_^），clone项目。&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ git clone https://github.com/tensorflow/tensorflow 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;第三步-编译前准备&quot;&gt;第三步. 编译前准备&lt;/h5&gt;

&lt;p&gt;　　在TensorFlow的&lt;code class=&quot;highlighter-rouge&quot;&gt;tensorflow/contrib/makefile/&lt;/code&gt;目录下，有很多可使用的编译脚本，其中&lt;code class=&quot;highlighter-rouge&quot;&gt;build_all_ios.sh&lt;/code&gt;脚本专门用来一键编译TensorFlow iOS静态库。虽然可以直接使用此脚本进行一键编译，但是因为有墙，某些依赖需要提前做处理。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;下载protobuf&lt;/p&gt;

    &lt;p&gt;protobuf 是编译前唯一需要特殊处理的依赖库，&lt;a href=&quot;https://github.com/google/protobuf/archive/master.zip&quot;&gt;点击下载&lt;/a&gt;，下载protobuf之后，解压，备用。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;下载googlemock&lt;/p&gt;

    &lt;p&gt;虽然protobuf编译脚本&lt;code class=&quot;highlighter-rouge&quot;&gt;autogen.sh&lt;/code&gt;中的googlemock链接地址&lt;code class=&quot;highlighter-rouge&quot;&gt;https://googlemock.googlecode.com/files/gmock-1.7.0.zip&lt;/code&gt;无法直接下载到，但是细心的人会发现，在浏览器中输入&lt;code class=&quot;highlighter-rouge&quot;&gt;https://googlemock.googlecode.com/&lt;/code&gt;地址后，会跳转到&lt;code class=&quot;highlighter-rouge&quot;&gt;https://github.com/google/googlemock&lt;/code&gt;地址，google在GiHub上的仓库地址。而GitHub上的仓库，我们可以直接的下载，克隆等。&lt;/p&gt;

    &lt;p&gt;我们直接在GitHub上下载googlemock(&lt;a href=&quot;https://github.com/google/googlemock/archive/master.zip&quot;&gt;点击下载&lt;/a&gt;)，下载完成后，修改压缩包名字为&lt;code class=&quot;highlighter-rouge&quot;&gt;gmock-1.7.0.zip&lt;/code&gt;，修改后将此压缩包移至上一步protobuf文件夹目录下，备用。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;修改下载依赖脚本，移除protobuf的下载&lt;/p&gt;

    &lt;p&gt;在&lt;code class=&quot;highlighter-rouge&quot;&gt;tensorflow/contrib/makefile/&lt;/code&gt;目录下，&lt;code class=&quot;highlighter-rouge&quot;&gt;download_dependencies.sh&lt;/code&gt;脚本用来下载相关依赖，打开此脚本文件，注释掉或者直接删掉&lt;code class=&quot;highlighter-rouge&quot;&gt;git clone https://github.com/google/protobuf.git ${DOWNLOADS_DIR}/protobuf&lt;/code&gt;部分，目的是不让脚本去下载protobuf。&lt;/p&gt;

    &lt;p&gt;上面三步准备好后，接下来就进入静态库编译了。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h5 id=&quot;第四步-一键编译&quot;&gt;第四步. 一键编译&lt;/h5&gt;

&lt;p&gt;　　前面已经知道在TensorFlow文件夹&lt;code class=&quot;highlighter-rouge&quot;&gt;tensorflow/contrib/makefile/&lt;/code&gt;目录下的&lt;code class=&quot;highlighter-rouge&quot;&gt;build_all_ios.sh&lt;/code&gt;脚本是用来编译iOS静态库的脚本，因此可以直接执行此脚本，开始静态库的编译工作了。&lt;/p&gt;

&lt;p&gt;　　但是有一个问题大家可能会发现，由于编译TensorFlow需要用到protobuf，但是protobuf使我们自己手动下载的，该怎么让手动下载的protobuf能够直接让&lt;code class=&quot;highlighter-rouge&quot;&gt;build_all_ios.sh&lt;/code&gt;脚本使用呢？&lt;/p&gt;

&lt;p&gt;　　答案是&lt;code class=&quot;highlighter-rouge&quot;&gt;复制、粘贴&lt;/code&gt;。可能有些low，但是有效。执行命令 &lt;code class=&quot;highlighter-rouge&quot;&gt;build_all_ios.sh&lt;/code&gt;之后，立即把之前手动下载的protobuf文件夹拷贝进&lt;code class=&quot;highlighter-rouge&quot;&gt;tensorflow/contrib/makefile/downloads&lt;/code&gt;目录。（放心，你拷贝的速度会很快，不会影响编译的执行的。^_^）&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ build_all_ios.sh    
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;　　一切准备就绪，接下来就是静静的等待编译完成了。在Mac编译的过程中，建议插上电源，最好不要让设备休眠断电，也最好不要去干别的东西，出去溜达一圈，回来后就看到战果了。&lt;/p&gt;

&lt;p&gt;编译完成之后，会在&lt;code class=&quot;highlighter-rouge&quot;&gt;tensorflow/contrib/makefile/gen/&lt;/code&gt;目录下看到编译的结果，关于这些静态库该如何使用，自己的项目如何应用，请参考&lt;a href=&quot;https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/ios_examples&quot;&gt;TensorFlow iOS Examples&lt;/a&gt;。&lt;/p&gt;

&lt;h3 id=&quot;三遇到的问题&quot;&gt;三、遇到的问题&lt;/h3&gt;

&lt;p&gt;1、googlecode.com被墙了，需要翻墙！（目前测试挂了VPN也没用），这也是上面编译前准备为什么要那么做的原因。&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl: (7) Failed to connect to googlemock.googlecode.com port 443: Operation timed out
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;解决： 请参考 『第三步. 编译前准备』。&lt;/p&gt;

&lt;p&gt;2、没有Xcode。&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;xcrun: error: SDK &quot;iphoneos&quot; cannot be located
xcrun: error: SDK &quot;iphoneos&quot; cannot be located
xcrun: error: unable to lookup item 'PlatformPath' in SDK 'iphoneos'
+ IPHONEOS_PLATFORM=
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;解决：安装Xcode，从上面报错的命令中可以看到，在编译静态库的过程中使用了&lt;code class=&quot;highlighter-rouge&quot;&gt;xcrun&lt;/code&gt;，而此命令是xCode本身具有的能力。&lt;/p&gt;

&lt;p&gt;3、你的Xcode版本不是7.3或以后，或者你有多个Xcode，而默认的安装路径版本不是7.3或以后。&lt;/p&gt;

&lt;p&gt;```
error: Xcode 7.3.0 or later is required.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;exit 1
```/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;解决：更新Xcode至最新版本，并且保证默认路径下是最新/版本。&lt;/p&gt;

&lt;p&gt;如果Xcode是7.3，并且没有条件更新Xcode，你可以修改&lt;code class=&quot;highlighter-rouge&quot;&gt;tensorflow/contrib/makefile/compile_ios_tensorflow.sh&lt;/code&gt; 里的&lt;code class=&quot;highlighter-rouge&quot;&gt;REQUIRED_XCODE_VERSION=7.3.0&lt;/code&gt;，为&lt;code class=&quot;highlighter-rouge&quot;&gt;REQUIRED_XCODE_VERSION=7.3&lt;/code&gt;。（这样修改，目前还不确定会不会带来一些其他影响，最好是升级你的Xcode）&lt;/p&gt;

&lt;h3 id=&quot;四参考链接&quot;&gt;四、参考链接&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://tensorfly.cn/&quot;&gt;TensorFlow 中文社区&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.tensorflow.org/mobile.html&quot;&gt;TensorFlow for Mobile&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://chenrudan.github.io/blog/2015/11/18/comparethreeopenlib.html&quot;&gt;Caffe、TensorFlow、MXnet三个开源库对比&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://weibo.com/p/1001603907610737775666&quot;&gt;如何评价Tensorflow和其它深度学习系统&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.algorithmdog.com/%E8%B0%81%E5%B0%86%E5%A4%BA%E5%8F%96%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%B7%A5%E4%B8%9A%E6%A0%87%E5%87%86%E7%9A%84%E8%8D%A3%E8%80%80&quot;&gt;深度学习框架大战正在进行，谁将夺取“深度学习工业标准”的荣耀？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;转载请注明：&lt;a href=&quot;http://baixin&quot;&gt;潘柏信的博客&lt;/a&gt; » &lt;a href=&quot;http://baixin.io/2016/07/iOSMachineLearning_TensorFlow/&quot;&gt;点击阅读原文&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 07 Jul 2016 00:00:00 +0000</pubDate>
        <link>https://gsmoke.github.io//2016/07/07/iOSMachineLearning_TensorFlow/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2016/07/07/iOSMachineLearning_TensorFlow/</guid>
        
        <category>机器学习</category>
        
        
      </item>
    
      <item>
        <title>机器学习入门（名词科普）</title>
        <description>&lt;h3 id=&quot;通用名词&quot;&gt;通用名词&lt;/h3&gt;

&lt;h4 id=&quot;ml&quot;&gt;ML&lt;/h4&gt;

&lt;p&gt;　　&lt;strong&gt;名词解释：&lt;/strong&gt; 机器学习(Machine Learning)是一门多领域交叉学科，涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为，以获取新的知识或技能，重新组织已有的知识结构使之不断改善自身的性能。
　　它是人工智能的核心，是使计算机具有智能的根本途径，其应用遍及人工智能的各个领域，它主要使用归纳、综合而不是演绎。&lt;/p&gt;

&lt;h4 id=&quot;dl&quot;&gt;DL&lt;/h4&gt;
&lt;p&gt;　　&lt;strong&gt;名词解释：&lt;/strong&gt; 深度学习（Deep Learning）是机器学习拉出的分支，它试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。        &lt;br /&gt;
　　深度学习是机器学习中表征学习方法。观测值（例如一幅图像）可以使用多种方式来表示，如每个像素强度值的矢量，或者更抽象地表示成一系列边、特定形状的区域等。而使用某些特定的表示方法更容易从实例中学习任务（例如，人脸识别或面部表情识别）。深度学习的好处是将用非监督式或半监督式的特征学习和分层特征提取的高效算法来替代手工获取特征。&lt;/p&gt;

&lt;h4 id=&quot;cnn&quot;&gt;CNN&lt;/h4&gt;
&lt;p&gt;　　&lt;strong&gt;名词解释：&lt;/strong&gt; 卷积神经网络（Convolutional neural networks，简称CNNs）是一种深度的监督学习下的机器学习模型&lt;/p&gt;

&lt;h3 id=&quot;算法名词&quot;&gt;算法名词&lt;/h3&gt;

&lt;h4 id=&quot;knn&quot;&gt;KNN:&lt;/h4&gt;

&lt;p&gt;　　&lt;strong&gt;名词解释：&lt;/strong&gt; 邻近算法，或者说K最近邻(kNN，k-NearestNeighbor)分类算法。
　　邻近算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻，就是k个最近的邻居的意思，说的是每个样本都可以用它最接近的k个邻居来代表。
　　kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别，则该样本也属于这个类别，并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时，只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本，而不是靠判别类域的方法来确定所属类别的，因此对于类域的交叉或重叠较多的待分样本集来说，kNN方法较其他方法更为适合。&lt;/p&gt;

&lt;h4 id=&quot;svm&quot;&gt;SVM:&lt;/h4&gt;
&lt;p&gt;　　&lt;strong&gt;名词解释：&lt;/strong&gt; 支持向量机（Support Vector Machine）。
　　在机器学习领域，支持向量机SVM(Support Vector Machine)是一个有监督的学习模型，通常用来进行模式识别、分类、以及回归分析。&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;转载请注明：&lt;a href=&quot;http://baixin&quot;&gt;潘柏信的博客&lt;/a&gt; » &lt;a href=&quot;http://baixin.io/2016/07/MachineLearning_introduce/&quot;&gt;点击阅读原文&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 05 Jul 2016 00:00:00 +0000</pubDate>
        <link>https://gsmoke.github.io//2016/07/05/MachineLearning_introduce/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2016/07/05/MachineLearning_introduce/</guid>
        
        <category>机器学习</category>
        
        
      </item>
    
      <item>
        <title>HEXO进阶</title>
        <description>&lt;p&gt;HEXO接近是最近有一些朋友提出的问题，然后我做了总结，如果你也在使用HEXO，不妨看看，应该会有些帮助。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;1、博客部署样式出问题了怎么办？&lt;/li&gt;
  &lt;li&gt;2、电脑重装或者误删了本地博客怎么办？&lt;/li&gt;
  &lt;li&gt;3、想使用两台电脑写博客怎么办？&lt;/li&gt;
  &lt;li&gt;4、为何使用百度搜不到我的博客？&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;使用jekyll解决前三个问题&quot;&gt;使用Jekyll解决前三个问题。&lt;/h3&gt;
&lt;p&gt;不得不说 &lt;code class=&quot;highlighter-rouge&quot;&gt;Jekyll&lt;/code&gt; 确实可以解决我上面三个问题, 因为 &lt;code class=&quot;highlighter-rouge&quot;&gt;Jekyll&lt;/code&gt; 是直接把Markdown格式的文章直接放在github仓库里的, 相当于直接用git来管理博客了, &lt;code class=&quot;highlighter-rouge&quot;&gt;Github&lt;/code&gt; 官方也很推荐 &lt;code class=&quot;highlighter-rouge&quot;&gt;Jekyll&lt;/code&gt; 。 你可以先看下 &lt;code class=&quot;highlighter-rouge&quot;&gt;Jekyll&lt;/code&gt; 搭建博客的&lt;a href=&quot;voyagelab.github.io&quot;&gt;voyagelab&lt;/a&gt;, &lt;a href=&quot;https://github.com/voyagelab/voyagelab.github.io&quot;&gt;github地址&lt;/a&gt;, 当然了这只是很普通的, Jekyll 也有很多主题可以选择的, 更详细的请看&lt;a href=&quot;http://jekyll.bootcss.com/&quot;&gt;Jekyll中文文档&lt;/a&gt;、&lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll英文文档&lt;/a&gt;、&lt;a href=&quot;http://jekyllthemes.org/&quot;&gt;Jekyll主题列表&lt;/a&gt;。
在 &lt;code class=&quot;highlighter-rouge&quot;&gt;Jekyll&lt;/code&gt; 上逛了一个星期的我又回到了 &lt;code class=&quot;highlighter-rouge&quot;&gt;Hexo&lt;/code&gt; , 发现 目前 &lt;code class=&quot;highlighter-rouge&quot;&gt;Jekyll&lt;/code&gt; 对主题和一些插件的支持相对 &lt;code class=&quot;highlighter-rouge&quot;&gt;Hexo&lt;/code&gt; 来说, 没那么友好, 可能有一些其它的方法只是我没找到而已,关于 &lt;code class=&quot;highlighter-rouge&quot;&gt;Jekyll&lt;/code&gt; 搭建博客就介绍到这, 如果有问题的话可以评论, 或者联系我。&lt;/p&gt;

&lt;h3 id=&quot;使用hexo解决上面前三个问题&quot;&gt;使用Hexo解决上面前三个问题&lt;/h3&gt;
&lt;p&gt;是的, 我大&lt;code class=&quot;highlighter-rouge&quot;&gt;Hexo&lt;/code&gt;同样可以解决上面三个问题, 那就是使用git。关于如何使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;Hexo&lt;/code&gt; 搭建博客请看我另一篇文章&lt;a href=&quot;http://www.baixin.io/2015/08/25/HEXO%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/&quot;&gt;HEXO搭建个人博客&lt;/a&gt;, 如果搭建的过程中出现了问题, 我们可以交流交流。现在我假设你已经能基本使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;Hexo&lt;/code&gt; 了, 接下来就看看如何来管理博客。&lt;/p&gt;

&lt;h2 id=&quot;使用git管理博客&quot;&gt;使用git管理博客&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/leopardpan/Blog-Growing&quot;&gt;Blog-Growing&lt;/a&gt;是我管理博客的仓库地址。结构大致是:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;– Blog-Growing   &lt;br /&gt;
　　|– .git   &lt;br /&gt;
　　|– .gitignore  &lt;br /&gt;
　　|– Hexo   &lt;br /&gt;
　　　　|   ..  &lt;br /&gt;
　　　　|   ..  &lt;br /&gt;
　　　　|   整个博客的配置信息&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;你可以把我的的&lt;a href=&quot;https://github.com/leopardpan/Blog-Growing&quot;&gt;Blog-Growing&lt;/a&gt; clone下来, 看看一些基本配置是怎么配置的。需要提醒的是, &lt;code class=&quot;highlighter-rouge&quot;&gt;要把主题下的.git给删除掉&lt;/code&gt; , 当然了你也可以使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;git submodule&lt;/code&gt; 来管理, 具体的管理方法我这里就不做多的介绍了, 想了解的话可以私信我。
上面的过程基本做完后, 怎么来解决我开篇提的前三个问题了。&lt;/p&gt;

&lt;h3 id=&quot;具体实现&quot;&gt;具体实现:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;一：家里电脑使用博客&lt;/strong&gt;      &lt;br /&gt;
　　建立git远端仓库管理博客,并使用家里的电脑把本地博客的配置推送到远端仓库。 &lt;br /&gt;
&lt;strong&gt;二：公司电脑使用博客&lt;/strong&gt;       &lt;br /&gt;
　　到了公司只需要执行&lt;code class=&quot;highlighter-rouge&quot;&gt;sudo npm install -g hexo&lt;/code&gt;,然后cd到你的博客目录下,如我cd 到Hexo目录下, 然后执行 &lt;code class=&quot;highlighter-rouge&quot;&gt;hexo server&lt;/code&gt; 就可以在本地预览博客了。  &lt;br /&gt;
&lt;strong&gt;三：使用Git保存&lt;/strong&gt;        &lt;br /&gt;
　　修改好博客后记得先使用git来提交下, 即使下次把博客的样式修改坏了, 也可以使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;git reset --hard&lt;/code&gt; 来回退。如: 我cd 到 &lt;code class=&quot;highlighter-rouge&quot;&gt;Blog-Growing&lt;/code&gt; 目录下使用git提交。 &lt;br /&gt;
&lt;strong&gt;四：博客提交&lt;/strong&gt;         &lt;br /&gt;
　　1、修改好的博客使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;hexo d&lt;/code&gt; 展示到博客页上。 &lt;br /&gt;
　　2、git push 整个本地博客。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;提示:&lt;/strong&gt; 在这里 &lt;code class=&quot;highlighter-rouge&quot;&gt;git&lt;/code&gt; 仅仅只是用户做博客的版本管理的, 博客的样式修改、基本部署还是使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;hexo&lt;/code&gt; 来操作的。&lt;/p&gt;

&lt;h2 id=&quot;让百度能搜索到你的博客&quot;&gt;让百度能搜索到你的博客&lt;/h2&gt;

&lt;h3 id=&quot;为什么要使用百度搜索&quot;&gt;为什么要使用百度搜索？&lt;/h3&gt;

&lt;p&gt;　　有人可能会说作为一个开发人员, 你不会用 &lt;code class=&quot;highlighter-rouge&quot;&gt;Google&lt;/code&gt; 啊。 是的, Google是能搜到我们搭建在 &lt;code class=&quot;highlighter-rouge&quot;&gt;Github Page&lt;/code&gt; 的博客, 会用&lt;code class=&quot;highlighter-rouge&quot;&gt;Google&lt;/code&gt; 也是一个开发人员必备技能之一。但是, 我们生活在天朝, 所以百度还是总有会用到的时候, 或者是你想让更多的天朝人能搜到你。&lt;/p&gt;

&lt;h3 id=&quot;为什么使用百度搜索不到-github-page-上的博客&quot;&gt;为什么使用百度搜索不到 Github Page 上的博客？&lt;/h3&gt;

&lt;p&gt;有人联系过 Github Support 部门 , 给出大致的意思就是: 百度爬虫爬得太猛烈，已经对很多 Github 用户造成了问题。所以 Github 将禁止百度爬虫的爬取。&lt;/p&gt;

&lt;h3 id=&quot;如何让百度能搜索你的博客&quot;&gt;如何让百度能搜索你的博客?&lt;/h3&gt;

&lt;p&gt;　　根据上面说的, 目前发现只是Github Page禁止了百度搜索, 所以让百度能搜索到你的博客还是有一些方法的。例如:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;自己搞个VPS,博客部署在VPS上。&lt;/li&gt;
  &lt;li&gt;博客部署 &lt;code class=&quot;highlighter-rouge&quot;&gt;Coding.net&lt;/code&gt; 上, &lt;code class=&quot;highlighter-rouge&quot;&gt;GitCafe&lt;/code&gt;已经合并到 &lt;code class=&quot;highlighter-rouge&quot;&gt;Coding&lt;/code&gt; 。
我使用的是第二种方法, 博客部署在 &lt;code class=&quot;highlighter-rouge&quot;&gt;Coding.net&lt;/code&gt; 上也相对简单些。&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;在coding上部署你的博客&quot;&gt;在Coding上部署你的博客。&lt;/h4&gt;

&lt;p&gt;　　Coding同样支持Hexo、Jekyll等博客的部署, Coding 跟Github还是挺像的,而且是中文。 同样的在Coding里面建一个项目,项目名字跟你的用户名一样,这里我就不啰嗦了, 说几个需要注意的地方:   &lt;br /&gt;
&lt;strong&gt;注意一:&lt;/strong&gt;     &lt;br /&gt;
　　在&lt;code class=&quot;highlighter-rouge&quot;&gt;Coding Page&lt;/code&gt; 上部署博客,需要把博客推送到&lt;code class=&quot;highlighter-rouge&quot;&gt;coding-pages &lt;/code&gt; 分支上, 分支名字是固定的。  &lt;br /&gt;
&lt;strong&gt;注意二:&lt;/strong&gt;   &lt;br /&gt;
　　&lt;code class=&quot;highlighter-rouge&quot;&gt;Coding Page&lt;/code&gt; 不支持自定义CNAME, 你需要点击到Page模块,然后添加一个域名来绑定。&lt;/p&gt;

&lt;p&gt;更详细的请看&lt;a href=&quot;https://coding.net/help/doc/pages/index.html&quot;&gt;Coding Pages 官网介绍&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;参考文章:
&lt;a href=&quot;http://jerryzou.com/posts/feasibility-of-allowing-baiduSpider-for-Github-Pages/&quot;&gt;解决 Github Pages 禁止百度爬虫的方法与可行性分析&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;转载请注明：&lt;a href=&quot;http://baixin&quot;&gt;潘柏信的博客&lt;/a&gt; » &lt;a href=&quot;http://baixin.io/2016/06/HEXO_Advanced/&quot;&gt;点击阅读原文&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 12 Jun 2016 00:00:00 +0000</pubDate>
        <link>https://gsmoke.github.io//2016/06/12/HEXO_Advanced/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2016/06/12/HEXO_Advanced/</guid>
        
        <category>博客</category>
        
        
      </item>
    
      <item>
        <title>开发常用工具</title>
        <description>&lt;p&gt;工欲善其事必先利其器，选择一些好的工具可以成吨的提高自己的工作效率。&lt;/p&gt;

&lt;h3 id=&quot;个人开发常用工具的收集&quot;&gt;个人开发常用工具的收集&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.zybuluo.com/mdeditor&quot;&gt;cmd Markdown&lt;/a&gt; 作业部落出版的Markdown编辑器&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rest-client/rest-client&quot;&gt;RESTClient&lt;/a&gt; 一个开源的客户端HTTP调试工具。&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/getlantern/lantern&quot;&gt;lantern&lt;/a&gt; 蓝灯,一款开源的翻墙工具。&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.charlesproxy.com/&quot;&gt;Charles&lt;/a&gt; 青花瓷, 一款HTTP/HTTPS的抓包工具。
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://blog.devtang.com/2015/11/14/charles-introduction/&quot;&gt;Charles 从入门到精通&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.sublimetext.com&quot;&gt;Sublime&lt;/a&gt; 一款强大的IDE,支持Python、JS、JSON格式化等等…更重要的是&lt;code class=&quot;highlighter-rouge&quot;&gt;Sublime&lt;/code&gt;支持的插件很多。
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://www.xuanfengge.com/practical-collection-of-sublime-plug-in.html&quot;&gt;实用的sublime插件集合&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;文章配图网站&quot;&gt;文章配图网站&lt;/h3&gt;

&lt;p&gt;还在为文章配图而苦恼吗？点击店面的网站吧，各种各样的图片帮你丰富你的文章。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.gratisography.com/&quot;&gt;Gratisography&lt;/a&gt; gratisography 里面的图片每周都会更新，很多时尚流行的照片在里面，并且适合用在设计项目上。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.ssyer.com/home-index.html&quot;&gt;ssyer&lt;/a&gt;国内的网站，不需要翻墙，速度很快，图片最全。完全免费的图片库。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pixabay.com/&quot;&gt;Pixabay&lt;/a&gt; 不同类型的高清摄影照片。&lt;/p&gt;

&lt;h3 id=&quot;ui设计网站&quot;&gt;UI设计网站&lt;/h3&gt;

&lt;p&gt;作为一个开发者，自己写些小程序的时候经常会为没有UI而烦恼，下面就是一些UI设计网站，有新颖的UI界面设计，也有单独的UI元素，icon等。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.ui.cn/&quot;&gt;UI中国&lt;/a&gt; 国内潮流的UI设计作品。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.webdesigndev.com/&quot;&gt;webdesigndev&lt;/a&gt; 国外网站设计文章，各种各样的资料看到你眼花缭乱。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dribbble.com/&quot;&gt;dribbble&lt;/a&gt; 接触过设计的应该都知道，一个很好的UI设计平台。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flaticon.com/&quot;&gt;flaticon&lt;/a&gt; 各种icon的设计，一定有你想想要的。&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;转载请注明：&lt;a href=&quot;http://baixin&quot;&gt;潘柏信的博客&lt;/a&gt; » &lt;a href=&quot;http://baixin.io/2016/06/Develop_Tool/&quot;&gt;点击阅读原文&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 02 Jun 2016 11:15:06 +0000</pubDate>
        <link>https://gsmoke.github.io//2016/06/02/Develop_Tool/</link>
        <guid isPermaLink="true">https://gsmoke.github.io//2016/06/02/Develop_Tool/</guid>
        
        <category>工具</category>
        
        
      </item>
    
  </channel>
</rss>
