-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeed.xml
637 lines (441 loc) · 44.4 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>dingc'enstein</title>
<description>Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.
</description>
<link>https://qtdc1229.github.io/</link>
<atom:link href="https://qtdc1229.github.io/feed.xml" rel="self" type="application/rss+xml" />
<pubDate>Mon, 25 Jan 2016 18:53:29 +0800</pubDate>
<lastBuildDate>Mon, 25 Jan 2016 18:53:29 +0800</lastBuildDate>
<generator>Jekyll v3.0.1</generator>
<item>
<title>Welcome to Jekyll!</title>
<description><p>You’ll find this post in your <code class="highlighter-rouge">_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code class="highlighter-rouge">jekyll serve --watch</code>, which launches a web server and auto-regenerates your site when a file is updated.</p>
<p>To add new posts, simply add a file in the <code class="highlighter-rouge">_posts</code> directory that follows the convention <code class="highlighter-rouge">YYYY-MM-DD-name-of-post.ext</code> and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.</p>
<p>Jekyll also offers powerful support for code snippets:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
<span class="nb">puts</span> <span class="s2">"Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="n">print_hi</span><span class="p">(</span><span class="s1">'Tom'</span><span class="p">)</span>
<span class="c1">#=&gt; prints 'Hi, Tom' to STDOUT.</span></code></pre></figure>
<p>Check out the <a href="http://jekyllrb.com">Jekyll docs</a> for more info on how to get the most out of Jekyll. File all bugs/feature requests at <a href="https://github.com/jekyll/jekyll">Jekyll’s GitHub repo</a>. If you have questions, you can ask them on <a href="https://github.com/jekyll/jekyll-help">Jekyll’s dedicated Help repository</a>.</p>
</description>
<pubDate>Mon, 25 Jan 2016 00:53:13 +0800</pubDate>
<link>https://qtdc1229.github.io/jekyll/update/2016/01/25/welcome-to-jekyll.html</link>
<guid isPermaLink="true">https://qtdc1229.github.io/jekyll/update/2016/01/25/welcome-to-jekyll.html</guid>
<category>jekyll</category>
<category>update</category>
</item>
<item>
<title>移动开发的专注之路</title>
<description><h1 id="section">移动开发的专注之路</h1>
<p>在被测试一而再再而三的打断之后,我对自己工作效率实在是忍无可忍了。怎么样才能快速构建部署提上了日程。</p>
<h3 id="section-1">移动开发的系统集成要做什么?</h3>
<p>首先我们来看看,为了专注工作我们要做些什么:</p>
<ul>
<li>1、更好用的bug收集工具(仅仅是人工提交一个问题已经没有办法我们的需求了,客观的stack日志、操作步奏、carshReport以及截图会更加提升效率)</li>
<li>2、提交代码后自动编译(我们现在使用了SVN,整体需要支持SVN,服务器平台需要支持xcode)</li>
<li>3、自动打包</li>
<li>4、快速部署平台(APP需要下载)</li>
</ul>
<h3 id="section-2">友盟错误统计</h3>
<p>bug收集工具的重要性这里就不说了大家都知道的,怎么才能更~~搞笑,搞笑。。。手残~~高效收集解决bug是个大问题。</p>
<p><strong>友盟</strong> 是我们最早使用的一个bug统计工具,<strong>友盟</strong> 只能收集崩溃日志,对于当初啥都不懂的我来说已经很高大上了。</p>
<p>他的优点。。。在现在来说只能说出现的太早了。。。当时国外的工具不怎么知道,也没这么多人普及。。。
他的缺点收集到的崩溃日志没符号表没法看。。。不够友好。。。只能收集<strong>CrashReport</strong>。</p>
<h3 id="bughd">BugHD</h3>
<p><code class="highlighter-rouge">BugHD</code>是<code class="highlighter-rouge">fir.im</code>推出的一款bug收集工具,其实他也就是<strong>友盟</strong>的扩展版。功能比较单一依然是只收集<strong>CrashReport</strong>,而且出现过一个非常不友好的事件–2015年9月前后所有安装<code class="highlighter-rouge">BugHD</code>的应用全部遭到提交失败,理由是会跳到第三方下载。。。然后被大面积的删除。</p>
<p>生不逢时也是<code class="highlighter-rouge">BugHD</code>比较悲剧的地方,因为同一时期我们发现了另一个bug收集工具 — <strong>bugtags</strong>。</p>
<h3 id="bugtags">bugtags</h3>
<p><code class="highlighter-rouge">bugtags</code>是我们最新发现的一款测试软件,也是我们现在一直在使用的。</p>
<p>他的优势在于测试人员能快速的提交有问题的页面到服务端,然后系统会自动发邮件给应用管理者,开发人员就会对该bug做出相应的措施了。</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/Simulator%20Screen%20Shot%202016%E5%B9%B41%E6%9C%8821%E6%97%A5%20%E4%B8%8B%E5%8D%884.01.10.png?raw=true" alt="提交bug界面" /></p>
<p>bug提交后后台显示</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/B6BAE36A-8C4B-4D60-AFB0-889B0C623CDE.png?raw=true" alt="后台显示" /></p>
<p>崩溃抛出问题也更好解决了,抛出的时候<code class="highlighter-rouge">bugtags</code>自动做了屏幕截图,并且将图以及<strong>CrashReport</strong>一同提交到了后台。</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/QQ20160121-0.png?raw=true" alt="崩溃信息" /></p>
<p>点击堆栈信息后会有堆栈的详细信息。</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/QQ20160121-stackinfo.png?raw=true" alt="堆栈信息" /></p>
<p>最近<code class="highlighter-rouge">bugtags</code>推出了他们的网页版,有兴趣可以试试。</p>
<h3 id="firim">fir.im</h3>
<p>找到了合适的bug收集工具我们算是能闲一闲了,但是面对一大堆机器让你安装APP的机器,你的内心估计是崩溃的。。。找到一个合适的APP仓库是需要提上日程了。</p>
<p>我们要做的很简单,就是将有Develop证书的APP发布到服务器上,能供测试人员下载。这个服务器必须支持https,而且我们还得顺利的搞到测试设备的UDID,大致就是这样。</p>
<p><code class="highlighter-rouge">fir.im</code>是最先出现在我的眼中的。</p>
<p><code class="highlighter-rouge">fir.im</code>给出的方案是这样的:</p>
<ul>
<li>1、首先是收集UDID,先访问<a href="http://fir.im/udid">http://fir.im/udid</a>选择发送udid发送到指定邮箱,然后开发者一条一条添加到apple的设备后台里去。。。(有没有更好的办法。。。。自己写个程序?)</li>
</ul>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/IMG_0436.PNG?raw=true" alt="udid" /></p>
<ul>
<li>2、在<code class="highlighter-rouge">fir.im</code>后台建立APP,上传APP到后台</li>
</ul>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/QQ20160121-firimapp.png?raw=true" alt="fir.im后台" /></p>
<ul>
<li>3、<code class="highlighter-rouge">fir.im</code>给你一个短链接,这个短链接你可以任意修改最后的后缀,确定以后依然可以修改,然后你将该短链接发送给测试人员。</li>
</ul>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/QQ20160121-563b22a400fc74087200000e.png?raw=true" alt="fir.im云掌柜" /></p>
<ul>
<li>4、测试设备访问短链接下载APP,和下载企业发布应用是一样的</li>
</ul>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/QQ20160121-dmiotinn.png?raw=true" alt="dmiotinn" /></p>
<p>最初我只是把他当作企业发布的仓库,作为一个囊中羞涩的小公司,一个CA高级认证的https证书也是需要节省的…<code class="highlighter-rouge">fir.im</code>给我们解决了https的证书问题,在全国范围内下载成功了比我们自己放在高的多。再后来发现用他的测试发布平台是非常好用的,当然 <code class="highlighter-rouge">fir.im</code> 本身就是作为测试平台去做的,现在来看也是国内做的最好的测试分发平台。</p>
<p>后来我拥有了全公司iOS设备的UDID,这个过程。。。实在是不想提起。。。好吧那我们就把测试版本也发布到<code class="highlighter-rouge">fir.im</code>上去吧,不用一个设备一个设备的安装了。</p>
<h3 id="testflight">TestFlight</h3>
<p><code class="highlighter-rouge">TestFlight</code> 是国外一个比较优秀的测试平台,后来被苹果收购了,所以现在只支持iOS平台。</p>
<p>作为苹果自己的东西自然有他的过人之处————那就是不用统计udid,但是相对应的需要你的iCloud账号。</p>
<p>过程大致如下:</p>
<ul>
<li>在iTunes-connects中设置<code class="highlighter-rouge">TestFlight</code>,加入要发布的构建。</li>
<li>在该APP中加入测试人员的iCloud的账号</li>
<li>测试人员下载<code class="highlighter-rouge">TestFlight</code>应用</li>
<li>然后在应用中登录,下载测试APP</li>
</ul>
<p>以上过程全部脑补。<strong><a href="https://github.com/wensonMaster">wency</a></strong></p>
<h3 id="travis-ci">Travis CI</h3>
<p>完成了bug管理,打包发布怎么才能将编译和以上步骤一起自动发布呢?在阅读Bolg的时候我不经意间了解到了系统集成。</p>
<p>第一次看到<code class="highlighter-rouge">Travis CI</code>是在<strong><a href="http://objccn.io/">objccn.io</a></strong>上这是一个关于Objective-C的进阶的网站。其中第六章有一篇<strong><a href="http://objccn.io/issue-6-5/">为 iOS 建立 Travis CI</a></strong>的文章。阅读了他才对为<code class="highlighter-rouge">Travis CI</code>有一点了解。</p>
<p>首先是CI,持续集成(Continuous integration)
&gt;持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。</p>
<p><code class="highlighter-rouge">Travis CI</code>被广泛的用在github上,如果你想在自己的服务器上部署一份,对不起这不被允许。。。即使是企业版也是要他们合作,整个持续集成的过程将在<code class="highlighter-rouge">Travis CI</code>的服务器上执行。可以说他们出售的是个在线的服务。</p>
<p>如果你的是一个开源项目,或者你愿意的持续集成服务不再自己的服务器上运行,那<code class="highlighter-rouge">Travis CI</code>绝对是你不二的选择。</p>
<p>企业级的他还要收费的。。。我只能选择其他路径了。</p>
<h3 id="jenkins">Jenkins</h3>
<p><code class="highlighter-rouge">Jenkins</code>也是一款经典的持续集成软件。</p>
<p>他可以安装在自己的服务器上,这个比较和我的胃口。</p>
<p>这里先说一下之CI主机必须满足2个要求:速度快与容量大。所以<code class="highlighter-rouge">Travis CI</code>能提供这样的服务,与他强大的服务器组是分不开的。首先我想到的是部署在咱们的公司服务器上,但是很快就发现,这是一个无法完成的动作。。。为什么?CentOS怎么运行XCode 的 commodline ?</p>
<p>好吧既然这样就先部署在我的电脑上好了,至少保证他能运行。</p>
<p>简单介绍一下<code class="highlighter-rouge">Jenkins</code>的安装,首先保证有Java环境,如果没有安装一个JDK最新版的好了。然后在Terminal中键入以下代码:</p>
<p><code class="highlighter-rouge">
$ brew install jenkins
</code>
没有安装过brew的自行脑补。
安装完成后键入</p>
<p><code class="highlighter-rouge">
$ java -jar */jenkins.war
</code></p>
<p>然后在浏览器中键入<a href="http://localhost:8080/">http://localhost:8080/</a>,可以看到<code class="highlighter-rouge">Jenkins</code>的主界面</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/QQ20160121-Jenkins.png?raw=true" alt="Jenkins主界面" /></p>
<p>点击新建然后选择自由风格的软件项目</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/B9F00738-67AC-4BC1-A771-C99666E076C9.png?raw=true" alt="Jenkins新建" /></p>
<p>ok后会进入配置页面</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/8CF5649F-696F-4FDF-8750-C8F839628DAD.png?raw=true" alt="Jenkins项目配置" /></p>
<p>这里说明一下,Jenkins跟大部分应用一样有大量的插件,比如在图中看到我们看到svn账号管理这个插件就是<strong>Credentials Plugin</strong>,如果要运行iOS就要安装相应的iOS编译相关的XCode比如<strong>CocoaPods Jenkins Integration</strong>、<strong>Xcode integration</strong>、<strong>Keychains and Provisioning Profiles Management</strong>等。以上3个插件加上<strong>fir-plugin</strong>是我们必要的,你可以根据不同的构建选择不同的插件。</p>
<p>这个iOS构建我添加了<strong>Xcode integration</strong>,用于控制iOS的编译</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/B01794F7-1803-433F-97D7-FC355ECFA4A9.png?raw=true" alt="Jenkins iOS设置1" /></p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/B0BF8F87-6419-4ACE-989B-BDC1CDCD205B.png?raw=true" alt="Jenkins iOS设置2" /></p>
<p>这里大部分的数据都在环境变量选项已经设置过了,简单贴一下环境变量的设置:</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/18220E3E-16CF-43BE-A531-82E776798120.png?raw=true" alt="Jenkins 环境变量设置" /></p>
<p>这里注意按照自己的路径设置,相对来说设置还是比较简单的。</p>
<p>比较麻烦的是关于keychain的设置,<strong>Keychains and Provisioning Profiles Management</strong>插件是必要的,安装完之后我们就可以继续设置工程了。</p>
<p>首先要在钥匙串中导出keychain,然后在<code class="highlighter-rouge">Jenkins</code>的系统管理中找到<strong>Keychains and Provisioning Profiles Management</strong>选项。在这里选择上传文件上传keychain,然后点击添加证书填入要选择的签名证书名称。然后填写<strong>Provisioning Profiles</strong>文件的名称以及<strong>UUID</strong>这里path可以设置为系统默认的path一般xcode会把预编译文件存放在这个目录下。</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/D22F6C20-ACCB-44CF-8315-0289A2C7EBB6.png?raw=true" alt="Jenkins Manage Keychain and Provisioning Profile files" /></p>
<p>在系统管理中设置完keychain后就可在任务的设置中继续设置了。添加keychain然后在keychain选项可以选择你刚才设置的keychain,然后选择需要的<strong>Code Signing Identity</strong>,<strong>Provisioning Profiles</strong>也是同理勾选<strong>Mobile Provisioning Profiles</strong>后然后设置。</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/70E28929-C858-4336-BC01-1882B3728039.png?raw=true" alt="Jenkins Keychains and Code Signing Identities" /></p>
<p>ok,到此为止就可以进行构建了。</p>
<p>我在自己构建的时候遇到了一种情况,打包的时候失败了,构建日志告诉我<strong>CODE_SIGN_RESOURCE_RULES_PATH</strong>没有设置,这个是在.xcodeproj文件中buildSetting里设置的,但是提交appstore的是不需要<strong>CODE_SIGN_RESOURCE_RULES</strong>,如果遇到这种情况记得设置。</p>
<p>最后在<code class="highlighter-rouge">fir.im</code>的官网下载插件,填写<strong>API Token</strong>和包地址,上传到fir即可。</p>
<p><img src="https://github.com/qtdc1229/tutorial/blob/newbranch/resources/9AD8E605-0FAA-4B46-A095-B6B29193734D.png?raw=true" alt="Jenkins fir.im" /></p>
<p>如何自动化?这里有多种形式,设置都在<strong>构建触发器</strong>模块中
* 触发远程构建 (例如,使用脚本)</p>
<ul>
<li>
<p>添加svn的hock文件,每次提交时根据我们的关键字会自动构建。</p>
</li>
<li>
<p>选择<strong>Poll SCM</strong>然后填写自己定义的日程。规则如下:</p>
</li>
</ul>
<blockquote>
<p>MINUTE HOUR DOM MONTH DOW</p>
</blockquote>
<blockquote>
<p>MINUTE 一小时内多少分钟(0-59)</p>
</blockquote>
<blockquote>
<p>HOUR 一天内多少小时(0-23小时)</p>
</blockquote>
<blockquote>
<p>DOM 一个月内多少天(1-31)</p>
</blockquote>
<blockquote>
<p>MONTH 每月(1-12)</p>
</blockquote>
<blockquote>
<p>DOW 星期几(0-7),其中0和7都表示周日。</p>
</blockquote>
<blockquote>
<p>如果要指定一个字段允许多个值,就按下面提供的操作步骤(指定)。</p>
</blockquote>
<blockquote>
<p>优先顺序如下:</p>
</blockquote>
<blockquote>
<p>‘*’ 可用来指定所有有效的值。</p>
</blockquote>
<blockquote>
<p>‘M-N’ 可以用来指定一个范围,比如“1-5”</p>
</blockquote>
<blockquote>
<p>‘M-N/X’或’<em>/X’ 可用于在指定范围内跳跃一个X的值,比如在MINUTE字段中”</em>/15”表示”0,15,30,45”,”1-6/2”表示”1,3,5”。</p>
</blockquote>
<blockquote>
<p>‘A,B,…,Z’ 可以用来指定多个值,比如“0,30”或“1,3,5”。</p>
</blockquote>
<blockquote>
<p>任何空白行和’#’开始的行都将表示为注释而不予理睬。</p>
</blockquote>
<blockquote>
<p>此外,’‘@yearly’, ‘@annually’, ‘@monthly’, ‘@weekly’, ‘@daily’, ‘@midnight’, ‘@hourly’都是支持的 。</p>
</blockquote>
<blockquote>
<p>举例说明:</p>
</blockquote>
<blockquote>
<p>#每分钟</p>
</blockquote>
<blockquote>
<p><code class="highlighter-rouge">
* * * * *
</code></p>
</blockquote>
<blockquote>
<p>#每一小时后第5分钟</p>
</blockquote>
<blockquote>
<p><code class="highlighter-rouge">
5 * * * *
</code></p>
</blockquote>
<h3 id="section-3">小结</h3>
<p>公司比较小,之前也很有程序构建上的经验,不过这是一个机会能够一步一步去实践,完成从无到有,从有到强的过程。</p>
<h3 id="section-4">参考</h3>
<p><a href="https://kkbox.codes/archives/2015/07/03/kkbox-ios-jenkins/">KKBOX iOS 開發過程中使用的 Jenkins 環境</a></p>
<p><a href="https://www.built.io/blog/2014/10/how-to-set-up-customized-jenkins-for-ios/">How to Set Up Customized Jenkins for iOS</a></p>
<p><a href="http://blog.csdn.net/ilyzj/article/details/8123150">Hudson poll scm 时间格式说明</a></p>
<p><a href="http://rannie.github.io/ios/2014/12/29/xcodebuild-jenkins-ci.html">使用 Xcodebuild + Jenkins + Apache 做 iOS 持续集成</a></p>
</description>
<pubDate>Wed, 20 Jan 2016 15:29:33 +0800</pubDate>
<link>https://qtdc1229.github.io/%E5%AE%9E%E8%B7%B5%E4%B9%8B%E8%B7%AF/2016/01/20/zhuan-zhu-yi-dong-kai-fa-zhi-lu.html</link>
<guid isPermaLink="true">https://qtdc1229.github.io/%E5%AE%9E%E8%B7%B5%E4%B9%8B%E8%B7%AF/2016/01/20/zhuan-zhu-yi-dong-kai-fa-zhi-lu.html</guid>
<category>实践之路</category>
</item>
<item>
<title>关于注释以及文档</title>
<description><hr />
<p>#关于注释</p>
<p>作为一个懒人。。。一般注释都不写的。。。其实不写注释也是有原因的:项目太紧。。我记忆力很好。。只有我一个人看。。(这都是借口啊)</p>
<p>最近公司来了一些新人,我这边有两个给人家讲代码的时候就抓瞎了。。回头过来发现自己1-2两年的代码全部都忘掉(其实前几个月的迭代也忘掉了)。。。还得好好看看为啥写了这些。。。
基于这个问题,查找了一下关于注释以及文档的相关插件程序,收益还是蛮大的。</p>
<h3 id="vvdocumenter-xcode">VVDocumenter-Xcode</h3>
<p>首先感谢<a href="http://onevcat.com/">onevcat</a>同学的<code class="highlighter-rouge">Xcode</code>注释插件<a href="https://github.com/onevcat/VVDocumenter-Xcode">VVDocumenter-Xcode</a>。(其实这个插件我安装了很久了。。。一直懒得使用)</p>
<p>以下是该插件在<code class="highlighter-rouge">Xcode</code>中的用法。</p>
<p><img src="https://raw.github.com/onevcat/VVDocumenter-Xcode/master/ScreenShot.gif" alt="Screenshot" />
&gt; 同样支持<a href="https://developer.apple.com/swift/">Swift</a></p>
<p><img src="https://raw.github.com/onevcat/VVDocumenter-Xcode/master/vvdocumenter-swift.gif" alt="Screenshot" /></p>
<p>用法很简单,安装一样很简单,下载程序后编译<code class="highlighter-rouge">VVDocumenter-Xcode</code>target即可,程序会自动把插件添加到<code class="highlighter-rouge">~/Library/Application Support/Developer/Shared/Xcode/Plug-ins</code>位置。重新启动<code class="highlighter-rouge">Xcode</code>后,可以在window菜单中看到’VVDocumenter’的选项,安装完成。看看人家写的插件也是挺有意思的。
写好注释后就要去生成文档了。
###appledoc</p>
<p>之前没怎么写过文档。。。要写文档就凌乱了。。。怎么办呢?注释应该可以自动生成文档吧?找个工具?
google了一下发现了<a href="http://blog.devtang.com/blog/">唐乔的博客</a>中<a href="http://blog.devtang.com/blog/2012/02/01/use-appledoc-to-generate-xcode-doc/">使用Objective-C的文档生成工具:appledoc</a>提到了<code class="highlighter-rouge">appledoc</code>这个文档生成器,当然是为objectc开发的。
根据他的描述有三个比较流行的工具:<a href="http://www.stack.nl/~dimitri/doxygen/index.html"><code class="highlighter-rouge">doxygen</code></a>,<a href="http://developer.apple.com/opensource/tools/headerdoc.html"><code class="highlighter-rouge">headdoc</code></a>和<a href="http://gentlebytes.com/appledoc/"><code class="highlighter-rouge">appledoc</code></a>。</p>
<p>我听从了他的选择直接使用了<code class="highlighter-rouge">appledoc</code>。以下是<code class="highlighter-rouge">appledoc</code>的优点</p>
<blockquote>
<ul>
<li>它默认生成的文档风格和苹果的官方文档是一致的,而doxygen需要另外配置。</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>appledoc就是用objective-c生成的,必要的时候调试和改动也比较方便。</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>可以生成docset,并且集成到<code class="highlighter-rouge">xcode</code>中。这一点是很赞的,相当于在源码中按住option再单击就可以调出相应方法的帮助。</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>appledoc源码在github上,而doxygen在svn上。我个人比较偏激地认为比较活跃的开源项目都应该在github上。</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>相对于headerdoc,它没有特殊的注释要求,可以用<code class="highlighter-rouge">/** */</code> 的格式,也可以兼容<code class="highlighter-rouge">/*! */</code>的格式的注释,并且生成的注释有汇总页面。</li>
</ul>
</blockquote>
<p>直接生成docset真的不错哦,不用我去分发多好。<code class="highlighter-rouge">appledoc</code>的安装也很简单,在github上下载程序后,在解压目录下执行一下语句:</p>
<p><code class="highlighter-rouge">
$sudo sh install-appledoc.sh
</code>
ok完成安装后,让我们来看看是如何使用的,举一个简单的例子:</p>
<p><code class="highlighter-rouge">
$appledoc --project-name MyProject --project-company ibireme ./
</code>
这样直接就可以将编译好的<code class="highlighter-rouge">docset</code>放入<code class="highlighter-rouge">Xcode</code>的doc目录。</p>
<p>更多使用方法可以使用查询命令:</p>
<p><code class="highlighter-rouge">
$sudo sh install-appledoc.sh
</code></p>
<p>这这里学到一个小技巧,经常有同学直接用脚本发布包,这里也可以直接用脚本生成文档。</p>
<ol>
<li>选中你的工程,点击Add Target按钮,选择 Other -&gt; Aggregate模板新建.</li>
<li>点击Add Build Phase按钮,添加一个Run Script.</li>
<li>把下面的模板代码复制进去,把前几行参数改成你自己的.</li>
<li>在Xcode左上角选择这个新建的Target,然后点击build.</li>
<li>文档就会编译好并且自动安装进Xcode了(重启Xcode生效).</li>
</ol>
<p><code class="highlighter-rouge">AppleScript
#appledoc Xcode script
# Start constants
company="ACME";
companyID="com.ACME";
companyURL="http://ACME.com";
target="iphoneos";
#target="macosx";
outputPath="~/help";
# End constants
/usr/local/bin/appledoc \
--project-name "${PROJECT_NAME}" \
--project-company "${company}" \
--company-id "${companyID}" \
--docset-atom-filename "${company}.atom" \
--docset-feed-url "${companyURL}/${company}/%DOCSETATOMFILENAME" \
--docset-package-url "${companyURL}/${company}/%DOCSETPACKAGEFILENAME" \
--docset-fallback-url "${companyURL}/${company}" \
--output "${outputPath}" \
--publish-docset \
--docset-platform-family "${target}" \
--logformat xcode \
--keep-intermediate-files \
--no-repeat-first-par \
--no-warn-invalid-crossref \
--exit-threshold 2 \
"${PROJECT_DIR}"
</code>
###小结</p>
<p>阅读了下<a href="http://onevcat.com/">onevcat</a>同学的代码,学习到不少东西,MacOS的程序没怎么写过,一直想弄一个一键同步kindle的东西,后来以不了了之了。。。还是要勤快点好。。。注释、文档一定要有不能懒了。。</p>
<h3 id="section">参考</h3>
<ol>
<li><a href="http://blog.ibireme.com/2013/08/26/appledoc-guide/">用appledoc生成文档</a></li>
<li><a href="https://github.com/onevcat/VVDocumenter-Xcode/blob/master/README.md">VVDocumenter-Xcode_Readme</a></li>
<li><a href="http://blog.devtang.com/blog/2012/02/01/use-appledoc-to-generate-xcode-doc/">使用Objective-C的文档生成工具:appledoc</a></li>
</ol>
</description>
<pubDate>Mon, 29 Dec 2014 15:29:33 +0800</pubDate>
<link>https://qtdc1229.github.io/%E5%AE%9E%E8%B7%B5%E4%B9%8B%E8%B7%AF/2014/12/29/guan-yu-zhu-shi.html</link>
<guid isPermaLink="true">https://qtdc1229.github.io/%E5%AE%9E%E8%B7%B5%E4%B9%8B%E8%B7%AF/2014/12/29/guan-yu-zhu-shi.html</guid>
<category>实践之路</category>
</item>
<item>
<title>利用Octopress写博客(在Mac环境搭建)</title>
<description><p><img src="http://beyondvincent.com/images/2013/08/github_page_and-octopress.png" alt="github + octopress" /></p>
<hr />
<h1 id="gitpress">你好,gitpress</h1>
<p>大家好,这是我的第一篇blog,写些什么呢,就记录下怎么建立这个小blog的过程吧,权当大家参考。</p>
<h3 id="blog">为什么搭建这个blog</h3>
<p>作为一个iOS开发者,互联网穿梭歌者,阅读各种文章必不可少,在这中间发现了<a href="http://beyondvincent.com/">破船之家</a>、<a href="http://onevcat.com/">OneV’s Den</a>、<a href="http://blog.devtang.com/">唐巧的技术博客</a>这些优秀的iOS开发博客,在这当中发现这些博客几乎都是使用了Octopress这个framwork搭建的。Octopress本身是基于Jekyll的,而jekyll这个开源的blog软件是<a href="http://en.wikipedia.org/wiki/Tom_Preston-Werner">Tom Preston-Werner</a>用ruby完成的(wiki了一下这哥们原来是github的CEO,果然很NB)。什么样的blog软件值得这么多人风靡呢?基于这个疑问我只好hacker一把,尝试的完成了这个blog的搭建。</p>
<p>这个blog是搭建在github上的这个就不多说了,github已经成为coder界最神奇最风靡的一个异次元空间。Octopress因为基于jekyll所以对github支持非常优秀。搭建这个blog可以促进git的学习使用,同时markdown的书写习惯也可以多多练习。markdown编辑器是<a href="http://mouapp.com/">Mou</a>,书写方法参考了<a href="https://www.zybuluo.com/mdeditor">cmd在线编辑</a>。</p>
<h3 id="ruby--bundle--octopress-">ruby + bundle + Octopress 的安装</h3>
<p>整个安装过程可以参考官方文档 http://octopress.org/docs/setup/ 这里大概说说,自己遇到的问题也说一下。</p>
<p>mac系统本身是带有<code class="highlighter-rouge">ruby</code>的,这里可以确认下<code class="highlighter-rouge">ruby</code>的版本:</p>
<p><code class="highlighter-rouge">
$ ruby --version //确认 ruby的版本
</code>
如果小于1.9.3或者没有安装需要先安装<code class="highlighter-rouge">RVM</code>,然后安装<code class="highlighter-rouge">ruby</code></p>
<p><code class="highlighter-rouge">
$ curl -L https://get.rvm.io | bash -s stable --ruby ruby的版本
$ rvm install 1.9.3
$ rvm use 1.9.3
$ rvm rubygems latest
</code>
然后再使用<code class="highlighter-rouge">ruby --version</code>确认<code class="highlighter-rouge">ruby</code>是否已经安装。
参考:<a href="http://octopress.org/docs/setup/rvm/">Installing Ruby With RVM</a></p>
<p>在安装Octopress之前,请确保你的电脑上已经安装有<code class="highlighter-rouge">git</code>了,在终端输入<code class="highlighter-rouge">git --version</code>,应该可以看到电脑中的<code class="highlighter-rouge">git</code>版本,如果没有显示相关内容,请先安装<code class="highlighter-rouge">git</code>。</p>
<p><code class="highlighter-rouge">git</code>安装之后,利用<code class="highlighter-rouge">git</code>命令将<code class="highlighter-rouge">octopress</code>从<code class="highlighter-rouge">github</code>上clone到本机</p>
<p><code class="highlighter-rouge">
$ git clone git://github.com/imathis/octopress.git octopress
$ cd octopress # If you use RVM, You'll be asked if you trust the .rvmrc file (say yes).
</code>
接着安装相关依赖项:</p>
<p><code class="highlighter-rouge">
$ gem install bundler
$ rbenv rehash # If you use rbenv, rehash to be able to run the bundle command
$ bundle install
</code>
* 这里使用<code class="highlighter-rouge">gem</code>的时候注意,由于<code class="highlighter-rouge">gem</code>默认的包是来源于Amazon的服务器所以很大的可能会被GFW阻挡,因此可以将<code class="highlighter-rouge">gem</code>的源转移到淘宝的<a href="https://ruby.taobao.org/">RubyGems</a>。</p>
<p>最后安装默认的Octopress 主题。</p>
<p><code class="highlighter-rouge">
$ rake install
</code>
参考: <a href="http://octopress.org/docs/setup/">Octopress Setup</a></p>
<h3 id="octopress">配置Octopress</h3>
<p>Octopress主要有三种部署模式:</p>
<ul>
<li>1、部署在GitHub Pages。<a href="http://octopress.org/docs/deploying/github">Deploying to GitHub Pages »</a></li>
<li>2、部署在Heroku。<a href="http://octopress.org/docs/deploying/heroku">Deploying to Heroku »</a></li>
<li>3、部署在自己的服务器。(Rsync模式)<a href="http://octopress.org/docs/deploying/rsync">Deploying with Rsync »</a></li>
</ul>
<p>这里主要说在github的部署,其余请查阅对应链接。</p>
<p>Octopress的作者已经尽量让配置简化了。大多数情况下只需要配置<code class="highlighter-rouge">_config.yml</code>和<code class="highlighter-rouge">Rakefile</code>文件即可。其中Rakefile是跟博客部署相关,一般情况下并不需要修改这个文件,除非使用了rsync。</p>
<p><code class="highlighter-rouge">config.yml</code>是博客重要的一个配置文件,在config.yml文件中有三大配置项:<code class="highlighter-rouge">Main Configs</code>、<code class="highlighter-rouge">Jekyll &amp; Plugins</code>和<code class="highlighter-rouge">3rd Party Settings</code>。</p>
<p>一般,该文件中其中<code class="highlighter-rouge">url</code>是必须要填写的,这里的url是在github上创建的一个仓库地址,具体请看第四步中创建的地址。另外再修改一下<code class="highlighter-rouge">title</code>、<code class="highlighter-rouge">subtitle</code>和<code class="highlighter-rouge">author</code>,根据需求,在开启一些第三方组件服务。</p>
<p>关于<code class="highlighter-rouge">_config.yml</code>文件中的更多内容,请看这里的内容:<a href="http://octopress.org/docs/configuring/">Configuring Octopress</a></p>
<h3 id="octopressgithub-pages">将Octopress部署到GitHub Pages上</h3>
<p>首先需要在github上申请一个免费账号,然后<a href="https://github.com/new">创建一个资源库</a>资源库需要命名为:<code class="highlighter-rouge">username.github.io</code>、<code class="highlighter-rouge">username.github.com</code>或<code class="highlighter-rouge">organization.github.com</code>,这个地址就是配置完毕后我们访问blog的地址。
创建好仓库后我们需要利用octopress在rakefile文件中配置好的的task来设置blog。可以先使用下面的命令:</p>
<p><code class="highlighter-rouge">
$ rake setup_github_pages
</code>
上面的命令会做一些事情(详细介绍看下面给出的参考链接)。其中最主要的就是创建一个_deploy目录,目录用来存放部署到master分支的内容。期间会要求你输入仓库的url,根据提示,进行输入即可。</p>
<p>完成上面的命令后我们就可以生成blog,然后部署到服务器上了。</p>
<p><code class="highlighter-rouge">
$ rake generate
$ rake deploy
</code>
执行玩<code class="highlighter-rouge">deploy</code>后,就可以访问刚才你申请资源库名称了。</p>
<p>至此你已经基本完成了octopress的部署。</p>
<h3 id="blog-1">新添加一篇blog</h3>
<p>Octopress为我们提供了一些task来创建博文和页面。博文必须存储在source/_posts目录下,并且需要按照Jekyll的命名规范对文章进行命名:YYYY-MM-DD-post-title.markdown。文章的名字会被当做url的一部分,而其中的日期用于对博文的区分和排序。</p>
<p>通过Octopress提供的task可以正确的按照命名规范创建一个博文,并且在博文中会附带常用的一些yaml元数据。只需要在终端输入如下命令:</p>
<p><code class="highlighter-rouge">
$ rake new_post["title"]
</code>
其中title为博文的文件名,创建出来的文件默认是markdown格式。上面的命令会创建出这样一个文件:<code class="highlighter-rouge">source/_posts/2014-10-09-title.markdown</code>。</p>
<p>打开这个文件,可以看到里面有如下一些内容了(告诉Jekyll博客引擎如何处理博文和页面):</p>
<p><code class="highlighter-rouge">
---
layout: post
title: "title"
date: 2013-08-03 16:36
comments: true
categories:
---
</code>
接着我们就可以在这个文件中写我们的博文啦。完成之后,我们可以预览和部署博文。下面是创建并部署博文的一个完整过程:</p>
<p><code class="highlighter-rouge">
$ rake new_post["New Post"]
$ rake generate
$ git add .
$ git commit -am "Some comment here."
$ git push origin source
$ rake deploy
</code>
参考:<a href="http://octopress.org/docs/blogging/">Start blogging with Octopress</a></p>
<h3 id="section">小结</h3>
<p>在这之后还需要做很多,比如评论插件、分享插件的添加,有自己域名了可以把这个再指向自己的域名,还有一些关于自己个性化的配置。在之后慢慢完善吧。</p>
<h3 id="section-1">参考</h3>
<ul>
<li>1、<a href="http://beyondvincent.com/blog/2013/08/03/108-creating-a-github-blog-using-octopress/">利用Octopress搭建一个Github博客</a></li>
<li>2、<a href="http://blog.devtang.com/blog/2012/02/10/setup-blog-based-on-github/">象写程序一样写博客:搭建基于github的博客</a></li>
<li>3、<a href="http://octopress.org/docs/">Octopress Documentation</a></li>
</ul>
</description>
<pubDate>Thu, 09 Oct 2014 15:29:33 +0800</pubDate>
<link>https://qtdc1229.github.io/gitpress/2014/10/09/li-yong-octopressxie-bo-ke-(zai-machuan-jing-da-jian-).html</link>
<guid isPermaLink="true">https://qtdc1229.github.io/gitpress/2014/10/09/li-yong-octopressxie-bo-ke-(zai-machuan-jing-da-jian-).html</guid>
<category>gitpress</category>
</item>
</channel>
</rss>