-
Notifications
You must be signed in to change notification settings - Fork 13
/
atom.xml
580 lines (384 loc) · 36.9 KB
/
atom.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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[Phenmod Zhu's Blog]]></title>
<link href="http://phenmod.com/atom.xml" rel="self"/>
<link href="http://phenmod.com/"/>
<updated>2016-02-04T15:59:17+08:00</updated>
<id>http://phenmod.com/</id>
<author>
<name><![CDATA[朱兴灿]]></name>
</author>
<generator uri="http://octopress.org/">Octopress</generator>
<entry>
<title type="html"><![CDATA[Brew 的工作细节]]></title>
<link href="http://phenmod.com/blog/2016/01/20/brew-internal/"/>
<updated>2016-01-20T21:17:23+08:00</updated>
<id>http://phenmod.com/blog/2016/01/20/brew-internal</id>
<content type="html"><![CDATA[<p>本文将大略讲一下 brew 的工作细节。对普通的使用者来说,只要看明白使用文档就好,了不了解这些内容并不重要。有些内容(用斜体标出的部分)我也不太确定是否正确,还待后续修改。</p>
<h3>brew 本身的文件位置</h3>
<p>通过 <code>which brew</code> 命令,可以发现 brew 命令的可执行文件的路径为 /usr/local/bin/brew,它是个 shell 脚本。用文本编辑软件打开,可以发现它实际上是读取系统使用的 ruby 的路径,来执行 /usr/local/Library/brew.rb。</p>
<p>brew 软件本身的各个文件 <em>全部</em> 在 /usr/local/Library 目录下,可以在它的三个子目录 bin/、Library/、share/ 下找到安装后的 brew 文件。比如,/usr/local/bin/brew 就是 brew 的可执行文件。具体每个brew的子命令都是一个个的 ruby 脚本,比如,<code>brew search</code> 就是 /usr/local/Library/Homebrew/cmd/search.rb。</p>
<p>每个使用brew安装的软件都有一个对应的ruby脚本,我们称为 Formula,<code>brew install <package_name></code>安装命令其实就是读取这个脚本里的配置,下载源码,然后运行配置里写好的安装命令。这些脚本放在 /usr/local/Library/Formula 下,使用 <code>brew update</code> 从github拉取最新版本的 brew 时,会在命令行运行结束后看到提示,哪些软件有版本更新,新增了哪些软件。</p>
<h3>brew 安装软件的细节</h3>
<p>软件下载下来之后,缓存在 /Library/Caches/Homebrew 目录中,你会在这个目录下发现一堆你下载过的软件包。如果你已安装某软件,然后用 <code>brew reinstall <package_name></code> 重新安装该版本,就不需要重新下载了,它会直接使用已下载的软件进行安装。</p>
<p>brew 大多是直接下载源码然后编译安装,安装命令如 <code>./configure && make install</code>。并且,在安装本软件之前,会先安装脚本里指明的本项目的依赖库。</p>
<p>软件安装的目录是 /usr/local/Cellar/<package_name>/<version>/,比如 /usr/local/Cellar/autojump/22.2.4/。源码编译完成后,生成的文件都会放在这里,如果是直接下载的可执行文件,也会直接放在这里。每个版本的软件都会放在对应版本名称的文件夹下。一般的软件可能会包含可执行文件、供其它库使用的头文件、运行库、文档等文件或目录,为了方便升级管理,,brew 会把这些文件或目录分别软链接到 /usr/local/bin/、/usr/local/include/、/usr/local/lib/、/usr/local/share/ 等目录下。</p>
<p>如果你用 <code>brew upgrade <package_name></code> 更新过几次该软件,你所有安装过的版本都会在 /usr/local/Cellar/<package_name>/ 目录下找到。每次升级时,brew都是先把可执行文件等都编译到当前版本目录下,撤销之前版本的软链接,然后再将新版本软链接到 /usr/local 的各子文件夹下。这样,我们就会使用到最新版本了。</p>
<p>你也可以使用 <code>brew swith</code> 来切换使用软件的某具体版本。比如,<code>brew swith autojump 22.1.4</code> 。</p>
<p>时间久了,你的安装文件会越来越多,这时候可以用 <code>brew cleanup</code> 清理掉不想用的旧版本,这样会会节省出来大量硬盘空间。如果你不想直接删掉,可以使用 <code>brew cleanup -n</code> 命令,它相当于预演一下,告诉你真正运行 <code>brew cleanup</code> 时会干些什么,而不会真正执行。检查完毕确定可以删除后,你再 <code>brew cleanup</code> 就安全多了。brew 的很多命令都支持 <code>-n</code> 参数,也就是 <code>--dry-run</code> 参数,这些就需要你自己去翻文档了。</p>
<p>brew 还提供了很多其他命令,有需要的话自己 <code>man brew</code> 查看吧。</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[用 Brew 安装管理软件]]></title>
<link href="http://phenmod.com/blog/2016/01/09/use-brew/"/>
<updated>2016-01-09T17:11:11+08:00</updated>
<id>http://phenmod.com/blog/2016/01/09/use-brew</id>
<content type="html"><![CDATA[<p>看看 brew 官网的<a href="http://brew.sh/">介绍</a>,</p>
<blockquote><p><code>The missing package manager for OS X</code></p></blockquote>
<p>Mac OS 没有提供软件包管理器,不能像在 linux 上能使用 apt-get 那样,从软件仓库中搜索、安装、升级软件。就有大神 <a href="https://github.com/mxcl">Max Howell</a> 写了个 brew。</p>
<p>brew 项目在 github 上的地址是 <a href="https://github.com/Homebrew/homebrew">https://github.com/Homebrew/homebrew</a>,brew 本身及每个软件的版本更新维护都是在这里通过提 pr 的方式进行。</p>
<h2>安装</h2>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</span></code></pre></td></tr></table></div></figure>
<h2>常用命令</h2>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>brew search <package_name> # 搜索
</span><span class='line'>brew install <package_name> # 安装一个软件
</span><span class='line'>brew update # 从服务器上拉取,并更新本地 brew 的包目录
</span><span class='line'>brew upgrade <package_name> # 更新软件
</span><span class='line'>brew outdated # 查看你的软件中哪些有新版本可用
</span><span class='line'>brew cleanup # 清理老版本。使用 `-n` 参数,不会真正执行,只是打印出真正运行时会做什么。
</span><span class='line'>brew list --versions # 查看你安装过的包列表(包括版本号)
</span><span class='line'>brew link <package_name> # 将软件的当前最新版本软链到`/usr/local`目录下
</span><span class='line'>brew unlink <package_name> # 将软件在`/usr/local`目录下的软链接删除。
</span><span class='line'>brew info # 显示软件的信息
</span><span class='line'>brew deps # 显示包依赖</span></code></pre></td></tr></table></div></figure>
<h2>brew 的子软件包</h2>
<p>我们常用的其实是 brew 的主包,里面有比较常用的软件,比如 <code>erlang</code>、<code>cloc</code>、<code>cmake</code>、<code>tree</code>等。但还有些比如科学计算相关的软件,并不是很常用,数量又很多,就会根据类型单独分到一个子软件包里。在安装 brew 的时候,并不会将这些软件的 <code>Formula</code> 下载到本地,要想使用的话,应该先安装该子软件包。</p>
<p>比如 opencv 在 science 子软件包里,安装的时候需要先使用命令 <code>brew tap homebrew/science</code> 将 <code>science</code> 子软件包下载下来,然后再 <code>brew install opencv</code>。或者你也可以直接指明软件所在的子包,通过 <code>brew install homebrew/science/opencv</code> 命令来安装,这个命令会先 <code>tap</code> 该子软件包,再安装软件。<code>homebrw/science</code> 项目的 github 地址是:<a href="https://github.com/Homebrew/homebrew-science">https://github.com/Homebrew/homebrew-science</a>,tap下来的 science 的 <code>Formula</code> 放在 <code>/usr/local/Library/Taps/homebrew/homebrew-science</code> 目录下。</p>
<p>你可以在 github 上看到 brew 的其它子软件包:<a href="https://github.com/Homebrew">https://github.com/Homebrew</a>,比如 <code>homebrew-games</code>、<code>homebrew-emacs</code> 等。</p>
<h2>使用 brew cask</h2>
<p>brew 会对依赖的软件也进行安装,并且配置环境,再复杂的安装也就是一条命令而已,这对需要安装各种运行环境的程序员来说,简直是天大的福音。但 brew 是通过下载源码的方式进行安装的,alfred、dropbox、chrome 等软件能使用 brew 直接安装软件么?答案是可以的,有工具 brew cask。</p>
<p>官网地址:<a href="http://caskroom.io/">caskroom.io</a></p>
<p>github地址:<a href="https://github.com/caskroom/homebrew-cask">brew cask</a></p>
<p>它扩展了 brew,以优雅、简单、快速地安装和管理 OS X 图形界面程序为己任,目前已收集了 2941 个常用软件,并有 433 个维护人员。</p>
<pre><code>brew tap caskroom/cask # 添加 github 上的 caskroom/cask 库
brew install brew-cask # 安装 brew-cask
brew cask install google-chrome # 安装 chrome 浏览器
brew update && brew upgrade brew-cask && brew cleanup # 更新
brew search <package_name> # 搜索想要的软件。
</code></pre>
<p>brew cask装的软件会放到 <code>/opt/homebrew-cask/Caskroom</code> 下面,然后软链接到 <code>~/Applications</code>。 跟我们手动安装软件的默认位置 <code>/Applications</code> 不一样。</p>
<p>一些我安装的软件:alfred appcleaner cheatsheet chrome dropbox haskell-platform launchrocket onepassword totalfinder</p>
<h3>通过 brew cask 安装 Finder 的文件预览插件</h3>
<p>我们可以在 Finder 里选中某个文件后,敲一下空格键,Finder 会弹出一个这个文件的预览窗口,这会让我们直接看到这个文件的内容,而不用打开关闭该文件,在是个非常实用的功能。如果你的 Finder 像我一样始终是以<code>分栏</code>的方式显示的话,在选中文件后,Finder 右侧会直接显示改文件内容,那就更方便了。</p>
<p>但是,支持预览的文件格式只有系统默认的一些如图片、pdf等,还有很多格式的软件,如 json、xml、markdown、html等,我们是不能通过 Finder 的文件预览来查看的。</p>
<p>所以,强烈推荐装一些<a href="https://github.com/sindresorhus/quick-look-plugins">插件</a></p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>brew cask install qlcolorcode qlstephen qlmarkdown quicklook-json qlprettypatch quicklook-csv betterzipql webp-quicklook suspicious-package</span></code></pre></td></tr></table></div></figure>
<h3>其它</h3>
<p>如果你经常使用 Alfred 启动程序,那么你会想 Alfred 可以搜索 brew cask 安装的程序,实现这些仅需运行:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>brew cask alfred link</span></code></pre></td></tr></table></div></figure>
<p>此外,你还可以通过 brew cask 安装 <a href="https://github.com/jimbojsb/launchrocket">launchrocket</a>,来管理通过 brew 安装的 service。</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[用 ClangFormat 插件格式化 Objective-C 代码]]></title>
<link href="http://phenmod.com/blog/2015/11/17/use-clangformat-to-format-objective-c-code/"/>
<updated>2015-11-17T20:26:17+08:00</updated>
<id>http://phenmod.com/blog/2015/11/17/use-clangformat-to-format-objective-c-code</id>
<content type="html"><![CDATA[<p>多人开发的工程中,每人负责一部分,代码风格各异。如果没有统一的约定,在阅读和维护其他人的代码时,会有各种不适。一些简单的排版工作,比如空格有几个、括号是否换行等等,也会不必要地浪费一些精力。于是不少公司会使用一些工具对代码进行自动格式化,比如 Dropbox、Parse。</p>
<p>在 iOS 工程中,我们使用 <a href="http://clang.llvm.org/docs/ClangFormat.html">ClangFormat</a> 工具来格式化代码,Xcode 有方便的插件可用。插件地址:<a href="https://github.com/travisjeffery/ClangFormat-Xcode">https://github.com/travisjeffery/ClangFormat-Xcode</a>。</p>
<h2>安装</h2>
<ul>
<li>安装 clang-format</li>
</ul>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>brew install clang-format</span></code></pre></td></tr></table></div></figure>
<ul>
<li><p>安装 Xcode 插件 <a href="https://github.com/travisjeffery/ClangFormat-Xcode">ClangFormat-Xcode</a>。可通过 <a href="https://github.com/supermarin/Alcatraz">Alcatraz</a>或者直接下载源代码编译运行,然后重启 Xcode 。</p></li>
<li><p>下载本人使用的<a href="https://github.com/Phenmod/Phenmod.github.io/blob/master/assets/.clang-format">格式配置文件</a>,文件名为 <code>.clang-format</code>,把它放到 <code>/Users/yourname/</code> 下,你的所有工程都会使用本配置文件。也可单独放到某工程文件夹里,仅限本工程使用。</p></li>
</ul>
<p>或者自己使用 clang-format 导出一份配置文件再自己修改。</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>clang-format -style=WebKit -dump-config > .clang-format</span></code></pre></td></tr></table></div></figure>
<blockquote><p>注意,文件名最前面有个点,改名后会变为隐藏文件。如果你的 Finder 不能显示隐藏文件,可运行下面两条命令</p>
<pre><code>defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder
</code></pre></blockquote>
<ul>
<li>勾选上 <code>Xcode -> Edit -> Clang Format -> File</code>,该插件就会使用我们放到用户文件夹的配置文件对源码进行格式化了。</li>
</ul>
<h2>使用方式</h2>
<ul>
<li>可以手动点选 <code>Xcode -> Edit -> Clang Format -> Format File in Focus</code> 对当前选中的文件进行格式化。也可以选择其它两个选项对当前选中的文本或多个文件进行格式化。</li>
<li>可以选中 <code>Xcode -> Edit -> Clang Format -> Enable Format on Save</code>,使之变为 <code>Disable Format on Save</code>,这样在每次 <code>cmd + s</code> 保存文件时,都会自动格式化文件了。</li>
<li>可以给 Xcode 配置系统快捷键。比如我们可以配置 <code>ctr + i</code> 作为对当前选中文件进行格式化的快捷键。步骤如下:
<ul>
<li>打开<code>系统偏好设置 -> 键盘 -> 快捷键 -> 应用程序快捷键</code>,并点击 <code>+</code>。</li>
<li>设置应用程序为 <code>Xcode</code>,菜单标题为 <code>Format File in Focus</code>,快捷键里按下 <code>ctr + i</code>。当然,你也可以使用为其它命令设置快捷键。</li>
</ul>
</li>
</ul>
<p>每个人在提交代码之前,必须格式化代码。
用了这个之后,基本上就不用开发者做排版的事情了,哗啦啦写完代码,一键格式化,人生舒爽了很多。</p>
<h2>格式配置文件</h2>
<p>该插件默认了几种风格可供选用,但都不太符合我们想要的形式,于是自己定义了一个格式配置文件<a href="https://github.com/Phenmod/Phenmod.github.io/blob/master/assets/.clang-format">.format</a></p>
<p>这个是<a href="http://clang.llvm.org/docs/ClangFormatStyleOptions.html">ClangFormat各配置项字段的详细说明</a>,还有个<a href="http://clangformat.com/">用实例解释各字段的可交互网站</a>。</p>
<p>这个是<a href="https://github.com/ParsePlatform/xctoolchain/blob/master/.clang-format">Parse的配置文件</a>,可做参考对比。</p>
<p>我们的这个配置还有很多不足的地方,比如长字符串会因为每行字符数限制被截断成两个字符串,并且每格式化一次,就再多截一段,直至截到某个阶段才不再变化。造成一个好好的字符串,变成了好几个只包含了一个或几个字符的字符串。</p>
<h2>关于空行</h2>
<p>配置文件里我们现在允许最多连续两行空行,正在考虑只允许一行。</p>
<p>确实有分段视觉需求的,使用pragma mark进行分割,如下:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>// =================================================================================================
</span><span class='line'>#pragma mark - <#代码分块注释#>
</span><span class='line'>// =================================================================================================</span></code></pre></td></tr></table></div></figure>
<p>用它定义个<code>code snippet</code>,来个快捷键(我的是pm),省心啊。</p>
<h2>关于每行字符限制</h2>
<p>如果你把上面的 pragma 段拷贝到 xcode,会发现上面那一串等号会终止在第 100 列。没错,我们现在每行字符数限制就是 100。</p>
<p>其实我很想定义到 120,但是在某些同学的 macbook air 的小屏幕上不太够显示。</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[用 Git-flow 做分支管理]]></title>
<link href="http://phenmod.com/blog/2015/11/17/use-git-flow/"/>
<updated>2015-11-17T20:17:50+08:00</updated>
<id>http://phenmod.com/blog/2015/11/17/use-git-flow</id>
<content type="html"><![CDATA[<h2>关于git-flow</h2>
<p>git 鼓励我们多开分支,但是没有一套模型告诉我们如何管理分支,有人总结了一条最佳实践惯例:git-flow,并且提供了一套 <a href="https://github.com/nvie/gitflow">git-flow工具</a>来方便我们实践它。该工具的每个命令都能实现数个 git 命令才能实现的功能,使用起来还是比较方便的。</p>
<p><a href="http://ihower.tw/blog/archives/5140">Git flow 開發流程</a>这篇文章介绍了git-flow的入门使用方式。</p>
<p>git-flow 创始人写的关于 git-flow 的文章:<a href="http://nvie.com/posts/a-successful-git-branching-model/">A successful Git branching model</a>。里面详细描述了 git-flow 的工作方式。这儿有两篇不错的中文翻译: <a href="http://www.uml.org.cn/pzgl/201301065.asp">Git开发管理之道</a>,<a href="http://www.juvenxu.com/2010/11/28/a-successful-git-branching-model/">一个成功的Git分支模型</a> 。</p>
<p>git-flow的<a href="http://danielkummer.github.io/git-flow-cheatsheet/">cheatsheet</a>,里面列出了常用的命令:
<img src="http://danielkummer.github.io/git-flow-cheatsheet/img/git-flow-commands.png" alt="cheatSheet" /></p>
<p>该网页比较直观地展示出每个 git-flow 命令实际都做了哪些操作,值得一看。还提供了中文版,翻译得不咋地。</p>
<h2>安装</h2>
<p>github上git-flow的<a href="https://github.com/nvie/gitflow/wiki/Installation">安装页</a>。</p>
<p>如果在mac上安装了brew,直接用brew安装</p>
<pre><code>brew install git-flow
</code></pre>
<h3>git-flow-completion</h3>
<p>命令行不默认自动补齐git flow命令,安装一个git-flow-completion,它可以让你的Bash、Zsh支持命令行自动补齐,github项目地址<a href="https://github.com/bobthecow/git-flow-completion">在此</a>。</p>
<p>我用的oh-my-zsh,它的最新包里面有git-flow插件(<code>~/.oh-my-zsh/plugins/git-flow</code>),这个插件其实用的就是git-flow-completion的内容。修改~/.zshrc的plugins,添加使用git-flow插件即可。我的plugin列表如下</p>
<pre><code>plugins=(git git-flow git-flow-completion python svn xcode ruby perl)
</code></pre>
<p>(关于brew和oh-my-zsh,参见文章:mac上常用软件)</p>
<h2>使用</h2>
<h3>init</h3>
<p>git flow init [-d]
提示你各个分支的命名及tag前缀。[-d]表示接受所有默认设置。</p>
<h3>开发新功能(feature)</h3>
<p>based on develop</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow feature start login</span></code></pre></td></tr></table></div></figure>
<p>从 <code>develop</code> 分支创建了一个新的分支 feature/login,并自动切换到这个分支下面。然后就可以进行 login 功能开发,中间可以多次的 commit 操作。开发完毕后:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow feature finish login</span></code></pre></td></tr></table></div></figure>
<p>feature/login分支的代码会被合并到 develop 里面,然后删除该分支,切换回 develop. 到此,新功能开发这个场景完毕。</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow feature publish MYFEATURE</span></code></pre></td></tr></table></div></figure>
<p>如果是合作开发,需要发布新特性到远程服务器,其它用户也可以使用这分支。</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow feature pull MYFEATURE</span></code></pre></td></tr></table></div></figure>
<p>取得一个其它用户发布的新特性分支,并签出远程的变更。</p>
<h3>发布上线前(release)</h3>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow release start v0.1.0 [BASE]</span></code></pre></td></tr></table></div></figure>
<p>git-flow 从 <code>develop</code> 分支创建一个新的分支,做发布前的一些事情,如修改版本号,fix最后的一些bug。</p>
<p>完成后,</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow release finish v0.1.0</span></code></pre></td></tr></table></div></figure>
<p>git-flow 会依次切换到 master develop 下合并 release/0.1 里的修改,然后用 git tag 给当次发布打上tag v0.1.0。
release分支里的东西会自动合并到master和develop里。</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow release publish v0.1.0</span></code></pre></td></tr></table></div></figure>
<p>创建 release 分支之后立即发布允许其它用户向这个 release 分支提交见容是个明智的做法。命令十分类似发布新特性。</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow release track v0.1.0</span></code></pre></td></tr></table></div></figure>
<p>签出 v0.1.0 版本的远程变更</p>
<h3>紧急bug修正(hotfix)</h3>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow hotfix start bug1 [BASENAME]</span></code></pre></td></tr></table></div></figure>
<p>git-flow 从 <code>master</code> 分支创建一个新的分支 hotfix/bug1,并切换到该分支下。接下来要做的就是修复 bug,完成后:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow hotfix finish bug1 </span></code></pre></td></tr></table></div></figure>
<p>git-flow 会依次切换到 master、develop 分支下合并 hotfix/bug1,然后删掉 hotfix/bug1。到此,hotfix 完成。</p>
<h3>support分支</h3>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git flow support
</span><span class='line'>git flow support start <release> <base></span></code></pre></td></tr></table></div></figure>
<p>也是从 <code>master</code>创建的新分支,目前不推荐用。</p>
<blockquote><p>git-flow 的 feature、release 都是从 develop 分支创建,hotfix、support 都是从 master 分支创建。</p></blockquote>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[用 Git 做版本控制]]></title>
<link href="http://phenmod.com/blog/2015/11/17/use-git/"/>
<updated>2015-11-17T20:17:39+08:00</updated>
<id>http://phenmod.com/blog/2015/11/17/use-git</id>
<content type="html"><![CDATA[<h2>简介</h2>
<p>Git是个分布式版本管理系统,本地自己的机器上有代码库,远程服务器上也有代码库。每个人要做的事情就是把自己的代码提交到本地,再把别人提交到服务器上的最新代码拉到本地,修改冲突之后,再将最终的正确代码再推送到远程服务器上面去。多从这个概念来理解,很快就能上手了。</p>
<h2>git、ssh配置及bitbucket账号设置</h2>
<p>mac系统有默认git,可以直接使用,从命令行运行以下命令可以见到当前git的版本。
git –-version</p>
<h3>为git设置ssh</h3>
<ol>
<li>运行命令:ssh-keygen ,会让输入名称什么的,直接回车三次即可。运行命令后,出现 ~/.ssh 文件夹,里面有两个文件,分别为 RSA 的公钥和私钥,将公钥文件 id_rsa.pub 里的内容拷贝出来。</li>
<li>当前我们的代码托管在 bitbucket.org 上,需要你注册一个bitbucket.org账号。</li>
<li>进入 bitbucket 的个人账户管理页面,找到 “SSH Keys",点击 "Add key",将第一步中 id_rsa.pub 里的内容粘贴进去。</li>
</ol>
<p>参见:</p>
<ul>
<li><a href="http://boliquan.com/bitbucket-method-of-use/">Bitbucket 使用方法</a></li>
<li><a href="http://confluence.atlassian.com/display/BITBUCKET/Set+up+SSH+for+Git">Set up SSH for Git</a></li>
</ul>
<h2>试用一下</h2>
<p>配置完成之后自己新建个工程传到 bitbucket 上去,并且试用一下其基本功能。</p>
<p>我们最常用的就是下面这几个命令:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git add . # 如果有新添加的文件,将这些文件添加到本地版本库
</span><span class='line'>git commit -am "changed something" # 然后将代码提交到本地代码库
</span><span class='line'>git pull origin develop # 把服务器代码库上 develop 分支的最新代码拉下来,自动合并到本地代码库的 develop 分支
</span><span class='line'>…… # 如果有冲突,修改冲突代码,然后再次 commit
</span><span class='line'>git push origin develop # 将本地develop分支的代码提交到服务器的 develop 分支</span></code></pre></td></tr></table></div></figure>
<p>有了上面这四个,基本的功能就可以实现了。</p>
<p>从服务器上拉下最新代码之前,如果不想提交当前代码,可以这样:</p>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git stash #将当前工程暂存
</span><span class='line'>git pull origin develop #更新远程服务器上的代码到本地
</span><span class='line'>git stash pop #弹出刚才暂存的当前工程,合并代码</span></code></pre></td></tr></table></div></figure>
<h2>推荐教程</h2>
<ol>
<li><a href="http://sites.google.com/site/nanjunjie/download/Git_Magic_CN.pdf">Git Magit</a>:很简单很优秀的一个入门教程。</li>
<li><a href="http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000">Git 教程</a>:另一个浅显易懂的教程。</li>
<li><a href="http://marklodato.github.io/visual-git-guide/index-zh-cn.html">图解 Git</a>:常用命令的工作原理,有助于透彻理解。</li>
<li><a href="http://www.open-open.com/lib/view/open1328069609436.html">Git 详解</a>:比较全面的介绍了Git的使用。</li>
<li><a href="http://git-scm.com/book/en/v2">Pro Git</a>:git官网上的书,覆盖全面,深入浅出,原理介绍得透彻。推荐通读。</li>
<li><a href="http://gitbook.liuhui998.com/index.html">Git Community Book 中文版</a></li>
</ol>
<h2>分支管理方案</h2>
<p>Git 鼓励大量使用分支开发,但是分支多了容易乱,我们使用一套比较成熟的分支管理方案 git-flow,详情参见</p>
<blockquote><p><a href="http://phenmod.com/blog/2015/11/17/use-git-flow/">使用 Git-flow</a></p></blockquote>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Mac 下推荐的软件]]></title>
<link href="http://phenmod.com/blog/2015/11/17/recommend-some-mac-os-software/"/>
<updated>2015-11-17T20:05:03+08:00</updated>
<id>http://phenmod.com/blog/2015/11/17/recommend-some-mac-os-software</id>
<content type="html"><![CDATA[<p>传说中,Mac 电脑是程序员专用的“飞机中的战斗机”,baidu 一下 “mac 软件推荐”,你会得到很多优秀的工具。下面是我常用的几款,具体安装及使用方式不细说。</p>
<ol>
<li>终端工具 <a href="http://www.iterm2.com/#/section/home">iterm</a>,官网下载安装。preferences -> Keys -> HotKey,设置一个系统热键。(我的是cmd+shift+m)。</li>
<li>终极 shell <a href="https://github.com/robbyrussell/oh-my-zsh">oh-my-zsh</a> 。安装命令:<code>curl -L http://install.ohmyz.sh | sh</code>,具体使用参考<a href="http://zhuanlan.zhihu.com/mactalk/19556676">池建强的文章</a></li>
<li>SourceTree :git的图形化操作工具。</li>
<li>brew :Mac下安装常用软件的利器,几乎所有的软件我都是用它安装管理的。参见<a href="http://phenmod.com/blog/2016/01/09/use-brew/">用 Brew 安装管理软件</a></li>
<li>Alfred :自定义各种快捷操作,神器。</li>
<li>Moom :快速设置窗口的位置及大小,全键盘流的福音。</li>
<li>Parallel Desktop :想安装个虚拟机就用它吧,无缝连接系统,牛叉无比。</li>
<li>RescueTime :关注你每天时间的使用,提高工作效率。</li>
<li>Charles :抓包工具,可给真机做代理,可模拟网络不好的情况。</li>
<li>Sublime Text :你永远都不会知道这个看起来像个简单文本编辑器的编辑器有多牛逼。<a href="https://sublime.wbond.net/">一堆堆的插件</a>。支持 Dash 集成。</li>
<li>Mou :写 markdown 文档,编辑时同步预览比较方便。但是最新版在编写大文件时会比较卡。我现在用 Sublime 装上<code>Markdown Extended</code>、<code>Markdown Preview</code>、<code>MarkdownEditing</code>、<code>MarkdownTOC</code>这几个插件,编辑预览什么的,也很方便。</li>
<li>iTools :不越狱查看真机 app 里的个各种文件。</li>
<li>XtraFinder :增强 Finder 功能。</li>
<li><a href="http://www.grandtotal.biz/CheatSheet/">cheatSheat</a>:长按 command 查看当前程序的所有快捷键,好用到爆。</li>
<li><a href="http://www.sequelpro.com/download">Sequel Pro</a>:连接远端、本地 mysql,方便易用。</li>
<li><a href="http://www.freemacsoft.net/appcleaner/">AppCleaner</a>:应用程序卸载工具。</li>
</ol>
<p>另外的几个相关推荐帖子:</p>
<ul>
<li><a href="http://www.cocoachina.com/mac/20141112/10198.html">Mac 开发配置手册</a> 本文翻译自 <a href="https://github.com/sb2nov/mac-setup">mac-setup</a>,原文不断更新,且有很多其他内容。</li>
<li><a href="https://github.com/hzlzh/Best-App">Best-App</a> 收集 & 推荐优秀的 Apps/硬件/技巧/周边等</li>
<li><a href="http://www.xialeizhou.com/?p=71">高效 MacBook 工作环境配置</a></li>
<li><a href="https://support.apple.com/zh-cn/HT201236">MacBook 快捷键</a></li>
</ul>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[iOS新人入门文档目录]]></title>
<link href="http://phenmod.com/blog/2015/11/17/to-ios-fresh-man/"/>
<updated>2015-11-17T19:35:21+08:00</updated>
<id>http://phenmod.com/blog/2015/11/17/to-ios-fresh-man</id>
<content type="html"><![CDATA[<h2>软件推荐</h2>
<ul>
<li><a href="http://phenmod.com/blog/2015/11/17/recommend-some-mac-os-software/">Mac下推荐的软件</a></li>
<li><a href="http://phenmod.com/blog/2016/01/09/use-brew/">用 Brew 安装管理软件</a></li>
</ul>
<h2>版本控制:Git 及 git-flow</h2>
<ul>
<li><a href="http://phenmod.com/blog/2015/11/17/use-git/">用 Git 做版本控制</a></li>
<li><a href="http://phenmod.com/blog/2015/11/17/use-git-flow/">用 Git-flow 做分支管理</a></li>
</ul>
<h2>代码风格</h2>
<ul>
<li><a href="http://phenmod.com/blog/2015/11/17/use-clangformat-to-format-objective-c-code/">用 ClangFormat 插件格式化 Objective-C 代码</a></li>
</ul>
<h2>iOS技术</h2>
<h3>开发工具</h3>
<ul>
<li>CocoaPods 的使用。
参见唐巧的<a href="http://blog.devtang.com/blog/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/">用CocoaPods做iOS程序的依赖管理</a></li>
<li>Xcode 及 Instruments 的使用。编译、调试、调优等手段。</li>
</ul>
<h3>开发技术</h3>
<ul>
<li>了解项目框架及用法。</li>
<li>研究ARC的相关技术及使用。熟悉 weak,strong 等关键字的使用。</li>
<li>研究 block 的使用,理解内存的循环引用。</li>
<li>熟悉 StoryBoard 及 Xib 的使用。</li>
<li>全面认识 UIView 及 UIViewController 的各属性功能类的函数功能。</li>
<li>透彻理解 MVC。了解常用设计模式。</li>
<li>了解 UIView 动画及 Core Animation 的主要知识点。</li>
<li>研究线程安全,了解系统类中哪些是线程安全的,了解如何写一个线程安全类。</li>
</ul>
<h3>阅读目录</h3>
<ul>
<li>Advanced Memory Management Programming Guide</li>
<li>Blocks Programming Topics</li>
<li>Cocoa Fundamentals Guide</li>
<li>Concurrency Programming Guide</li>
<li>Event Handling Guide for iOS</li>
<li>iOS Human Interface Guidelines</li>
<li>Key-Value Coding Programming Guide</li>
<li>Key-Value Observing Programming Guide</li>
<li>Threading Programming Guide</li>
<li>Memory Management Programming Guide for Core Foundation</li>
<li>Notification Programming Topics</li>
<li>Objective-C Runtime Programming Guide</li>
<li>Table View Programming Guide for iOS</li>
<li>View Programming Guide for iOS</li>
<li>View Controller Programming Guide for iOS</li>
<li>Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法</li>
<li>iOS开发进阶</li>
<li>Objective-C高级编程 iOS与OS X多线程和内存管理</li>
<li>Pro Objective-C</li>
</ul>
<h4>其他</h4>
<ul>
<li>Advanced Mac OS X Programming</li>
<li>Functional Reactive Programming on iOS</li>
</ul>
]]></content>
</entry>
</feed>