diff --git a/_posts/PythonTestAutomationiOS.md b/_posts/2016-08-04-PythonTestAutomationiOS.md similarity index 100% rename from _posts/PythonTestAutomationiOS.md rename to _posts/2016-08-04-PythonTestAutomationiOS.md diff --git a/_posts/iOSLowerLeftAppicon.md b/_posts/2016-09-23-iOSLowerLeftAppicon.md similarity index 100% rename from _posts/iOSLowerLeftAppicon.md rename to _posts/2016-09-23-iOSLowerLeftAppicon.md diff --git a/_posts/jekyll_tutorials1.md b/_posts/2016-10-14-jekyll_tutorials1.md similarity index 100% rename from _posts/jekyll_tutorials1.md rename to _posts/2016-10-14-jekyll_tutorials1.md diff --git a/_posts/Xcode8.md b/_posts/2016-10-25-Xcode8.md similarity index 100% rename from _posts/Xcode8.md rename to _posts/2016-10-25-Xcode8.md diff --git a/_posts/TensorFlowOniOSUse1.md b/_posts/2016-11-03-TensorFlowOniOSUse1.md similarity index 100% rename from _posts/TensorFlowOniOSUse1.md rename to _posts/2016-11-03-TensorFlowOniOSUse1.md diff --git a/_posts/macTips.md b/_posts/2016-11-16-macTips.md similarity index 100% rename from _posts/macTips.md rename to _posts/2016-11-16-macTips.md diff --git a/_posts/markdownTool.md b/_posts/2016-11-20-markdownTool.md similarity index 98% rename from _posts/markdownTool.md rename to _posts/2016-11-20-markdownTool.md index 8afff38c3b..9fe6b3b033 100755 --- a/_posts/markdownTool.md +++ b/_posts/2016-11-20-markdownTool.md @@ -36,8 +36,6 @@ H6 :###### Header 6 css 的大部分语法同样可以在 markdown 上使用,但不同的渲染器渲染出来的 markdown 内容样式也不一样,下面这些链接里面有 markdown 基本语法,你也可以在下面几个平台上尝试着写一些。 -### 一些好用的 Markdown 编辑器 -
[MaHua](http://mahua.jser.me/?utm_source=mindstore.io) 在线 Markdown 编辑器 ,无须测试。 diff --git a/_posts/neural_networks_using_TensorFlow.md b/_posts/2016-11-20-neural_networks_using_TensorFlow.md similarity index 100% rename from _posts/neural_networks_using_TensorFlow.md rename to _posts/2016-11-20-neural_networks_using_TensorFlow.md diff --git a/_site/2016/07/Codeless/index.html b/_site/2016/07/Codeless/index.html index 023168f736..a6f79d2670 100644 --- a/_site/2016/07/Codeless/index.html +++ b/_site/2016/07/Codeless/index.html @@ -277,6 +277,11 @@

实现原理

+ + diff --git a/_site/archive/index.html b/_site/archive/index.html index da23a3b1b6..32bceab250 100644 --- a/_site/archive/index.html +++ b/_site/archive/index.html @@ -194,6 +194,106 @@

2016

+
  • + + 2016-11- 3 + + » + TensorFlow 在 iOS 平台上的使用(一) +
  • + + + + + + + + + + + + + +
  • + + 2016-10-25 + + » + Xcode 8 使用笔记 +
  • + + + + + + + + + + + + + +
  • + + 2016-10-14 + + » + Jekyll搭建个人博客 +
  • + + + + + + + + + + + + + +
  • + + 2016-09-23 + + » + iOS设备左下角出现Appicon +
  • + + + + + + + + + + + + + +
  • + + 2016-08- 4 + + » + Python自动化测试iOS项目 +
  • + + + + + + + + + + + + +
  • 2016-07-15 diff --git a/_site/feed.xml b/_site/feed.xml index 35be9996c8..5074142992 100644 --- a/_site/feed.xml +++ b/_site/feed.xml @@ -5,1033 +5,1239 @@ 欢迎来到我的个人站~ http://baixin.io/ - Fri, 25 Nov 2016 16:04:40 +0800 - Fri, 25 Nov 2016 16:04:40 +0800 + Fri, 04 Nov 2016 19:17:20 +0800 + Fri, 04 Nov 2016 19:17:20 +0800 Jekyll v3.1.2 - 老司机带你剖析无码统计 - <p>  无需开发介入,也可以统计移动App上按钮的点击次数,简称 <code class="highlighter-rouge">无码统计</code> ,只要是跟App开发相关的同学,相信都对埋点统计有些了解,特别是针对开发人员来说,做代码埋点统计基本上是看不到直接收益也是开发人员最不愿做的一件事,这篇文章讲的就是如何让开发人员摆脱代码埋点的痛苦。</p> - -<p>  文章主要分为:使用场景、实现原理、适用范围、使用详情四个模块,不管你是产品,还是开发人员又或者是运营人员都适合读这篇文章。</p> - -<p>  在App开发过程中我们应该都有过类似的需求:想统计某些按钮的点击次数。例如,我们开发了一个注册模块,注册流程有些复杂,整个注册功能开发完成后,我们想知道到底有没有用户使用注册功能,而又有多少用户使用?</p> - -<p>有什么方式能知道呢?</p> - -<blockquote> - <ul> - <li>后台看注册系统? <br /> - 有些麻烦,需要后台去数据库里查看,还要做成数据可视化的才方便看。</li> - </ul> -</blockquote> - -<blockquote> - <ul> - <li>查看注册按钮的点击情况? <br /> - 这是最直观的。 主看看两块就行,注册按钮的点击次数 和 提交注册按钮的点击次数,如果发现注册按钮被点击多次(如1W次),而提交注册的点击次数却只有几次,这就可以反映出,很多用户看到的我们的注册流程太复杂,然后选择放弃注册了。同样的道理,我们通过同样的方式可以验证我们其它的功能模块是否有用户经常使用,从而来重新规划我们的设计需求。</li> - </ul> -</blockquote> - -<p>  一整个功能模块的完成涉及到 产品、UI设计、开发、测试 等几个部分,资源和人力的消耗还是挺大的,所以我们在开发过程是否继续维护这些功能模块,还是开发新功能是要经过慎重衡量,而衡量这些最有说服力的依据就是用户的使用数据,这些数据来源是刚才说的 按钮的点击次数,页面的停留时长 等等。</p> + TensorFlow 在 iOS 平台上的使用(一) + <p>  距离上次使用 TensorFlow 在iOS平台上做的小 Demo,已经过了四个月了,今天忽然想再看看,发现 Demo 已经不见了,我只能从头在编一次,这次发现编译 iOS 库,简单多了。</p> -<h3 id="section">使用场景</h3> - -<p>  分析用户App的使用情况当然是直接用数据说话,那么想知道某些按钮的点击次数,就一定需要App的开发人员去具体的按钮点击方法里面埋点才行,有的公司有自己的一套完整的统计埋点系统,有的公司是使用第三方统计,最终都是可以看到按钮的点击次数的,不管怎么样想知道按钮的点击必须要App的开发人员亲自去写代码埋点才行,而这篇文章主要讲的是 <code class="highlighter-rouge">无码统计</code> 按钮点击次数。也就是不需要开发介入,我们就能知道按钮的点击了,开发人员只要负责他的业务开发就行,下面是一张 <code class="highlighter-rouge">传统埋点</code> 统计和 <code class="highlighter-rouge">灵动分析</code> 统计,灵动是TalkingData的SDK无码统计的一个功能。</p> - -<p><img src="/images/posts/codeless/image01.png" height="300" width="600" /></p> - -<p>先大致讲下左边 <code class="highlighter-rouge">传统</code> 埋点统计流程</p> +<p>  tensorflow <a href="https://github.com/tensorflow/tensorflow/archive/master.zip">下载地址</a>,tensorflow 最近提交的时间:2016-11-03,commit:<code class="highlighter-rouge">7b7c02de56e013482b5fe5ab05e576dc98fe5742</code> 。</p> -<blockquote> - <ul> - <li>首先需要制定埋点需求、设计埋点方案,需求有了后就去找开发沟通,埋点需求的讨论,双方确认需求通过后,然后准备需求文档,开发再根据文档来写具体的埋点代码。</li> - </ul> -</blockquote> +<p>  下载完成后打开文件,找到目录 <code class="highlighter-rouge">tensorflow-master/tensorflow/contrib/ios_examples</code> 你会发现目录下有三个项目和一个 README.md 。</p> -<blockquote> - <ul> - <li>代码写完后,App打包给测试人员,测试人员进行测试,同时还要对埋点参数的数据安全审核,参数是否有包含公司敏感信息。</li> - </ul> -</blockquote> +<div class="highlighter-rouge"><pre class="highlight"><code>benchmark 、 camera 、 simple 、README.md -<blockquote> - <ul> - <li>测试通过后就需要上线了,这个过程一般是开发人员去完成的。iOS需要提交到AppStore上,以前大家都知道,一个审核周期就是一两周,还有随时被拒的可能,现在虽然周期变短了,但审核也还是挺严格的(走快捷通道的除外)。Android需要在各个渠道上重新发布,也是很麻烦的。</li> - </ul> -</blockquote> +</code></pre> +</div> -<blockquote> - <ul> - <li>如果前面几部都顺利完成了的话,接下来就等待用户更新了,如果埋点统计功能跟其它新功能一起上线的话,我们更新就有理由了,如果仅仅这一版仅仅只是埋点统计功能,那么让用户更新App的理由又是一件头疼的事情了,不管怎么样经常让用户更新App多少会对用户用些影响的。</li> - </ul> -</blockquote> +<h3 id="section">如果你发现项目无法运行,请看这里</h3> -<blockquote> - <ul> - <li>最终的结果应该是部分用户更新了App,那么我们能统计到按钮点击的用户了就只是更新了App的这一部分用户了,而且他们更新的时间是不一样的,最终我们终于可以看需求上的埋点统计了。</li> - </ul> -</blockquote> +<p>  对于任何项目我们首先打开的应该是 README.md ,里面一般情况都会有介绍如何使用这个项目,tensorflow 也不会例外。README 开头就说了,这个目录里有如何在 iOS 平台上使用 tensorflow 的例子,但是需要注意几点:</p> -<p>再看看右边 <code class="highlighter-rouge">灵动</code> 统计流程</p> +<ul> + <li>你的 Xcode 版本必须是 7.3 或更高版本,并且有安装 command-line 工具 。</li> + <li>项目(Examples) 里必须包含一个静态库:<code class="highlighter-rouge">libtensorflow-core.a</code> 。</li> + <li>下载 <a href="https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip">Inception v1</a>,解压后将 label 和 graph 放在 simple 和 camera 的项目中。</li> +</ul> -<p>同样需要制定需求,但是需求方可以直接根据自己的需求去使用 <code class="highlighter-rouge">灵动</code> 了,使用了灵动就可以直接看按钮的点击率了,这个过程不需要开发介入,也不需要用户去更新App。</p> +<h3 id="camera-">camera 项目的使用</h3> -<p>  从这张图可以看出,不需要开发人员介入,可以开发成功,提高开发效率,而且埋点也很灵活,需求人员(可以是产品,也可以是运营)可以直接使用灵动,也不需要用户更新,那么数据反馈会比传统埋点快很多,使用了就可以立即生效,需求方的观察周期也缩短了,能更灵活的做出决策。</p> +<p>  camera 项目在 tensorflow-master/tensorflow/contrib/ios_examples 目录下,如果你是直接打开 camera 项目,编译你会发现报错缺少 imagenet_comp_graph_label_strings.txt 和 tensorflow_inception_graph.pb 两个文件,这两个文件上面已经说到了下载 <a href="https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip">Inception v1</a> 解压得到。现在还差 静态库:<code class="highlighter-rouge">libtensorflow-core.a</code> ,这个需要我们自己编译。</p> -<h3 id="section-1">实现原理</h3> +<h4 id="libtensorflow-corea">编译静态库:libtensorflow-core.a</h4> -<p>  上面大致介绍了下 <code class="highlighter-rouge">灵动</code> 能给我们解决什么问题,这里讲的是 <code class="highlighter-rouge">灵动</code> 是通过什么样的技术手段实现,这里可能对于开发人员来说更喜欢,大家先看一张灵动使用时的一个交互</p> +<p>进入目录:tensorflow-master/tensorflow/contrib/makefile,你可以看到一大堆 .sh 结尾的文件,找到 build_all_ios.sh ,Mac 上可以直接在 termina(终端)上运行命令编译</p> -<p><img src="/images/posts/codeless/image02.png" height="300" width="500" /></p> +<div class="highlighter-rouge"><pre class="highlight"><code>$ sh build_all_ios.sh +</code></pre> +</div> -<p>  这张图分成两部分看,先看上面,一个用户在操作Client和PC,Client和PC通讯是通过一个Wss的服务器建立的长连接,这是灵动调试时的一个交互。 <br /> -  也就是说,用户使用灵动分析时,需要一个安装自己App的移动设备,这个App必须要集成TalkingData的统计分析SDK才行,SDK初始化时的AppID是在TalkingData创建应用时分配的。另一端用户要打开TalkingData的灵动网页,在App启动的时候摇一摇手机,然后就可以建立一个wss的长连接了。用户就可以直接在网页上给按钮添加监听事件了,添加完成后,在手机上点击该按钮,网页上就会提示被点击,调试完成后点击全部生效,配置数据就会保存到下面https的服务器。 <br /> -  我们的所有用户在启动App的时候,都可以从https服务器里获取到这套配置,客户端根据这套配置找到具体的按钮,监听点击事件,当按钮被点击后,就可以统计到了。</p> +<p>这个编译的过程是很漫长的,一般在一个小时左右。也有可能你在编译的过程中会遇到问题,这次我只遇到一个问题:</p> -<p>接下来再看看灵动调试过程中数据是具体怎么进行数据交互的。</p> +<div class="highlighter-rouge"><pre class="highlight"><code>configure.ac:30: error: required file 'build-aux/ltmain.sh' not found +configure.ac:24: installing 'build-aux/missing' +Makefile.am: installing 'build-aux/depcomp' +parallel-tests: installing 'build-aux/test-driver' +autoreconf: automake failed with exit status: 1 -<p><img src="/images/posts/codeless/image03.png" height="300" width="500" /></p> +</code></pre> +</div> -<p>  可以看到App客户端和Web端交互主要分为四部分:<code class="highlighter-rouge">设备信息</code> 、 <code class="highlighter-rouge">App基本结构</code> 、<code class="highlighter-rouge">控件绑定配置</code> 、<code class="highlighter-rouge">按钮点击信息</code> ,<code class="highlighter-rouge">设备信息</code> 主要是用来确认设备是调试者的设备,因为其它的终端用户也可能会误触发调试,<code class="highlighter-rouge">App基本结构</code>是用来在Web上展示移动App的,然后在Web上绑定了控件,就会把<code class="highlighter-rouge">控件绑定配置</code>发送给客户端,客户端根据配置监听绑定,当终端用户点击控件后,客户端就会把<code class="highlighter-rouge">按钮点击信息</code>传给Web端,Web显示控件被点击。</p> +<p>解决方法是:先卸载 libtool 在重新安装,<code class="highlighter-rouge">brew uninstall libtool</code> &amp;&amp; <code class="highlighter-rouge">brew install libtool</code></p> -<p>  再回头看看实现原理的第一张图片,调试完成数据就会从WSS的长连接服务器存储到HTTPS的服务器,此后其它终端用户只要在再次启动App就能获取到埋点配置了,SDK根据埋点配置去找到具体的控件(按钮),监听点击,当用户点击控件时就可以调用自定义埋点的方法,之后的数据处理就跟自定义埋点是一样的原理了。 <br /> -  可能有同学会有疑问,所有的App每次启动的时候都会去获取埋点配置,是不是会很耗流量? 答案是不会的,服务器在没有埋点配置的时候每次将获取不到信息,那么将不会有什么流量消耗。如果服务器有配置了,App才会有些流量消耗的,而且这些配置信息是经过压缩的,所以流量消耗也不大,App获取到了配置之后就会做本地缓存,服务器配置不变的情况下再次获取配置也不会有流量的消耗,只有在下一次运营人员修改了新的控件绑定时才会消耗一些流量。 所以整个无码统计对终端用户的流量的影响是很小的。 <br /> -  你也可以参考这套逻辑试试自己也部署这么一套无码统计,之后就不用再担心运营给的埋点统计需求了,让他们自己去用无码统计吧。</p> +<p>如果你还遇到了其它问题,可以看看我之前的一片文章 <a href="http://baixin.io/2016/07/iOSMachineLearning_TensorFlow/">iOS开发迎来机器学习的春天—TensorFlow</a> ,或者是直接去 tensorflow 的 <a href="https://github.com/tensorflow/tensorflow/issues">Issues</a> 里面找。</p> -<p><a href="http://baixin.io/2016/07/Codeless/">点击阅读原文</a></p> +<p>一个小时后。。。 如果编译没出问题,你可以在目录 <code class="highlighter-rouge">tensorflow-master/tensorflow/contrib/makefile/gen/lib</code> 下找到一个静态库:<code class="highlighter-rouge">libtensorflow-core.a</code> ,把这个静态库拷贝到 camera 项目中,然后编译运行。</p> - Fri, 15 Jul 2016 00:00:00 +0800 - http://baixin.io/2016/07/Codeless/ - http://baixin.io/2016/07/Codeless/ + Thu, 03 Nov 2016 00:00:00 +0800 + http://baixin.io/2016/11/TensorFlowOniOSUse1/ + http://baixin.io/2016/11/TensorFlowOniOSUse1/ - 技术 + 机器学习 - Git教程 - <h3 id="section">介绍</h3> + Xcode 8 使用笔记 + <p>最近使用 Xcode8遇到了一些问题,想记下来,发现简书上有位同学写了一篇很详细的教程 <a href="http://www.jianshu.com/p/c1904fd8db06">原文链接</a>,比较懒惰的我就在他的基础上加了些我自己的一些笔记。</p> -<p>  Git是做项目的版本管理,你也可以称它们为版本管理工具。假如现在你有一个文件夹,里面可以是项目,也可以是你的个人笔记(如我这个博客),或者是你的简历、毕业设计等等,都可以使用git来管理。</p> +<h3 id="interface-builder">Interface Builder</h3> -<p>  目前常用的版本控制器有Git和SVN,即使这两个你没有全用过,至少也会听过,我这里以Git为例,个人比较喜欢Git,你也可以看看这篇文章:<a href="http://www.worldhello.net/2012/04/12/why-git-is-better-than-svn.html">为什么Git比SVN好</a>。我使用的是Mac,Mac上没自带Git环境,但是作为iOS开发者,我安装Xcode的时候,Xcode里是有自带Git的,所以我不需要考虑怎么去安装Git了。</p> +<p>随着 14 年的 iPhone6 和 6P 出来之后,iPhone 的屏幕尺寸也越来越多,屏幕适配是一个需要解决的问题,以后不一定苹果又出什么尺寸的 iPhone 呢。</p> -<h3 id="git">安装Git</h3> +<p>在 iPhone6 和 6P 发布的同一年,苹果推出的 Xcode6 中在原有的 Auto layout的基础上,添加了Size Classes新特性,通过这个新特性可以使用一个XIB或者SB文件,适配不同的屏幕以及iPhone和iPad两种设备。</p> -<p><strong>在Mac OS X上安装Git</strong></p> +<p>在 Xcode8 中,苹果推出了更加强大的可视化编辑工具预览功能,可以在不运行App的情况下,预览当前XIB或SB在不同屏幕尺寸下的显示。(这个功能我记得之前Xcode就有,只是隐藏的比较深,苹果现在给拿到外面了)</p> -<p>提供两种方法参考:</p> +<p>选择一个XIB文件进去,点击下面红框的位置,会出现从3.5寸-5.5寸一系列屏幕尺寸的选项。直接点击不同屏幕尺寸,以及横竖屏选项,切换不同的屏幕显示。在iPad上还可以选择是否分屏,功能非常强大。</p> -<blockquote> - <p>1、通过homebrew安装Git,具体方法请参考<a href="http://brew.sh/">homebrew的文档</a> <br /> -2、直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode。</p> -</blockquote> +<p><img src="/images/posts/Xcode8/image1.png" height="200" width="600" /></p> -<p><strong>在Windows上安装Git</strong></p> +<p>在右边有一个 Vary for Traits 选项,点击这个选项就可以同时显示所有可选的屏幕样式,功能和上面图片都一样,只是显示上看起来比较多。</p> -<blockquote> - <p>从<a href="https://git-for-windows.github.io">https://git-for-windows.github.io</a> 下载,然后按默认选项安装即可,安装完成后,在开始菜单里找到“Git”-&gt;“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!</p> -</blockquote> +<p><img src="/images/posts/Xcode8/image2.png" height="160" width="600" /></p> -<h3 id="git-1">配置Git</h3> +<p>还有一点,新创建的 XIB 控件尺寸,不再是之前 600*600 的方块了,而是默认是6s的长方形 XIB 文件,看起来舒服多了。</p> -<p>安装完成后,还需要最后一步设置,在命令行输入:</p> +<h3 id="targetgeneral-">Target中General 的变化</h3> -<blockquote> - <ul> - <li>$ git config –global user.name “Your Name”</li> - <li>$ git config –global user.email “email@example.com”</li> - </ul> -</blockquote> +<p>在 Xcode8 之前,都需要自己设置证书和描述文件。如果设置出现错误的情况下,还可以通过点击 Fix issue 来修复这个错误。但这有个问题就在于,Fix issue 选项并不是那么好用,有的时候设置是正确的这里也提示需要 Fix issue。</p> -<p>“Your Name”: 是每次提交时所显示的用户名,因为Git是分布式版本控制系统,当我们push到远端时,就需要区分每个提交记录具体是谁提交的,这个”Your Name”就是最好的区分。</p> +<p>可能苹果也意识到这个问题的存在,在Xcode8中可以通过Automatically manage signing选项,让苹果为我们管理证书和配置文件,设置也都是由苹果来完成的。在Xcode8中新建项目,这个选项默认是被勾选的。</p> -<p>“email@example.com”: 是你远端仓库的email</p> +<p><img src="/images/posts/Xcode8/image3.png" height="350" width="500" /></p> -<p>–global:用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然我们也可以对某个仓库指定不同的用户名和Email地址。</p> +<p>从上面图中可以看到,苹果帮我们自动管理了证书和配置文件。而且在之前的项目中,如果想要设置安装后显示在手机上的App名字,还需要自己到Info.plist文件中,修改Display Name字段,而现在直接在General中就可以做修改,这个修改和Info.plist是同步的。</p> -<h3 id="section-1">开始使用-建立仓库:</h3> +<p>但是,如果我想自己管理证书和描述文件呢?只需要去掉Automatically manage signing选项。</p> -<p>你在目标文件夹下使命令:</p> +<p><img src="/images/posts/Xcode8/image4.png" height="350" width="500" /></p> -<blockquote> - <ul> - <li>git init (创建.git文件)</li> - </ul> -</blockquote> +<p>如果自己到Build Settings中手动设置证书和描述文件,可以发现Provisioning Profile选项已经被标明为Deprecated,也就是苹果并不推荐手动设置。</p> -<p>就会创建一个 <code class="highlighter-rouge">.git</code> 隐藏文件,相当于已经建立了一个本地仓库。</p> +<h3 id="xcode-">Xcode 插件</h3> -<p><strong>添加到暂存区:</strong></p> +<p>升级 Xcode8 之后会发现,在 Xcode8 中所有第三方插件都失效了,并且连之前菜单栏的插件选项也不存在了。在之前很多 iOS 开发者,都是通过 <a href="http://alcatraz.io/">Alcatraz</a> 来管理插件的,现在 Alcatraz 也是不可用的。但是X code8 自身也对编译器进行了升级,将一些比较好的插件功能加入到 Xcode 中,例如单行高亮显示等。</p> -<blockquote> - <ul> - <li>git add . (全部添加到暂存区)</li> - <li>git commit -m ‘ first commit’ (提交暂存区的记录到本地仓库)</li> - </ul> -</blockquote> +<p>在 Xcode8 中支持了开发插件工程,并且为我们提供了一个插件模板,开发的插件可以上传到App Store 下载。苹果这么做有一个原因在于,之前 Xcode和插件是运行在同一个进程的,所以插件的崩溃也会导致Xcode崩溃。苹果现在将插件作为一个单独的应用程序,分开进程运行,不会对Xcode带来其他影响。</p> -<h3 id="section-2">其它</h3> +<p><img src="/images/posts/Xcode8/image5.png" height="350" width="500" /></p> -<p>git branc 查看时如出现</p> +<h3 id="runtime-issues">Runtime Issues</h3> -<blockquote> - <ul> - <li>(HEAD detached at analytics_v2)</li> - <li>dev</li> - <li>master</li> - </ul> -</blockquote> +<p>在开发过程中,因为语法或明显的代码错误(例如Retain Cycle),编译器可以发现并报黄色或红色警告。但是一些因为代码逻辑导致的错误,编译器并没有办法找到。例如下面的这句代码,因为代码逻辑的问题导致两个数组相互引用,都不能释放。</p> -<p>代表现在已经进入一个临时的HEAD,可以使用 <code class="highlighter-rouge">git checkout -b temp</code> 创建一个 temp branch,这样临时HEAD上修改的东西就不会被丢掉了。 -然后切换到 dev 分支上,在使用 git branch merge temp,就可以把 temp 分支上的代码合并到 dev 上了。</p> +<p><img src="/images/posts/Xcode8/image6.png" height="180" width="600" /></p> -<p><a href="http://baixin.io/2016/07/GitTutorial/">点击阅读原文</a></p> +<p>这时候可以通过 Xcode8 提供的 Runtime Issues 新特性,查找到运行过程中出现的问题,并通过 Graph 的方式将问题可视化的展现给开发者。</p> - - Wed, 13 Jul 2016 00:00:00 +0800 - http://baixin.io/2016/07/GitTutorial/ - http://baixin.io/2016/07/GitTutorial/ - - 工具 - - - - - - iOS开发迎来机器学习的春天---TensorFlow - <div align="center"> - <img src="/images/posts/tfimg/logo.jpg" height="300" width="500" /> -</div> +<p><img src="/images/posts/Xcode8/image7.png" height="300" width="600" /></p> -<p>  <code class="highlighter-rouge">人工智能</code>、<code class="highlighter-rouge">机器学习</code>都已走进了我们的日常,尤其是愈演愈热的大数据更是跟我们的生活息息相关,做 <code class="highlighter-rouge">人工智能</code>、<code class="highlighter-rouge">数据挖掘</code>的人在其他人眼中感觉是很高大上的,总有一种遥不可及的感觉,在我司也经常会听到数据科学部的同事们提到 <code class="highlighter-rouge">机器学习</code>、<code class="highlighter-rouge">数据挖掘</code> 之类的词。但这些名词真的跟我们移动开发就没直接关系了吗? <br /> -  作为移动开发者来说,无时无刻不被这些名词狠狠地敲打着脆弱的内心。💢 💢 💢 何时才能够将<code class="highlighter-rouge">机器学习</code>、<code class="highlighter-rouge">深度学习</code>应用在移动端,敲响移动端<code class="highlighter-rouge">机器学习</code>工业化的大门呢?</p> +<h3 id="debug-memory-graph">Debug Memory Graph</h3> -<blockquote> - <p>想象一下,某一天你身处一个完全陌生的环境,周围都是陌生的事物,而运行在iPhone的某个APP却对这个环境了如指掌,你要做的就是打开这个APP,输入你需要了解的事物,iPhone告诉你这个事物的信息,你也就没有了陌生事物了。世界就在眼前!</p> -</blockquote> +<p>在Xcode6中出现了Debug View Hierarchy新特性,可以通过其调试当前App的视图层级,查找UI相关的bug非常方便。在Xcode8中苹果为开发者提供了Debug Memory Graph特性,通过这个新特性,可以直接选择一个对象,查看与其相关的内存关系。</p> -<p>如下图:</p> -<div align="center"> - <img src="/images/posts/tfimg/image02.png" height="300" width="480" /> -</div> +<p><img src="/images/posts/Xcode8/image8.png" height="300" width="600" /></p> -<p>上面物体的识别准确率还是蛮不错的,基本识别出了键盘(49%的概率)、鼠标(46%的概率)和水杯(24%的概率)。</p> +<p>Debug Memory Graph 和 Runtime Issues 可以配合使用,通过 Debug Memory Graph 分析内存关系完成后,点击 Runtime Issues 可以看到已经发现的内存问题。</p> -<p>但是在某些事物的识别准确度方便却差强人意,比如下图:</p> +<h3 id="swift-3">Swift 3</h3> -<div align="center"> -  <img src="/images/posts/tfimg/image01.png" height="300" width="320" /> -</div> -<p>  iPhone 6被识别成了iPod(59%的概率),而iPod的却是不怎么敢认(10%的概率)。想想最崩溃的估计是iPhone 6了,身价直接被降了好几个等级。</p> +<p>Xcode8 带来了新版本的 Swift3,新版本的Swift变化较大,如果旧版的Swift项目在Xcode8上编译可能会失败。对此,苹果为开发者提供了Swift迁移工具,听说不太好用(我没用过这个工具)。</p> -<div align="center"> -  <img src="/images/posts/tfimg/wq.jpg" height="320" width="240" /> -</div> +<p>如果不想立刻就迁移到Swift3,可以在Builder Settings中进行设置,选择Use Legacy Swift Language Version设置为YES,就可以继续使用旧版本的Swift2.3。</p> -<p>  上面的例子来自于TensorFlow官方iOSDemo,暂且不评述TensorFlow的识别准确度如何,毕竟它还年轻,但是仅凭其识别能力的体现,也给机器学习在移动端的运用带来了无限的可能。</p> +<p><img src="/images/posts/Xcode8/image9.png" height="300" width="600" /></p> -<h3 id="tensorflowtf">一、TensorFlow(简称TF)</h3> +<h3 id="section">其他更新</h3> -<p>  去年,Google资深系统专家Jeff Dean在湾区机器学习大会上隆重介绍了其第二代深度学习系统<a href="http://www.tensorflow.org/">TensorFlow</a>,一时间网络上针对TensorFlow的文章铺天盖地,<a href="http://www.leiphone.com/news/201511/UDLyNds2oSTwM2yZ.html">揭秘TensorFlow:Google开源到底开的是什么?</a>、<a href="http://www.leiphone.com/news/201511/Voza1pFNQB4bzKdR.html">Google开源TensorFlow系统,这背后都有什么门道?</a>、<a href="http://www.zhihu.com/question/37243838">如何评价Google发布的第二代深度学习系统TensorFlow?</a>等等文章,TensorFlow的燎原之火一直在燃烧蔓延着,其<a href="https://github.com/tensorflow/tensorflow">GitHub上的开源库</a>在此文撰写时,也已经被<code class="highlighter-rouge">star:27550</code>,<code class="highlighter-rouge">fork:11054</code>了。🔥 🔥 🔥 🔥 🔥</p> +<p>Xcode 新版字体,SF Mono Regular 字体。更新 Xcode 之后我比较喜欢这种字体,看起来代码非常工整。 +被编辑的行高亮显示。之前Xcode有个插件就是这个功能,Xcode8把高亮功能集成进来了,使用起来很方便。 +最新版的API文档,展示样式发生了很大的改变。 +更方便的生成文档(就是喵神写的VVDocumenter),在Xcode8中可以将光标放在方法上面,通过option + command + /快捷键生成文档注释。</p> -<p>不负众望,Google一直宣称平台移植性非常好的TensorFlow,终于在2016年6月27日,发布0.9版本,宣布移动端支持。<a href="https://developers.googleblog.com/2016/06/tensorflow-v09-now-available-with.html">TensorFlow v0.9 now available with improved mobile support</a>( 有墙💢 ),同时也给出了移动端的<a href="https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/ios_examples">Demo</a>,对于代码为生的程序员,身处大数据处理为主导的<a href="http://www.talkingdata.com/">TalkingData</a>,也小试身手了一把,下载TensorFlow源码,查看编译指南,开始跳坑、填坑之路,也成就了此篇拙文的产生。</p> +<h3 id="xcode8xibstoreboard">Xcode8适配,XIB和Storeboard适配</h3> -<h3 id="tensorflowios">二、从TensorFlow到iOS静态库</h3> +<p>在 Xcode8 之前,创建一个 XIB 或 SB 文件,都是一个 600*600 的方块 XIB 文件。在 Xcode8 之后,创建的 XIB 文件默认是6s尺寸的大小。</p> -<p>对于iOS平台下如何使用TensorFlow,TensorFlow给出了详细的编译脚本命令,详情请查看<a href="https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile">官方文档的命令</a>。</p> +<p>但是 Xcode8 打开之前旧项目的 XIB或SB 文件时,会弹出下面的弹框, 这时候一般直接选择Choose Device即可。</p> -<h5 id="section">第一步. 工具准备</h5> +<p><img src="/images/posts/Xcode8/image10.png" height="300" width="500" /></p> -<p><code class="highlighter-rouge">工欲善其事必先利其器</code>,在开始编译工作之前,需要准备一些编译所必须的工具:</p> +<p>但是这样有个问题,如果Xcode8打开过这个XIB文件,并选择Choose Device之后。其他的Xcode8以下版本的编译器,将无法再打开这个文件,会报以下错误:</p> -<ol> - <li><a href="http://brew.sh/">Homebrew</a>: Mac os x 上包管理工具,具体使用方法可参考<a href="http://brew.sh/index_zh-cn.html">Doc</a>。</li> -</ol> +<p>The document “ViewController.xib” requires Xcode 8.0 or later. This version does not support documents saved in the Xcode 8 format. Open this document with Xcode 8.0 or later. +有两种方法解决这个问题:</p> -<div class="highlighter-rouge"><pre class="highlight"><code>$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" -</code></pre> -</div> +<p>你同事也升级Xcode8,比较推荐这种方式,应该迎接改变。 +右击XIB或SB文件 -&gt; Open as -&gt; Source Code,删除xml文件中下面一行字段。</p> +<capability name="documents saved in the Xcode 8 format" mintoolsversion="8.0" /> -<ol> - <li>Homebrew安装好之后,依次安装三个辅助性编译工具:</li> -</ol> +<h3 id="section-1">编译错误</h3> -<div class="highlighter-rouge"><pre class="highlight"><code>$ brew install libtool -$ brew install autoconf -$ brew install automake -</code></pre> -</div> +<p>升级Xcode之后,Xcode8对之前的一些修饰符和语句不兼容,会导致一些编译错误。这种错误导致的原因很多,这里大致列几条,各位还是根据自身遇到的情况做修改吧。</p> -<blockquote> - <p>三个工具的含义,请参考:<a href="https://en.wikipedia.org/wiki/GNU_Libtool">https://en.wikipedia.org/wiki/GNU_Libtool</a></p> -</blockquote> +<p>之前一些泛型相关的修饰符,nullable之类的有的会报错。 +CAAnimation及其子类,设置代理属性后,必须在@interface()遵守代理,否则报错,等等。</p> -<h5 id="tensorflow">第二步. 克隆TensorFlow</h5> +<h3 id="section-2">权限适配</h3> -<p>Google以<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>开源协议将TensorFlow开源在<a href="https://github.com/tensorflow/tensorflow">GitHub</a>上,我们可以直接使用TensorFlow源码。</p> +<p>这应该算iOS10系统适配的范畴,最近这两个都在弄,所以就直接和Xcode8适配一起写出来了。</p> -<p>在任意你想存放TensorFlow源码的地方(建议不要放在桌面。^_^),clone项目。</p> +<p>在iOS10之后需要在Info.plist中,添加新的字段获取权限,否则在iOS10上运行会导致崩溃。下面是一些常用的字段,如果有缺少的麻烦各位评论区补充一下。</p> -<div class="highlighter-rouge"><pre class="highlight"><code>$ git clone https://github.com/tensorflow/tensorflow -</code></pre> -</div> +<p>Key 权限 +Privacy - Camera Usage Description 相机 +Privacy - Microphone Usage Description 麦克风 +Privacy - Photo Library Usage Description 相册 +Privacy - Contacts Usage Description 通讯录 +Privacy - Bluetooth Peripheral Usage Description 蓝牙 +Privacy - Location When In Use Usage Description 定位 +Privacy - Location Always Usage Description 后台定位 +Privacy - Calendars Usage Description 日历</p> -<h5 id="section-1">第三步. 编译前准备</h5> +<p>参考资料:<a href="https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html">developer.apple</a></p> -<p>  在TensorFlow的<code class="highlighter-rouge">tensorflow/contrib/makefile/</code>目录下,有很多可使用的编译脚本,其中<code class="highlighter-rouge">build_all_ios.sh</code>脚本专门用来一键编译TensorFlow iOS静态库。虽然可以直接使用此脚本进行一键编译,但是因为有墙,某些依赖需要提前做处理。</p> +<h3 id="section-3">推送通知</h3> -<ol> - <li> - <p>下载protobuf</p> +<p>苹果的推送在之前iOS8和iOS9的时候就发生过大的更新,推送功能越来越强大。在iOS10之后苹果推出了UserNotifications框架,可以通过这个框架更好的控制推送通知,可以更新、修改锁屏页面的推送消息,可以添加图片等功能。</p> - <p>protobuf 是编译前唯一需要特殊处理的依赖库,<a href="https://github.com/google/protobuf/archive/master.zip">点击下载</a>,下载protobuf之后,解压,备用。</p> - </li> - <li> - <p>下载googlemock</p> +<p>但是在用Xcode8打包后,并且不对代码进行修改的情况下,会发现打包后苹果发来了一封邮件。这封邮件大概意思是如果需要使用推送通知,需要对代码做修改,否则将不能使用推送通知。</p> - <p>虽然protobuf编译脚本<code class="highlighter-rouge">autogen.sh</code>中的googlemock链接地址<code class="highlighter-rouge">https://googlemock.googlecode.com/files/gmock-1.7.0.zip</code>无法直接下载到,但是细心的人会发现,在浏览器中输入<code class="highlighter-rouge">https://googlemock.googlecode.com/</code>地址后,会跳转到<code class="highlighter-rouge">https://github.com/google/googlemock</code>地址,google在GiHub上的仓库地址。而GitHub上的仓库,我们可以直接的下载,克隆等。</p> +<p><img src="/images/posts/Xcode8/image11.png" height="300" width="600" /></p> - <p>我们直接在GitHub上下载googlemock(<a href="https://github.com/google/googlemock/archive/master.zip">点击下载</a>),下载完成后,修改压缩包名字为<code class="highlighter-rouge">gmock-1.7.0.zip</code>,修改后将此压缩包移至上一步protobuf文件夹目录下,备用。</p> - </li> - <li> - <p>修改下载依赖脚本,移除protobuf的下载</p> +<p>这是因为在Xcode8之后,如果需要使用Push Notifications的功能,需要勾选Capabilities -&gt; Push Notifications为YES,否则进行远程推送就会有问题,并且会收到苹果发来的这封邮件。</p> - <p>在<code class="highlighter-rouge">tensorflow/contrib/makefile/</code>目录下,<code class="highlighter-rouge">download_dependencies.sh</code>脚本用来下载相关依赖,打开此脚本文件,注释掉或者直接删掉<code class="highlighter-rouge">git clone https://github.com/google/protobuf.git ${DOWNLOADS_DIR}/protobuf</code>部分,目的是不让脚本去下载protobuf。</p> +<h3 id="log">删除系统log</h3> - <p>上面三步准备好后,接下来就进入静态库编译了。</p> - </li> -</ol> +<p>升级Xcode8之后,在调试和运行过程中,发现控制台打印了很多不认识的log,这些log是系统打印的,和开发者没关系。但是这么多log看着比较乱,怎么屏蔽掉呢?</p> -<h5 id="section-2">第四步. 一键编译</h5> +<p>subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0 +在Target -&gt; Edit Scheme -&gt; Run -&gt; Arguments中,添加OS_ACTIVITY_MODE字段,并设置为Disable即可。</p> -<p>  前面已经知道在TensorFlow文件夹<code class="highlighter-rouge">tensorflow/contrib/makefile/</code>目录下的<code class="highlighter-rouge">build_all_ios.sh</code>脚本是用来编译iOS静态库的脚本,因此可以直接执行此脚本,开始静态库的编译工作了。</p> +<p><img src="/images/posts/Xcode8/image12.png" height="300" width="500" /></p> -<p>  但是有一个问题大家可能会发现,由于编译TensorFlow需要用到protobuf,但是protobuf使我们自己手动下载的,该怎么让手动下载的protobuf能够直接让<code class="highlighter-rouge">build_all_ios.sh</code>脚本使用呢?</p> +<p>顺便提一下,这两天在设置log选项的时候,发现可以通过在Arguments中设置参数,打印出App加载的时长,包括整体加载时长,动态库加载时长等。</p> -<p>  答案是<code class="highlighter-rouge">复制、粘贴</code>。可能有些low,但是有效。执行命令 <code class="highlighter-rouge">build_all_ios.sh</code>之后,立即把之前手动下载的protobuf文件夹拷贝进<code class="highlighter-rouge">tensorflow/contrib/makefile/downloads</code>目录。(放心,你拷贝的速度会很快,不会影响编译的执行的。^_^)</p> +<p>在Environment Variables中添加DYLD_PRINT_STATISTICS字段,并设置为YES,在控制台就会打印加载时长。</p> -<div class="highlighter-rouge"><pre class="highlight"><code>$ build_all_ios.sh +<p><img src="/images/posts/Xcode8/image13.png" height="300" width="600" /></p> + +<h3 id="awakefromnib">awakeFromNib报警告</h3> + +<p>老项目在Xcode8中,有些重写awakeFromNib方法的地方,会报下面的错误。这是因为没有调用super的方法导致的,还好我平时都是调用super的,我代码目前还没出问题。</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>Method possibly missing a [super awakeFromNib] call </code></pre> </div> -<p>  一切准备就绪,接下来就是静静的等待编译完成了。在Mac编译的过程中,建议插上电源,最好不要让设备休眠断电,也最好不要去干别的东西,出去溜达一圈,回来后就看到战果了。</p> + + Tue, 25 Oct 2016 00:00:00 +0800 + http://baixin.io/2016/10/Xcode8/ + http://baixin.io/2016/10/Xcode8/ + + iOS + + + + + + Jekyll搭建个人博客 + <p> 之前写了一篇<a href="http://baixin.io/2015/08/HEXO%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/">HEXO搭建个人博客</a>的教程获得了很好评,尤其是在<a href="http://www.jianshu.com/p/465830080ea9">简书</a>上目前已经累积了10W+的阅读量了,也有好心的读者主动给我打赏,在此感谢。</p> -<p>编译完成之后,会在<code class="highlighter-rouge">tensorflow/contrib/makefile/gen/</code>目录下看到编译的结果,关于这些静态库该如何使用,自己的项目如何应用,请参考<a href="https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/ios_examples">TensorFlow iOS Examples</a>。</p> +<p> 如果你看过我的文章会发现我现在的博客样式跟之前是有很大的区别的,之前我也是使用 HEXO 搭建的博客,后来发现使用 HEXO 在多台电脑上发布博客,操作起来并不是那么方便,果断就转到了 Jekyll 上,接下来我会讲如何使用 Jekyll 搭建博客,<a href="http://baixin.io/#blog">博客模板效果</a>。</p> -<h3 id="section-3">三、遇到的问题</h3> +<h3 id="section">介绍</h3> -<p>1、googlecode.com被墙了,需要翻墙!(目前测试挂了VPN也没用),这也是上面编译前准备为什么要那么做的原因。</p> +<p> Jekyll 是一个简单的博客形态的静态站点生产机器。它有一个模版目录,其中包含原始文本格式的文档,通过 Markdown (或者 Textile) 以及 Liquid 转化成一个完整的可发布的静态网站,你可以发布在任何你喜爱的服务器上。Jekyll 也可以运行在 GitHub Page 上,也就是说,你可以使用 GitHub 的服务来搭建你的项目页面、博客或者网站,而且是完全免费的</p> -<div class="highlighter-rouge"><pre class="highlight"><code>curl: (7) Failed to connect to googlemock.googlecode.com port 443: Operation timed out +<p> 使用 Jekyll 搭建博客之前要确认下本机环境,Git 环境(用于部署到远端)、<a href="http://www.ruby-lang.org/en/downloads/">Ruby</a> 环境(Jekyll 是基于 Ruby 开发的)、包管理器 <a href="http://rubygems.org/pages/download">RubyGems</a> <br /> +  如果你是 Mac 用户,你就需要安装 Xcode 和 Command-Line Tools了。下载方式 Preferences → Downloads → Components。</p> + +<p>  Jekyll 是一个免费的简单静态网页生成工具,可以配合第三方服务例如: Disqus(评论)、多说(评论) 以及分享 等等扩展功能,Jekyll 可以直接部署在 Github(国外) 或 Coding(国内) 上,可以绑定自己的域名。<a href="http://jekyll.bootcss.com/">Jekyll中文文档</a>、<a href="https://jekyllrb.com/">Jekyll英文文档</a>、<a href="http://jekyllthemes.org/">Jekyll主题列表</a>。</p> + +<h3 id="jekyll-">Jekyll 环境配置</h3> + +<p>安装 jekyll</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>$ gem install jekyll </code></pre> </div> -<p>解决: 请参考 『第三步. 编译前准备』。</p> - -<p>2、没有Xcode。</p> +<p>创建博客</p> -<div class="highlighter-rouge"><pre class="highlight"><code>xcrun: error: SDK "iphoneos" cannot be located -xcrun: error: SDK "iphoneos" cannot be located -xcrun: error: unable to lookup item 'PlatformPath' in SDK 'iphoneos' -+ IPHONEOS_PLATFORM= +<div class="highlighter-rouge"><pre class="highlight"><code>$ jekyll new myBlog </code></pre> </div> -<p>解决:安装Xcode,从上面报错的命令中可以看到,在编译静态库的过程中使用了<code class="highlighter-rouge">xcrun</code>,而此命令是xCode本身具有的能力。</p> +<p>进入博客目录</p> -<p>3、你的Xcode版本不是7.3或以后,或者你有多个Xcode,而默认的安装路径版本不是7.3或以后。</p> +<div class="highlighter-rouge"><pre class="highlight"><code>$ cd myBlog +</code></pre> +</div> -<p><code class="highlighter-rouge"> -error: Xcode 7.3.0 or later is required. -+ exit 1 -</code>/</p> - -<p>解决:更新Xcode至最新版本,并且保证默认路径下是最新/版本。</p> - -<p>如果Xcode是7.3,并且没有条件更新Xcode,你可以修改<code class="highlighter-rouge">tensorflow/contrib/makefile/compile_ios_tensorflow.sh</code> 里的<code class="highlighter-rouge">REQUIRED_XCODE_VERSION=7.3.0</code>,为<code class="highlighter-rouge">REQUIRED_XCODE_VERSION=7.3</code>。(这样修改,目前还不确定会不会带来一些其他影响,最好是升级你的Xcode)</p> - -<p><a href="http://baixin.io/2016/07/iOSMachineLearning_TensorFlow/">点击阅读原文</a></p> - -<h3 id="section-4">四、参考链接</h3> - -<ul> - <li><a href="http://tensorfly.cn/">TensorFlow 中文社区</a></li> - <li><a href="https://www.tensorflow.org/mobile.html">TensorFlow for Mobile</a></li> - <li><a href="http://chenrudan.github.io/blog/2015/11/18/comparethreeopenlib.html">Caffe、TensorFlow、MXnet三个开源库对比</a></li> - <li><a href="http://weibo.com/p/1001603907610737775666">如何评价Tensorflow和其它深度学习系统</a></li> - <li><a href="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">深度学习框架大战正在进行,谁将夺取“深度学习工业标准”的荣耀?</a></li> -</ul> - - Thu, 07 Jul 2016 00:00:00 +0800 - http://baixin.io/2016/07/iOSMachineLearning_TensorFlow/ - http://baixin.io/2016/07/iOSMachineLearning_TensorFlow/ - - 机器学习 - - - - - - 机器学习入门(名词科普) - <h3 id="section">通用名词</h3> - -<h4 id="ml">ML</h4> - -<p>  <strong>名词解释:</strong> 机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。 -  它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。</p> - -<h4 id="dl">DL</h4> -<p>  <strong>名词解释:</strong> 深度学习(Deep Learning)是机器学习拉出的分支,它试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 <br /> -  深度学习是机器学习中表征学习方法。观测值(例如一幅图像)可以使用多种方式来表示,如每个像素强度值的矢量,或者更抽象地表示成一系列边、特定形状的区域等。而使用某些特定的表示方法更容易从实例中学习任务(例如,人脸识别或面部表情识别)。深度学习的好处是将用非监督式或半监督式的特征学习和分层特征提取的高效算法来替代手工获取特征。</p> - -<h4 id="cnn">CNN</h4> -<p>  <strong>名词解释:</strong> 卷积神经网络(Convolutional neural networks,简称CNNs)是一种深度的监督学习下的机器学习模型</p> - -<h3 id="section-1">算法名词</h3> - -<h4 id="knn">KNN:</h4> - -<p>  <strong>名词解释:</strong> 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法。 -  邻近算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。 -  kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。</p> - -<h4 id="svm">SVM:</h4> -<p>  <strong>名词解释:</strong> 支持向量机(Support Vector Machine)。 -  在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类、以及回归分析。</p> - -<p><a href="http://baixin.io/2016/07/MachineLearning_introduce/">点击阅读原文</a></p> - - Tue, 05 Jul 2016 00:00:00 +0800 - http://baixin.io/2016/07/MachineLearning_introduce/ - http://baixin.io/2016/07/MachineLearning_introduce/ - - 机器学习 - - - - - - HEXO进阶 - <p>HEXO接近是最近有一些朋友提出的问题,然后我做了总结,如果你也在使用HEXO,不妨看看,应该会有些帮助。</p> - -<ul> - <li>1、博客部署样式出问题了怎么办?</li> - <li>2、电脑重装或者误删了本地博客怎么办?</li> - <li>3、想使用两台电脑写博客怎么办?</li> - <li>4、为何使用百度搜不到我的博客?</li> -</ul> - -<h3 id="jekyll">使用Jekyll解决前三个问题。</h3> -<p>不得不说 <code class="highlighter-rouge">Jekyll</code> 确实可以解决我上面三个问题, 因为 <code class="highlighter-rouge">Jekyll</code> 是直接把Markdown格式的文章直接放在github仓库里的, 相当于直接用git来管理博客了, <code class="highlighter-rouge">Github</code> 官方也很推荐 <code class="highlighter-rouge">Jekyll</code> 。 你可以先看下 <code class="highlighter-rouge">Jekyll</code> 搭建博客的<a href="voyagelab.github.io">voyagelab</a>, <a href="https://github.com/voyagelab/voyagelab.github.io">github地址</a>, 当然了这只是很普通的, Jekyll 也有很多主题可以选择的, 更详细的请看<a href="http://jekyll.bootcss.com/">Jekyll中文文档</a>、<a href="https://jekyllrb.com/">Jekyll英文文档</a>、<a href="http://jekyllthemes.org/">Jekyll主题列表</a>。 -在 <code class="highlighter-rouge">Jekyll</code> 上逛了一个星期的我又回到了 <code class="highlighter-rouge">Hexo</code> , 发现 目前 <code class="highlighter-rouge">Jekyll</code> 对主题和一些插件的支持相对 <code class="highlighter-rouge">Hexo</code> 来说, 没那么友好, 可能有一些其它的方法只是我没找到而已,关于 <code class="highlighter-rouge">Jekyll</code> 搭建博客就介绍到这, 如果有问题的话可以评论, 或者联系我。</p> - -<h3 id="hexo">使用Hexo解决上面前三个问题</h3> -<p>是的, 我大<code class="highlighter-rouge">Hexo</code>同样可以解决上面三个问题, 那就是使用git。关于如何使用 <code class="highlighter-rouge">Hexo</code> 搭建博客请看我另一篇文章<a href="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/">HEXO搭建个人博客</a>, 如果搭建的过程中出现了问题, 我们可以交流交流。现在我假设你已经能基本使用 <code class="highlighter-rouge">Hexo</code> 了, 接下来就看看如何来管理博客。</p> - -<h2 id="git">使用git管理博客</h2> -<p><a href="https://github.com/leopardpan/Blog-Growing">Blog-Growing</a>是我管理博客的仓库地址。结构大致是:</p> - -<blockquote> - <p>– Blog-Growing <br /> -  |– .git <br /> -  |– .gitignore <br /> -  |– Hexo <br /> -    | .. <br /> -    | .. <br /> -    | 整个博客的配置信息</p> -</blockquote> - -<p>你可以把我的的<a href="https://github.com/leopardpan/Blog-Growing">Blog-Growing</a> clone下来, 看看一些基本配置是怎么配置的。需要提醒的是, <code class="highlighter-rouge">要把主题下的.git给删除掉</code> , 当然了你也可以使用 <code class="highlighter-rouge">git submodule</code> 来管理, 具体的管理方法我这里就不做多的介绍了, 想了解的话可以私信我。 -上面的过程基本做完后, 怎么来解决我开篇提的前三个问题了。</p> - -<h3 id="section">具体实现:</h3> -<p><strong>一:家里电脑使用博客</strong> <br /> -  建立git远端仓库管理博客,并使用家里的电脑把本地博客的配置推送到远端仓库。 <br /> -<strong>二:公司电脑使用博客</strong> <br /> -  到了公司只需要执行<code class="highlighter-rouge">sudo npm install -g hexo</code>,然后cd到你的博客目录下,如我cd 到Hexo目录下, 然后执行 <code class="highlighter-rouge">hexo server</code> 就可以在本地预览博客了。 <br /> -<strong>三:使用Git保存</strong> <br /> -  修改好博客后记得先使用git来提交下, 即使下次把博客的样式修改坏了, 也可以使用 <code class="highlighter-rouge">git reset --hard</code> 来回退。如: 我cd 到 <code class="highlighter-rouge">Blog-Growing</code> 目录下使用git提交。 <br /> -<strong>四:博客提交</strong> <br /> -  1、修改好的博客使用 <code class="highlighter-rouge">hexo d</code> 展示到博客页上。 <br /> -  2、git push 整个本地博客。</p> - -<p><strong>提示:</strong> 在这里 <code class="highlighter-rouge">git</code> 仅仅只是用户做博客的版本管理的, 博客的样式修改、基本部署还是使用 <code class="highlighter-rouge">hexo</code> 来操作的。</p> +<p>启动本地服务</p> -<h2 id="section-1">让百度能搜索到你的博客</h2> +<div class="highlighter-rouge"><pre class="highlight"><code>$ jekyll serve +</code></pre> +</div> -<h3 id="section-2">为什么要使用百度搜索?</h3> +<p>在浏览器里输入: <a href="http://localhost:4000">http://localhost:4000</a>,就可以看到你的博客效果了。</p> + +<p><img src="/images/posts/jekyll/image1.png" alt="" /></p> + +<p>so easy !</p> + +<h3 id="section-1">目录结构</h3> +<p>  + Jekyll 的核心其实是一个文本转换引擎。它的概念其实就是: 你用你最喜欢的标记语言来写文章,可以是 Markdown,也可以是 Textile,或者就是简单的 HTML, 然后 Jekyll 就会帮你套入一个或一系列的布局中。在整个过程中你可以设置URL路径, 你的文本在布局中的显示样式等等。这些都可以通过纯文本编辑来实现,最终生成的静态页面就是你的成品了。</p> + +<p>一个基本的 Jekyll 网站的目录结构一般是像这样的:</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>. +├── _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 -<p>  有人可能会说作为一个开发人员, 你不会用 <code class="highlighter-rouge">Google</code> 啊。 是的, Google是能搜到我们搭建在 <code class="highlighter-rouge">Github Page</code> 的博客, 会用<code class="highlighter-rouge">Google</code> 也是一个开发人员必备技能之一。但是, 我们生活在天朝, 所以百度还是总有会用到的时候, 或者是你想让更多的天朝人能搜到你。</p> +</code></pre> +</div> -<h3 id="github-page-">为什么使用百度搜索不到 Github Page 上的博客?</h3> +<p>这些目录结构以及具体的作用可以参考 <a href="http://jekyll.com.cn/docs/structure/">官网文档</a></p> -<p>有人联系过 Github Support 部门 , 给出大致的意思就是: 百度爬虫爬得太猛烈,已经对很多 Github 用户造成了问题。所以 Github 将禁止百度爬虫的爬取。</p> +<p>进入 _config.yml 里面,修改成你想看到的信息,重新 jekyll server ,刷新浏览器就可以看到你刚刚修改的信息了。</p> -<h3 id="section-3">如何让百度能搜索你的博客?</h3> +<p>到此,博客初步搭建算是完成了,</p> -<p>  根据上面说的, 目前发现只是Github Page禁止了百度搜索, 所以让百度能搜索到你的博客还是有一些方法的。例如: -* 自己搞个VPS,博客部署在VPS上。 -* 博客部署 <code class="highlighter-rouge">Coding.net</code> 上, <code class="highlighter-rouge">GitCafe</code>已经合并到 <code class="highlighter-rouge">Coding</code> 。 -我使用的是第二种方法, 博客部署在 <code class="highlighter-rouge">Coding.net</code> 上也相对简单些。</p> +<h3 id="section-2">博客部署到远端</h3> -<h4 id="coding">在Coding上部署你的博客。</h4> +<p> 我这里讲的是部署到 Github Page 创建一个 github 账号,然后创建一个跟你账户名一样的仓库,如我的 github 账户名叫 <a href="https://github.com/leopardpan">leopardpan</a>,我的 github 仓库名就叫 <a href="https://github.com/leopardpan/leopardpan.github.io">leopardpan.github.io</a>,创建好了之后,把刚才建立的 myBlog 项目 push 到 username.github.io仓库里去(username指的是你的github用户名),检查你远端仓库已经跟你本地 myBlog 同步了,然后你在浏览器里输入 username.github.io ,就可以访问你的博客了。</p> -<p>  Coding同样支持Hexo、Jekyll等博客的部署, Coding 跟Github还是挺像的,而且是中文。 同样的在Coding里面建一个项目,项目名字跟你的用户名一样,这里我就不啰嗦了, 说几个需要注意的地方: <br /> -<strong>注意一:</strong> <br /> -  在<code class="highlighter-rouge">Coding Page</code> 上部署博客,需要把博客推送到<code class="highlighter-rouge">coding-pages </code> 分支上, 分支名字是固定的。 <br /> -<strong>注意二:</strong> <br /> -  <code class="highlighter-rouge">Coding Page</code> 不支持自定义CNAME, 你需要点击到Page模块,然后添加一个域名来绑定。</p> +<h3 id="section-3">编写文章</h3> -<p>更详细的请看<a href="https://coding.net/help/doc/pages/index.html">Coding Pages 官网介绍</a>.</p> +<p>  所有的文章都是 _posts 目录下面,文章格式为 mardown 格式,文章文件名可以是 .mardown 或者 .md。</p> -<p><a href="http://baixin.io/2016/06/HEXO_Advanced/">点击阅读原文</a></p> +<p>  编写一篇新文章很简单,你可以直接从 _posts/ 目录下复制一份出来 <code class="highlighter-rouge">2016-10-16-welcome-to-jekyll副本.markdown</code> ,修改名字为 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 打开</p> -<p>参考文章: -<a href="http://jerryzou.com/posts/feasibility-of-allowing-baiduSpider-for-Github-Pages/">解决 Github Pages 禁止百度爬虫的方法与可行性分析</a></p> - - Sun, 12 Jun 2016 00:00:00 +0800 - http://baixin.io/2016/06/HEXO_Advanced/ - http://baixin.io/2016/06/HEXO_Advanced/ - - 博客 - - - - - - 开发常用工具 - <p>个人开发常用工具的收集</p> +<div class="highlighter-rouge"><pre class="highlight"><code> +--- +layout: post +title: "Welcome to Jekyll!" +date: 2016-10-16 11:29:08 +0800 +categories: jekyll update +--- -<ul> - <li><a href="https://www.zybuluo.com/mdeditor">cmd Markdown</a> 作业部落出版的Markdown编辑器</li> - <li><a href="https://github.com/rest-client/rest-client">RESTClient</a> 一个开源的客户端HTTP调试工具。</li> - <li><a href="https://github.com/getlantern/lantern">lantern</a> 蓝灯,一款开源的翻墙工具。</li> - <li><a href="https://www.charlesproxy.com/">Charles</a> 青花瓷, 一款HTTP/HTTPS的抓包工具。 - <ul> - <li><a href="http://blog.devtang.com/2015/11/14/charles-introduction/">Charles 从入门到精通</a></li> - </ul> - </li> - <li><a href="http://www.sublimetext.com">Sublime</a> 一款强大的IDE,支持Python、JS、JSON格式化等等…更重要的是<code class="highlighter-rouge">Sublime</code>支持的插件很多。 - <ul> - <li><a href="http://www.xuanfengge.com/practical-collection-of-sublime-plug-in.html">实用的sublime插件集合</a></li> - </ul> - </li> -</ul> +正文... - - Thu, 02 Jun 2016 19:15:06 +0800 - http://baixin.io/2016/06/Develop_Tool/ - http://baixin.io/2016/06/Develop_Tool/ - - 工具 - - - - - - 我们日常生活中的 iBeacon - <p>  随着低功耗蓝牙的推出,iBeacon 的使用是越来越广泛了,如:微信的附近摇一摇功能,又或者是当你进入大型商场,一些店铺给你推送通知,VR 场景识别等等,这些表示 iBeacon 已经与我们的生活精密相连了。</p> +</code></pre> +</div> -<h4 id="section">简介:</h4> +<p>title: 显示的文章名, 如:title: 我的第一篇文章 <br /> +date: 显示的文章发布日期,如:date: 2016-10-16 <br /> +categories: tag标签的分类,如:categories: 随笔</p> -<ul> - <li> - <p><strong>概念:</strong> iBeacon 是 iOS7 后苹果出的一项新技术,支持蓝牙4.0(或以上)的 iOS 设备,工作方式是低功耗蓝牙(Bluetooth Low Energy),向周围发送自己特有的ID,一个 <code class="highlighter-rouge">iBeacon</code> 硬件设备在不做任何处理的情况下一般可使用两三年左右。</p> - </li> - <li> - <p>iBeacon 的形状多种多样,大致如下图。 -<img src="/images/posts/iBeacon/iBeacon.png" alt="" /></p> - </li> -</ul> +<p>注意:文章头部格式必须为上面的,…. 就是文章的正文内容。</p> -<h4 id="ibeacon">目前哪些地方有 iBeacon:</h4> -<ul> - <li>1、微信摇一摇:使用微信的人应该都知道微信有一个 <code class="highlighter-rouge">周边摇一摇</code> 功能, 使用的就是 iBeacon 技术。 很多餐馆都部有 iBeacon 的点,如果你想验证直接监测微信的 iBeaconUUID:FDA50693-A4E2-4FB1-AFCF-C6EB07647825。</li> - <li>2、走进某个商场时,忽然手机里推出一个通知,也是使用 iBeacon 技术。</li> - <li>3、帝都的地跌站大部分也有微信 UUID 的 iBeacon 发射器,具体是用来做什么的还不是慢清楚。</li> - <li>4、iBeacon 还可实现地理围栏、室内定位等功能。</li> -</ul> +<p>我写文章使用的是 Sublime Text2 编辑器,如果你对 markdown 语法不熟悉的话,可以看看<a href="https://www.zybuluo.com/">作业部落的教程</a></p> -<h4 id="ibeacon-">iBeacon 技术</h4> -<p>  Apple的 <code class="highlighter-rouge">CoreLocation.frame</code> 里把iBeacon封装成了一个 <code class="highlighter-rouge">CLBeacon</code> 类,<code class="highlighter-rouge">CLBeacon</code> 大致有下面几个属性组成:<code class="highlighter-rouge">Major</code> 、<code class="highlighter-rouge">Minor</code> 、 <code class="highlighter-rouge">proximity</code> 、 <code class="highlighter-rouge">rssi</code> 、 <code class="highlighter-rouge">accuracy</code> 。</p> +<h3 id="section-4">使用我的博客模板</h3> -<h4 id="ibeacopn">开发者如何使用 iBeacopn?:</h4> -<ul> - <li>1、用户需要添加 <code class="highlighter-rouge">CoreLocation.framework</code> ,App 才具备定位的功能。</li> - <li>2、App 开发者需要开启定位功能需要配置:在 <code class="highlighter-rouge">Xcode</code> 的 <code class="highlighter-rouge">info.plist</code> 里面添加 <code class="highlighter-rouge">NSLocationAlwaysUsageDescription</code>(允许后台访问位置信息) 或 <code class="highlighter-rouge">requestWhenInUseAuthorization</code>(允许使用时访问位置信息) 字段。(iOS7后该添加了该字段应用才会弹出 `是否允许应用访问用户的位置信息)。</li> -</ul> +<p>虽然博客部署完成了,你会发现博客太简单不是你想要的,如果你喜欢我的模板的话,可以使用我的模板。</p> -<p>创建和注册一个beacon区域</p> +<p>首先你要获取的我博客,<a href="https://github.com/leopardpan/leopardpan.github.io.git">Github项目地址</a>,你可以直接<a href="https://github.com/leopardpan/leopardpan.github.io/archive/master.zip">点击下载博客</a>,进去leopardpan.github.io/ 目录下, 使用命令部署本地服务</p> -<div class="highlighter-rouge"><pre class="highlight"><code>- (void)registerBeaconRegionWithUUID:(NSUUID *)proximityUUID andIdentifier:(NSString *)identifier -{ - CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:proximityUUID identifier:identifier]; - - [manager startMonitoringForRegion:beaconRegion]; -} +<div class="highlighter-rouge"><pre class="highlight"><code>$ jekyll server </code></pre> </div> -<p>当接受到 iBeacon 信号时回调 ,beacons 里面装了信号的对象,可能同时出现多个信号。 <br /> -``` -- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region -{</p> - -<p>} -```</p> - -<p>Note: <a href="https://developer.apple.com/library/prerelease/content/samplecode/AirLocate/Introduction/Intro.html">苹果iBeacon官方代码例子</a>。</p> - -<h4 id="ibeacon--1">iBeacon 硬件设备条件:</h4> -<ul> - <li>用户设备 iOS7 或更新操作系统。</li> - <li>用户蓝牙设备4.0或更新。</li> - <li>用户蓝牙设备必须开启。</li> - <li>用户设备定位服务必须开启,允许应用访问位置信息。</li> -</ul> - -<h4 id="ibeacon--2">iBeacon 能唤醒应用</h4> -<ul> - <li>前提:App 具备上面使用 iBeacon 的功能,并且允许后台访问位置信息。</li> - <li>现象:App 能被 iBeacon 信号唤醒,即使 App 已经被用户手动杀死掉了,App 也能被 iBeacon 技术唤醒,并且能执行一系列操作。</li> - <li>影响:导致 App 用户在并没有使用 <code class="highlighter-rouge">App</code> 的情况下, <code class="highlighter-rouge">App</code> 有了长达几个小时的后台使用时长。</li> -</ul> - -<p><a href="http://baixin.io/2016/04/iBeacon/">点击阅读原文</a></p> - - Wed, 06 Apr 2016 19:25:06 +0800 - http://baixin.io/2016/04/iBeacon/ - http://baixin.io/2016/04/iBeacon/ - - 技术 - - - - - - CocoaPods使用心得 - <h3 id="section">简介:</h3> -<p> 本章介绍什么是 <code class="highlighter-rouge">CocoaPods</code> ,如何使用 <code class="highlighter-rouge">CocoaPods</code> , 以及 <code class="highlighter-rouge">CocoaPods</code> 的原理,和使用 <code class="highlighter-rouge">CocoaPods</code> 时经常出现的一些问题。</p> +<h3 id="jekyll">如果你本机没配置过任何jekyll的环境,可能会报错</h3> -<p> Cocoapods 是 OS X 和 iOS 下的一个第三方库管理工具。我们能使用CocoaPods添加被称作 “Pods”的依赖库,并轻松管理它们的版本,CocoaPods会帮我们配置好这些三方库的路径及开发环境,极大的提升了开发者的工作效率。</p> +<div class="highlighter-rouge"><pre class="highlight"><code>/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 `&lt;top (required)&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 `&lt;main&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 `&lt;main&gt;' -<h3 id="cocoapods">安装CocoaPods </h3> +</code></pre> +</div> -<p> Mac下自带ruby,使用ruby的gem命令安装,ruby的软件源被墙了,把官方的ruby源替换成国内的淘宝源。</p> +<p>原因: 没有安装 bundler ,执行安装 bundler 命令</p> -<h3 id="gem">更换Gem源</h3> +<div class="highlighter-rouge"><pre class="highlight"><code> +$ gem install bundler -<div class="highlighter-rouge"><pre class="highlight"><code><span class="gp">$ </span>gem sources --remove https://rubygems.org/ -<span class="gp">$ </span>gem sources -a https://ruby.taobao.org/ -<span class="gp">$ </span>gem sources -l </code></pre> </div> -<ul> - <li>1.移除掉原有的源(服务器在国外,速度较慢)。</li> - <li>2.等1有反应之后再敲2命令(替换成淘宝上的ruby镜像https)。</li> - <li>3.验证是否成功。成功如下:</li> -</ul> -<div class="highlighter-rouge"><pre class="highlight"><code> -<span class="k">***</span> CURRENT SOURCES <span class="k">***</span> +<p>提示:</p> -http://ruby.taobao.org/ +<div class="highlighter-rouge"><pre class="highlight"><code>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 </code></pre> </div> -<h3 id="gem-1">更新Gem源</h3> +<p>再次执行 $ jekyll server ,提示</p> <div class="highlighter-rouge"><pre class="highlight"><code> -sudo gem update --system +Could not find proper version of jekyll (3.1.1) in any of the sources +Run `bundle install` to install missing gems. </code></pre> </div> -<h3 id="cocoapods-1">安装cocoapods</h3> - -<div class="highlighter-rouge"><pre class="highlight"><code> -<span class="gp">$ </span>sudo gem install cocoapods -<span class="gp">$ </span>pod setup +<p>跟着提示运行命令</p> +<div class="highlighter-rouge"><pre class="highlight"><code>$ bundle install </code></pre> </div> -<p>pod setup 在执行时会比较慢,因为Cocoapods 要将它的信息下载到 ~/.cocoapods目录下, 耐心等待…</p> +<p>这个时候你可能会发现 bundle install 运行卡主不动了。</p> -<h4 id="cocoapods-2">提升cocoapods的安装速度</h4> +<p>如果很长时间都没任何提示的话,你可以尝试修改 gem 的 source</p> -<p>所有的项目的 Podspec 文件都托管在https://github.com/CocoaPods/Specs。第一次执行 pod setup 时,CocoaPods 会将这些podspec索引文件更新到本地的 ~/.cocoapods/目录下,这个索引文件比较大,有 80M 左右。 -作者akinliu 在 gitcafe 和 oschina 上建立了 CocoaPods 索引库的镜像(在国内),我们可以使用CocoaPods国内的镜像索引,操作时会快多了,如gitcafe:</p> +<div class="highlighter-rouge"><pre class="highlight"><code>$ gem sources --remove https://rubygems.org/ +$ gem sources -a http://ruby.taobao.org/ +$ gem sources -l +*** CURRENT SOURCES *** -<div class="highlighter-rouge"><pre class="highlight"><code> -pod repo remove master -pod repo add master https://gitcafe.com/akuandev/Specs.git -pod repo update +http://ruby.taobao.org </code></pre> </div> -<h3 id="cocoapods-3">使用cocoapods</h3> - -<p>cocoapods安装完成后,使用 pod search 命令来验证一下</p> - -<div class="highlighter-rouge"><pre class="highlight"><code> -pod search AFNetworking +<p>再次执行命令 $ bundle install,发现开始有动静了</p> +<div class="highlighter-rouge"><pre class="highlight"><code>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. </code></pre> </div> -<p>终端将会有如下结果:</p> +<p>bundler安装完成,后再次启动本地服务</p> -<div class="highlighter-rouge"><pre class="highlight"><code> -<span class="gp">-&gt; </span>AFNetworking <span class="o">(</span>3.0.4<span class="o">)</span> -A delightful iOS and OS X networking framework. -pod <span class="s1">'AFNetworking'</span>, <span class="s1">'~&gt; 3.0.4'</span> -- Homepage: https://github.com/AFNetworking/AFNetworking -- Source: https://github.com/AFNetworking/AFNetworking.git -- Versions: 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, -3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, -2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0, 2.0.3, -2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4, 1.3.3, 1.3.2, -1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, -0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 <span class="o">[</span>master repo] -- Subspecs: -- AFNetworking/Serialization <span class="o">(</span>3.0.4<span class="o">)</span> -- AFNetworking/Security <span class="o">(</span>3.0.4<span class="o">)</span> -- AFNetworking/Reachability <span class="o">(</span>3.0.4<span class="o">)</span> -- AFNetworking/NSURLSession <span class="o">(</span>3.0.4<span class="o">)</span> -- AFNetworking/UIKit <span class="o">(</span>3.0.4<span class="o">)</span> - - -<span class="gp">-&gt; </span>AFNetworking+AutoRetry <span class="o">(</span>0.0.5<span class="o">)</span> -Auto Retries <span class="k">for </span>AFNetworking requests -pod <span class="s1">'AFNetworking+AutoRetry'</span>, <span class="s1">'~&gt; 0.0.5'</span> -- Homepage: https://github.com/shaioz/AFNetworking-AutoRetry -- Source: https://github.com/shaioz/AFNetworking-AutoRetry.git -- Versions: 0.0.5, 0.0.4, 0.0.3, 0.0.2, 0.0.1 <span class="o">[</span>master repo] - -.........太多了,省略 +<div class="highlighter-rouge"><pre class="highlight"><code>$ jekyll server </code></pre> </div> -<p>pod search 是CocoaPods的一个搜索命令,我们可以用来搜索任何托管在CocoaPods上的三方库。</p> +<p>继续报错</p> -<p>使用CocoaPods时需要新建一个 Podfile 的文件,cd 到 我的Demo项目里,Demo目录下有三个文件</p> - -<div class="highlighter-rouge"><pre class="highlight"><code> -Demo 、 Demo.xcodeproj 、 DemoTests +<div class="highlighter-rouge"><pre class="highlight"><code>Configuration file: /Users/tendcloud-Caroline/Desktop/leopardpan.github.io/_config.yml + 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: 'cannot load such file -- jekyll-sitemap' If you run into trouble, you can find helpful resources at http://jekyllrb.com/help/! +jekyll 3.1.1 | Error: jekyll-sitemap </code></pre> </div> +<p>表示 当前的 jekyll 版本是 3.1.1 ,无法使用 jekyll-sitemap</p> -<p>新建 Podfile</p> +<p>解决方法有两个</p> -<div class="highlighter-rouge"><pre class="highlight"><code> -touch Podfile +<blockquote> + <p>1、打开当前目录下的 _config.yml 文件,把 gems: [jekyll-paginate,jekyll-sitemap] 换成 gems: [jekyll-paginate] ,也就是去掉jekyll-sitemap。</p> +</blockquote> -</code></pre> -</div> +<blockquote> + <p>2、升级 jekyll 版本,我当前的是 jekyll 3.1.2 。</p> +</blockquote> + +<p>修改完成后保存配置,再次执行</p> -<p>vim 编辑 Podfile</p> +<div class="highlighter-rouge"><pre class="highlight"><code>$ jekyll server -<div class="highlighter-rouge"><pre class="highlight"><code>vim Podfile </code></pre> </div> -<p>由于是新建的 Podfile 里面应该是空白的。然后我们在里面添加依赖库,格式如下:</p> - -<div class="highlighter-rouge"><pre class="highlight"><code> -platform :ios -pod <span class="s1">'Reachability'</span>, <span class="s1">'~&gt; 3.0.0'</span> -pod <span class="s1">'ASIHTTPRequest'</span> +<p>提示</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>Configuration file: /Users/baixinpan/Desktop/OpenSource/Mine/Page-Blog/leopardpan.github.io-github/_config.yml + Source: /Users/baixinpan/Desktop/OpenSource/Mine/Page-Blog/leopardpan.github.io-github + Destination: /Users/baixinpan/Desktop/OpenSource/Mine/Page-Blog/leopardpan.github.io-github/_site + Incremental build: disabled. Enable with --incremental + Generating... + done in 0.901 seconds. + Auto-regeneration: enabled for '/Users/baixinpan/Desktop/OpenSource/Mine/Page-Blog/leopardpan.github.io-github' +Configuration file: /Users/baixinpan/Desktop/OpenSource/Mine/Page-Blog/leopardpan.github.io-github/_config.yml + Server address: http://127.0.0.1:4000/ + Server running... press ctrl-c to stop. </code></pre> </div> -<p>‘~&gt; 3.0.0’ 是 Reachability 的版本号, 设定了版本号CocoaPods就会下载对应的版本,ASIHTTPRequest没指定版本号,CocoaPods就会下载最新版本的ASIHTTPRequest。 -退出编辑,执行 pod install 下载三方库。</p> +<p>表示本地服务部署成功。</p> -<div class="highlighter-rouge"><pre class="highlight"><code> -pod install +<p>在浏览器输入 <a href="127.0.0.1:4000">127.0.0.1:4000</a> , 就可以看到<a href="http://baixin.io">baixin.io</a>博客效果了。</p> -</code></pre> -</div> -<p>完成后我Demo项目下的文件多了几个:</p> +<h3 id="section-5">修改成你自己的博客</h3> + +<blockquote> + <ul> + <li>如果你想使用我的模板请把 _posts/ 目录下的文章都去掉。</li> + <li>修改 _config.yml 文件里面的内容为你自己的。</li> + </ul> +</blockquote> -<div class="highlighter-rouge"><pre class="highlight"><code>Demo 、 Demo.xcodeproj 、 DemoTests (之前的三个) +<p>然后使用 git push 到你自己的仓库里面去,检查你远端仓库,在浏览器输入 username.github.io 就会发现,你有一个漂亮的主题模板了。</p> -Demo.xcworkspace 、Podfile 、Podfile.lock 、Pods -</code></pre> -</div> +<h4 id="section-6">【 如果想修改博客样式却不知道怎么修改,可以直接在评论里给我提问 】</h4> -<p>这个时候我们打开Demo项目是点击 Demo.xcworkspace 文件了,到此CocoaPods的基本使用已经讲完了,接下来的CocoaPods的原理,和让我们自己的三方库也支持CocoaPods。</p> +<h3 id="jekyll-1">为什么要是用 Jekyll</h3> -<p>待续…</p> +<p>使用了 Jekyll 你会发现如果你想使用多台电脑发博客都很方便,只要把远端 github 仓库里的博客 clone 下来,写文章后再提交就可以了,Hexo 由于远端提交的是静态网页,所有无法直接写 Markdown 的文章。如果你想看 Hexo 搭建博客,可以看看我的另一篇<a href="http://baixin.io/2015/08/HEXO%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/">HEXO搭建个人博客</a>的教程。</p> -<p><a href="http://blog.jobbole.com/53365/">深入理解 CocoaPods</a></p> +<p>如果你在搭建博客遇到问题,可以在<a href="http://baixin.io/2016/06/jekyll_tutorials1/">原文博客</a>的评论里给我提问。</p> -<p><a href="http://baixin.io/2016/04/CocoaPod_Use/">点击阅读原文</a></p> +<p>后面会继续介绍,在我的博客基础上,如何修改成你自己喜欢的 Style,欢迎继续关注我博客的更新。</p> - Sat, 02 Apr 2016 00:00:00 +0800 - http://baixin.io/2016/04/CocoaPod_Use/ - http://baixin.io/2016/04/CocoaPod_Use/ + Fri, 14 Oct 2016 00:00:00 +0800 + http://baixin.io/2016/10/jekyll_tutorials1/ + http://baixin.io/2016/10/jekyll_tutorials1/ - iOS + 博客 - iOS动态更新 - <ul> - <li>1、控件到 <code class="highlighter-rouge">window</code> 的层级关系:</li> - <li>2、分析控件的详细路径:</li> - <li>3、动态修改控件:</li> - <li>4、工具篇:</li> -</ul> + iOS设备左下角出现Appicon + <p>最近发现我设备锁屏后,按Home屏幕变亮的时候,左下角出现一个灰色的Appicon (应用图标),关于这个应用图标的出现做了一些调研,下面是应用图标出现的几种情况。</p> -<h3 id="section">视图的层级关系</h3> +<p>图一 iOS 系统自带的 App icon , 图二 第三方 App icon , 图三 通过 iBeacon 信号激活的 demo icon</p> -<p>每个 <code class="highlighter-rouge">App</code> , 至少有一个根 <code class="highlighter-rouge">Window</code> , 通常情况下我们只用一个 。<code class="highlighter-rouge">window</code> 有一个 <code class="highlighter-rouge">rootViewController</code> , 这就是我们所谓的根视图 , 我们所有的控制器都是放在 <code class="highlighter-rouge">rootViewController</code> 里面的。</p> +<p><img src="/images/posts/icon/image01.png" alt="" /></p> -<p>如果在项目里有了这么一个路径 , 我们可以做什么呢?</p> +<h2 id="app-icon">结论:有三种情况导致设备的左下角出现灰色的 App icon</h2> +<h3 id="appstoreapp-">1、AppStore根据地点对App 推荐</h3> <ul> - <li>在当项目很复杂 , 可以其它地方可以直接修改这个控件的状态</li> - <li>当某个控件命名存在却又没有显示出来 , 可以通过路径来辅助查找</li> - <li>由服务器下发一些配置 , 使用 <code class="highlighter-rouge">Runtime</code> 去动态的修改已上线的项目</li> + <li><strong>简介</strong> + <ul> + <li>iOS 8会基于你的位置在锁屏界面上展示一个app快捷打开方式。比如你正在星巴克附近,那iOS 8会在锁屏界面上展示星巴克应用的icon,方便你快速打开。一些用户也表示会在锁屏界面收到app推荐,比如你在Costco和Apple Store附近,即便你之前没有安装过这些应用。</li> + </ul> + </li> </ul> -<p>下面将介绍如何使用代码来找出这些视图(控件)的路径</p> - -<h3 id="section-1">分析控件的详细路径</h3> - -<h4 id="window-">1、找出根 <code class="highlighter-rouge">Window</code> :</h4> +<h3 id="apphandoff">2、App实现了handoff功能</h3> +<ul> + <li><strong><a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/Handoff/HandoffFundamentals/HandoffFundamentals.html">handoff简介</a>:</strong> + <ul> + <li><code class="highlighter-rouge">OS X 10.10 Yosemite</code> 新增了一个酷炫的功能 “Hand Off”,打开这个功能之后,用户可以在 Mac 上对 iPad 和 iPhone 进行操作,比如能够编写 iPhone 上未完成的邮件,并且可以在Mac上打开 iPhone 的热点等等, Mac 的 Hand Off 功能只能识别 Mac 周围的 iPhone 手机。</li> + </ul> + </li> + <li><strong>handoff有几个要求:</strong> + <ul> + <li>1 两台设备都要登录同一个 iCloud 账号。</li> + <li>2 两台设备上的app有相同的 TeamID 。</li> + <li>3 锁屏(或dock)设备上的app支持的 <code class="highlighter-rouge">NSUserActivityTypes</code> 包含活动设备上的app当前的UserActivityType。</li> + </ul> + </li> +</ul> -<p>每一个视图、控件 , 他们最终的根都是main函数返回的 <code class="highlighter-rouge">application</code> , 通过 <code class="highlighter-rouge">[UIApplication sharedApplication]</code> 可以得到 。 <code class="highlighter-rouge">application</code> 的 <code class="highlighter-rouge">windows</code> 属性是一个数组 , 这里面装的是这个应用的所有 <code class="highlighter-rouge">Window</code> , 我们通常用的是第一个也就是 <code class="highlighter-rouge">application.windows[0]</code></p> +<h3 id="appibeaconappibeacon">3、App内有iBeacon信号接收功能,App被iBeacon信号唤醒</h3> +<ul> + <li><strong><a href="https://developer.apple.com/ibeacon/">iBeacon简介</a></strong>: + <ul> + <li>是苹果公司2013年9月发布的移动设备用OS(iOS7)上配备的新功能。工作原理类似之前的蓝牙技术,由 <code class="highlighter-rouge">iBeacon</code> 发射信号,iOS设备定位接受,反馈信号。根据这项简单的定位技术可以做出许多的相应技术应用,如:<code class="highlighter-rouge">室内定位</code> 、<code class="highlighter-rouge">商品推荐</code> 、<code class="highlighter-rouge">微信摇一摇</code> 等。</li> + </ul> + </li> + <li><strong>App icon出现的原因</strong>: + <ul> + <li><code class="highlighter-rouge">iBeacon</code> 具备后台定位的能力,只要用户把蓝牙(4.0或以后)开启 和 允许 App 访问位置信息。在有被 App 检测的 <code class="highlighter-rouge">iBeacon</code> 出现时,如果设备是锁屏状态,设备的左下角就会出现该 App 的 icon 。</li> + </ul> + </li> +</ul> -<h4 id="section-2">2、遍历视图 :</h4> +<p><a href="http://baixin.io/2016/09/iOSLowerLeftAppicon/">点击阅读原文</a></p> -<p>得到了 <code class="highlighter-rouge">window</code> 对象一切都好办了 。 然后拿到 <code class="highlighter-rouge">window</code> 的 <code class="highlighter-rouge">rootViewController</code> , 在获取 <code class="highlighter-rouge">rootViewController</code> 里面所有的 <code class="highlighter-rouge">childViewControllers</code> 和 <code class="highlighter-rouge">view</code> 里的 <code class="highlighter-rouge">subviews</code> , 一直递归下去就可以得到当前屏幕里所有视图对象了 , 同时可以通过 <code class="highlighter-rouge">runtime</code> 把它们的 <code class="highlighter-rouge">property</code>、<code class="highlighter-rouge">delegate</code> 都获取出来。</p> +<p>参考链接: <br /> +<a href="http://stackoverflow.com/questions/26082414/make-app-appear-as-ios-8-suggested-app-at-lockscreen/26676020#26676020">Make app appear as iOS 8 Suggested App at lockscreen</a> <br /> +<a href="http://stackoverflow.com/questions/25897219/can-i-get-my-ios-app-to-appear-on-the-lower-left-corner-of-the-lock-screen/25898890#25898890">Can I get my iOS app to appear on the lower left corner of the lock screen?</a><br /> +<a href="https://www.zhihu.com/question/26653964">为什么 iOS 8 锁屏界面的左下角经常会出现某个应用的小图标?</a> <br /> +<a href="https://www.v2ex.com/t/142320">关于 IOS8 锁屏左下方出现的 APP ICON</a></p> + + Fri, 23 Sep 2016 00:00:00 +0800 + http://baixin.io/2016/09/iOSLowerLeftAppicon/ + http://baixin.io/2016/09/iOSLowerLeftAppicon/ + + iOS + + + + + + Python自动化测试iOS项目 + <p>作为一个开发人员,为了保证自己的代码的健壮,写单元测试是必不可少的环节,然而最痛快的是每天去手动跑一遍所有的case。那么什么能帮我们解决这些繁琐的操作呢,大家应该会想到自动化测试脚本了,是的,我们可以借助脚本来完成全自动化测试,下面是我列的每天脚本自动执行流程:</p> -<p>结合 <code class="highlighter-rouge">Reveal</code> 或者 <code class="highlighter-rouge">Xcode</code> 自带的 <code class="highlighter-rouge">Captuer View Hiearachy</code> , 我们可以推测一下这两个的的实现原理了 :</p> +<blockquote> + <ul> + <li>1、<code class="highlighter-rouge">pull</code> git仓库里面的最新代码到本地。</li> + <li>2、然后打包成<code class="highlighter-rouge">App</code>。</li> + <li>3、安装到模拟器上。</li> + <li>4、运行App,执行单元测试,生成测试数据并保存到本地。</li> + <li>5、脚本读取测试数据,邮件发送给相关人员。</li> + </ul> +</blockquote> -<p>1、根据应用得到根视图 <br /> -2、递归获取里面的所有控件 <br /> -3、按照他们的层级关系一层一层的画出来</p> +<p>当这些全自动化后,可以大大减少开发人员的维护成本,即使每次项目里面有新增模块后,增加测试case就行了,下面会介绍自动测试这5步具体怎么去执行,整个脚本是使用Python写的,代码很少功能也很简单,但这已经可以帮我们完成基本的自动化测试了,这就是脚本的强大之处,选择Pyhton纯属个人喜好,最近也在学习Python,当然了最终使用什么语言看你自己。</p> -<h3 id="section-3">动态修改控件</h3> +<h3 id="pythonshell">python执行shell命令完成测试</h3> -<p>1、把上面获取到的所有控件的详细信息上传到服务器 。 <br /> -2、根据业务需求由服务器给我们下发对应的配置列表,以 <code class="highlighter-rouge">button</code> 为例 : 配置列表里必须要有 :</p> +<p>首先确认本机上安装了<code class="highlighter-rouge">git</code> 和 <code class="highlighter-rouge">python</code> 。 <br /> +脚本判断本地是否存在项目,不存在则使用命令 <code class="highlighter-rouge">git clone ...</code> ,存在则使用命令 <code class="highlighter-rouge">git pull ...</code> 。 <br /> +这些在Linux的命令都可以使用脚本来完成的,python的 <code class="highlighter-rouge">os.popen()</code> 方法 就是可以在Linux上执行shell命令。 <br /> +<strong>例如:</strong> 把下面这段代码添加到一个 test.py 的文件里,然后在终端上执行 <code class="highlighter-rouge">python test.py</code> 命令你就会看到,你的当前目录下正在下载我的博客了。</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>import os + +os.popen('git clone https://github.com/leopardpan/leopardpan.github.io.git') + +</code></pre> +</div> +<p>git pull 。。。 更新代码也是一样的。</p> + +<p>接下来的打包、安装、运行都是使用python执行shell命令</p> + +<p><strong>把iOS项目打包成App,下面的 <code class="highlighter-rouge">Demo</code> 是项目的名字</strong></p> <blockquote> - <p>1)、<code class="highlighter-rouge">button</code> 的全路径 : 如 <code class="highlighter-rouge">UIWindow</code> -&gt; <code class="highlighter-rouge">UIWindow</code> -&gt; <code class="highlighter-rouge">UIView</code> -&gt; <code class="highlighter-rouge">UIView</code> -&gt; <code class="highlighter-rouge">UILayoutContainerView</code> -&gt; <code class="highlighter-rouge">UITabBar</code> -&gt; <code class="highlighter-rouge">UIView</code> —&gt; <code class="highlighter-rouge">UIButton</code></p> + <ul> + <li>os.popen(‘xcodebuild -project Demo.xcodeproj -target Demo -configuration Debug -sdk iphonesimulator’)</li> + </ul> </blockquote> +<p>这行脚本运行完成后,你就会发现同会生成一个 <code class="highlighter-rouge">build</code> 的文件夹。<br /> +Debug参数表示现在是Debug模式,如果Xcode里面改成Release了,这里需要改成Release。<br /> +xcodebuild 命令是 Xcode Command Line Tools 的一部分。通过调用这个命令,可以完成 iOS 工程的编译,打包和签名过程。可以使用 xcodebuild –help 来看看具体有哪些功能。</p> + +<p><strong>打开iOS模拟器,这里运行的是<code class="highlighter-rouge">iPhone 6 Plus</code> 你也可以换成其它型号的模拟器</strong></p> + <blockquote> - <p>2)、<code class="highlighter-rouge">button</code> 的唯一标识 : 如 <code class="highlighter-rouge">tag</code> 值或自己实现的一套算法生成的唯一标识 , 目的是防止与 <code class="highlighter-rouge">button</code> 同一层次的视图搞混 。</p> + <ul> + <li>os.popen(‘xcrun instruments -w “iPhone 6 Plus”’)</li> + </ul> </blockquote> +<p><strong>把刚才打包生成的App安装到模拟器上</strong> <br /> +在安装之前要先卸载App,不然你运行的永远是最初安装的那个,后来安装的不会覆盖之前的,卸载App</p> + <blockquote> - <p>3)、 根据路径及唯一标识来匹配 <code class="highlighter-rouge">App</code> 里的控件 , 匹配和上面的查找原理是相通的。</p> + <ul> + <li>os.popen(‘xcrun simctl uninstall booted com.test.Demo’)</li> + </ul> </blockquote> +<p>booted 后面接的是 <code class="highlighter-rouge">Bundle Identifier</code>,我的是 com.test.Demo,然后再安装App</p> + <blockquote> - <p>4)、 匹配成功代表 <code class="highlighter-rouge">button</code> 确实存在 , 根据业务需求做后续操作 。</p> + <ul> + <li>os.popen(‘xcrun simctl install booted build/Debug-iphonesimulator/Demo.app ‘)</li> + </ul> </blockquote> +<p>booted 后面接的是.app的路径,我打包的时候的是Debug,所以这个的文件夹名称是Debug-iphonesimulator。</p> + +<p><strong>在模拟器里运行App</strong></p> + <blockquote> - <p>提示: 匹配策略尽可能的多 , 防止意外情况某一两个标识生成失败或者生成相同 。</p> + <ul> + <li>os.popen(‘xcrun simctl launch booted com.test.Demo’)</li> + </ul> </blockquote> -<p>3、修改 <code class="highlighter-rouge">button</code> 的状态。</p> +<p>booted 后面接的是 <code class="highlighter-rouge">Bundle Identifier</code>,我的是 com.test.Demo。</p> + +<p>到目前为止,你就会发现你的项目已经运行起来了,你可以在项目是Debug模式下一启动就执行单元测试,然后把对应的测试数据保存到本地为data.json。然后在使用python脚本读取测试文件的数据,最终使用邮件发送给相关人员,pyhton读取数据很简单,一行代码就行</p> <blockquote> - <p>1)、 如某个按钮点了会 <code class="highlighter-rouge">Crash</code> 或暂时不需要被点击 , 但是又要展示出来 , 可以直接修改 <code class="highlighter-rouge">button</code> 的 <code class="highlighter-rouge">enabled</code> 属性 。</p> + <ul> + <li>data = open(‘data.json’).read()</li> + </ul> </blockquote> +<p>data里面就是json字符串,为了脚本操作简单,我在存储的时候直接把json格式的转成了字符串类型。</p> + +<h3 id="python">python发送邮件</h3> + +<p>我使用的是SMTP进行邮件发送的,SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。</p> + +<p>Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件,具体代码如下:</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>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'自动化测试邮件 &lt;%s&gt;' % from_addr) + msg['To'] = self.format_addr(u'管理员 &lt;%s&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','正文','标题') +</code></pre> +</div> + +<p>from_addr是发送方的邮箱地址,password是开通SMTP时输入的密码 <br /> +smtp_server是smtp的服务,如果你的from_addr是gamil.com,那么就要写成smtp_server = ‘smtp.gmail.com’ 了。</p> + +<p>方法 send_mail(self, mail, message, title): 有四个参数,第一个不用传,第二个参数是收信人的邮箱,第三个是邮件的正文,第四个是邮件的标题,方法调用格式: <code class="highlighter-rouge">send_mail('leopardpan@icloud.com','正文','标题')</code></p> + +<p>注意:发送方的邮箱必须要开通SMTP功能才行,否则会报错</p> + <blockquote> - <p>2)、 如某业务暂时关闭 , 可以直接修改入口 <code class="highlighter-rouge">按钮</code> frame为0 , 前提是要自动布局已做好 。</p> + <ul> + <li>SMTPSenderRefused: (550, ‘User has no permission’, ‘leopardpan@163.com’)</li> + </ul> </blockquote> +<p>163的SMTP开通,需要你登录网易邮箱,然后点击顶部的设置就会出现<code class="highlighter-rouge">POP3/SMTP/IMAP</code>,点击之后,勾选选择开启,这个时候需要你输入密码,记住这个密码就是上面代码中的<code class="highlighter-rouge">password</code>,如果你都完成的话,你把上面的代码拷贝出现,把邮箱修改成你自己的,使用 pyhton 运行一下吧。</p> + +<p>上面的几个流程结合起来就可以实现一个简单的自动化测试了,如果你有什么建议和意见欢迎讨论。</p> + +<p><a href="http://baixin.io/2016/08/PythonTestAutomationiOS/">点击阅读原文</a></p> + +<p>参考链接: +<a href="http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832745198026a685614e7462fb57dbf733cc9f3ad000">SMTP发送邮件</a></p> + + + Thu, 04 Aug 2016 00:00:00 +0800 + http://baixin.io/2016/08/PythonTestAutomationiOS/ + http://baixin.io/2016/08/PythonTestAutomationiOS/ + + python + + + + + + 老司机带你剖析无码统计 + <p>  无需开发介入,也可以统计移动App上按钮的点击次数,简称 <code class="highlighter-rouge">无码统计</code> ,只要是跟App开发相关的同学,相信都对埋点统计有些了解,特别是针对开发人员来说,做代码埋点统计基本上是看不到直接收益也是开发人员最不愿做的一件事,这篇文章讲的就是如何让开发人员摆脱代码埋点的痛苦。</p> + +<p>  文章主要分为:使用场景、实现原理、适用范围、使用详情四个模块,不管你是产品,还是开发人员又或者是运营人员都适合读这篇文章。</p> + +<p>  在App开发过程中我们应该都有过类似的需求:想统计某些按钮的点击次数。例如,我们开发了一个注册模块,注册流程有些复杂,整个注册功能开发完成后,我们想知道到底有没有用户使用注册功能,而又有多少用户使用?</p> + +<p>有什么方式能知道呢?</p> + <blockquote> - <p>3)、 如给购买 <code class="highlighter-rouge">按钮</code> 添加监听事件 <code class="highlighter-rouge">addTarget: action: forControlEvents:</code></p> + <ul> + <li>后台看注册系统? <br /> + 有些麻烦,需要后台去数据库里查看,还要做成数据可视化的才方便看。</li> + </ul> </blockquote> <blockquote> - <p><code class="highlighter-rouge">target</code> 也可以通过上面 <code class="highlighter-rouge">遍历视图</code> 获取到 , <code class="highlighter-rouge">action</code> 可以由服务器下发 , 也可以一开始就写死 , 等有需求的时候直接传不同的参数就行了 。</p> + <ul> + <li>查看注册按钮的点击情况? <br /> + 这是最直观的。 主看看两块就行,注册按钮的点击次数 和 提交注册按钮的点击次数,如果发现注册按钮被点击多次(如1W次),而提交注册的点击次数却只有几次,这就可以反映出,很多用户看到的我们的注册流程太复杂,然后选择放弃注册了。同样的道理,我们通过同样的方式可以验证我们其它的功能模块是否有用户经常使用,从而来重新规划我们的设计需求。</li> + </ul> </blockquote> -<p>4、 绑定查找控件时 , 这个界面必须要已经初始化完成了才行 , 假如界面还没生成肯定是查找不到这个控件的 。 这里给大家提供两种思路 :</p> +<p>  一整个功能模块的完成涉及到 产品、UI设计、开发、测试 等几个部分,资源和人力的消耗还是挺大的,所以我们在开发过程是否继续维护这些功能模块,还是开发新功能是要经过慎重衡量,而衡量这些最有说服力的依据就是用户的使用数据,这些数据来源是刚才说的 按钮的点击次数,页面的停留时长 等等。</p> + +<h3 id="section">使用场景</h3> + +<p>  分析用户App的使用情况当然是直接用数据说话,那么想知道某些按钮的点击次数,就一定需要App的开发人员去具体的按钮点击方法里面埋点才行,有的公司有自己的一套完整的统计埋点系统,有的公司是使用第三方统计,最终都是可以看到按钮的点击次数的,不管怎么样想知道按钮的点击必须要App的开发人员亲自去写代码埋点才行,而这篇文章主要讲的是 <code class="highlighter-rouge">无码统计</code> 按钮点击次数。也就是不需要开发介入,我们就能知道按钮的点击了,开发人员只要负责他的业务开发就行,下面是一张 <code class="highlighter-rouge">传统埋点</code> 统计和 <code class="highlighter-rouge">灵动分析</code> 统计,灵动是TalkingData的SDK无码统计的一个功能。</p> + +<p><img src="/images/posts/codeless/image01.png" height="300" width="600" /></p> + +<p>先大致讲下左边 <code class="highlighter-rouge">传统</code> 埋点统计流程</p> <blockquote> - <p>1、使用Runtime <code class="highlighter-rouge">Method Swizzing</code> , 直接把修改控件的方法与 <code class="highlighter-rouge">didMoveToSuperview</code> 和 <code class="highlighter-rouge">didMoveToWindow</code> 动态绑定 , 等这个控件加载出来之后再去修改 , 查找路径正确的话肯定就能找到了 。</p> + <ul> + <li>首先需要制定埋点需求、设计埋点方案,需求有了后就去找开发沟通,埋点需求的讨论,双方确认需求通过后,然后准备需求文档,开发再根据文档来写具体的埋点代码。</li> + </ul> </blockquote> <blockquote> - <p>2、在具体的类里面 , 等控件的初始化方法调用完后 , 再去执行动态修改 , 如在<code class="highlighter-rouge">viewDidLoad</code> 里面初始化控件 , 在 <code class="highlighter-rouge">viewWillAppear:</code> 里面动态修改 。</p> + <ul> + <li>代码写完后,App打包给测试人员,测试人员进行测试,同时还要对埋点参数的数据安全审核,参数是否有包含公司敏感信息。</li> + </ul> </blockquote> <blockquote> - <p>建议使用第一种适用范围更强 。</p> + <ul> + <li>测试通过后就需要上线了,这个过程一般是开发人员去完成的。iOS需要提交到AppStore上,以前大家都知道,一个审核周期就是一两周,还有随时被拒的可能,现在虽然周期变短了,但审核也还是挺严格的(走快捷通道的除外)。Android需要在各个渠道上重新发布,也是很麻烦的。</li> + </ul> +</blockquote> + +<blockquote> + <ul> + <li>如果前面几部都顺利完成了的话,接下来就等待用户更新了,如果埋点统计功能跟其它新功能一起上线的话,我们更新就有理由了,如果仅仅这一版仅仅只是埋点统计功能,那么让用户更新App的理由又是一件头疼的事情了,不管怎么样经常让用户更新App多少会对用户用些影响的。</li> + </ul> </blockquote> -<p>上架后的 <code class="highlighter-rouge">应用</code> 可能会遇到的一些突发状况 , 未测出的<code class="highlighter-rouge">Crash</code>、临时改点小需求 , 等等 , 我们总不能每次因为一点小改动就重新提交一次 <code class="highlighter-rouge">App Store</code> , 先不说 <code class="highlighter-rouge">App Store</code> 的审核时间 , 频繁的让用户去更新应用 , 用户也会烦的 。使用这篇文章所讲的来实现动态更新是再合适不过了 。</p> +<blockquote> + <ul> + <li>最终的结果应该是部分用户更新了App,那么我们能统计到按钮点击的用户了就只是更新了App的这一部分用户了,而且他们更新的时间是不一样的,最终我们终于可以看需求上的埋点统计了。</li> + </ul> +</blockquote> -<p>首先上面讲的 <code class="highlighter-rouge">动态更新</code> 是完全脱离出来的一个模块 , 跟业务逻辑没有任何关系 , 只需要部署一次就行了 , 等开发下一个项目也可以直接拿过去使用 。这里的动态更新适用于局部的视图、控件的修改 , 如果你有其它需求可以考虑 <a href="https://github.com/bang590/JSPatch">JSPatch</a> , 下发脚本也是一个不错的选择 。</p> +<p>再看看右边 <code class="highlighter-rouge">灵动</code> 统计流程</p> -<h3 id="section-4">工具篇</h3> -<p>使用一些UI调试的辅助工具 , 使我们查看视图在项目中得层次结构更为方便 。 <br /> -常用的UI调试的工具:</p> +<p>同样需要制定需求,但是需求方可以直接根据自己的需求去使用 <code class="highlighter-rouge">灵动</code> 了,使用了灵动就可以直接看按钮的点击率了,这个过程不需要开发介入,也不需要用户去更新App。</p> -<ul> - <li>Captuer View Hiearachy</li> - <li>Reveal</li> -</ul> +<p>  从这张图可以看出,不需要开发人员介入,可以开发成功,提高开发效率,而且埋点也很灵活,需求人员(可以是产品,也可以是运营)可以直接使用灵动,也不需要用户更新,那么数据反馈会比传统埋点快很多,使用了就可以立即生效,需求方的观察周期也缩短了,能更灵活的做出决策。</p> -<p>Xcode自带的 <code class="highlighter-rouge">Captuer View Hiearachy</code> 实现步骤:</p> +<h3 id="section-1">实现原理</h3> -<ul> - <li>1、打开Xcode , 运行项目 , 选择最顶部的 <code class="highlighter-rouge">Debug</code></li> - <li>2、<code class="highlighter-rouge">Debug</code> -&gt; <code class="highlighter-rouge">View Debugging</code> -&gt; <code class="highlighter-rouge">Show View Frames</code></li> - <li>3、<code class="highlighter-rouge">Debug</code> -&gt; <code class="highlighter-rouge">View Debugging</code> -&gt; <code class="highlighter-rouge">Captuer View Hiearachy</code></li> -</ul> +<p>  上面大致介绍了下 <code class="highlighter-rouge">灵动</code> 能给我们解决什么问题,这里讲的是 <code class="highlighter-rouge">灵动</code> 是通过什么样的技术手段实现,这里可能对于开发人员来说更喜欢,大家先看一张灵动使用时的一个交互</p> -<p>Xcode里面就变成了三维的视图了 , Xcode左侧展示出来的是层级关系的树状图 。</p> +<p><img src="/images/posts/codeless/image02.png" height="300" width="500" /></p> + +<p>  这张图分成两部分看,先看上面,一个用户在操作Client和PC,Client和PC通讯是通过一个Wss的服务器建立的长连接,这是灵动调试时的一个交互。 <br /> +  也就是说,用户使用灵动分析时,需要一个安装自己App的移动设备,这个App必须要集成TalkingData的统计分析SDK才行,SDK初始化时的AppID是在TalkingData创建应用时分配的。另一端用户要打开TalkingData的灵动网页,在App启动的时候摇一摇手机,然后就可以建立一个wss的长连接了。用户就可以直接在网页上给按钮添加监听事件了,添加完成后,在手机上点击该按钮,网页上就会提示被点击,调试完成后点击全部生效,配置数据就会保存到下面https的服务器。 <br /> +  我们的所有用户在启动App的时候,都可以从https服务器里获取到这套配置,客户端根据这套配置找到具体的按钮,监听点击事件,当按钮被点击后,就可以统计到了。</p> + +<p>接下来再看看灵动调试过程中数据是具体怎么进行数据交互的。</p> + +<p><img src="/images/posts/codeless/image03.png" height="300" width="500" /></p> + +<p>  可以看到App客户端和Web端交互主要分为四部分:<code class="highlighter-rouge">设备信息</code> 、 <code class="highlighter-rouge">App基本结构</code> 、<code class="highlighter-rouge">控件绑定配置</code> 、<code class="highlighter-rouge">按钮点击信息</code> ,<code class="highlighter-rouge">设备信息</code> 主要是用来确认设备是调试者的设备,因为其它的终端用户也可能会误触发调试,<code class="highlighter-rouge">App基本结构</code>是用来在Web上展示移动App的,然后在Web上绑定了控件,就会把<code class="highlighter-rouge">控件绑定配置</code>发送给客户端,客户端根据配置监听绑定,当终端用户点击控件后,客户端就会把<code class="highlighter-rouge">按钮点击信息</code>传给Web端,Web显示控件被点击。</p> -<p><a href="http://baixin.io/2016/01/iOS_OTA/">点击阅读原文</a></p> +<p>  再回头看看实现原理的第一张图片,调试完成数据就会从WSS的长连接服务器存储到HTTPS的服务器,此后其它终端用户只要在再次启动App就能获取到埋点配置了,SDK根据埋点配置去找到具体的控件(按钮),监听点击,当用户点击控件时就可以调用自定义埋点的方法,之后的数据处理就跟自定义埋点是一样的原理了。 <br /> +  可能有同学会有疑问,所有的App每次启动的时候都会去获取埋点配置,是不是会很耗流量? 答案是不会的,服务器在没有埋点配置的时候每次将获取不到信息,那么将不会有什么流量消耗。如果服务器有配置了,App才会有些流量消耗的,而且这些配置信息是经过压缩的,所以流量消耗也不大,App获取到了配置之后就会做本地缓存,服务器配置不变的情况下再次获取配置也不会有流量的消耗,只有在下一次运营人员修改了新的控件绑定时才会消耗一些流量。 所以整个无码统计对终端用户的流量的影响是很小的。 <br /> +  你也可以参考这套逻辑试试自己也部署这么一套无码统计,之后就不用再担心运营给的埋点统计需求了,让他们自己去用无码统计吧。</p> -<p>Reveal的功能相对来说更强大 , 适用于UI调试视图查找 。使用方法请看 <a href="http://support.revealapp.com/kb/getting-started/reveal">Reveal集成指南</a> 。</p> +<p><a href="http://baixin.io/2016/07/Codeless/">点击阅读原文</a></p> - Sat, 09 Jan 2016 19:15:06 +0800 - http://baixin.io/2016/01/iOS_OTA/ - http://baixin.io/2016/01/iOS_OTA/ + Fri, 15 Jul 2016 00:00:00 +0800 + http://baixin.io/2016/07/Codeless/ + http://baixin.io/2016/07/Codeless/ - iOS + 技术 - iOS 9 变化笔记 - <p>这里将介绍下我们日常开发一些从iOS8过度到iOS9给我们带来的一些变化,及解决方法。<a href="http://baixin.io/2015/09/iOS9_Note/">点击阅读原文</a></p> + Git教程 + <h3 id="section">介绍</h3> -<h3 id="app-transport-security">App Transport Security</h3> +<p>  Git是做项目的版本管理,你也可以称它们为版本管理工具。假如现在你有一个文件夹,里面可以是项目,也可以是你的个人笔记(如我这个博客),或者是你的简历、毕业设计等等,都可以使用git来管理。</p> -<p>iOS9和OS X El Capitan的一个新特性,App Transport Security 的目地是提高Apple 操作系统的安全性以及在此操作系统上运行的任何应用的安全性。ATS是苹果针对与 NSURL这一层做的封装,iOS9后ATS默认是开启的,即网络传输需要使用HTTPS。如果想在iOS9后继续使用HTTP的话,有两条路可以走:</p> +<p>  目前常用的版本控制器有Git和SVN,即使这两个你没有全用过,至少也会听过,我这里以Git为例,个人比较喜欢Git,你也可以看看这篇文章:<a href="http://www.worldhello.net/2012/04/12/why-git-is-better-than-svn.html">为什么Git比SVN好</a>。我使用的是Mac,Mac上没自带Git环境,但是作为iOS开发者,我安装Xcode的时候,Xcode里是有自带Git的,所以我不需要考虑怎么去安装Git了。</p> + +<h3 id="git">安装Git</h3> + +<p><strong>在Mac OS X上安装Git</strong></p> + +<p>提供两种方法参考:</p> <blockquote> - <ol> - <li>在Info.plist中添加 <code class="highlighter-rouge">NSAppTransportSecurity</code>类型Dictionary,在<code class="highlighter-rouge">NSAppTransportSecurity</code>下添加<code class="highlighter-rouge">NSAllowsArbitraryLoads</code>,Boolean 为 YES。</li> - <li>直接使用CFNetwork做网络请求,ASIHTTPRequest就是基于CFNetwotk做的封装,如果有需求的同学可以看看ASI里面的源码,如果某个时间段你又想要使用HTTPS的话,ASI对SSL/TSL的证书验证有点问题,证书验证还得自己封装一下才行。刚才我说道,ATS是苹果针对与NSURL这一层做的封装,所以我们使用CFNetwork或者更底层做网络请求的话是不受ATS限制的。</li> - </ol> + <p>1、通过homebrew安装Git,具体方法请参考<a href="http://brew.sh/">homebrew的文档</a> <br /> +2、直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode。</p> +</blockquote> + +<p><strong>在Windows上安装Git</strong></p> + +<blockquote> + <p>从<a href="https://git-for-windows.github.io">https://git-for-windows.github.io</a> 下载,然后按默认选项安装即可,安装完成后,在开始菜单里找到“Git”-&gt;“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!</p> +</blockquote> + +<h3 id="git-1">配置Git</h3> + +<p>安装完成后,还需要最后一步设置,在命令行输入:</p> + +<blockquote> + <ul> + <li>$ git config –global user.name “Your Name”</li> + <li>$ git config –global user.email “email@example.com”</li> + </ul> </blockquote> -<h3 id="discoveryd-dns">移除了discoveryd DNS解析服务</h3> +<p>“Your Name”: 是每次提交时所显示的用户名,因为Git是分布式版本控制系统,当我们push到远端时,就需要区分每个提交记录具体是谁提交的,这个”Your Name”就是最好的区分。</p> -<p>iPhone升级到iOS8后WiFi有时候会有问题,特别是Mac升级到OS X Yosemite后,时而电脑休眠唤醒唬就连不上WiFi,有时候还突然掉线,经常要手动去关闭WiFi在重新连接,这是因为苹果到了OS X Yosemite系统后,把之前的mDNSResponder换成了discoveryd DNS。iOS9和OS X Yosemite10.4后mDNSResponder又回来了。</p> +<p>“email@example.com”: 是你远端仓库的email</p> -<p>mDNSResponder: 苹果以前一直使用控制DNS和Bonjour服务的一种进程。 -discoveryd:OS X Yosemite后苹果新出的一种进程。</p> +<p>–global:用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然我们也可以对某个仓库指定不同的用户名和Email地址。</p> -<h3 id="app-thinning">App Thinning</h3> -<p>App Thinning是一个关于节省iOS设备存储空间的功能,它可以让iOS设备在安装、更新及运行App等场景中仅下载所需的资源,减少App的占用空间,从而节省设备的存储空间。</p> +<h3 id="section-1">开始使用-建立仓库:</h3> -<h4 id="app-thinning-1">App Thinning主要有三个机制:</h4> +<p>你在目标文件夹下使命令:</p> <blockquote> - <ol> - <li>Slicing: 开发者把App安装包上传到AppStore后,Apple服务会自动对安装包切割为不同的应用变体(App variant), 当用户下载安装包时,系统会根据设备型号下载安装对应的单个应用变体。</li> - <li>On-Demand Resources: ORD(随需资源)是指开发者对资源添加标签上传后,系统会根据App运行的情况,动态下载并加载所需资源,而在存储空间不足时,自动删除这类资源。</li> - <li>Bitcode:开启Bitcode编译后,可以使得开发者上传App时只需上传Intermediate Representation(中间件),而非最终的可执行二进制文件。 在用户下载App之前,AppStore会自动编译中间件,产生设备所需的执行文件供用户下载安装。</li> - </ol> + <ul> + <li>git init (创建.git文件)</li> + </ul> </blockquote> -<p>其中,Bitcode的机制可以支持动态的进行App Slicing,而对于Apple未来进行硬件升级的措施,此机制可以保证在开发者不重新发布版本的情况下而兼容新的设备。Xcode7默认是开始了Bitcode,如果不想使用可以手动关闭Bitcode:</p> +<p>就会创建一个 <code class="highlighter-rouge">.git</code> 隐藏文件,相当于已经建立了一个本地仓库。</p> -<ul> - <li>选择项目——&gt;点击Target——&gt;点击Build Setttings——&gt;搜索栏里搜bitcode——&gt;把Enable Bitcode对应的Yes改成No。</li> -</ul> +<p><strong>添加到暂存区:</strong></p> -<p>启用Bitcode编译机制,需要注意以下几点:</p> +<blockquote> + <ul> + <li>git add . (全部添加到暂存区)</li> + <li>git commit -m ‘ first commit’ (提交暂存区的记录到本地仓库)</li> + </ul> +</blockquote> -<ol> - <li>如果应用开启Bitcode,那么其集成的其他第三方库也需要是Bitcode编译的包才能真正进行Bitcode编译</li> - <li>开启Bitcode编译后,编译产生的.app体积会变大(中间代码,不是用户下载的包),且.dSYM文件不能用来崩溃日志的符号化(用户下载的包是Apple服务重新编译产生的,有产生新的符号文件),使用dSYM来收集Crash日志的同学得注意了。</li> - <li>通过Archive方式上传AppStore的包,可以在Xcode的Organizer工具中下载对应安装包的新的符号文件</li> -</ol> +<h3 id="section-2">其它</h3> + +<p>git branc 查看时如出现</p> + +<blockquote> + <ul> + <li>(HEAD detached at analytics_v2)</li> + <li>dev</li> + <li>master</li> + </ul> +</blockquote> -<h3 id="section">后台定位</h3> +<p>代表现在已经进入一个临时的HEAD,可以使用 <code class="highlighter-rouge">git checkout -b temp</code> 创建一个 temp branch,这样临时HEAD上修改的东西就不会被丢掉了。 +然后切换到 dev 分支上,在使用 git branch merge temp,就可以把 temp 分支上的代码合并到 dev 上了。</p> -<p>iOS9后苹果为了对保障用户的地理位置的隐私对App请求后台定位有了权限设置,则需要多加一些代码。如果不适配iOS9,就不能偷偷在后台定位,如果没有后台定位的权限也是可以在后台定位的,只是会出现蓝条。</p> +<p><a href="http://baixin.io/2016/07/GitTutorial/">点击阅读原文</a></p> -<p>开启后台定位功能:<code class="highlighter-rouge">locationManager.allowsBackgroundLocationUpdates = YES;</code> -locationManager是CLLocationManager的对象,用来管理整个定位的。</p> + + Wed, 13 Jul 2016 00:00:00 +0800 + http://baixin.io/2016/07/GitTutorial/ + http://baixin.io/2016/07/GitTutorial/ + + 工具 + + + + + + iOS开发迎来机器学习的春天---TensorFlow + <div align="center"> + <img src="/images/posts/tfimg/logo.jpg" height="300" width="500" /> +</div> -<p><strong>重点:</strong></p> +<p>  <code class="highlighter-rouge">人工智能</code>、<code class="highlighter-rouge">机器学习</code>都已走进了我们的日常,尤其是愈演愈热的大数据更是跟我们的生活息息相关,做 <code class="highlighter-rouge">人工智能</code>、<code class="highlighter-rouge">数据挖掘</code>的人在其他人眼中感觉是很高大上的,总有一种遥不可及的感觉,在我司也经常会听到数据科学部的同事们提到 <code class="highlighter-rouge">机器学习</code>、<code class="highlighter-rouge">数据挖掘</code> 之类的词。但这些名词真的跟我们移动开发就没直接关系了吗? <br /> +  作为移动开发者来说,无时无刻不被这些名词狠狠地敲打着脆弱的内心。💢 💢 💢 何时才能够将<code class="highlighter-rouge">机器学习</code>、<code class="highlighter-rouge">深度学习</code>应用在移动端,敲响移动端<code class="highlighter-rouge">机器学习</code>工业化的大门呢?</p> <blockquote> - <p>配置info.plist,添加一个Required background modes,Array类型的,然后在Required background modes里面Item 0对应的Value设置为App registers for location updates,这样就解决了iOS9后台定位出现蓝条的问题了。</p> + <p>想象一下,某一天你身处一个完全陌生的环境,周围都是陌生的事物,而运行在iPhone的某个APP却对这个环境了如指掌,你要做的就是打开这个APP,输入你需要了解的事物,iPhone告诉你这个事物的信息,你也就没有了陌生事物了。世界就在眼前!</p> </blockquote> -<h3 id="ui-testing">UI Testing</h3> -<p>Xcode7中苹果引入了一种新的方式在应用中进行测试——UI Testting,UI Testting允许我们找到UI元素与之交互,还能检查属性和状态。UI Testting已经完全集成进了Xcode7的测试报告,可以和单元测试一起执行。使用起来跟之前Xcode5出来的XCTest差不多,Xcode bots提供对此的支持,而且command line支持当UI测试失败时会立即发出通知。</p> +<p>如下图:</p> +<div align="center"> + <img src="/images/posts/tfimg/image02.png" height="300" width="480" /> +</div> + +<p>上面物体的识别准确率还是蛮不错的,基本识别出了键盘(49%的概率)、鼠标(46%的概率)和水杯(24%的概率)。</p> + +<p>但是在某些事物的识别准确度方便却差强人意,比如下图:</p> + +<div align="center"> +  <img src="/images/posts/tfimg/image01.png" height="300" width="320" /> +</div> +<p>  iPhone 6被识别成了iPod(59%的概率),而iPod的却是不怎么敢认(10%的概率)。想想最崩溃的估计是iPhone 6了,身价直接被降了好几个等级。</p> + +<div align="center"> +  <img src="/images/posts/tfimg/wq.jpg" height="320" width="240" /> +</div> + +<p>  上面的例子来自于TensorFlow官方iOSDemo,暂且不评述TensorFlow的识别准确度如何,毕竟它还年轻,但是仅凭其识别能力的体现,也给机器学习在移动端的运用带来了无限的可能。</p> + +<h3 id="tensorflowtf">一、TensorFlow(简称TF)</h3> + +<p>  去年,Google资深系统专家Jeff Dean在湾区机器学习大会上隆重介绍了其第二代深度学习系统<a href="http://www.tensorflow.org/">TensorFlow</a>,一时间网络上针对TensorFlow的文章铺天盖地,<a href="http://www.leiphone.com/news/201511/UDLyNds2oSTwM2yZ.html">揭秘TensorFlow:Google开源到底开的是什么?</a>、<a href="http://www.leiphone.com/news/201511/Voza1pFNQB4bzKdR.html">Google开源TensorFlow系统,这背后都有什么门道?</a>、<a href="http://www.zhihu.com/question/37243838">如何评价Google发布的第二代深度学习系统TensorFlow?</a>等等文章,TensorFlow的燎原之火一直在燃烧蔓延着,其<a href="https://github.com/tensorflow/tensorflow">GitHub上的开源库</a>在此文撰写时,也已经被<code class="highlighter-rouge">star:27550</code>,<code class="highlighter-rouge">fork:11054</code>了。🔥 🔥 🔥 🔥 🔥</p> + +<p>不负众望,Google一直宣称平台移植性非常好的TensorFlow,终于在2016年6月27日,发布0.9版本,宣布移动端支持。<a href="https://developers.googleblog.com/2016/06/tensorflow-v09-now-available-with.html">TensorFlow v0.9 now available with improved mobile support</a>( 有墙💢 ),同时也给出了移动端的<a href="https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/ios_examples">Demo</a>,对于代码为生的程序员,身处大数据处理为主导的<a href="http://www.talkingdata.com/">TalkingData</a>,也小试身手了一把,下载TensorFlow源码,查看编译指南,开始跳坑、填坑之路,也成就了此篇拙文的产生。</p> + +<h3 id="tensorflowios">二、从TensorFlow到iOS静态库</h3> + +<p>对于iOS平台下如何使用TensorFlow,TensorFlow给出了详细的编译脚本命令,详情请查看<a href="https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile">官方文档的命令</a>。</p> + +<h5 id="section">第一步. 工具准备</h5> -<p>可以参考Github上的Demo,步骤:</p> +<p><code class="highlighter-rouge">工欲善其事必先利其器</code>,在开始编译工作之前,需要准备一些编译所必须的工具:</p> <ol> - <li>在DemoTests.m里创建一个test开头的方法</li> - <li>在setUp()里启动应用 <code class="highlighter-rouge">XCUIApplication().launch()</code></li> - <li>新建一个方法test开头的,在里面获取应用<code class="highlighter-rouge">let app = XCUIApplication()</code></li> - <li>的到<code class="highlighter-rouge">let app = XCUIApplication()</code>,a<code class="highlighter-rouge">pp.buttons[“View Detail”].tap()?</code>。buttons是当前这个界面的所有按钮的集合,[]里面写按钮的名字,tap()就是执行这个按钮所对应的方法,可以是网络请求、界面跳转等等。</li> + <li><a href="http://brew.sh/">Homebrew</a>: Mac os x 上包管理工具,具体使用方法可参考<a href="http://brew.sh/index_zh-cn.html">Doc</a>。</li> </ol> -<h3 id="url-scheme">URL scheme</h3> +<div class="highlighter-rouge"><pre class="highlight"><code>$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" +</code></pre> +</div> -<p>在iOS9中,如果使用URL scheme必须在”Info.plist”中将你要在外部调用的URL scheme列为白名单,否则不能使用。</p> +<ol> + <li>Homebrew安装好之后,依次安装三个辅助性编译工具:</li> +</ol> -<p>配置info.plist,添加一个<code class="highlighter-rouge">LSApplicationQueriesSchemes</code>,Array类型的,然后在<code class="highlighter-rouge">LSApplicationQueriesSchemes</code>的Item里面添加urlscheme就行了,urlscheme是任意一个字符串,就是你自己需要使用的urlscheme,iOS9 URL scheme白名单适配就完成了。</p> +<div class="highlighter-rouge"><pre class="highlight"><code>$ brew install libtool +$ brew install autoconf +$ brew install automake +</code></pre> +</div> -<h3 id="section-1">出现大量的警告</h3> +<blockquote> + <p>三个工具的含义,请参考:<a href="https://en.wikipedia.org/wiki/GNU_Libtool">https://en.wikipedia.org/wiki/GNU_Libtool</a></p> +</blockquote> -<p>Xcode7后运行以前的项目后出现大量的警告如:</p> +<h5 id="tensorflow">第二步. 克隆TensorFlow</h5> -<div class="highlighter-rouge"><pre class="highlight"><code><span class="o">(</span>null<span class="o">)</span>: warning: /var/folders/p4/z7zy68r92hd3p5ry5g2v3k_8rlwzzr/C/org.llvm.clang.dalmo/ModuleCache/1TXZDLI9N2EMV/Foundation-3DFYNEBRQSXST.pcm: No such file or directory。 +<p>Google以<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>开源协议将TensorFlow开源在<a href="https://github.com/tensorflow/tensorflow">GitHub</a>上,我们可以直接使用TensorFlow源码。</p> + +<p>在任意你想存放TensorFlow源码的地方(建议不要放在桌面。^_^),clone项目。</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>$ git clone https://github.com/tensorflow/tensorflow </code></pre> </div> -<p>作为一个有洁癖的我反正是不能忍,出现警告的大致原因跟我上面提到的开启Bitcode,.dSYM文件不能用来符号化有关,Xcode试图去创建dSYM文件,但是你又不需要。</p> +<h5 id="section-1">第三步. 编译前准备</h5> -<h3 id="section-2">解决方法</h3> +<p>  在TensorFlow的<code class="highlighter-rouge">tensorflow/contrib/makefile/</code>目录下,有很多可使用的编译脚本,其中<code class="highlighter-rouge">build_all_ios.sh</code>脚本专门用来一键编译TensorFlow iOS静态库。虽然可以直接使用此脚本进行一键编译,但是因为有墙,某些依赖需要提前做处理。</p> <ol> - <li>Build Settings ——&gt;Build Options——&gt;Debug Information Format</li> - <li>Debug下的DWARF with dsYM File改成DWARF</li> - <li>Release下的还是之前默认的DWARF with dsYM File不变</li> + <li> + <p>下载protobuf</p> + + <p>protobuf 是编译前唯一需要特殊处理的依赖库,<a href="https://github.com/google/protobuf/archive/master.zip">点击下载</a>,下载protobuf之后,解压,备用。</p> + </li> + <li> + <p>下载googlemock</p> + + <p>虽然protobuf编译脚本<code class="highlighter-rouge">autogen.sh</code>中的googlemock链接地址<code class="highlighter-rouge">https://googlemock.googlecode.com/files/gmock-1.7.0.zip</code>无法直接下载到,但是细心的人会发现,在浏览器中输入<code class="highlighter-rouge">https://googlemock.googlecode.com/</code>地址后,会跳转到<code class="highlighter-rouge">https://github.com/google/googlemock</code>地址,google在GiHub上的仓库地址。而GitHub上的仓库,我们可以直接的下载,克隆等。</p> + + <p>我们直接在GitHub上下载googlemock(<a href="https://github.com/google/googlemock/archive/master.zip">点击下载</a>),下载完成后,修改压缩包名字为<code class="highlighter-rouge">gmock-1.7.0.zip</code>,修改后将此压缩包移至上一步protobuf文件夹目录下,备用。</p> + </li> + <li> + <p>修改下载依赖脚本,移除protobuf的下载</p> + + <p>在<code class="highlighter-rouge">tensorflow/contrib/makefile/</code>目录下,<code class="highlighter-rouge">download_dependencies.sh</code>脚本用来下载相关依赖,打开此脚本文件,注释掉或者直接删掉<code class="highlighter-rouge">git clone https://github.com/google/protobuf.git ${DOWNLOADS_DIR}/protobuf</code>部分,目的是不让脚本去下载protobuf。</p> + + <p>上面三步准备好后,接下来就进入静态库编译了。</p> + </li> </ol> -<p>参考资料:</p> +<h5 id="section-2">第四步. 一键编译</h5> + +<p>  前面已经知道在TensorFlow文件夹<code class="highlighter-rouge">tensorflow/contrib/makefile/</code>目录下的<code class="highlighter-rouge">build_all_ios.sh</code>脚本是用来编译iOS静态库的脚本,因此可以直接执行此脚本,开始静态库的编译工作了。</p> + +<p>  但是有一个问题大家可能会发现,由于编译TensorFlow需要用到protobuf,但是protobuf使我们自己手动下载的,该怎么让手动下载的protobuf能够直接让<code class="highlighter-rouge">build_all_ios.sh</code>脚本使用呢?</p> + +<p>  答案是<code class="highlighter-rouge">复制、粘贴</code>。可能有些low,但是有效。执行命令 <code class="highlighter-rouge">build_all_ios.sh</code>之后,立即把之前手动下载的protobuf文件夹拷贝进<code class="highlighter-rouge">tensorflow/contrib/makefile/downloads</code>目录。(放心,你拷贝的速度会很快,不会影响编译的执行的。^_^)</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>$ build_all_ios.sh +</code></pre> +</div> + +<p>  一切准备就绪,接下来就是静静的等待编译完成了。在Mac编译的过程中,建议插上电源,最好不要让设备休眠断电,也最好不要去干别的东西,出去溜达一圈,回来后就看到战果了。</p> + +<p>编译完成之后,会在<code class="highlighter-rouge">tensorflow/contrib/makefile/gen/</code>目录下看到编译的结果,关于这些静态库该如何使用,自己的项目如何应用,请参考<a href="https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/ios_examples">TensorFlow iOS Examples</a>。</p> + +<h3 id="section-3">三、遇到的问题</h3> + +<p>1、googlecode.com被墙了,需要翻墙!(目前测试挂了VPN也没用),这也是上面编译前准备为什么要那么做的原因。</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>curl: (7) Failed to connect to googlemock.googlecode.com port 443: Operation timed out +</code></pre> +</div> + +<p>解决: 请参考 『第三步. 编译前准备』。</p> + +<p>2、没有Xcode。</p> + +<div class="highlighter-rouge"><pre class="highlight"><code>xcrun: error: SDK "iphoneos" cannot be located +xcrun: error: SDK "iphoneos" cannot be located +xcrun: error: unable to lookup item 'PlatformPath' in SDK 'iphoneos' ++ IPHONEOS_PLATFORM= +</code></pre> +</div> + +<p>解决:安装Xcode,从上面报错的命令中可以看到,在编译静态库的过程中使用了<code class="highlighter-rouge">xcrun</code>,而此命令是xCode本身具有的能力。</p> + +<p>3、你的Xcode版本不是7.3或以后,或者你有多个Xcode,而默认的安装路径版本不是7.3或以后。</p> + +<p><code class="highlighter-rouge"> +error: Xcode 7.3.0 or later is required. ++ exit 1 +</code>/</p> + +<p>解决:更新Xcode至最新版本,并且保证默认路径下是最新/版本。</p> + +<p>如果Xcode是7.3,并且没有条件更新Xcode,你可以修改<code class="highlighter-rouge">tensorflow/contrib/makefile/compile_ios_tensorflow.sh</code> 里的<code class="highlighter-rouge">REQUIRED_XCODE_VERSION=7.3.0</code>,为<code class="highlighter-rouge">REQUIRED_XCODE_VERSION=7.3</code>。(这样修改,目前还不确定会不会带来一些其他影响,最好是升级你的Xcode)</p> + +<p><a href="http://baixin.io/2016/07/iOSMachineLearning_TensorFlow/">点击阅读原文</a></p> + +<h3 id="section-4">四、参考链接</h3> <ul> - <li><a href="https://github.com/ChenYilong/iOS9AdaptationTips">iOS9AdaptationTips</a></li> - <li><a href="http://www.cocoachina.com/ios/20150821/13140.html">iOS9学习系列</a></li> - <li><a href="https://github.com/shinobicontrols/iOS9-day-by-day">iOS9-day-by-day</a></li> + <li><a href="http://tensorfly.cn/">TensorFlow 中文社区</a></li> + <li><a href="https://www.tensorflow.org/mobile.html">TensorFlow for Mobile</a></li> + <li><a href="http://chenrudan.github.io/blog/2015/11/18/comparethreeopenlib.html">Caffe、TensorFlow、MXnet三个开源库对比</a></li> + <li><a href="http://weibo.com/p/1001603907610737775666">如何评价Tensorflow和其它深度学习系统</a></li> + <li><a href="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">深度学习框架大战正在进行,谁将夺取“深度学习工业标准”的荣耀?</a></li> </ul> - Sun, 27 Sep 2015 02:15:06 +0800 - http://baixin.io/2015/09/iOS9_Note/ - http://baixin.io/2015/09/iOS9_Note/ + Thu, 07 Jul 2016 00:00:00 +0800 + http://baixin.io/2016/07/iOSMachineLearning_TensorFlow/ + http://baixin.io/2016/07/iOSMachineLearning_TensorFlow/ - iOS + 机器学习 + + + + + + 机器学习入门(名词科普) + <h3 id="section">通用名词</h3> + +<h4 id="ml">ML</h4> + +<p>  <strong>名词解释:</strong> 机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。 +  它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。</p> + +<h4 id="dl">DL</h4> +<p>  <strong>名词解释:</strong> 深度学习(Deep Learning)是机器学习拉出的分支,它试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 <br /> +  深度学习是机器学习中表征学习方法。观测值(例如一幅图像)可以使用多种方式来表示,如每个像素强度值的矢量,或者更抽象地表示成一系列边、特定形状的区域等。而使用某些特定的表示方法更容易从实例中学习任务(例如,人脸识别或面部表情识别)。深度学习的好处是将用非监督式或半监督式的特征学习和分层特征提取的高效算法来替代手工获取特征。</p> + +<h4 id="cnn">CNN</h4> +<p>  <strong>名词解释:</strong> 卷积神经网络(Convolutional neural networks,简称CNNs)是一种深度的监督学习下的机器学习模型</p> + +<h3 id="section-1">算法名词</h3> + +<h4 id="knn">KNN:</h4> + +<p>  <strong>名词解释:</strong> 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法。 +  邻近算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。 +  kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。</p> + +<h4 id="svm">SVM:</h4> +<p>  <strong>名词解释:</strong> 支持向量机(Support Vector Machine)。 +  在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类、以及回归分析。</p> + +<p><a href="http://baixin.io/2016/07/MachineLearning_introduce/">点击阅读原文</a></p> + + Tue, 05 Jul 2016 00:00:00 +0800 + http://baixin.io/2016/07/MachineLearning_introduce/ + http://baixin.io/2016/07/MachineLearning_introduce/ + + 机器学习 + + + + + + HEXO进阶 + <p>HEXO接近是最近有一些朋友提出的问题,然后我做了总结,如果你也在使用HEXO,不妨看看,应该会有些帮助。</p> + +<ul> + <li>1、博客部署样式出问题了怎么办?</li> + <li>2、电脑重装或者误删了本地博客怎么办?</li> + <li>3、想使用两台电脑写博客怎么办?</li> + <li>4、为何使用百度搜不到我的博客?</li> +</ul> + +<h3 id="jekyll">使用Jekyll解决前三个问题。</h3> +<p>不得不说 <code class="highlighter-rouge">Jekyll</code> 确实可以解决我上面三个问题, 因为 <code class="highlighter-rouge">Jekyll</code> 是直接把Markdown格式的文章直接放在github仓库里的, 相当于直接用git来管理博客了, <code class="highlighter-rouge">Github</code> 官方也很推荐 <code class="highlighter-rouge">Jekyll</code> 。 你可以先看下 <code class="highlighter-rouge">Jekyll</code> 搭建博客的<a href="voyagelab.github.io">voyagelab</a>, <a href="https://github.com/voyagelab/voyagelab.github.io">github地址</a>, 当然了这只是很普通的, Jekyll 也有很多主题可以选择的, 更详细的请看<a href="http://jekyll.bootcss.com/">Jekyll中文文档</a>、<a href="https://jekyllrb.com/">Jekyll英文文档</a>、<a href="http://jekyllthemes.org/">Jekyll主题列表</a>。 +在 <code class="highlighter-rouge">Jekyll</code> 上逛了一个星期的我又回到了 <code class="highlighter-rouge">Hexo</code> , 发现 目前 <code class="highlighter-rouge">Jekyll</code> 对主题和一些插件的支持相对 <code class="highlighter-rouge">Hexo</code> 来说, 没那么友好, 可能有一些其它的方法只是我没找到而已,关于 <code class="highlighter-rouge">Jekyll</code> 搭建博客就介绍到这, 如果有问题的话可以评论, 或者联系我。</p> + +<h3 id="hexo">使用Hexo解决上面前三个问题</h3> +<p>是的, 我大<code class="highlighter-rouge">Hexo</code>同样可以解决上面三个问题, 那就是使用git。关于如何使用 <code class="highlighter-rouge">Hexo</code> 搭建博客请看我另一篇文章<a href="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/">HEXO搭建个人博客</a>, 如果搭建的过程中出现了问题, 我们可以交流交流。现在我假设你已经能基本使用 <code class="highlighter-rouge">Hexo</code> 了, 接下来就看看如何来管理博客。</p> + +<h2 id="git">使用git管理博客</h2> +<p><a href="https://github.com/leopardpan/Blog-Growing">Blog-Growing</a>是我管理博客的仓库地址。结构大致是:</p> + +<blockquote> + <p>– Blog-Growing <br /> +  |– .git <br /> +  |– .gitignore <br /> +  |– Hexo <br /> +    | .. <br /> +    | .. <br /> +    | 整个博客的配置信息</p> +</blockquote> + +<p>你可以把我的的<a href="https://github.com/leopardpan/Blog-Growing">Blog-Growing</a> clone下来, 看看一些基本配置是怎么配置的。需要提醒的是, <code class="highlighter-rouge">要把主题下的.git给删除掉</code> , 当然了你也可以使用 <code class="highlighter-rouge">git submodule</code> 来管理, 具体的管理方法我这里就不做多的介绍了, 想了解的话可以私信我。 +上面的过程基本做完后, 怎么来解决我开篇提的前三个问题了。</p> + +<h3 id="section">具体实现:</h3> +<p><strong>一:家里电脑使用博客</strong> <br /> +  建立git远端仓库管理博客,并使用家里的电脑把本地博客的配置推送到远端仓库。 <br /> +<strong>二:公司电脑使用博客</strong> <br /> +  到了公司只需要执行<code class="highlighter-rouge">sudo npm install -g hexo</code>,然后cd到你的博客目录下,如我cd 到Hexo目录下, 然后执行 <code class="highlighter-rouge">hexo server</code> 就可以在本地预览博客了。 <br /> +<strong>三:使用Git保存</strong> <br /> +  修改好博客后记得先使用git来提交下, 即使下次把博客的样式修改坏了, 也可以使用 <code class="highlighter-rouge">git reset --hard</code> 来回退。如: 我cd 到 <code class="highlighter-rouge">Blog-Growing</code> 目录下使用git提交。 <br /> +<strong>四:博客提交</strong> <br /> +  1、修改好的博客使用 <code class="highlighter-rouge">hexo d</code> 展示到博客页上。 <br /> +  2、git push 整个本地博客。</p> + +<p><strong>提示:</strong> 在这里 <code class="highlighter-rouge">git</code> 仅仅只是用户做博客的版本管理的, 博客的样式修改、基本部署还是使用 <code class="highlighter-rouge">hexo</code> 来操作的。</p> + +<h2 id="section-1">让百度能搜索到你的博客</h2> + +<h3 id="section-2">为什么要使用百度搜索?</h3> + +<p>  有人可能会说作为一个开发人员, 你不会用 <code class="highlighter-rouge">Google</code> 啊。 是的, Google是能搜到我们搭建在 <code class="highlighter-rouge">Github Page</code> 的博客, 会用<code class="highlighter-rouge">Google</code> 也是一个开发人员必备技能之一。但是, 我们生活在天朝, 所以百度还是总有会用到的时候, 或者是你想让更多的天朝人能搜到你。</p> + +<h3 id="github-page-">为什么使用百度搜索不到 Github Page 上的博客?</h3> + +<p>有人联系过 Github Support 部门 , 给出大致的意思就是: 百度爬虫爬得太猛烈,已经对很多 Github 用户造成了问题。所以 Github 将禁止百度爬虫的爬取。</p> + +<h3 id="section-3">如何让百度能搜索你的博客?</h3> + +<p>  根据上面说的, 目前发现只是Github Page禁止了百度搜索, 所以让百度能搜索到你的博客还是有一些方法的。例如: +* 自己搞个VPS,博客部署在VPS上。 +* 博客部署 <code class="highlighter-rouge">Coding.net</code> 上, <code class="highlighter-rouge">GitCafe</code>已经合并到 <code class="highlighter-rouge">Coding</code> 。 +我使用的是第二种方法, 博客部署在 <code class="highlighter-rouge">Coding.net</code> 上也相对简单些。</p> + +<h4 id="coding">在Coding上部署你的博客。</h4> + +<p>  Coding同样支持Hexo、Jekyll等博客的部署, Coding 跟Github还是挺像的,而且是中文。 同样的在Coding里面建一个项目,项目名字跟你的用户名一样,这里我就不啰嗦了, 说几个需要注意的地方: <br /> +<strong>注意一:</strong> <br /> +  在<code class="highlighter-rouge">Coding Page</code> 上部署博客,需要把博客推送到<code class="highlighter-rouge">coding-pages </code> 分支上, 分支名字是固定的。 <br /> +<strong>注意二:</strong> <br /> +  <code class="highlighter-rouge">Coding Page</code> 不支持自定义CNAME, 你需要点击到Page模块,然后添加一个域名来绑定。</p> + +<p>更详细的请看<a href="https://coding.net/help/doc/pages/index.html">Coding Pages 官网介绍</a>.</p> + +<p><a href="http://baixin.io/2016/06/HEXO_Advanced/">点击阅读原文</a></p> + +<p>参考文章: +<a href="http://jerryzou.com/posts/feasibility-of-allowing-baiduSpider-for-Github-Pages/">解决 Github Pages 禁止百度爬虫的方法与可行性分析</a></p> + + Sun, 12 Jun 2016 00:00:00 +0800 + http://baixin.io/2016/06/HEXO_Advanced/ + http://baixin.io/2016/06/HEXO_Advanced/ + + 博客 diff --git a/_site/index.html b/_site/index.html index 5920582cf6..3c81dafed8 100644 --- a/_site/index.html +++ b/_site/index.html @@ -164,6 +164,126 @@

    +
  • +

    TensorFlow 在 iOS 平台上的使用(一)

    +

      距离上次使用 TensorFlow 在iOS平台上做的小 Demo,已经过了四个月了,今天忽然想再看看,发现 Demo 已经不见了,我只能从头在编一次,这次发现编译 iOS 库,简单多了。  tensorflow 下载地址,tensorflow 最近提交的时间:2016-11-03,commit:7b7c02de56e013482b5fe5ab05e576dc98fe5742 。  下载完成后打开文件,找到目录 tensorflow-master/tensorflow/contrib/...…

    +
    + +
    + +
    + +
    + +
    +
    + + 机器学习 + +
    +
    + 阅读全文... +
    +
    +
    +
  • + +
  • +

    Xcode 8 使用笔记

    +

    最近使用 Xcode8遇到了一些问题,想记下来,发现简书上有位同学写了一篇很详细的教程 原文链接,比较懒惰的我就在他的基础上加了些我自己的一些笔记。Interface Builder随着 14 年的 iPhone6 和 6P 出来之后,iPhone 的屏幕尺寸也越来越多,屏幕适配是一个需要解决的问题,以后不一定苹果又出什么尺寸的 iPhone 呢。在 iPhone6 和 6P 发布的同一年,苹果推出的 Xcode6 中在原有的 Auto layout的基础上,添加了Size Classes...…

    +
    + +
    + +
    + +
    + +
    +
    + + iOS + +
    +
    + 阅读全文... +
    +
    +
    +
  • + +
  • +

    Jekyll搭建个人博客

    +

     之前写了一篇HEXO搭建个人博客的教程获得了很好评,尤其是在简书上目前已经累积了10W+的阅读量了,也有好心的读者主动给我打赏,在此感谢。 如果你看过我的文章会发现我现在的博客样式跟之前是有很大的区别的,之前我也是使用 HEXO 搭建的博客,后来发现使用 HEXO 在多台电脑上发布博客,操作起来并不是那么方便,果断就转到了 Jekyll 上,接下来我会讲如何使用 Jekyll 搭建博客,博客模板效果。介绍 Jekyll 是一个简单的博客形态的静态站点生产机器。它有一个模版目录,其中包含原...…

    +
    + +
    + +
    + +
    + +
    +
    + + 博客 + +
    +
    + 阅读全文... +
    +
    +
    +
  • + +
  • +

    iOS设备左下角出现Appicon

    +

    最近发现我设备锁屏后,按Home屏幕变亮的时候,左下角出现一个灰色的Appicon (应用图标),关于这个应用图标的出现做了一些调研,下面是应用图标出现的几种情况。图一 iOS 系统自带的 App icon , 图二 第三方 App icon , 图三 通过 iBeacon 信号激活的 demo icon结论:有三种情况导致设备的左下角出现灰色的 App icon1、AppStore根据地点对App 推荐 简介 iOS 8会基于你的位置在锁屏界面上展示一个app快捷打开...…

    +
    + +
    + +
    + +
    + +
    +
    + + iOS + +
    +
    + 阅读全文... +
    +
    +
    +
  • + +
  • +

    Python自动化测试iOS项目

    +

    作为一个开发人员,为了保证自己的代码的健壮,写单元测试是必不可少的环节,然而最痛快的是每天去手动跑一遍所有的case。那么什么能帮我们解决这些繁琐的操作呢,大家应该会想到自动化测试脚本了,是的,我们可以借助脚本来完成全自动化测试,下面是我列的每天脚本自动执行流程: 1、pull git仓库里面的最新代码到本地。 2、然后打包成App。 3、安装到模拟器上。 4、运行App,执行单元测试,生成测试数据并保存到本地。 5、脚本读取测试数据,邮件发送给相关人员。...…

    +
    + +
    + +
    + +
    + +
    +
    + + python + +
    +
    + 阅读全文... +
    +
    +
    +
  • +
  • 老司机带你剖析无码统计

      无需开发介入,也可以统计移动App上按钮的点击次数,简称 无码统计 ,只要是跟App开发相关的同学,相信都对埋点统计有些了解,特别是针对开发人员来说,做代码埋点统计基本上是看不到直接收益也是开发人员最不愿做的一件事,这篇文章讲的就是如何让开发人员摆脱代码埋点的痛苦。  文章主要分为:使用场景、实现原理、适用范围、使用详情四个模块,不管你是产品,还是开发人员又或者是运营人员都适合读这篇文章。  在App开发过程中我们应该都有过类似的需求:想统计某些按钮的点击次数。例如,我们开发了一个注册...…

    diff --git a/_site/sitemap.xml b/_site/sitemap.xml index 6a3c41a0dd..ae002d20d4 100644 --- a/_site/sitemap.xml +++ b/_site/sitemap.xml @@ -1,6 +1,26 @@ +http://baixin.io/2016/11/TensorFlowOniOSUse1/ +2016-11-03T00:00:00+08:00 + + +http://baixin.io/2016/10/Xcode8/ +2016-10-25T00:00:00+08:00 + + +http://baixin.io/2016/10/jekyll_tutorials1/ +2016-10-14T00:00:00+08:00 + + +http://baixin.io/2016/09/iOSLowerLeftAppicon/ +2016-09-23T00:00:00+08:00 + + +http://baixin.io/2016/08/PythonTestAutomationiOS/ +2016-08-04T00:00:00+08:00 + + http://baixin.io/2016/07/Codeless/ 2016-07-15T00:00:00+08:00 diff --git a/_site/tags/index.html b/_site/tags/index.html index 5c294c8047..71d5be7a4e 100644 --- a/_site/tags/index.html +++ b/_site/tags/index.html @@ -179,15 +179,17 @@

    -
  • 博客 2
  • +
  • 博客 3
  • -
  • iOS 3
  • +
  • iOS 5
  • 技术 2
  • 工具 2
  • -
  • 机器学习 2
  • +
  • 机器学习 3
  • + +
  • python 1
  • @@ -208,6 +210,14 @@

    博客

    +
  • Jekyll搭建个人博客
  • + + + + + + +
  • HEXO进阶
  • @@ -239,6 +249,22 @@

    iOS

    +
  • Xcode 8 使用笔记
  • + + + + + + + +
  • iOS设备左下角出现Appicon
  • + + + + + + +
  • CocoaPods使用心得
  • @@ -340,6 +366,14 @@

    机器学习

    +
  • TensorFlow 在 iOS 平台上的使用(一)
  • + + + + + + +
  • iOS开发迎来机器学习的春天---TensorFlow
  • @@ -356,6 +390,29 @@

    机器学习

    + + + + + +

    python

    +