-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsearch.json
More file actions
1 lines (1 loc) · 131 KB
/
search.json
File metadata and controls
1 lines (1 loc) · 131 KB
1
[{"title":"个人唠叨","url":"http://coderykw.com/2016/08/03/个人唠叨/","content":"<p> 突然想起以前黑苹果的日子 装黑果装的不亦乐乎 加固态 换网卡 在同学们面前 大神一般 ,现在淘宝几十块远程帮你装.</p>\n<p> 最近做了一个win to go 放到固态移动硬盘里,这下 需要win系统的时候直接插上开机option 选择一下就行 也可以 设置默认进win 只要插上硬盘 就直接进 爽…现在也很少进win 了 pd虚拟机装win10主要是下载,现在也不开了, 现在用aria2 GUi配合百度云插件下载百度云文件,速度别提有多爽,mama2不发热插件 看优酷的个人会员频道 直接就能看,还减少发热, 翻~墙的东西也玩了不少 玩得好的朋友都让我安利ss了,看youtube上4k别提有多爽了,不过上1080就够看了google搜索依然是程序员必备的搜索引擎.</p>\n<p> github搭建博客玩了挺久,,基本上一小会就能搭建出一个 最爽的是自己改界面的过程,非常激动,一次次编译 找素材替换 最后达到满意 让人惊艳的效果 我就很开心, coding这个平台也不错,同步博文的时候 一起上传到coding了.</p>\n<p> mac的迅雷已死,然后我用手机迅雷 下载嗖嗖的不要不要的,mac电脑好容易发热啊 我的天.</p>\n<p> zealer王自如的品牌网站,我没事就上去看看大家的炫桌面摆放帖,每个人都有自己独一无二的桌面 时尚 狂野 简约 非常刺激我的神经,我也会效仿喜欢的桌面 去购买.等我赚更多的钱 满足一下小小愿望 ,不过 再也没有小时候拿到gameboy的那种开心了,我的天哪!</p>\n<p> 最近还有点迷4k拍摄,说到设备 我的6s 是我哥跟我的6换的,哈哈哈哈他买的港行不支持他的大电信 ,我就爽了 64g 6s 拍摄4k,然后拍摄过程中 防抖效果 实在太差,就看到一款手持防抖手柄,看了挺多评测智云的 1300软妹币,还是等我富裕了 入了它,话说6splus 是苹果到现在出的最好的相机吗…..我要领教一下……..</p>\n<p> 去年脑残入了magic keyboard2 给我后悔的 还过了苹果的7天退换,为了我的手指,入了我大F的minila白茶,真是爽啊 小小的蓝牙键盘 放到MBP上 无绳设计才是设计!! 把之前的ganss红轴扔给我哥 因为他拿着我的6挺可怜的,固态硬盘也送他一个.</p>\n<p> 不说了我要敲代码了.</p>\n"},{"title":"用dns 来爬qiang","url":"http://coderykw.com/2016/06/29/dns/","content":"<p>.</p>\n<p></p><h1>最近的s-s账号抽风 不稳定 ,所以爬v2ex看看有啥好玩的ss站点<h3><br>有人推荐 PandaDNS<p></p>\n<p>官网 <a href=\"https://dns.pandadns.xyz\" target=\"_blank\" rel=\"external\">https://dns.pandadns.xyz</a></p>\n<p>把你电脑的 dns改为 </p>\n<p> 首选DNS<br>182.254.158.191</p>\n<p>备选DNS<br>120.27.30.176</p>\n<p>我选第二个 因为作者在Twitter上说 第二个 更新ip比第一个快<br>怎么改 自己百度 我只写个博客而已~~~~</p>\n</h3></h1>"},{"title":"简单把 百度云 app 下载的文件提取到电脑上","url":"http://coderykw.com/2016/04/30/baiduyun/","content":"<p></p><h2>昨晚有个小伙伴 问我怎么把iphone手机百度云下载的视频 提取到电脑上看 大屏幕l的爽 你懂得<p></p>\n<p></p><h3>百度云 默认 不提供 itunes中 文件共享 <br><br>所以 我们借助izip解压缩 或者moliplayer 或者 nplayer 等带共享的软件<p></p>\n<p></p><h2>今天我们利用izip免费版app说一下教程<p></p>\n<p></p><h3>在百度云中点击需要提取的文件 -打开-选择传输到izip 然后打开 izip列表里就能看到有新的文件 确认传输成功后<p></p>\n<p>手机连接电脑-打开itunes-左边列表-应用-往下滑 -文件共享 点击izip 文件都在上面 点击 你要的-右下角 -储存到- 到哪里都行….. 再见!<br><br>懒得七牛挂图 了 嘿嘿嘿</p>\n</h3></h2></h3></h2>"},{"title":"xcode7.21 真机测试9.3方法","url":"http://coderykw.com/2016/04/26/xcode7.2/","content":"<p>最近 跟风升级手机电脑都升级 7.3 和9.31 我的代码提示就这样瘫痪了 搜了很久 最终还是在7.21下放入9.3的sdk文件解决</p>\n<p>注意:_操作过程中xcode要关闭!!!!!<br>可以从开发者网站下载的完整xcode7.3中提取 —也可以直接下载9.3sdk </p>\n<p>如果自己下载xcode7.3 请进入<br>Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport<br>路径下的9.3(XXXX)文件夹,复制粘贴到<br>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport</p>\n<p>9.3sdk下载地址<br><a href=\"http://download.csdn.net/download/karas_27/9469739\" target=\"_blank\" rel=\"external\">http://download.csdn.net/download/karas_27/9469739</a><br>下载后拉到上面路径即可<br>无需其他操作 替换结束直接运行xcode 进工程运行选手机即可!</p>\n"},{"title":"MacBook接入外置键盘时 关闭电脑自带键盘 方法","url":"http://coderykw.com/2016/04/19/关闭键盘/","content":"<p>macbook接入外置键盘时 关闭 电脑自带键盘 方法</p>\n<center><br><img src=\"http://7xpy20.com1.z0.glb.clouddn.com/FullSizeRender.jpg\" alt=\"iOS-WiF-iInfo-1\"><br></center><br><br><h1>1.安装 karabiner(需翻墙下载)<br><br>2.打开karabiner,第一个按钮搜索internal keyboard <br><br><br>选中 “Disable an internal keyboard while external keyboards are connected” 下面的对勾<br><br><center><br><img src=\"http://7xpy20.com1.z0.glb.clouddn.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202016-04-19%20%E4%B8%8B%E5%8D%882.19.20.png\" alt=\"iOS-WiF-iInfo-1\"><br></center>\n\n</h1>"},{"title":"真机测试问题","url":"http://coderykw.com/2016/04/16/真机测试问题/","content":"<p>#测试同事的app 里面有他的appid怎么办?</p>\n<p>#在Archive项目时,出现了“Your build settings specify a provisioning profile with the UUID “”, however, no such provisioning profile was found”的出错。一直提示指定UUID的provisioning profile找不到,<br>参考地址:<a href=\"http://stackoverflow.com/questions/1760518/codesign-error-provisioning-profile-cannot-be-found-after-deleting-expired-prof\" target=\"_blank\" rel=\"external\">http://stackoverflow.com/questions/1760518/codesign-error-provisioning-profile-cannot-be-found-after-deleting-expired-prof</a><br>这里所说的就是要通过修改你的项目的.xcodeproj文件来解决上述的错误。</p>\n<p>#1.找到项目中的**.xcodeproj文件,点击右键,show package contents(打开包内容)。</p>\n<p>#2.打开后找到project.pbxproj文件,用文本编辑器打开。其实就是右键,点击open就好了。</p>\n<p>#3.打开这个文件后,按command+F,在这个文件中查找“PROVISIONING_PROFILE”,找到和这个“<br> PROVISIONING_PROFILE = “487F3EAC-05FB-4A2A-9EA0-31F1F35760EB”;<br> “PROVISIONING_PROFILE[sdk=iphoneos*]” = “487F3EAC-05FB-4A2A-9EA0-31F1F35760EB”;”类似的都删除。</p>\n<p>#4.然后保存文件,重新打开项目。xcode会提示你重新下载安装provisioning profile文件。下载后安装上就可以。</p>\n"},{"title":"去视频广告推荐","url":"http://coderykw.com/2016/04/09/去广告/","content":"<p>1.adblcok plus 去广告插件(safari /chrome谷歌浏览器都支持)<br>在浏览器搜索插件即可 !</p>\n<p>2.去视频广告插件! chrome浏览器专用 2016/4/28依旧可用<br><a href=\"https://chrome.google.com/webstore/detail/adfreeplayeronline/gnpjhfjhgfkohgdklomfbjmnchpenngp\" target=\"_blank\" rel=\"external\">https://chrome.google.com/webstore/detail/adfreeplayeronline/gnpjhfjhgfkohgdklomfbjmnchpenngp</a></p>\n<p>3.mama2插件 safari专用 在优酷界面直接点击插件图标 直接跳过广告播放 走的h5播放器 机器就不那么热了 爱奇艺因为警告插件作者 所以 不能去广告了!<br><a href=\"https://github.com/zythum/mama2/\" target=\"_blank\" rel=\"external\">https://github.com/zythum/mama2/</a></p>\n"},{"title":"百度云下载","url":"http://coderykw.com/2016/04/03/百度云下载/","content":"<p>mac系统下载百度云 速度超级慢 推荐大家用aria2GUI 百度 威锋论坛有教程 </p>\n"},{"title":"iOS 获取当前 WiFi 信息(swift)","url":"http://coderykw.com/2016/04/01/wifi/","content":" <p>此处以 Swift 代码为例</p><br><hr><br><h1 id=\"1-添加模块引用\"><a href=\"#1-添加模块引用\" class=\"headerlink\" title=\"1.添加模块引用\"></a>1.添加模块引用</h1><p>首先我们在需要获取 WiFi 信息的地方引用需要的模块:<br><figure class=\"highlight swift\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">import</span> SystemConfiguration.CaptiveNetwork</span><br></pre></td></tr></table></figure></p><br><h1 id=\"2-添加获取代码\"><a href=\"#2-添加获取代码\" class=\"headerlink\" title=\"2.添加获取代码\"></a>2.添加获取代码</h1><p>接下来编写获取 WiFi 信息的代码,如下:<br><figure class=\"highlight swift\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">//获取 WiFi 信息</span></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">func</span> <span class=\"title\">getWifiInfo</span><span class=\"params\">()</span></span> -> (ssid: <span class=\"type\">String</span>, mac: <span class=\"type\">String</span>) {</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">let</span> cfas: <span class=\"type\">NSArray</span> = <span class=\"type\">CNCopySupportedInterfaces</span>() {</span><br><span class=\"line\"> <span class=\"keyword\">for</span> cfa <span class=\"keyword\">in</span> cfas {</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">let</span> dict = <span class=\"type\">CFBridgingRetain</span>(</span><br><span class=\"line\"> <span class=\"type\">CNCopyCurrentNetworkInfo</span>(cfa <span class=\"keyword\">as</span>! <span class=\"type\">CFString</span>)</span><br><span class=\"line\"> ) {</span><br><span class=\"line\"> <span class=\"keyword\">if</span> <span class=\"keyword\">let</span> ssid = dict[<span class=\"string\">“SSID”</span>] <span class=\"keyword\">as</span>? <span class=\"type\">String</span>,</span><br><span class=\"line\"> <span class=\"keyword\">let</span> bssid = dict[<span class=\"string\">“BSSID”</span>] <span class=\"keyword\">as</span>? <span class=\"type\">String</span> {</span><br><span class=\"line\"> <span class=\"keyword\">return</span> (ssid, bssid)</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">return</span> (<span class=\"string\">“未知”</span>, <span class=\"string\">“未知”</span>)</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure></p><br><h1 id=\"3-获取-WiFi-信息\"><a href=\"#3-获取-WiFi-信息\" class=\"headerlink\" title=\"3.获取 WiFi 信息\"></a>3.获取 WiFi 信息</h1><p>然后在我们需要获取 WiFi 信息的位置添加如下代码即可:<br><figure class=\"highlight swift\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">let</span> wifiInfo = getWifiInfo()</span><br><span class=\"line\"><span class=\"type\">NSLog</span>(<span class=\"string\">“SSID(WiFi名称): <span class=\"subst\">(wifiInfo.<span class=\"number\">0</span>)</span>“</span>)</span><br><span class=\"line\"><span class=\"type\">NSLog</span>(<span class=\"string\">“BSSID(Mac地址): <span class=\"subst\">(wifiInfo.<span class=\"number\">1</span>)</span>“</span>)</span><br></pre></td></tr></table></figure></p><br><h1 id=\"4-输出结果\"><a href=\"#4-输出结果\" class=\"headerlink\" title=\"4.输出结果\"></a>4.输出结果</h1><center><br><img src=\"http://7xpy20.com1.z0.glb.clouddn.com/iOS-WiF-iInfo-1.png.jpeg\" alt=\"iOS-WiF-iInfo-1\"><br></center><br><br><hr><br><p>以上。</p>"},{"title":"MAC自定义终端(Terminal)欢迎图案","url":"http://coderykw.com/2015/07/27/MAC自定义终端(Terminal)欢迎图案/","content":"<p> <div class=\"show-content\"><blockquote><p>昨晚网上随便看看技术贴,偶然间看见别人的终端上的图案,经过早上的折腾,终于实现了想要的效果——自定义终端(Terminal)欢迎图案。在最后我会附上几个符号图案,您只需要复制粘贴就可以了。</p></blockquote></div></p>\n<p><ul></ul></p>\n<p><li>首先看效果</li></p>\n<pre><code> /\/\\n (_人|人_)\n /‥\\n ミ(_Y_)ミ\n > <\n (/ \)\n _( )_\n (_>―<_)</code></pre>\n\n<p><li>配置方法<ul></ul></li></p>\n<p><li>打开终端(可以command+空格键,然后输入ter自动打开终端);</li></p>\n<p><li>输入 cd /etc;</li></p>\n<p><li>输入 sudo pico motd;</li></p>\n<p><li>然后将想要输入的图案或文字在终端中粘贴;</li></p>\n<p><li>最后,按键:control+x ,再按y回车保存。</li><br><br><br></p>\n<p>经过上面的步骤,我们就成功配置了我们想要实现的效果,最后附上几个我找的图案:</p><br><pre><code> /\/\<br> (<em>人|人</em>)<br> /‥\<br> ミ(<em>Y</em>)ミ<br> > <<br> (/ \)<br> <em>( )</em><br> (_>―<_)</code></pre><br><pre><code> ___<br>彡 <em>/ ⌒ ⌒ 你说神马~<br> /)) (●) (●) ヽ<br> |∩ (</em>人<em>) |<br> / ノ、_ヽノ_ノ ̄)<br> / / /フ</em>/<br> L_/\ \(</code></pre><br><p>如果想搭个猴子的图案,还可以复制 <a href=\"http://www.fuhaodq.com/fuhaotuan/1826.html\" target=\"_blank\">这个链接</a>里的内容。</p><br><p>快动手去尝试吧~</p>"},{"title":"ios-给你的APP添加手势","url":"http://coderykw.com/2015/06/02/手势/","content":"<p>看见别人做的APP有的时候加了很多手势,使得用户体验很好,让我非常羡慕,于是搜了一下,发现其实一点都不难,下面说一下简单的手势知识:</p><br><blockquote><br><ul><br><li>iOS将常用的触摸操作封装成了几个手势,手势识别器</li><br><li>手势识别器自带判断是否成立的功能,我们只需要去使用就可以了</li><br><li>使用手势需要三步:1.创建识别器对象;2.绑定识别器对象;3.实现识别器对象的方法</li><br></ul><br></blockquote><br><p>我们创建一个根视图控制体RootViewController,对应的View为RootView(rv),在上面建立一个imageView,我们在这个imageView上面进行手势操作。<br>首先打开imageView的用户响应,因为imageView的用户响应默认是关闭的。</p><br><figure class=\"highlight objectivec\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">self</span><span class=\"variable\">.rv</span><span class=\"variable\">.imageView</span><span class=\"variable\">.userInteractionEnabled</span> = <span class=\"literal\">YES</span>;</span><br></pre></td></tr></table></figure><br><h3 id=\"u8F7B_u62CD_u624B_u52BF\"><a href=\"#u8F7B_u62CD_u624B_u52BF\" class=\"headerlink\" title=\"轻拍手势\"></a>轻拍手势</h3><figure class=\"highlight groovy\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">UITapGestureRecognizer <em>tap = [[UITapGestureRecognizer alloc]<span class=\"string\">initWithTarget:</span>self <span class=\"string\">action:</span><span class=\"annotation\">@selector</span>(<span class=\"string\">tapAction:</span>)];</em></span><br><span class=\"line\">[self.rv.imageView <span class=\"string\">addGestureRecognizer:</span>tap];</span><br></pre></td></tr></table></figure><br><p>响应事件:</p><br><figure class=\"highlight erlang\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"pp\">- <span class=\"params\">(void)</span>tapAction:<span class=\"params\">(<span class=\"variable\">UITapGestureRecognizer</span> )</span>sender</span><br><span class=\"line\">{</span><br><span class=\"line\"> NSLog<span class=\"params\">(@<span class=\"string\">“不要拍我”</span>)</span>;</span><br><span class=\"line\">}</span></span><br></pre></td></tr></table></figure><br><h3 id=\"u957F_u6309_u624B_u52BF\"><a href=\"#u957F_u6309_u624B_u52BF\" class=\"headerlink\" title=\"长按手势\"></a>长按手势</h3><figure class=\"highlight groovy\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">UILongPressGestureRecognizer <em>longPress = [[UILongPressGestureRecognizer alloc]<span class=\"string\">initWithTarget:</span>self <span class=\"string\">action:</span><span class=\"annotation\">@selector</span>(<span class=\"string\">longAction:</span>)];</em></span><br><span class=\"line\">[self.rv.imageView <span class=\"string\">addGestureRecognizer:</span>longPress];</span><br><span class=\"line\"><span class=\"comment\">// 设置长按手势的判断时间为0.5秒</span></span><br><span class=\"line\">longPress.minimumPressDuration = <span class=\"number\">0.5</span>;</span><br></pre></td></tr></table></figure><br><p>响应事件:</p><br><figure class=\"highlight pf\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">- (void)longAction:(UILongPressGestureRecognizer )sender</span><br><span class=\"line\">{</span><br><span class=\"line\"> // 长按手势有状态(<span class=\"keyword\">state</span>),开始和结束</span><br><span class=\"line\"> if (sender.<span class=\"keyword\">state</span> == UIGestureRecognizerStateBegan) {</span><br><span class=\"line\"> NSLog(@<span class=\"string\">“长按开始”</span>);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> if (sender.<span class=\"keyword\">state</span> == UIGestureRecognizerStateEnded) {</span><br><span class=\"line\"> NSLog(@<span class=\"string\">“不要走!决战到天亮”</span>);</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure><br><h3 id=\"u65CB_u8F6C_u624B_u52BF\"><a href=\"#u65CB_u8F6C_u624B_u52BF\" class=\"headerlink\" title=\"旋转手势\"></a>旋转手势</h3><figure class=\"highlight groovy\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">UIRotationGestureRecognizer <em>rotation = [[UIRotationGestureRecognizer alloc]<span class=\"string\">initWithTarget:</span>self <span class=\"string\">action:</span><span class=\"annotation\">@selector</span>(<span class=\"string\">rotationAction:</span>)];</em></span><br><span class=\"line\">[self.rv.imageView <span class=\"string\">addGestureRecognizer:</span>rotation];</span><br></pre></td></tr></table></figure><br><p>响应事件:</p><br><figure class=\"highlight objectivec\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">- (<span class=\"keyword\">void</span>)rotationAction:(<span class=\"built_in\">UIRotationGestureRecognizer</span> )sender</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"comment\">// imageView跟随手指旋转</span></span><br><span class=\"line\"> <span class=\"keyword\">self</span><span class=\"variable\">.rv</span><span class=\"variable\">.imageView</span><span class=\"variable\">.transform</span> = <span class=\"built_in\">CGAffineTransformRotate</span>(<span class=\"keyword\">self</span><span class=\"variable\">.rv</span><span class=\"variable\">.imageView</span><span class=\"variable\">.transform</span>, sender<span class=\"variable\">.rotation</span>);</span><br><span class=\"line\"> <span class=\"comment\">// 将角度置零</span></span><br><span class=\"line\"> sender<span class=\"variable\">.rotation</span> = <span class=\"number\">0</span>;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure><br><h3 id=\"u634F_u5408_uFF08_u7F29_u653E_uFF09_u624B_u52BF\"><a href=\"#u634F_u5408_uFF08_u7F29_u653E_uFF09_u624B_u52BF\" class=\"headerlink\" title=\"捏合(缩放)手势\"></a>捏合(缩放)手势</h3><figure class=\"highlight groovy\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">UIPinchGestureRecognizer <em>pinch = [[UIPinchGestureRecognizer alloc]<span class=\"string\">initWithTarget:</span>self <span class=\"string\">action:</span><span class=\"annotation\">@selector</span>(<span class=\"string\">pinchAction:</span>)];</em></span><br><span class=\"line\">[self.rv.imageView <span class=\"string\">addGestureRecognizer:</span>pinch];</span><br></pre></td></tr></table></figure><br><p>响应事件:</p><br><figure class=\"highlight processing\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">- (<span class=\"keyword\">void</span>)pinchAction:(UIPinchGestureRecognizer )sender</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"comment\">// 控件跟随手指的捏合进行放大和缩小</span></span><br><span class=\"line\"> sender.view.transform = CGAffineTransformScale(sender.view.transform, sender.<span class=\"built_in\">scale</span>, sender.<span class=\"built_in\">scale</span>);</span><br><span class=\"line\"> <span class=\"comment\">// 将放大缩小的倍数置为1</span></span><br><span class=\"line\"> sender.<span class=\"built_in\">scale</span> = <span class=\"number\">1</span>;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure><br><h3 id=\"u5E73_u79FB_uFF08_u62D6_u52A8_uFF09_u624B_u52BF\"><a href=\"#u5E73_u79FB_uFF08_u62D6_u52A8_uFF09_u624B_u52BF\" class=\"headerlink\" title=\"平移(拖动)手势\"></a>平移(拖动)手势</h3><figure class=\"highlight groovy\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">UIPanGestureRecognizer <em>pan = [[UIPanGestureRecognizer alloc]<span class=\"string\">initWithTarget:</span>self <span class=\"string\">action:</span><span class=\"annotation\">@selector</span>(<span class=\"string\">panAction:</span>)];</em></span><br><span class=\"line\">[self.rv.imageView <span class=\"string\">addGestureRecognizer:</span>pan];</span><br></pre></td></tr></table></figure><br><p>响应事件:</p><br><figure class=\"highlight groovy\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">- (<span class=\"typename\">void</span>)<span class=\"string\">panAction:</span>(UIPanGestureRecognizer )sender</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"comment\">// 控件跟随手指的移动而移动</span></span><br><span class=\"line\"> CGPoint point = [sender <span class=\"string\">translationInView:</span>sender.view];</span><br><span class=\"line\"> sender.view.transform = CGAffineTransformTranslate(sender.view.transform, point.x, point.y);</span><br><span class=\"line\"> <span class=\"comment\">// 将偏移量归零</span></span><br><span class=\"line\"> [sender <span class=\"string\">setTranslation:</span>CGPointZero <span class=\"string\">inView:</span>sender.view];</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure><br><p>好了,手势的学习就到这里,抓紧练习去提升自己APP的bigger吧!</p>"},{"title":"福利","url":"http://coderykw.com/2015/03/27/福利/","content":"<p>被骗进来了吧哈哈哈哈哈</p>\n<p><br><img src=\"http://upload.jianshu.io/collections/images/26113/1434248199.jpg?imageMogr/thumbnail/300x300\"><br></p>\n"},{"title":"写一个完美单例Singleton","url":"http://coderykw.com/2015/02/11/写一个完美单例Singleton/","content":"<p>单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。比如我们想创建使用一个管理工具类,这个类只有一个实例并且一直存在且不会被改变,那么我们就需要创建一个单例。下面我们一起来学习一下如何写一个比较完美的单例。</p>\n<p>新建一个类,继承自NSObject;</p>\n<blockquote>\n<ul>\n<li>Manager.h中</li>\n</ul>\n</blockquote>\n<figure class=\"highlight gherkin\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#import <Foundation/Foundation.h></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">@interface</span> Manager : NSObject </span><br><span class=\"line\"></span><br><span class=\"line\">/<span class=\"keyword\">*</span><span class=\"keyword\">*</span></span><br><span class=\"line\"> <span class=\"keyword\">*</span> 懒汉式</span><br><span class=\"line\"> <span class=\"keyword\">*</span>/</span><br><span class=\"line\">+ (instancetype)shareManager;</span><br></pre></td></tr></table></figure>\n<blockquote>\n<ul>\n<li>Manager.m中</li>\n</ul>\n</blockquote>\n<figure class=\"highlight objectivec\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#import <span class=\"meta-string\">\"Manager.h\"</span></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">@implementation</span> <span class=\"title\">Manager</span></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">// 如果不用static修饰,在别的文件可以用extern关键字引用到这个全局变量,并且可以修改它</span></span><br><span class=\"line\"><span class=\"keyword\">static</span> <span class=\"keyword\">id</span> _instance;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">#pragma mark alloc方法内部会调用这个方法</span></span><br><span class=\"line\">+ (instancetype)allocWithZone:(<span class=\"keyword\">struct</span> _<span class=\"built_in\">NSZone</span> *)zone</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (_instance == <span class=\"literal\">nil</span>) { <span class=\"comment\">// 防止频繁加锁</span></span><br><span class=\"line\"> <span class=\"keyword\">@synchronized</span>(<span class=\"keyword\">self</span>) { <span class=\"comment\">// 线程锁</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> (_instance == <span class=\"literal\">nil</span>) { <span class=\"comment\">// 防止创建多次</span></span><br><span class=\"line\"> _instance = [<span class=\"keyword\">super</span> allocWithZone:zone];</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">+ (instancetype)shareManager</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (_instance == <span class=\"literal\">nil</span>) { <span class=\"comment\">// 防止频繁加锁</span></span><br><span class=\"line\"> <span class=\"keyword\">@synchronized</span>(<span class=\"keyword\">self</span>) { <span class=\"comment\">// 线程锁</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> (_instance == <span class=\"literal\">nil</span>) { <span class=\"comment\">// 防止创建多次</span></span><br><span class=\"line\"> _instance = [[Manager alloc]init]; <span class=\"comment\">// 这样写保证init方法也只调用一次</span></span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">// copy有可能会产生新对象</span></span><br><span class=\"line\">- (<span class=\"keyword\">id</span>)copyWithZone:(<span class=\"built_in\">NSZone</span> *)zone</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"comment\">// copy会调用- copyWithZone:</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">- (instancetype)init</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>大家可能发现了,.h文件中有个注释叫做懒汉式,还有一种单例的写法叫做饿汉式,有什么区别的呢?懒汉式可以参考懒加载,是使用这个类的时候才创建,而饿汉式就是很饿很急性子,程序一运行就直接创建一个单例的对象,其实这样并不是很好,我们比较常用的还是懒汉式。上面是添加线程锁的方式写单例,我们还可以用GCD来写一个,话不多说,上代码!</p>\n<blockquote>\n<ul>\n<li>DataManager.h中</li>\n</ul>\n</blockquote>\n<figure class=\"highlight objectivec\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#import <span class=\"meta-string\"><Foundation/Foundation.h></span></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">@interface</span> <span class=\"title\">DataManager</span> : <span class=\"title\">NSObject</span></span></span><br><span class=\"line\"></span><br><span class=\"line\">+ (instancetype)shareDataManager;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">@end</span></span><br></pre></td></tr></table></figure>\n<blockquote>\n<ul>\n<li>DataManager.m中</li>\n</ul>\n</blockquote>\n<figure class=\"highlight objectivec\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#import <span class=\"meta-string\">\"DataManager.h\"</span></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">@implementation</span> <span class=\"title\">DataManager</span></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">static</span> <span class=\"keyword\">id</span> _instance;</span><br><span class=\"line\"></span><br><span class=\"line\">+ (instancetype)shareDataManager</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"keyword\">static</span> <span class=\"built_in\">dispatch_once_t</span> onceToken;</span><br><span class=\"line\"> <span class=\"built_in\">dispatch_once</span>(&onceToken, ^{</span><br><span class=\"line\"> _instance = [[DataManager alloc]init];</span><br><span class=\"line\"> });</span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">+ (instancetype)allocWithZone:(<span class=\"keyword\">struct</span> _<span class=\"built_in\">NSZone</span> *)zone</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"keyword\">static</span> <span class=\"built_in\">dispatch_once_t</span> onceToken;</span><br><span class=\"line\"> <span class=\"built_in\">dispatch_once</span>(&onceToken, ^{</span><br><span class=\"line\"> _instance = [<span class=\"keyword\">super</span> allocWithZone:zone];</span><br><span class=\"line\"> });</span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">// copy有可能会产生新对象</span></span><br><span class=\"line\">- (<span class=\"keyword\">id</span>)copyWithZone:(<span class=\"built_in\">NSZone</span> *)zone</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"comment\">// copy会调用- copyWithZone:</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">- (instancetype)init</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>上面这种方式更简便一些,也不用麻烦得进行两次判断,因为dispatch_once这个函数默认是线程安全的,因此不用考虑多线程不安全的问题。<br>最后一种,比较不常用的饿汉式,参考一下就好:</p>\n<blockquote>\n<ul>\n<li>Tool.h中</li>\n</ul>\n</blockquote>\n<figure class=\"highlight gherkin\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#import <Foundation/Foundation.h></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">@interface</span> Tool : NSObject</span><br><span class=\"line\">/<span class=\"keyword\">*</span><span class=\"keyword\">*</span></span><br><span class=\"line\"> <span class=\"keyword\">*</span> 饿汉式</span><br><span class=\"line\"> <span class=\"keyword\">*</span>/</span><br><span class=\"line\">+ (instancetype)shareTool;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"meta\">@end</span></span><br></pre></td></tr></table></figure>\n<blockquote>\n<ul>\n<li>Tool.m中</li>\n</ul>\n</blockquote>\n<figure class=\"highlight objectivec\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#import <span class=\"meta-string\">\"Tool.h\"</span></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"class\"><span class=\"keyword\">@implementation</span> <span class=\"title\">Tool</span></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">static</span> <span class=\"keyword\">id</span> _instance;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">/**</span><br><span class=\"line\"> * 当类加载到OC运行时环境中(内存),就会调用这个方法,而且只调用一次</span><br><span class=\"line\"> */</span></span><br><span class=\"line\">+ (<span class=\"keyword\">void</span>)load</span><br><span class=\"line\">{</span><br><span class=\"line\"> _instance = [[<span class=\"keyword\">self</span> alloc]init];</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">+ (instancetype)shareTool</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">+ (instancetype)allocWithZone:(<span class=\"keyword\">struct</span> _<span class=\"built_in\">NSZone</span> *)zone</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (_instance == <span class=\"literal\">nil</span>) { <span class=\"comment\">// 防止创建多次</span></span><br><span class=\"line\"> _instance = [<span class=\"keyword\">super</span> allocWithZone:zone];</span><br><span class=\"line\"></span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">// copy有可能会产生新对象</span></span><br><span class=\"line\">- (<span class=\"keyword\">id</span>)copyWithZone:(<span class=\"built_in\">NSZone</span> *)zone</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"comment\">// copy会调用- copyWithZone:</span></span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">- (instancetype)init</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"keyword\">return</span> _instance;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>最后附加一个小小的知识点,上面用到了一个+load的方法,为什么在这个方法写呢,因为这个方法是只要程序运行起来,这个类就被添加到运行环境(内存)中了,这时候就会调用这个方法,与其类似的方法是+initialize,两个方法的区别是后者只有在我们主动使用这个类的时候才调用这个方法,相同点是两个方法都只调用一次。</p>\n"},{"title":"fmdb_sqlite第三方","url":"http://coderykw.com/2014/12/10/fmdb/","content":"<p><a href=\"https://github.com/ccgus/fmdb\" target=\"_blank\" rel=\"external\">https://github.com/ccgus/fmdb</a> github</p>\n<p>由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍。与此同时,把SQLite的文档页 加到你的书签中。自动引用计数(APC)还是手动内存管理呢?</p><br><p>两种都行,FMDB会在编译的时候知道你是用的哪一种,然后进行相应处理。</p><br><h4>使用方法</h4><br><br><br><h5>FMDB有三个主要的类</h5><br>1.FMDatabase – 表示一个单独的SQLite数据库。 用来执行SQLite的命令。<br>2.FMResultSet – 表示FMDatabase执行查询后结果集<br>3.FMDatabaseQueue – 如果你想在多线程中执行多个查询或更新,你应该使用该类。这是线程安全的。<br><br><h5>数据库创建</h5><br>创建FMDatabase对象时参数为SQLite数据库文件路径。该路径可以是以下三种之一:<br>1..文件路径。该文件路径无需真实存,如果不存在会自动创建。<br>2..空字符串(@””)。表示会在临时目录创建一个空的数据库,当FMDatabase 链接关闭时,文件也被删除。<br>3.NULL. 将创建一个内在数据库。同样的,当FMDatabase连接关闭时,数据会被销毁。<br><br>(如需对临时数据库或内在数据库进行一步了解,请继续阅读:<a href=\"http://www.sqlite.org/inmemorydb.html\" target=\"_blank\" rel=\"external\">http://www.sqlite.org/inmemorydb.html</a>)<br><br><figure class=\"highlight gherkin\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">FMDatabase <span class=\"keyword\"><em></em></span>db = [FMDatabase databaseWithPath:<span class=\"comment\">@”/tmp/tmp.db”];</span></span><br></pre></td></tr></table></figure><br><br><br><h5>打开数据库</h5><br>在和数据库交互 之前,数据库必须是打开的。如果资源或权限不足无法打开或创建数据库,都会导致打开失败。<br><br><figure class=\"highlight stata\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">if</span> (![<span class=\"keyword\">db</span> <span class=\"keyword\">open</span>]) { </span><br><span class=\"line\"> [<span class=\"keyword\">db</span> release]; </span><br><span class=\"line\"> <span class=\"keyword\">return</span>; </span><br><span class=\"line\"> }</span><br></pre></td></tr></table></figure><br><br><br><h5>执行更新</h5><br>一切不是SELECT命令的命令都视为更新。这包括 CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE (等)。<br>简单来说,只要不是以SELECT开头的命令都是UPDATE命令。<br><br>执行更新返回一个BOOL值。YES表示执行成功,否则表示有那些错误 。你可以调用 -lastErrorMessage 和 -lastErrorCode方法来得到更多信息。<br><br><h5>执行查询</h5><br>SELECT命令就是查询,执行查询的方法是以 -excuteQuery开头的。<br><br>执行查询时,如果成功返回FMResultSet对象, 错误返回nil. 与执行更新相当,支持使用 NSError**参数。同时,你也可以使用 -lastErrorCode和-lastErrorMessage获知错误信息。<br><br>为了遍历查询结果,你可以使用while循环。你还需要知道怎么跳到下一个记录。使用FMDB,很简单实现,就像这样:<br><br><figure class=\"highlight elixir\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"constant\">FMResultSet </span>s = [db <span class=\"symbol\">executeQuery:</span>@<span class=\"string\">“SELECT <em> FROM myTable”</em></span>]; </span><br><span class=\"line\"><span class=\"keyword\">while</span> ([s <span class=\"keyword\">next</span>]) { </span><br><span class=\"line\"> <span class=\"regexp\">//retrieve</span> values <span class=\"keyword\">for</span> each record </span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure><br><br>你必须一直调用 -[FMResultSet next] 在你访问查询返回值之前,甚至你只想要一个记录:<br><br><figure class=\"highlight groovy\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">FMResultSet s = [db <span class=\"string\">executeQuery:</span>@<span class=\"string\">“SELECT COUNT(<em>) FROM myTable”</em></span>]; </span><br><span class=\"line\"> <span class=\"keyword\">if</span> ([s next]) { </span><br><span class=\"line\"> <span class=\"typename\">int</span> totalCount = [s <span class=\"string\">intForColumnIndex:</span><span class=\"number\">0</span>]; </span><br><span class=\"line\"> }</span><br></pre></td></tr></table></figure><br><br><br>FMResultSet 提供了很多方法来获得所需的格式的值:<br><br> intForColumn:<br> longForColumn:<br> longLongIntForColumn:<br> boolForColumn:<br> doubleForColumn:<br> stringForColumn:<br> dataForColumn:<br> dataNoCopyForColumn:<br> UTF8StringForColumnIndex:<br> objectForColumn:<br><br>这些方法也都包括 {type}ForColumnIndex 的这样子的方法,参数是查询结果集的列的索引位置。<br><br>你无需调用 [FMResultSet close]来关闭结果集, 当新的结果集产生,或者其数据库关闭时,会自动关闭。<br><br>关闭数据库<br>当使用完数据库,你应该 -close 来关闭数据库连接来释放SQLite使用的资源。<br><br><figure class=\"highlight ini\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"title\">[db close]</span><span class=\"comment\">;</span></span><br></pre></td></tr></table></figure><br><br><h4>事务</h4><br>FMDatabase是支持事务的。<br><h5>数据净化(数据格式化)</h5><br><br><p>使用FMDB,插入数据前,你不要花时间审查你的数据。你可以使用标准的SQLite数据绑定语法。</p><br><p>INSERT INTO myTable VALUES (?, ?, ?) </p><br><p>SQLite会识别 “?” 为一个输入的点位符, 这样的执行会接受一个可变参数(或者表示为其他参数,如NSArray, NSDictionary,或va_list等),会正确为您转义。</p><br><p>你也可以选择使用命名参数语法。</p><br><p>INSERT INTO myTable VALUES (:id, :name, :value) </p><br><p>参数名必须以冒名开头。SQLite本身支持其他字符,当Dictionary key的内部实现是冒号开头。注意你的NSDictionary key不要包含冒号。</p><br><figure class=\"highlight groovy\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">NSDictionary argsDict = [NSDictionary <span class=\"string\">dictionaryWithObjectsAndKeys:</span>@<span class=\"string\">“My Name”</span>, @<span class=\"string\">“name”</span>, nil]; </span><br><span class=\"line\"> [db <span class=\"string\">executeUpdate:</span>@<span class=\"string\">“INSERT INTO myTable (name) VALUES (:name)”</span> <span class=\"string\">withParameterDictionary:</span>argsDict];</span><br></pre></td></tr></table></figure><br><p>而且,代码不能这么写(为什么?想想吧。)</p><br><figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[db executeUpdate:@”<span class=\"operator\"><span class=\"keyword\">INSERT</span> <span class=\"keyword\">INTO</span> myTable <span class=\"keyword\">VALUES</span> (?)<span class=\"string\">“, @”</span>this has \\<span class=\"string\">“ lots of ‘ bizarre \\” quotes ‘“</span>];</span></span><br></pre></td></tr></table></figure><br><p>你应该:</p><br><figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[db executeUpdate:@”<span class=\"operator\"><span class=\"keyword\">INSERT</span> <span class=\"keyword\">INTO</span> myTable <span class=\"keyword\">VALUES</span> (?)<span class=\"string\">“, @”</span>this has <span class=\"string\">“ lots of ‘ bizarre “</span> quotes <span class=\"string\">‘“];</span></span></span><br></pre></td></tr></table></figure><br><p>提供给 -executeUpdate: 方法的参数都必须是对象。就像以下的代码就无法工作,且会产生崩溃。</p><br><figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[db executeUpdate:@”<span class=\"operator\"><span class=\"keyword\">INSERT</span> <span class=\"keyword\">INTO</span> myTable <span class=\"keyword\">VALUES</span> (?)<span class=\"string\">“, 42];</span></span></span><br></pre></td></tr></table></figure><br><p> 正确有做法是把数字打包成 NSNumber对象</p><br><figure class=\"highlight clojure\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"collection\">[db executeUpdate:@<span class=\"string\">“INSERT INTO myTable VALUES (?)”</span>, </span><br><span class=\"line\"><span class=\"collection\">[NSNumber numberWithInt:42]</span>]</span><span class=\"comment\">;</span></span><br></pre></td></tr></table></figure><br><p>或者,你可以使用 -executeWithFormat: ,这是NSString风格的参数</p><br><figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[db executeUpdateWithFormat:@”<span class=\"operator\"><span class=\"keyword\">INSERT</span> <span class=\"keyword\">INTO</span> myTable <span class=\"keyword\">VALUES</span> (%<span class=\"keyword\">d</span>)<span class=\"string\">“, 42];</span></span></span><br></pre></td></tr></table></figure><br><p> -execute<em>WithFormat: 的方法的内部实现会帮你封装数据, 以下这些修饰符都可以使用: %@, %c, %s, %d, %D,%i, %u, %U, %hi, %hu, %qi, %qu, %f, %g, %ld, %lu, %lld, and %llu. 除此之外的修饰符可能导致无法预知的结果。 一些情况下,你需要在SQL语句中使用 % 字符,你应该使用 %%。</em></p><br><p>使用FMDatabaseQueue 及线程安全<br>在多个线程中同时使用一个FMDatabase实例是不明智的。现在你可以为每个线程创建一个FMDatabase对象。 不要让多个线程分享同一个实例,它无法在多个线程中同时使用。 若此,坏事会经常发生,程序会时不时崩溃,或者报告异常,或者陨石会从天空中掉下来砸到你Mac Pro. 总之很崩溃。所以,不要初始化FMDatabase对象,然后在多个线程中使用。请使用 FMDatabaseQueue,它是你的朋友而且会帮助你。以下是使用方法:</p><br><p>首先创建队列。</p><br><figure class=\"highlight accesslog\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">FMDatabaseQueue queue = <span class=\"string\">[FMDatabaseQueue databaseQueueWithPath:aPath]</span>;</span><br></pre></td></tr></table></figure><br><p>这样使用。</p><br><figure class=\"highlight clojure\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"collection\">[queue inDatabase:^<span class=\"list\">(<span class=\"keyword\">FMDatabase</span> <em>db)</em></span> <span class=\"collection\">{ </span><br><span class=\"line\"> <span class=\"collection\">[db executeUpdate:@<span class=\"string\">“INSERT INTO myTable VALUES (?)”</span>, <span class=\"collection\">[NSNumber numberWithInt:1]</span>]</span><span class=\"comment\">; </span></span><br><span class=\"line\"> <span class=\"collection\">[db executeUpdate:@<span class=\"string\">“INSERT INTO myTable VALUES (?)”</span>, <span class=\"collection\">[NSNumber numberWithInt:2]</span>]</span><span class=\"comment\">; </span></span><br><span class=\"line\"> <span class=\"collection\">[db executeUpdate:@<span class=\"string\">“INSERT INTO myTable VALUES (?)”</span>, <span class=\"collection\">[NSNumber numberWithInt:3]</span>]</span><span class=\"comment\">; </span></span><br><span class=\"line\"> FMResultSet rs = <span class=\"collection\">[db executeQuery:@<span class=\"string\">“select <em> from foo”</em></span>]</span><span class=\"comment\">; </span></span><br><span class=\"line\"> while<span class=\"list\">(<span class=\"collection\">[rs next]</span>)</span> <span class=\"collection\">{ </span><br><span class=\"line\"> … </span><br><span class=\"line\"> }</span> </span><br><span class=\"line\">}</span>]</span><span class=\"comment\">;</span></span><br></pre></td></tr></table></figure><br><p>像这样,轻松地把简单任务包装到事务里:</p><br><figure class=\"highlight clojure\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"collection\">[queue inTransaction:^<span class=\"list\">(<span class=\"keyword\">FMDatabase</span> db, BOOL <em>rollback)</em></span> <span class=\"collection\">{ </span><br><span class=\"line\"> <span class=\"collection\">[db executeUpdate:@<span class=\"string\">“INSERT INTO myTable VALUES (?)”</span>, <span class=\"collection\">[NSNumber numberWithInt:1]</span>]</span><span class=\"comment\">; </span></span><br><span class=\"line\"> <span class=\"collection\">[db executeUpdate:@<span class=\"string\">“INSERT INTO myTable VALUES (?)”</span>, <span class=\"collection\">[NSNumber numberWithInt:2]</span>]</span><span class=\"comment\">; </span></span><br><span class=\"line\"> <span class=\"collection\">[db executeUpdate:@<span class=\"string\">“INSERT INTO myTable VALUES (?)”</span>, <span class=\"collection\">[NSNumber numberWithInt:3]</span>]</span><span class=\"comment\">; </span></span><br><span class=\"line\"> if <span class=\"list\">(<span class=\"keyword\">whoopsSomethingWrongHappened</span>)</span> <span class=\"collection\">{ </span><br><span class=\"line\"> rollback = YES; return; </span><br><span class=\"line\"> }</span> </span><br><span class=\"line\"> // etc… </span><br><span class=\"line\"> <span class=\"collection\">[db executeUpdate:@<span class=\"string\">“INSERT INTO myTable VALUES (?)”</span>, <span class=\"collection\">[NSNumber numberWithInt:4]</span>]</span><span class=\"comment\">; </span></span><br><span class=\"line\"> }</span>]</span><span class=\"comment\">;</span></span><br></pre></td></tr></table></figure><br><p> FMDatabaseQueue 后台会建立系列化的G-C-D队列,并执行你传给G-C-D队列的块。这意味着 你从多线程同时调用调用方法,GDC也会按它接收的块的顺序来执行。谁也不会吵到谁的脚 ,每个人都幸福。</p><br><p>—-转载自FMDB官方文档</p>"},{"title":"讯飞语音","url":"http://coderykw.com/2014/10/26/讯飞语音/","content":"<p> <span itemprop=\"articleBody\"><p>社会和产品的发展总是向着便利和智能的方法发展,对于手机的App来说也是如此.所以,现在的App都在缩减流程,优化使用体验,为的就是让用户用起来更加便利,提高App的入手度和用户粘性.那么另一方面的智能呢?<br><a id=\"more\"></a><br>一个比较简单智能的实现方法就是在输入的地方加上语音识别,在输出显示的时候加上语音合成,直接进行语音播报,那么是不是对于司机等来说就是一个智能的体现呢?</p></span></p>\n<p></p><p>现在做语音识别有一些不错的开放平台可以给我们直接提供使用,一家是科大讯飞开放平台,一家是百度语音开放平台.我个人比较喜欢讯飞,因为讯飞的优势是在大段文字的识别上,准确率比较高.这正好符合我的需求,这篇博客也主要讲的是讯飞语音SDK的使用.还是惯例,将科大讯飞的开放平台地址奉上.另外还有讯飞的SDK开发API和教程地址奉上<br><a href=\"http://www.xfyun.cn\" target=\"_blank\" rel=\"external\">讯飞开放平台传送门</a><br><a href=\"http://www.xfyun.cn/doccenter/iOS\" target=\"_blank\" rel=\"external\">讯飞开发API文档传送门</a></p><p></p>\n<p></p><p></p><h2>讯飞开发步骤</h2><br>讯飞开发教程上写的比较清楚也比较啰嗦,并不是一个最简洁的Demo.所以我在这篇博客里进行了一些适当的删减,争取做一个最简单的demo.<p></p><p></p>\n<p></p><p></p><h4>1 申请账号ID</h4>登陆到讯飞开放平台上,在用户菜单栏里就有创建我的应用.这里的登陆也可以采用第三方的方式.在创建应用的界面填写相关的信息即可.然后就会有一个SDK下载的链接.如果没有,直接去SDK下载中心按照三步选项去进行新的下载即可.这里不做过多的描述.<p></p><p></p>\n<p></p><p></p><h4>2 导入讯飞SDK框架</h4>下载下来的SDK包解压出来有三个文件夹,第一个市doc文件夹,不多说,肯定是开发文档,还有相关的作者信息什么的.最重要的是剩下的两个文件夹,一个是lib文件夹,这里存放的是讯飞SDK的类库文件,我们导入SDK就是导入的这里的文件.第三个文件夹是一个IOS的Demo演示工程.<br>1 添加静态库<br>新建一个IOS工程,将lib文件夹下的”iflyMSC.framework”文件拷贝到工程目录下,然后在工程配置文件的[Build Phases]-[Link Binary With Libraries]中通过[AddOther]<br>2 确认SDK路径<br>在配置文件中搜索”head”找到[Framework Search Paths],点开查看SDK的路径是不是绝对路径,如果是如下图的样子,那就没问题了.这一步主要是确保SDK的路径为相对路径,防止工程换了文件夹位置就无法运行的情况的发生.<br><img src=\"http://ww3.sinaimg.cn/large/005KqbSEgw1eyle52fn2gj31kw0etaev.jpg\"><br>3 添加框架<br>按照下图依次将图中的所有的框架添加到工程里面.讯飞官网API中给出的截图是XCode7以前的,XCode7之后一些动态链接库的后缀名发生了改变,Xcode7中添加完毕之后如下图:<br><img src=\"http://ww4.sinaimg.cn/large/005KqbSEgw1eylebbmst7j30f20fy772.jpg\"><p></p><p></p>\n<p></p><p></p><h4>语音识别</h4><br>语音识别分两种,分别用在不同的场合,一个是界面提示的语音识别,一个是无界面提示的语音识别,这里以有界面提示的语音识别为例子.<p></p><p></p>\n<h5>有界面提示的语音识别</h5>\n\n<p></p><p>1 导入头文件</p><p></p>\n<pre>//将讯飞SDK中的所有类都导入进来\n#import < iflyMSC/iflyMSC.h >\n</pre>\n\n<p></p><p>2 登陆讯飞服务器<br>在使用讯飞的语音解析之前,需要进行用户身份验证,即登陆讯飞服务器,这个在viewDidLoad()方法中添加两行代码即可.后面的ID数字就是之前我们在开放平台创建按自己应用时给的APPID,在下载的SDK中也是有的.</p><p></p>\n<pre>NSString *initString = [[NSString alloc] initWithFormat:@\"appid=%@\",@\"565e4dd9\"];\n[IFlySpeechUtility createUtility:initString];\n</pre>\n\n<p></p><p>3 创建有界面提示的语音识别对象<br>创建一个讯飞语音识别对象,可以对他进行一系列的调用<br><pre>@property (nonatomic, strong) IFlyRecognizerView *iflyRecognizerView;//带界面的识别对象<br></pre></p><p></p>\n<p></p><p>4 初始化带界面的识别对象<br>前面声明了一个带界面的语音识别对象,现在需要对这个识别对象进行初始化,同样是在ViewDidLoad()方法中进行就行.</p><p></p>\n<pre>#pragma mark ------ 进行有界面的语音识别的初始化\n_iflyRecognizerView = [[IFlyRecognizerView alloc] initWithCenter:self.view.center];\n_iflyRecognizerView.delegate = self;\n[_iflyRecognizerView setParameter: @\"iat\" forKey: [IFlySpeechConstant IFLY_DOMAIN]];\n//asr_audio_path保存录音文件名,如不再需要,设置value为nil表示取消,默认目录是documents\n[_iflyRecognizerView setParameter:@\"asrview.pcm \" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];\n</pre>\n\n<p></p><p>5 实现代理方法<br>讯飞对识别结果的处理采用的代理回调的方法,实现IFlySpeechSynthesizerDelegate协议的onResult:isLast:方法.<br>注意!!!!这里的是onResult,不是onResults,后者是无界面提示的语音解析的结果回调函数.</p><p></p>\n<pre>- (void)onResult: (NSArray *)resultArray isLast:(BOOL) isLast\n{\n NSMutableString *result = [[NSMutableString alloc] init];\n NSDictionary *dic = [resultArray objectAtIndex:0];\n for (NSString *key in dic) {\n [result appendFormat:@\"%@\",key];\n }\n NSString * resu = [ISRDataHelper stringFromJson:result];\n //将结果显示在界面的Label上\n _text.text = [NSString stringWithFormat:@\"%@%@\",_text.text,resu];\n}\n</pre>\n这里默认的传回来的是Json字符串,需要对字符串进行解析.当然,讯飞还是比较良心的,在demo中给提供了一个解析类,就是上面用到的ISRDataHelper.用它来进行解析就可以了.\n\n6 触发开始语音识别\n拖动一个Button,给一个响应事件,用于开始监听语音识别\n<pre>//启动识别服务\n[_iflyRecognizerView start];</pre>\n\n<p></p><p>这个时候运行App,就可以进行语音识别了,运行的结果应该如下图:<br><img src=\"http://ww2.sinaimg.cn/large/005KqbSEgw1eymahpu0z2g309g0go0zo.gif\"></p><p></p>\n<p></p><p></p><h5>无界面提示的语音识别</h5><br>无界面提示的语音识别适合将语音识别放在后台,这个看具体的使用场景.无界面的方式相对来说简洁大方,可制定性高.<br>1 导入头文件<p></p><p></p>\n<pre>//将讯飞SDK中的所有类都导入进来\n#import < iflyMSC/iflyMSC.h >\n</pre>\n\n<p></p><p>2 登陆讯飞服务器<br>在使用讯飞的语音解析之前,需要进行用户身份验证,即登陆讯飞服务器,这个在viewDidLoad()方法中添加两行代码即可.后面的ID数字就是之前我们在开放平台创建按自己应用时给的APPID,在下载的SDK中也是有的.</p><p></p>\n<pre>NSString *initString = [[NSString alloc] initWithFormat:@\"appid=%@\",@\"565e4dd9\"];\n[IFlySpeechUtility createUtility:initString];\n</pre>\n\n<p></p><p>3 创建无界面提示的语音识别对象<br>创建一个讯飞语音识别对象,可以对他进行一系列的调用<br><pre>@property (nonatomic, strong) IFlySpeechRecognizer *iFlySpeechRecognizer;//不带界面的识别对象<br></pre></p><p></p>\n<p></p><p>4 对象初始化<br>前面声明了一些在语音合成的时候会用到的对象,现在需要对前面的对象进行初始化.还是在ViewDidLoad()里面进行就可以了.这里的初始化内容比较多,是进行一些语音的设置,所以单独做成了一个方法,在ViewDidLoad()中进行调用即可.</p><p></p>\n<pre>-(void)initRecognizer{\n//单例模式,无UI的实例\nif (_iFlySpeechRecognizer == nil) {\n _iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance]; [_iFlySpeechRecognizer setParameter:@\"\" forKey:[IFlySpeechConstant PARAMS]];\n //设置听写模式\n [_iFlySpeechRecognizer setParameter:@\"iat\" forKey:[IFlySpeechConstant IFLY_DOMAIN]];\n}\n_iFlySpeechRecognizer.delegate = self; \nif (_iFlySpeechRecognizer != nil) {\n IATConfig *instance = [IATConfig sharedInstance]; \n //设置最长录音时间\n [_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];\n //设置后端点\n [_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];\n //设置前端点\n [_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];\n //网络等待时间\n [_iFlySpeechRecognizer setParameter:@\"20000\" forKey:[IFlySpeechConstant NET_TIMEOUT]]; \n //设置采样率,推荐使用16K\n [_iFlySpeechRecognizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]]; \n if ([instance.language isEqualToString:[IATConfig chinese]]) {\n //设置语言\n [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];\n //设置方言\n [_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];\n }else if ([instance.language isEqualToString:[IATConfig english]]) {\n [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];\n }\n //设置是否返回标点符号\n [_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]]; \n}\n}\n</pre>\n\n<p></p><p>5 实现代理方法<br>讯飞对识别结果的处理采用的代理回调的方法,实现IFlySpeechSynthesizerDelegate协议的onResult:isLast:方法.<br>注意!!!!这里的是onResults,不是onResult,前者是有界面提示的语音识别的结果回调函数.</p><p></p>\n<pre>- (void) onResults:(NSArray *) results isLast:(BOOL)isLast{\n NSMutableString *result = [[NSMutableString alloc] init];\n NSDictionary *dic = [results objectAtIndex:0];\n for (NSString *key in dic) {\n [result appendFormat:@\"%@\",key];\n }\n NSString * resu = [ISRDataHelper stringFromJson:result];\n _text.text = [NSString stringWithFormat:@\"%@%@\",_text.text,resu];\n}</pre>\n\n<p></p><p>6 触发语音合成<br>添加一个输入框,一个button,button的响应时间是将输入框中的文本内容读出来.</p><p></p>\n<pre>if(_iFlySpeechRecognizer == nil)\n{\n [self initRecognizer];\n}\n[_iFlySpeechRecognizer cancel];\n//设置音频来源为麦克风\n[_iFlySpeechRecognizer setParameter:IFLY_AUDIO_SOURCE_MIC forKey:@\"audio_source\"];\n//设置听写结果格式为json\n[_iFlySpeechRecognizer setParameter:@\"json\" forKey:[IFlySpeechConstant RESULT_TYPE]];\n//保存录音文件,保存在sdk工作路径中,如未设置工作路径,则默认保存在library/cache下\n[_iFlySpeechRecognizer setParameter:@\"asr.pcm\" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];\n[_iFlySpeechRecognizer setDelegate:self];\nBOOL ret = [_iFlySpeechRecognizer startListening];\n</pre>\n\n\n<p></p><p></p><h4>语音合成</h4><br>语音合成和语音识别的过程差不多<br>1 导入头文件<p></p><p></p>\n<pre>//将讯飞SDK中的所有类都导入进来\n#import < iflyMSC/iflyMSC.h >\n#import \"PcmPlayer.h\"\n#import \"TTSConfig.h\"\n</pre>\n\n<p></p><p>2 登陆讯飞服务器<br>在使用讯飞的语音解析之前,需要进行用户身份验证,即登陆讯飞服务器,这个在viewDidLoad()方法中添加两行代码即可.后面的ID数字就是之前我们在开放平台创建按自己应用时给的APPID,在下载的SDK中也是有的.</p><p></p>\n<pre>NSString *initString = [[NSString alloc] initWithFormat:@\"appid=%@\",@\"565e4dd9\"];\n[IFlySpeechUtility createUtility:initString];\n</pre>\n\n<p></p><p>3 创建有界面提示的语音识别对象<br>创建一个讯飞语音识别对象,可以对他进行一系列的调用</p><p></p>\n<pre>\ntypedef NS_OPTIONS(NSInteger, SynthesizeType) {\n NomalType = 5,//普通合成\n UriType = 6, //uri合成\n};\n@property (nonatomic, strong) IFlySpeechSynthesizer * iFlySpeechSynthesizer;//语音合成对象\n@property (nonatomic, strong) PcmPlayer *audioPlayer;//用于播放音频的\n@property (nonatomic, assign) SynthesizeType synType;//是何种合成方式\n@property (nonatomic, assign) BOOL hasError;//解析过程中是否出现错误\n</pre>\n\n<p></p><p>4 对象初始化<br>前面声明了一些在语音合成的时候会用到的对象,现在需要对前面的对象进行初始化.还是在ViewDidLoad()里面进行就可以了.<br><figure class=\"highlight\"><figcaption><span>*instance = [TTSConfig sharedInstance];</span></figcaption><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">if (instance == nil) { return; } //合成服务单例 if (_iFlySpeechSynthesizer == nil) { _iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance]; } _iFlySpeechSynthesizer.delegate = self; //设置语速1-100 [_iFlySpeechSynthesizer setParameter:instance.speed forKey:[IFlySpeechConstant SPEED]]; //设置音量1-100 [_iFlySpeechSynthesizer setParameter:instance.volume forKey:[IFlySpeechConstant VOLUME]]; //设置音调1-100 [_iFlySpeechSynthesizer setParameter:instance.pitch forKey:[IFlySpeechConstant PITCH]]; //设置采样率 [_iFlySpeechSynthesizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]]; //设置发音人 [_iFlySpeechSynthesizer setParameter:instance.vcnName forKey:[IFlySpeechConstant VOICE_NAME]];</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>5 触发语音合成<br>添加一个输入框,一个button,button的响应时间是将输入框中的文本内容读出来.</p><p></p>\n<pre>if ([self.VoiceText.text isEqualToString:@\"\"]) {\n return;\n}\nif (_audioPlayer != nil && _audioPlayer.isPlaying == YES) {\n [_audioPlayer stop];\n }\n_synType = NomalType;\nself.hasError = NO;\n[NSThread sleepForTimeInterval:0.05];\n_iFlySpeechSynthesizer.delegate = self;\n[_iFlySpeechSynthesizer startSpeaking:self.VoiceText.text];\n</pre>\n\n<p></p><p></p><h4>Demo下载</h4><br>最终写完的demo如下,下面是传送门.<br><a href=\"/../sourceFile/语音识别Demo/语音Lesson.zip\">demo传送门</a><p></p><br><p></p>\n"},{"title":"iOS的SQLite简单使用","url":"http://coderykw.com/2014/10/05/sqlite/","content":"<p>我们在开发过程中数据库是肯定需要使用的,其中移动开发过程中使用最多的可能就是SQLite了,本文就介绍一下iOS中如何使用SQlite。</p><br><p>SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至今已经有14个年头,SQLite也迎来了一个版本 SQLite 3已经发布。</p><br><h3>SQLite的特性</h3><br><br><ol><br><li>ACID事务 (注:①)</li><br><li>零配置 – 无需安装和管理配置</li><br><li>储存在单一磁盘文件中的一个完整的数据库</li><br><li>数据库文件可以在不同字节顺序的机器间自由的共享</li><br><li>支持数据库大小至2TB</li><br><li>足够小, 大致13万行C代码, 4.43M</li><br><li>比一些流行的数据库在大部分普通数据库操作要快</li><br><li>简单, 轻松的API</li><br><li>包含TCL绑定, 同时通过Wrapper支持其他语言的绑定</li><br><li>良好注释的源代码, 并且有着90%以上的测试覆盖率</li><br><li>独立,没有额外依赖</li><br><li>源码完全的开源, 你可以用于任何用途, 包括出售它</li><br><li>支持多种开发语言,C, PHP, Perl, Java, C#,Python, Ruby</li><br></ol><br><p></p><h3>SQLite在iOS中的基本使用</h3><p></p><br><p>在iOS开发中可以用一些SQLite数据库管理工具,例如SQLiteManager。<br><br>接下来就通过代码来讲述iOS中如何使用sqlite<br><br>sqlite.h文件的引入<br><br>首先是打开和关闭数据库,打开和创建数据库都是sqlite3_open函数,如果filename已经创建那就是打开。</p>\n\n<p><figure class=\"highlight objectivec\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">NSString</span> <em>filename;<span class=\"comment\">//数据库文件路径</span></em></span><br><span class=\"line\">sqlite3 database; <span class=\"comment\">//sqlite3数据库句柄的指针</span></span><br><span class=\"line\"><span class=\"comment\">//打开数据库</span></span><br><span class=\"line\">- (<span class=\"keyword\">int</span>) open{</span><br><span class=\"line\"> <span class=\"keyword\">int</span> rc=sqlite3_open([filename UTF8String], &amp;database);</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (rc) {</span><br><span class=\"line\"> sqlite3_close(database);</span><br><span class=\"line\"> <span class=\"built_in\">NSLog</span>(<span class=\"string\">@”open database failed”</span>);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">return</span> rc;</span><br><span class=\"line\">}</span><br><span class=\"line\"><span class=\"comment\">//关闭数据库</span></span><br><span class=\"line\">- (<span class=\"keyword\">void</span>) close{</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (database!=<span class=\"literal\">NULL</span>) {</span><br><span class=\"line\"> sqlite3_close(database);</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure></p>\n<p>接下来插入、删除、更新都是用sqlite3_exec函数,记住执行语句,必须要先打开数据库,完成之后需要关闭数据库。</p>\n\n<p><figure class=\"highlight objectivec\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">//执行 insert,update,delete 等非查询SQL语句</span></span><br><span class=\"line\"> - (<span class=\"keyword\">int</span>)executeNonQuery:(<span class=\"built_in\">NSString</span> <em>)sql error:(<span class=\"built_in\">NSError</span> **)error {</em></span><br><span class=\"line\"> <span class=\"keyword\">int</span> rc;</span><br><span class=\"line\"> <span class=\"keyword\">char</span> errmsg;</span><br><span class=\"line\"> rc = [<span class=\"keyword\">self</span> open];</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (rc) { </span><br><span class=\"line\"><span class=\"comment\">//错误处理</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> (error != <span class=\"literal\">NULL</span>) {</span><br><span class=\"line\"> <span class=\"built_in\">NSDictionary</span> <em>eDict =</em></span><br><span class=\"line\"> [<span class=\"built_in\">NSDictionary</span> dictionaryWithObject:<span class=\"string\">@”open database failed”</span></span><br><span class=\"line\"> forKey:<span class=\"built_in\">NSLocalizedDescriptionKey</span>];</span><br><span class=\"line\"> error =</span><br><span class=\"line\"> [<span class=\"built_in\">NSError</span> errorWithDomain:kSqliteErrorDomain code:rc userInfo:eDict];</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">return</span> rc;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> rc = sqlite3_exec(database, [sql UTF8String], <span class=\"literal\">NULL</span>, <span class=\"literal\">NULL</span>, &amp;errmsg);</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (rc != SQLITE_OK) {</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (error != <span class=\"literal\">NULL</span>) {</span><br><span class=\"line\"> <span class=\"built_in\">NSDictionary</span> <em>eDict =</em></span><br><span class=\"line\"> [<span class=\"built_in\">NSDictionary</span> dictionaryWithObject:<span class=\"string\">@”exec sql error”</span></span><br><span class=\"line\"> forKey:<span class=\"built_in\">NSLocalizedDescriptionKey</span>];</span><br><span class=\"line\"> error =</span><br><span class=\"line\"> [<span class=\"built_in\">NSError</span> errorWithDomain:kSqliteErrorDomain code:rc userInfo:eDict];</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"built_in\">NSLog</span>(<span class=\"string\">@”%s”</span>, errmsg);</span><br><span class=\"line\"> sqlite3_free(errmsg);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> [<span class=\"keyword\">self</span> close];</span><br><span class=\"line\"> <span class=\"keyword\">return</span> rc;</span><br><span class=\"line\"> }</span><br></pre></td></tr></table></figure></p>\n<p>上面函数中sqlite3_free就是释放存放错误信息的内存空间。<br><br>查询操作会略显复杂,同样需要有开关数据库的操作,不过有一个准备结果集和最后释放结果集的操作,分别是sqlite3_prepare_v2和sqlite3_finalize,sqlite3_stmt就是结果集,下面就是具体操作。</p>\n\n<p><figure class=\"highlight cpp\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[self open];</span><br><span class=\"line\"> <span class=\"comment\">// 查</span></span><br><span class=\"line\"> strsql = <span class=\"string\">“select <em> from users”</em></span>;</span><br><span class=\"line\"> <span class=\"comment\">// SQLITE_API int sqlite3_prepare_v2(</span></span><br><span class=\"line\"> <span class=\"comment\">// sqlite3 db, /<em> Database handle </em>/</span></span><br><span class=\"line\"> <span class=\"comment\">// const char <em>zSql, /</em> SQL statement<em>/</em></span></span><br><span class=\"line\"> <span class=\"comment\">// int nByte, / 结果集的最大长度。<em>/</em></span></span><br><span class=\"line\"> <span class=\"comment\">// sqlite3_stmt **ppStmt, / OUT: 结果集 <em>/</em></span></span><br><span class=\"line\"> <span class=\"comment\">// const char **pzTail / OUT:指向结果集没有用到的内存部分的指针。 <em>/</em></span></span><br><span class=\"line\"> <span class=\"comment\">// );</span></span><br><span class=\"line\"> sqlite3_stmt rc;<span class=\"comment\">//陈述式句柄</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> (sqlite3_prepare_v2(db, strsql, -<span class=\"number\">1</span>, &amp;rc, <span class=\"literal\">NULL</span>)!=SQLITE_OK) {</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"comment\">// sqlite3_step讲结果集数据指针指向下一个元素。</span></span><br><span class=\"line\"> <span class=\"comment\">// 这个函数的返回值如果是SQLITE_ROW就表示我们的结果集里面有数据。</span></span><br><span class=\"line\"> <span class=\"comment\">// 否则我们的结果集就是空的。</span></span><br><span class=\"line\"> <span class=\"keyword\">while</span> (sqlite3_step(rc)==SQLITE_ROW) {</span><br><span class=\"line\"> <span class=\"comment\">// sqlite3_column系列函数。一般有两个输入参数。第一个是结果集指针,第二是数据所在列的序号。</span></span><br><span class=\"line\"> <span class=\"comment\">// 比如我们现在用的sqlite3_column_int和sqlite3_column_text。</span></span><br><span class=\"line\"> <span class=\"built_in\">printf</span>(<span class=\"string\">“id:%d | username:%s | password:%s \\n”</span>,sqlite3_column_int(rc, <span class=\"number\">0</span>),sqlite3_column_text(rc, <span class=\"number\">1</span>),sqlite3_column_text(rc, <span class=\"number\">2</span>)); </span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"comment\">// 查完后一定要释放结果集。</span></span><br><span class=\"line\"> sqlite3_finalize(rc);</span><br><span class=\"line\"> [self close];</span><br></pre></td></tr></table></figure></p>\n<p></p><h3>数据库加密</h3><p></p><br><p>免费版的SQLite有一个致命缺点:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。<br><br>对数据库加密的思路有两种:<br><br>1. 将内容加密后再写入数据库<br><br>这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。<br><br>不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。<br><br>2. 对数据库文件加密<br><br>将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。这里就介绍一个开源的加密工具SQLCipher,安装方法可以参照官网文档,<a target=\"_blank\" href=\"https://www.zetetic.net/sqlcipher/ios-tutorial/\" title=\"https://www.zetetic.net/sqlcipher/ios-tutorial/\">https://www.zetetic.net/sqlcipher/ios-tutorial/</a>,SQLCipher使用256-bit AES加密,由于其基于免费版的SQLite,主要的加密接口和SQLite是相同的,但也增加了一些自己的接口。<br><br>其实SQLite的两个加密函数使用起来非常的简单,下面分情况说明:<br><br>1 给一个未加密的数据库添加密码:如果想要添加密码,则可以在打开数据库文件之后,关闭数据库文件之前的任何时刻调用sqlite3_key函数即可,该函数有三个参数,其中第一个参数为数据库对象,第二个参数是要设定的密码,第三个是密码的长度。例如:sqlite3_key(db,”1q2w3e4r”,8); //给数据库设定密码1q2w3e4r<br><br>2 读取一个加密数据库中的数据:完成这个任务依然十分简单,你只需要在打开数据库之后,再次调用一下sqlite3_key函数即可,例如,数据库密码是123456时,你只需要在代码中加入sqlite3_key(db,”123456″,6);<br><br>3更改数据库密码:首先你需要使用当前的密码正确的打开数据库,之后你可以调用sqlite3_rekey(db,”112233″,6) 来更改数据库密码。<br><br>4 删除密码:也就是把数据库恢复到明文状态。这时你仍然只需要调用sqlite3_rekey函数,并且把该函数的第二个参数置为NULL或者””,或者把第三个参数设为0。</p><br><h3>事务操作</h3><br><p>那么问题又来了,如果iOS的sqlite同时插入或者查询10000条数据,你该怎么办?<br><br>这里有三步要做,第一,减少开关数据库操作,插入10000条数据,不能开关10000次数据库,只能进行一次开关;<br><br>第二,就是不能放在主线程;<br><br>第三,最重要的一点就是加入事务操作。<br><br>事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。所以10000次磁盘操作可能几分钟都做不完,这个时候需要把10000条语句都封装成一个事务。<br><br>下面就是开始事务和提交事务的代码了</p>\n\n<p><figure class=\"highlight zephir\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">-(<span class=\"keyword\">int</span>)beginService{</span><br><span class=\"line\"> <span class=\"keyword\">char</span> <em>errmsg;</em></span><br><span class=\"line\"> <span class=\"keyword\">int</span> rc = sqlite3_exec(database, <span class=\"string\">“BEGIN transaction”</span>, <span class=\"keyword\">NULL</span>, <span class=\"keyword\">NULL</span>, &amp;errmsg);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> rc;</span><br><span class=\"line\"> }</span><br><span class=\"line\">-(<span class=\"keyword\">int</span>)commitService{</span><br><span class=\"line\"> <span class=\"keyword\">char</span> errmsg;</span><br><span class=\"line\"> <span class=\"keyword\">int</span> rc = sqlite3_exec(database, <span class=\"string\">“COMMIT transaction”</span>, <span class=\"keyword\">NULL</span>, <span class=\"keyword\">NULL</span>, &amp;errmsg);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> rc;</span><br><span class=\"line\">}</pre></span><br><span class=\"line\"><p>接下来就把三个操作合并</p></span><br><span class=\"line\"><pre lang=<span class=\"string\">“objc”</span> escaped=<span class=\"string\">“true”</span> style=<span class=\"string\">“background: #E8F2FB ;”</span>>-(<span class=\"keyword\">int</span>)addModelsTest:(NSArray <em>)models error:(NSError **) error{</em></span><br><span class=\"line\"> <span class=\"keyword\">char</span> errmsg;</span><br><span class=\"line\"> <strong>block NSMutableArray *sqls=[NSMutableArray <span class=\"keyword\">array</span>];</strong></span><br><span class=\"line\"> block NoticeModel <em>aModel=[[NoticeModel alloc] init];</em></span><br><span class=\"line\"> dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, <span class=\"number\">0</span>), ^{</span><br><span class=\"line\"> <span class=\"keyword\">for</span> (<span class=\"keyword\">int</span> i=<span class=\"number\">0</span>; i&lt;<span class=\"number\">100000</span>; i++) {</span><br><span class=\"line\"> aModel=[models objectAtIndex:<span class=\"number\">0</span>];</span><br><span class=\"line\"> NSString sql=[NSString stringWithFormat:@<span class=\"string\">“insert into notices values(‘%lf’,’%d’,’%@’,’%@’,’%@’,’%d’,’%d’,’%d’,’%d’,’%@’)”</span>,aModel.myID,aModel.news_id,aModel.news_title,aModel.content,aModel.pic,aModel.sort,aModel.record_status,aModel.counter,aModel.suid,aModel.publish_time];</span><br><span class=\"line\"> [sqls addObject:sql];</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">int</span> r1=[<span class=\"keyword\">self</span> open];</span><br><span class=\"line\"> [<span class=\"keyword\">self</span> beginService];</span><br><span class=\"line\"> <span class=\"keyword\">int</span> rc;</span><br><span class=\"line\"> <span class=\"keyword\">int</span> i;</span><br><span class=\"line\"> <span class=\"keyword\">for</span> (i=<span class=\"number\">0</span>; i&lt;<span class=\"number\">100000</span>; i++) {</span><br><span class=\"line\"> rc=sqlite3_exec(database, [[sqls objectAtIndex:i] UTF8String], <span class=\"keyword\">NULL</span>, <span class=\"keyword\">NULL</span>, &amp;errmsg);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> [<span class=\"keyword\">self</span> commitService];</span><br><span class=\"line\"> [<span class=\"keyword\">self</span> close];</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (i ==<span class=\"number\">100000</span>) {</span><br><span class=\"line\"> dispatch_async(dispatch_get_main_queue(), ^{</span><br><span class=\"line\"> NSLog(@<span class=\"string\">“call back, the data is: %@”</span>, i);</span><br><span class=\"line\"> });</span><br><span class=\"line\"> } <span class=\"keyword\">else</span> {</span><br><span class=\"line\"> NSLog(@<span class=\"string\">“error when download:%@”</span>, error);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> });</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span>;</span><br><span class=\"line\"> }</span><br></pre></td></tr></table></figure></p>\n<p> 注:① ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability). 原子性意味着数据库中的事务执行是作为原子。即不可再分,整个语句要么执行,要么不执行。一致性指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。</p><br><p> —-本文为转载,如有侵权,请及时告知,谢谢!</p>"},{"title":"coding上 搭建hexo静态博客","url":"http://coderykw.com/2014/08/30/coding/","content":"<p></p><p><a href=\"https://github.com/hexojs/hexo\" target=\"_blank\" rel=\"external\">Hexo</a> 是一款基于 Node.js 的静态博客框架, 目前在 GitHub 上已有 9133 star 和 1499 fork。Hexo 生成的静态页面可以部署在 Github 或 Coding 上,并且能够免费绑定自己的域名,可以用来很方便地搭建个人博客。</p><p></p>\n<p><hr></p>\n<p></p><h1 id=\"1,Git-安装\"><a href=\"#1,Git-安装\" class=\"headerlink\" title=\"1,Git 安装\"></a>1,Git 安装</h1><p>搭建博客需要用到 git,下面这条命令可查看本机是否已安装 git,若未安装可参考<a href=\"http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137396287703354d8c6c01c904c7d9ff056ae23da865a000/\" target=\"_blank\" rel=\"external\">这篇博文</a>进行安装。<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">git –version</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><h1 id=\"2,安装-Node-js\"><a href=\"#2,安装-Node-js\" class=\"headerlink\" title=\"2,安装 Node.js\"></a>2,安装 Node.js</h1><p>Mac下最简单的做法便是直接下载pkg文件进行安装,最新版本的下载地址如下,选择后缀为pkg的文件下载安装即可:<br><a href=\"https://nodejs.org/download/release/latest/\" target=\"_blank\" rel=\"external\">https://nodejs.org/download/release/latest/</a><br>完装完成后,要将以下路径计入你的系统环境变量 /usr/local/bin,步骤如下:<br>用vim 打开该文件:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">cd</span>; vi .bash_profile</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>在文件中加入该语句:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">export</span> PATH=/usr/<span class=\"built_in\">local</span>/bin:<span class=\"variable\">$PATH</span></span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>并保存退出,重新加载shell让设置的环境变量生效:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">source</span> ~/.bash_profile</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><h1 id=\"3,将-npm-的源替换成淘宝的源\"><a href=\"#3,将-npm-的源替换成淘宝的源\" class=\"headerlink\" title=\"3,将 npm 的源替换成淘宝的源\"></a>3,将 npm 的源替换成淘宝的源</h1><p>由于众所周知的原因,国内访问官方默认 npmjs.org 源速度不是十分理想,所以建议切换成国内的,利用以下命令将其替换为淘宝的 npm 源:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">npm config <span class=\"built_in\">set</span> registry <a href=\"http://registry.npm.taobao.org/\" target=\"_blank\" rel=\"external\">http://registry.npm.taobao.org/</a></span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><h1 id=\"4,安装-Hexo\"><a href=\"#4,安装-Hexo\" class=\"headerlink\" title=\"4,安装 Hexo\"></a>4,安装 Hexo</h1><p>利用 npm 命令安装:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">sudo npm install -g hexo</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>因为可能有文件读写权限的问题,这里推荐用 sudo,输入密码后会开始安装,时间可能比较长,耐心等待,如果长时间卡在某一步 Ctrl + C 终止当前任务后重试即可。</p><p></p>\n<p></p><h1 id=\"5,安装-Server-组件\"><a href=\"#5,安装-Server-组件\" class=\"headerlink\" title=\"5,安装 Server 组件\"></a>5,安装 Server 组件</h1><p>安装 Hexo 完成后我们在终端中执行如下命令:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">hexo</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>因为这并不是一个完整的命令,所以这时我们可以看到 hexo 输出的帮助信息</p><p></p>\n<p></p><p>我们可以在左边的 Commands 列表中查看我们需要的命令是否已成功安装,因为某些版本的 Hexo 的 Server 模块需要独立安装所以这里我们并没有看到 server 命令,我们可以执行下面这条命令来进行安装,如果有的话可以跳过这一步:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">sudo npm install hexo-server –save</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>如果安装过程中出现一些问题导致某些模块没有安装成功的也可以通过类似的方式单独安装某个模块进行修复。</p><p></p>\n<p></p><h1 id=\"6,本地建立博客\"><a href=\"#6,本地建立博客\" class=\"headerlink\" title=\"6,本地建立博客\"></a>6,本地建立博客</h1><p>安装完成后,新建一个目录如 myblog 用于存放博客,切换到该目录下执行以下指令,Hexo 即会在目标文件夹初步生成博客所需要的所有文件:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">hexo init</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>网上有大量开发者们分享的模板可供选择使用,将它们的 Git 仓库 Clone 以后放到博客目录下的 themes 文件夹中即可:<br><a href=\"https://github.com/hexojs/hexo/wiki/Themes\" target=\"_blank\" rel=\"external\">Github Hexo Themes</a><br><a href=\"http://www.zhihu.com/question/24422335\" target=\"_blank\" rel=\"external\">有哪些好看的 Hexo 主题?</a><br>本博客的搭建我选择了使用该主题:<br><a href=\"https://github.com/forsigner/fexo\" target=\"_blank\" rel=\"external\">https://github.com/forsigner/fexo</a><br>在这里对原作者 forsigner 表示感谢,🙏</p><p></p>\n<p></p><h1 id=\"7,安装-RSS-插件(可忽略)\"><a href=\"#7,安装-RSS-插件(可忽略)\" class=\"headerlink\" title=\"7,安装 RSS 插件(可忽略)\"></a>7,安装 RSS 插件(可忽略)</h1><p>到博客所在目录 myblog 下,利用该命令安装 RSS 插件,暂时不需添加 RSS 功能的同学可忽略该步骤:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">sudo npm install hexo-generator-feed –save</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>编辑 myblog 目录下的 _config.yml,添加如下代码开启 RSS 功能:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">rss: /atom.xml</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>RSS 地址保持默认即可,不需要多做修改。</p><p></p>\n<p></p><h1 id=\"8,本地效果预览\"><a href=\"#8,本地效果预览\" class=\"headerlink\" title=\"8,本地效果预览\"></a>8,本地效果预览</h1><p>在终端使用 cd 命令切换到博客所在目录 myblog,执行如下命令生成静态博客页面并启动本地服务器,若成功可在浏览器中访问 <a href=\"http://localhost:4000/\" target=\"_blank\" rel=\"external\">http://localhost:4000/</a> 进行预览。<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">hexo generate</span><br><span class=\"line\">hexo server</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>或者如下的缩写形式也可以:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">hexo g</span><br><span class=\"line\">hexo s</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><h1 id=\"9,部署到-Coding-Pages\"><a href=\"#9,部署到-Coding-Pages\" class=\"headerlink\" title=\"9,部署到 Coding Pages\"></a>9,部署到 Coding Pages</h1><p>在 Coding 新建一个项目,假设为 myblog,然后修改本地博客目录下的 _config.yml 文件,根据<a href=\"https://hexo.io/docs/deployment.html\" target=\"_blank\" rel=\"external\">官方文档</a>的描述,修改以下几个参数,这些参数一般在文件底部:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">deploy:</span><br><span class=\"line\"><span class=\"built_in\">type</span>: git <span class=\"comment\">#部署方式,这里我们用的是Coding的Git</span></span><br><span class=\"line\">repo: <repository url> <span class=\"comment\">#仓库地址,例如我的是git@git.coding.net:eyrefree/myblog.git </span></span><br><span class=\"line\">branch: [branch] <span class=\"comment\">#分支名,可任意填写,我填写的是master</span></span><br><span class=\"line\">message: [message] <span class=\"comment\">#可不填,这是显示在提交记录里的描述信息,默认为日期</span></span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>参数修改完成后,我们需要在终端中切换到博客所在目录安装 deploy 组建,执行以下命令将生成的博客静态页面 push 到我们上面在 Coding 创建的 myblog 仓库中:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">sudo npm install hexo-deployer-git –save</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>然后执行依次执行清理命令:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">hexo clean</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>生成命令:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">hexo g</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>部署命令:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">hexo s</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>如果在 _config.yml 的 repo 处填写的仓库地址是 https 形式的,在部署时可能需要输入你的 Coding 账号和密码。<br>然后切换到该项目的 Pages 标签,开启 pages 服务,分支名填写为我们在_config.yml 文件中设定的分支,我的是 master。</p><p></p>\n<p></p><h1 id=\"10,服务器效果预览\"><a href=\"#10,服务器效果预览\" class=\"headerlink\" title=\"10,服务器效果预览\"></a>10,服务器效果预览</h1><p>pages 服务开启完成后,Coding 会提供一个类似 {user_name}.coding.me/{project_name} 的链接用于访问,例如用户名为 eyrefree 项目名为 myblog 的链接应该是:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\"><a href=\"http://eyrefree.coding.me/myblog\" target=\"_blank\" rel=\"external\">http://eyrefree.coding.me/myblog</a></span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>访问该链接即可进行预览,由于我们引用的资源很多是和域名相关的,导致这里可能会有资源加载失败的情况,只能出现部分文字,接下来我们将域名绑定后即可恢复正常。</p><p></p>\n<p></p><h1 id=\"11,绑定域名\"><a href=\"#11,绑定域名\" class=\"headerlink\" title=\"11,绑定域名\"></a>11,绑定域名</h1><p>默认提供的链接可能过长或者不便于日常使用,我们也可以绑定自己的域名。<br>首先,需要提前准备一个域名,然后打开自己的域名控制面板,新建一个 CNAME 解析到 {user_name}.coding.me,例如我的是将 www.eyrefree.org 解析到 eyrefree.coding.me;<br>然后,打开 Coding 项目页面切换到 pages 项,填入刚才的设置解析的域名 www.eyrefree.org,点击“添加域名绑定”按钮即可,在浏览器中直接访问 www.eyrefree.org 就能成功打开。<br>有时可能由于缓存或者解析时间的问题,稍等片刻即可。 </p><p></p>\n<p></p><h1 id=\"12,编写博文\"><a href=\"#12,编写博文\" class=\"headerlink\" title=\"12,编写博文\"></a>12,编写博文</h1><p>接下来就是日常的博文编写啦,这里是使用 markdown 格式的,编写完成后添加到 source/_posts 目录下然后按照第 8 步的方法部署到 Coding 服务器即可,具体可参考<a href=\"http://www.jianshu.com/p/3c7ddd48bfa9\" target=\"_blank\" rel=\"external\">这篇博文</a>,Markdown 的一些语法可以参考:<br><a href=\"http://wowubuntu.com/markdown/\" target=\"_blank\" rel=\"external\">http://wowubuntu.com/markdown/</a></p><p></p>\n<p></p><h1 id=\"13,常见问题\"><a href=\"#13,常见问题\" class=\"headerlink\" title=\"13,常见问题\"></a>13,常见问题</h1><p>若执行 hexo 命令时出现如下警告信息:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">{ [Error: Cannot find module <span class=\"string\">‘./build/Release/DTraceProviderBindings’</span>] code: <span class=\"string\">‘MODULE_NOT_FOUND’</span> }</span><br><span class=\"line\">{ [Error: Cannot find module <span class=\"string\">‘./build/default/DTraceProviderBindings’</span>] code: <span class=\"string\">‘MODULE_NOT_FOUND’</span> }</span><br><span class=\"line\">{ [Error: Cannot find module <span class=\"string\">‘./build/Debug/DTraceProviderBindings’</span>] code: <span class=\"string\">‘MODULE_NOT_FOUND’</span> }</span><br></pre></td></tr></table></figure></p><p></p>\n<p></p><p>可以尝试执行以下命令修复:<br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">sudo npm install hexo –no-optional</span><br></pre></td></tr></table></figure></p><p></p>\n<p><hr></p>\n<p></p><p>嘛,大概就是这些内容了,有遗漏的话会继续补充,😝。</p>\n"},{"title":"fexo 主题 文档","url":"http://coderykw.com/2014/07/27/fexo中文文档/","content":"<p> </p><h1 id=\"开始\"><a href=\"#开始\" class=\"headerlink\" title=\"开始\"></a>开始</h1><h2 id=\"安装\"><a href=\"#安装\" class=\"headerlink\" title=\"安装\"></a>安装</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">$ <span class=\"built_in\">cd</span> my-blog</span><br><span class=\"line\">$ git <span class=\"built_in\">clone</span> git@github.com:forsigner/fexo.git themes/fexo</span><br></pre></td></tr></table></figure><p></p>\n<p></p><h2 id=\"启用\"><a href=\"#启用\" class=\"headerlink\" title=\"启用\"></a>启用</h2><p>打开博客根目录的 <code>_config.yml</code> 设为 <code>theme: fexo</code></p><p></p>\n<p></p><h2 id=\"升级\"><a href=\"#升级\" class=\"headerlink\" title=\"升级\"></a>升级</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">$ <span class=\"built_in\">cd</span> themes/fexo</span><br><span class=\"line\">$ git commit -am <span class=\"string\">‘update’</span></span><br><span class=\"line\">$ git pull</span><br></pre></td></tr></table></figure><p></p>\n<p></p><h1 id=\"配置主题\"><a href=\"#配置主题\" class=\"headerlink\" title=\"配置主题\"></a>配置主题</h1><p>主题配置全部在<code>theme/fexo</code>里面完成,所里下面所有配置指的是配置<code>theme/fexo/_config.yml</code>。</p><p></p>\n<p></p><h2 id=\"设置基本信息\"><a href=\"#设置基本信息\" class=\"headerlink\" title=\"设置基本信息\"></a>设置基本信息</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">blog_name: Forsigner</span><br><span class=\"line\">slogan: Find the bug of the world</span><br></pre></td></tr></table></figure><p></p>\n<p></p><h2 id=\"设置头像\"><a href=\"#设置头像\" class=\"headerlink\" title=\"设置头像\"></a>设置头像</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\"># relative url</span></span><br><span class=\"line\">avatar: /images/avatar.jpg</span><br><span class=\"line\"><span class=\"comment\"># or absolute url</span></span><br><span class=\"line\">avatar: <a href=\"https://avatars0.githubusercontent.com/u/\" target=\"_blank\" rel=\"external\">https://avatars0.githubusercontent.com/u/</a><span class=\"number\">2668081</span>?v=<span class=\"number\">3</span>&s=<span class=\"number\">460</span></span><br></pre></td></tr></table></figure><p></p>\n<p></p><h2 id=\"设置favicon\"><a href=\"#设置favicon\" class=\"headerlink\" title=\"设置favicon\"></a>设置favicon</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">favicon: /favicon.ico</span><br></pre></td></tr></table></figure><p></p>\n<p></p><h2 id=\"设置关键词\"><a href=\"#设置关键词\" class=\"headerlink\" title=\"设置关键词\"></a>设置关键词</h2><p>关键词主要作用是优化SEO</p><p></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">keywords: forsigner,前端,设计,Hexo主题,前端开发,用户体验,设计,frontend,design,nodejs,JavaScript</span><br></pre></td></tr></table></figure><br><h2 id=\"自定义博客名的字体\"><a href=\"#自定义博客名的字体\" class=\"headerlink\" title=\"自定义博客名的字体\"></a>自定义博客名的字体</h2><p>由于中文字体文件太大,有的快10M,所以 Fexo 没有引入中文字体,导致博客名有点难看。<br>但是可以通过提取字体来减小字体文件大小,让字体只有几KB。<br>一下步骤可以让你实现自定义博客名字体,包括英文和中文:</p><br><ol><br><li>下载免费可用的ttf格式字体</li><br><li>利用 <a href=\"http://fontmin.forsigner.com/\" target=\"_blank\" rel=\"external\">Web-Fontmin</a> 提取字体,然后下载 Web 字体和样式</li><br><li>在博客根目录的s<code>source</code>文件夹新建两个子目录: fonts 和 css</li><br><li>把下载的字体方式fonts文件夹,把CSS文件放入css文件夹</li><br><li>修改<code>theme/fexo/_config.yml</code>:</li><br></ol><br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\"> <span class=\"comment\"># 这是css文件里的font-familiy的值 ,例如里面是 font-familiy: “myfontName”</span></span><br><span class=\"line\">blog_name_font_familiy: myFontName</span><br><span class=\"line\"></span><br><span class=\"line\">fonts_css_path:</span><br><span class=\"line\"> - /css/calligraffittiregular.css</span><br><span class=\"line\"> - /css/second-font.css</span><br></pre></td></tr></table></figure><br><h2 id=\"设置首页内容\"><a href=\"#设置首页内容\" class=\"headerlink\" title=\"设置首页内容\"></a>设置首页内容</h2><p>你可以设置是否在首页直接显示文章</p><br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">init_page_content: HOME_NAV <span class=\"comment\"># HOME_NAV | POST</span></span><br></pre></td></tr></table></figure><br><h2 id=\"设置首页导航\"><a href=\"#设置首页导航\" class=\"headerlink\" title=\"设置首页导航\"></a>设置首页导航</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">home_nav:</span><br><span class=\"line\"> - name: B<span class=\"built_in\">log</span></span><br><span class=\"line\"> url: /archives</span><br><span class=\"line\"> - name: Github</span><br><span class=\"line\"> url: <a href=\"https://github.com/forsigner\" target=\"_blank\" rel=\"external\">https://github.com/forsigner</a></span><br><span class=\"line\"> target: _blank</span><br><span class=\"line\"> - name: Douban</span><br><span class=\"line\"> url: <a href=\"http://www.douban.com/people/forsigner/\" target=\"_blank\" rel=\"external\">http://www.douban.com/people/forsigner/</a></span><br><span class=\"line\"> target: _blank</span><br><span class=\"line\"> - name: Twitter</span><br><span class=\"line\"> url: <a href=\"https://twitter.com/forsigner\" target=\"_blank\" rel=\"external\">https://twitter.com/forsigner</a></span><br><span class=\"line\"> target: _blank</span><br></pre></td></tr></table></figure><br><h2 id=\"设置页面导航\"><a href=\"#设置页面导航\" class=\"headerlink\" title=\"设置页面导航\"></a>设置页面导航</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">page_nav:</span><br><span class=\"line\"> - 博客: /archives/</span><br><span class=\"line\"> - 分类: /category/</span><br><span class=\"line\"> - 标签: /tag/</span><br><span class=\"line\"> - 友链: /link/</span><br><span class=\"line\"> - 关于: /about/</span><br><span class=\"line\"> - RSS: /atom.xml</span><br></pre></td></tr></table></figure><br><h2 id=\"设置页面导航样式\"><a href=\"#设置页面导航样式\" class=\"headerlink\" title=\"设置页面导航样式\"></a>设置页面导航样式</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">page_nav_style: CIRCLE <span class=\"comment\"># CIRCLE|ROUND_RECT</span></span><br></pre></td></tr></table></figure><br><h2 id=\"设置面包屑\"><a href=\"#设置面包屑\" class=\"headerlink\" title=\"设置面包屑\"></a>设置面包屑</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">breadcrumb:</span><br><span class=\"line\"> isShow: <span class=\"literal\">true</span> <span class=\"comment\"># true|fase</span></span><br></pre></td></tr></table></figure><br><h2 id=\"设置盒子\"><a href=\"#设置盒子\" class=\"headerlink\" title=\"设置盒子\"></a>设置盒子</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">toolbox:</span><br><span class=\"line\"> isShow: <span class=\"literal\">true</span> <span class=\"comment\"># true|fase</span></span><br></pre></td></tr></table></figure><br><h2 id=\"设置文章标题对齐方式\"><a href=\"#设置文章标题对齐方式\" class=\"headerlink\" title=\"设置文章标题对齐方式\"></a>设置文章标题对齐方式</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">post:</span><br><span class=\"line\"> header_align: center <span class=\"comment\"># left|center</span></span><br></pre></td></tr></table></figure><br><h1 id=\"启用页面\"><a href=\"#启用页面\" class=\"headerlink\" title=\"启用页面\"></a>启用页面</h1><h2 id=\"启用分类页面\"><a href=\"#启用分类页面\" class=\"headerlink\" title=\"启用分类页面\"></a>启用分类页面</h2><ol><br><li>在博客根目录执行 <code>hexo new page category</code></li><br><li>修改<code>my-blog/source/category/index.md</code>里面的内容:</li><br></ol><br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">—</span><br><span class=\"line\">title: category</span><br><span class=\"line\">layout: category</span><br><span class=\"line\">comments: <span class=\"literal\">false</span></span><br><span class=\"line\">—</span><br></pre></td></tr></table></figure><br><h2 id=\"启用标签页面\"><a href=\"#启用标签页面\" class=\"headerlink\" title=\"启用标签页面\"></a>启用标签页面</h2><ol><br><li>在博客根目录执行 <code>hexo new page tag</code></li><br><li>修改<code>my-blog/source/tag/index.md</code>里面的内容:</li><br></ol><br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">—</span><br><span class=\"line\">title: tag</span><br><span class=\"line\">layout: tag</span><br><span class=\"line\">comments: <span class=\"literal\">false</span></span><br><span class=\"line\">—</span><br></pre></td></tr></table></figure><br><h2 id=\"启用友链页面\"><a href=\"#启用友链页面\" class=\"headerlink\" title=\"启用友链页面\"></a>启用友链页面</h2><ol><br><li>在博客根目录执行 <code>hexo new page link</code></li><br><li>修改<code>my-blog/source/link/index.md</code>里面的内容:</li><br></ol><br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">—</span><br><span class=\"line\">title: link</span><br><span class=\"line\">layout: link</span><br><span class=\"line\">comments: <span class=\"literal\">false</span></span><br><span class=\"line\">—</span><br></pre></td></tr></table></figure><br><h2 id=\"启用关于页面\"><a href=\"#启用关于页面\" class=\"headerlink\" title=\"启用关于页面\"></a>启用关于页面</h2><ol><br><li>在博客根目录执行 <code>hexo new page about</code></li><br><li>修改<code>my-blog/source/about/index.md</code>里面的内容:</li><br></ol><br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">—</span><br><span class=\"line\">title: about</span><br><span class=\"line\">layout: about</span><br><span class=\"line\">comments: <span class=\"literal\">false</span></span><br><span class=\"line\">—</span><br></pre></td></tr></table></figure><br><h2 id=\"启用项目页面\"><a href=\"#启用项目页面\" class=\"headerlink\" title=\"启用项目页面\"></a>启用项目页面</h2><ol><br><li>在博客根目录执行 <code>hexo new page project</code></li><br><li>修改<code>my-blog/source/project/index.md</code>里面的内容:</li><br></ol><br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">—</span><br><span class=\"line\">title: project</span><br><span class=\"line\">layout: project</span><br><span class=\"line\">comments: <span class=\"literal\">false</span></span><br><span class=\"line\">—</span><br></pre></td></tr></table></figure><br><h2 id=\"启用搜索页面\"><a href=\"#启用搜索页面\" class=\"headerlink\" title=\"启用搜索页面\"></a>启用搜索页面</h2><ul><br><li>在博客根目录执行 <code>hexo new page search</code></li><br><li>修改<code>my-blog/source/search/index.md</code>里面的内容:</li><br></ul><br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">—</span><br><span class=\"line\">title: search</span><br><span class=\"line\">layout: search</span><br><span class=\"line\">comments: <span class=\"literal\">false</span></span><br><span class=\"line\">—</span><br></pre></td></tr></table></figure><br><ul><br><li>然后安装 Hexo 插件 <code>hexo-search</code> (重要)</li><br></ul><br><p>先进入 blog 的根目录</p><br><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">$ <span class=\"built_in\">cd</span> my-blog</span><br><span class=\"line\">$ npm install hexo-search –save</span><br></pre></td></tr></table></figure><br><h1 id=\"第三方服务\"><a href=\"#第三方服务\" class=\"headerlink\" title=\"第三方服务\"></a>第三方服务</h1><h2 id=\"启用统计\"><a href=\"#启用统计\" class=\"headerlink\" title=\"启用统计\"></a>启用统计</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">google_analytics:</span><br><span class=\"line\">baidu_analytics: <span class=\"number\">57</span>e94d016sfsf1fba3xxxx8a2b0263af0</span><br></pre></td></tr></table></figure><br><h2 id=\"启用评论\"><a href=\"#启用评论\" class=\"headerlink\" title=\"启用评论\"></a>启用评论</h2><figure class=\"highlight bash\"><table><tr><td class=\"code\"><pre><span class=\"line\">disqus_shortname: forsigner</span><br><span class=\"line\"><span class=\"comment\"># duoshuo_shortname: forsigner</span></span><br></pre></td></tr></table></figure>"},{"title":"hexo博客搭建","url":"http://coderykw.com/2014/05/20/hexo博客搭建/","content":"<pre><code> 需要的东西我打包了 \n链接: http://pan.baidu.com/s/1cK8mNc 密码: ngvu\n</code></pre><p> <span itemprop=\"articleBody\"><p>这是我的个人博客,欢迎大家常来围观。</p></span></p>\n<p></p><p></p><h3>独立博客</h3><br>很多人已经养成了坚持写博客的习惯,但是论坛博客总有兴盛和衰落,而且最悲剧的是,通常不会持续几年,而我们做一件事是会做很久的,所以最后的结果就是不停地搬博客,博主有过这样的惨痛的经历,深知其中的苦与泪。于是一些优秀的程序猿开始找寻简便快捷长久而不失水准的发布博客的方法,于是便有了gitPage+Hexo的发布博客的方式。之前总结过了,但是随着版本变更有一些失效了,重新确认一遍又发布出来了。<br><a id=\"more\"></a><p></p><p></p>\n<p></p><p></p><h3>gitPage+Hexo</h3><br>gitPage是github推出一个可以显示静态网页的服务。而对于我们的博客来说,基本除了评论的模块之外,剩下的都是静态网页,所以完全可以满足我们的需求,我们将我们的博客做成静态网页传到gitPage上就行,然后我们就可以在浏览器里访问到我们的网站了。<p></p><br>但是对于我们来说,一套简洁大方的静态网页的编写也是一件相对费时费力的工作。于是一些人找到了一些静态网页生成工具,这样我们只需要编写内容即可,剩下的事儿就交给工具了,工具会根据你选择的模板和你写的内容生成静态网页,于是,静态网页我们也有了。/p><br>那么思路很明显了,想要实现拥有一个独立的私有博客,我们需要两个东西,一个是可供浏览器访问的静态网页存储空间,这个我们选择gitPage,一个是一个静态网页生成工具,Octopress也好,Hexo也罢,这里我选择的是Hexo。<p></p><p></p>\n<p></p><p></p><h3>环境搭建</h3><p></p><p></p>\n<p></p><p></p><h4>Hexo环境搭建</h4><br>在安装Hexo之前,还需要一些环境的搭建。需要安装NodeJS。安装NodeJS有两种方式<p></p><p></p>\n<p></p><p></p><h5>1 安装包的方式</h5><br>直接去官网也好,谷歌也罢,下载一个安装包,安装就行,简便快捷,这也是我比较推荐的方式。<p></p><p></p>\n<p></p><p></p><h5>2 命令行方式</h5><br>如果用命令行安装,推荐通过homebrew安装,简单、高效、靠谱。homebrew的安装一条指令就可以了<p></p><p></p>\n<p></p><p><pre>ruby -e “$(curl -fsSL <a href=\"https://raw.githubusercontent.com/Homebrew/install/master/install\" target=\"_blank\" rel=\"external\">https://raw.githubusercontent.com/Homebrew/install/master/install</a>)”<br></pre><br>安装完homebrew,现在我们可以安装NodeJS了,安装非常简单明了,只一行代码,如下:</p><p></p>\n<p></p><p><pre>sudo brew install nodejs</pre><br>如果这里出现error,请往下反翻倒最底下看问题1和问题2.</p><p></p>\n<p></p><p></p><h4>安装hexo</h4><br>到现在了,安装Hexo就很简单了,建立一个新的Hexo存放的文件夹,然后,<p></p><p></p>\n<p></p><p><pre>sudo npm install -g hexo</pre><br>注意!!!这里一定要建立一个新的Hexo存放的文件夹,然后再执行上面的指令,否则会出现一个情况,就是在用户的根目录创建了一些文件,删除了之后再指定也是没有用的。<br>指定运行结束之后,在当前目录下,如果你输入hexo,打印出来一些指令提示,那么证明OK,你的hexo已经可以使用了。</p><p></p>\n<p></p><p></p><h3>初始化Hexo环境</h3><br>依旧是在当前目录下,执行以下命令<p></p><p></p>\n<p></p><p><pre>hexo init</pre><br>然后会提示你别忘了执行一个指令,在命令行里直接输入执行就可以了</p><p></p>\n<p></p><p><pre>npm install</pre><br>接下来就是蛮长的网络下载和安装,中间可能会有一两个警告或者错误,并不影响使用。指令运行结束之后这个文件夹下面应该会多出两个文件和四个文件夹。<br>到这里 ,Hexo软件环境就已经搭建完毕,接下来就是GitPage部分的配合了。</p><p></p>\n<p></p><p></p><h3>Git环境搭建</h3><br>git的搭建,首先需要申请一个github账号,账号名字必须全部是小写字母没有特殊字符。<br>有了账号之后,登陆进去,new一个repository,仓库的名字必须是[用户名.github.io],注意,这里的名字是固定的,主要作用是限制每个账号只能有一个GitPage主页.<br>然后,下载一个github客户端,用于将我们的静态网页上传到刚才创建的代码仓库中。<br>这里解释一下,github上传代码和文件有两种,条条大路通罗马,不论用何种办法,能把东西传到github上的方法就是好方法。这里我采用的是客户端上传的方法,我个人觉得这样在使用的过程中清晰明了,操作快捷一些。部分网友喜欢使用命令行的方式操作git,我也是比较支持的,看个人爱好吧.<p></p><p></p>\n<p></p><p>—————————我是分割线啊我是分割线———————————–</p><p></p>\n<p></p><p></p><h3>问题1</h3><br>如果这里出现很多error,原因可能是环境没有安装好,有两种解决办法:<br>第一种:强行安装Hexo<p></p><p></p>\n<p></p><p><pre>sudo npm install –unsafe-perm –verbose -g hexo</pre><br>第二种:安装前置环境<br>安装nvm,否则在安装hexo的时候会报错<br>从github上下载nvm,指令如下。</p><p></p>\n<p></p><p><pre>git clone git://github.com/creationix/nvm.git ~/nvm<br></pre><br>从Finder中进入新生成的nvm文件夹里,把install.sh拖到命令行里,按下回车即可安装,然后关掉终端再打开。如果提示已经安装了nvm,那么OK,我们可以进行下一步了。这里之所以会进行这一步是因为有的人电脑可能没有安装nvm,或者因为某些原因卸载掉了,如果是这样的话,后面会出现各种错误。<br>接下来就是查看一下远程服务器上的nvm都有哪些版本,指令如下</p><p></p>\n<p></p><p><pre>nvm ls-remote<br></pre><br>选择一个比较新的版本,将下列指令的版本号替换成最新的版本号</p><p></p>\n<p></p><p><pre>nvm install iojs-v2.2.1</pre><br>然后是设定使用刚才安装的版本的nvm。</p><p></p>\n<p></p><p><pre>nvm use v2.2.3</pre><br>然后还需要一个设定,就是指定当前系统的默认版本是我们刚才安装的版本。</p><p></p>\n<p></p><p><pre>nvm alias default v2.2.3</pre></p><p></p>\n<p></p><p></p><h3>问题2</h3><br>如果这里只出现一个错误,提示如下:<p></p><p></p>\n<p></p><p><pre>Error: Cowardly refusing to ‘sudo brew install’<br>You can use brew with sudo, but only if the brew executable is owned by root.<br>However, this is both not recommended and completely unsupported so do so at<br>your own risk.<br></pre><br>只是权限提取重复的错误,将指令前面的sudo去掉,剩下的指令部分不变就可以了。</p><br><p></p>\n"}]