mkblog 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. data/LICENSE +13 -0
  2. data/README.rdoc +38 -0
  3. data/bin/mkblog +90 -0
  4. data/lib/mkblog_version.rb +3 -0
  5. data/templates/README.markdown +24 -0
  6. data/templates/Rakefile +46 -0
  7. data/templates/_config.yml +2 -0
  8. data/templates/_layouts/master.html +50 -0
  9. data/templates/_layouts/post.html +39 -0
  10. data/templates/_posts/2012-03-06-travis-ci-is-evolution.mkd +111 -0
  11. data/templates/_site/README.markdown +24 -0
  12. data/templates/_site/Rakefile +46 -0
  13. data/templates/_site/about.html +55 -0
  14. data/templates/_site/atom.xml +936 -0
  15. data/templates/_site/blog.html +581 -0
  16. data/templates/_site/drafts/outsource-your-blog.html +96 -0
  17. data/templates/_site/favicon.ico +0 -0
  18. data/templates/_site/images/about.gif +0 -0
  19. data/templates/_site/images/alm-overview.jpg +0 -0
  20. data/templates/_site/images/blog.gif +0 -0
  21. data/templates/_site/images/build-matrix.png +0 -0
  22. data/templates/_site/images/building-status-tag.png +0 -0
  23. data/templates/_site/images/gerrit-demo.jpg +0 -0
  24. data/templates/_site/images/github.gif +0 -0
  25. data/templates/_site/images/green_gradient.gif +0 -0
  26. data/templates/_site/images/header_bg.gif +0 -0
  27. data/templates/_site/images/header_gradient.gif +0 -0
  28. data/templates/_site/images/jenkins-jobs.jpg +0 -0
  29. data/templates/_site/images/jenkins-logo.jpg +0 -0
  30. data/templates/_site/images/linkedin.gif +0 -0
  31. data/templates/_site/images/subscribe-icon.gif +0 -0
  32. data/templates/_site/images/subscribe.png +0 -0
  33. data/templates/_site/images/title.gif +0 -0
  34. data/templates/_site/images/twitter.gif +0 -0
  35. data/templates/_site/images/weibo.gif +0 -0
  36. data/templates/_site/images/whiteboard.jpg +0 -0
  37. data/templates/_site/index.html +471 -0
  38. data/templates/_site/javascripts/jquery.github.js +3 -0
  39. data/templates/_site/javascripts/jquery.js +19 -0
  40. data/templates/_site/open-source.html +78 -0
  41. data/templates/_site/stylesheets/master.css +296 -0
  42. data/templates/_site/stylesheets/syntax.css +60 -0
  43. data/templates/about.textile +16 -0
  44. data/templates/atom.xml +27 -0
  45. data/templates/blog.html +29 -0
  46. data/templates/drafts/outsource-your-blog.textile +32 -0
  47. data/templates/favicon.ico +0 -0
  48. data/templates/images/about.gif +0 -0
  49. data/templates/images/blog.gif +0 -0
  50. data/templates/images/build-matrix.png +0 -0
  51. data/templates/images/building-status-tag.png +0 -0
  52. data/templates/images/github.gif +0 -0
  53. data/templates/images/green_gradient.gif +0 -0
  54. data/templates/images/header_bg.gif +0 -0
  55. data/templates/images/header_gradient.gif +0 -0
  56. data/templates/images/jenkins-jobs.jpg +0 -0
  57. data/templates/images/linkedin.gif +0 -0
  58. data/templates/images/subscribe-icon.gif +0 -0
  59. data/templates/images/subscribe.png +0 -0
  60. data/templates/images/title.gif +0 -0
  61. data/templates/images/twitter.gif +0 -0
  62. data/templates/images/weibo.gif +0 -0
  63. data/templates/index.html +62 -0
  64. data/templates/javascripts/jquery.github.js +3 -0
  65. data/templates/javascripts/jquery.js +19 -0
  66. data/templates/open-source.html +33 -0
  67. data/templates/stylesheets/master.css +296 -0
  68. data/templates/stylesheets/syntax.css +60 -0
  69. metadata +125 -0
@@ -0,0 +1,581 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3
+
4
+ <html>
5
+ <head>
6
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8">
7
+ <title>Larry Cai - Blog</title>
8
+ <link rel="stylesheet" href="/stylesheets/master.css" type="text/css" media="screen" charset="utf-8"/>
9
+ <link rel="stylesheet" href="/stylesheets/syntax.css" type="text/css" media="screen" charset="utf-8"/>
10
+ <script src="/javascripts/jquery.js" type="text/javascript" charset="utf-8"></script>
11
+ <script src="/javascripts/jquery.github.js" type="text/javascript" charset="utf-8"></script>
12
+ <link rel='alternate' type='application/rss+xml' href='http://feeds2.feedburner.com/larrycai' />
13
+ </head>
14
+ <body>
15
+ <div id='wrapper'>
16
+ <div id='header'>
17
+ <h1><a href='/'>Larry Cai</a></h1>
18
+
19
+ <div id='menu'>
20
+ <ul>
21
+ <li><a href='/blog.html' id='blog_link' title='Blog'>Blog</a></li>
22
+ <li><a href='/about.html' id='about_link' title='About'>About</a></li>
23
+ <li><a href='http://github.com/larrycai' target='_blank' title='GitHub' rel='me' id='github_link'>GitHub</a></li>
24
+ <li><a href='http://cn.linkedin.com/in/larrycaiyu' title='LinkedIn' target='_blank' rel='me' id='linkedin_link'>LinkedIn</a></li>
25
+ <li><a href='http://weibo.com/larrycaiyu' title='Weibo' target='_blank' rel='me' id='weibo_link'>Weibo</a></li>
26
+ </ul>
27
+ </div>
28
+ </div>
29
+ <div id='content'>
30
+ <a href='http://feeds.feedburner.com/~u/14174549791849888941' class='float-right'><img src='/images/subscribe.png' alt='Subscribe to XML Feed'/></a>
31
+
32
+
33
+
34
+ <div class='post'>
35
+ <span class='date'>06 Mar 2012</span>
36
+ <h1><a href='/2012/03/06/travis-ci-is-evolution.html'>Travis CI会替代Jenkins吗?</a></h1>
37
+ <div class='body'><h1>介绍</h1>
38
+
39
+ <p>你可能用Github了。但是你是怎么自动构建你的开源项目的呢?你的Github项目有“构建状态”标签吗?</p>
40
+
41
+ <p><img src="http://larrycai.github.com/images/building-status-tag.png" alt="Github上的项目构建状态" /></p>
42
+
43
+ <p>如果你还不知道这个,你就有些落伍了,因为这是Travis CI带来的持续集成的革新,它可能会替代Jenkins现在的地位。</p>
44
+
45
+ <p>让我们一起来看看Travis-ci到底带来了什么,先从Jenkins说起。</p>
46
+
47
+ <p>在写这篇博客时,发现好友晓斌也写了一篇<a href="http://www.juvenxu.com/2012/03/06/travis-ci/">Travis CI,翩翩而至的CI云</a>,可以参考阅读。</p>
48
+
49
+ <h2>Jenkins介绍</h2>
50
+
51
+ <p>持续集成是敏捷软件开发的一个重要工具,开源工具<a href="http://jenkins-ci.org/">Jenkins</a>是实施持续集成首选,大概占据了半壁江山。</p>
52
+
53
+ <p><img src="http://larrycai.github.com//images/jenkins-jobs.jpg" alt="Jenkins界面" /></p>
54
+
55
+ <p>Jenkins以前叫Hudson,后来由于Oracle收购了Sun公司,Oracle与开源软件社区谈崩了。Hudson创始人Kohsuke Kawaguchi(简称 KK)一怒之下,和社区的人其他人重起炉灶,建立了Jenkins社区。详细可以看看InfoQ的文章<a href="http://www.infoq.com/cn/news/2011/01/hudson-jenkins2">Hudson社区提议将项目更名为Jenkins</a>。</p>
56
+
57
+ <h3>Jenkins功能</h3>
58
+
59
+ <p>它有很多极佳的特性:</p>
60
+
61
+ <ol>
62
+ <li>易于安装:一个命令就可启动,也方便部署到各种Web容器中(如tomcat)。</li>
63
+ <li>易于配置:所有的配置都在Web界面实现,权限控制得也不错。</li>
64
+ <li>插件支持:基本上所有的扩展都是有插件完成的,开发插件也很方便,由此产生了庞大的社区。</li>
65
+ <li>支持分布式构建:Jenkins能够让通过主从模式(master/slave)多台机器一起构建。</li>
66
+ </ol>
67
+
68
+
69
+ <h3>Jenkins在企业中常见步骤</h3>
70
+
71
+ <p>Jenkins服务器一般先架设在一台服务器上,有配置管理人员管理。</p>
72
+
73
+ <p>产品有构建需求后,配置管理人员就新建一个任务,配好源码仓库,设置构建时间,指定运行脚本来编译测试产品,并且设置报告输出。一切都可以在Web界面中运行。</p>
74
+
75
+ <h2>Jenkins的一些弊端</h2>
76
+
77
+ <p>Jenkins虽然非常好用,但还是有些弊端。</p>
78
+
79
+ <h3>多平台或依赖的包</h3>
80
+
81
+ <p>如果你的软件想在不同的操作系统软件构建并验​​证,这将是相当有难度和技巧性,一般主要是准备不同的操作系统的机器,然后使用主/从模式进行分布式构建。</p>
82
+
83
+ <p>在C++中你可以使用有关的交叉编译器,一个不错的解决方案。</p>
84
+
85
+ <p>但是再进一步如果你的第三方软件和不同的依赖比较多,那么这个环境的准备是非常困难的,因为这个组合将很大。</p>
86
+
87
+ <p>当然你可有使用虚拟机的技术vagrant/virtualbox,参见<a href="http://larrycai.github.com/2011/10/25/vagrant-jenkins-ci.html">使用vagrant+jenkins来管理虚拟机的技巧</a>。可以工作,不太优雅。因为它不是原生的,有点复杂。</p>
88
+
89
+ <h3>配置管理人员的工作</h3>
90
+
91
+ <p>一般来说Jenkins的构建任务,它是集中控制的。大多来说都是有专职的配置管理人员来管理,否者权限会混乱。</p>
92
+
93
+ <p>当有需求时,他们负责在CI服务器创建任务(记住:这些配置文件不是有版本控制的)。这个就涉及到了沟通成本,你有变化需求,很难及时满足。</p>
94
+
95
+ <p>由于服务器是有限的,它主要构建重要分支的内容。在你自己的私有分支上运行CI是比较奢侈的,而且环境不一样,也不推荐。</p>
96
+
97
+ <p>你可以想象如果在一个C/C++产品的公司,你要为一个Lisp的项目创建CI要花多久?</p>
98
+
99
+ <p>作为开发者,为什么不能随时构建你想要的东西呢?这就是Travis CI想做的。</p>
100
+
101
+ <h2>Travis CI 介绍</h2>
102
+
103
+ <p>Travis CI 这里就不介绍怎么使用了具体可以先看<a href="http://www.juvenxu.com/2012/03/06/travis-ci/">晓斌的博客</a>和<a href="http://saberma.me/other/2011/11/29/travis-ci-is-a-free-continuous-integration-test-server.html">免费的持续集成测试服务</a>,强烈建议你先试一下。</p>
104
+
105
+ <p>初看Travis CI象和Jenkins没啥区别,指定你Github中的项目,然后他帮你编译,而且它使用的也是Vagrant/Virtualbox技术。但实际上里面有很多好点子。</p>
106
+
107
+ <h2>Travis CI带来的变革</h2>
108
+
109
+ <h3>配置本地化和可读性</h3>
110
+
111
+ <p>不像以前,构建的任务是在Jenkins服务器上的,现在构建的配置文件直接就和源码放在一起,而且配置文件使用DSL写的,可读性更高。</p>
112
+
113
+ <pre><code>before_script:
114
+ - sudo apt-get install pandoc
115
+ - sudo apt-get install ttf-arphic-gbsn00lp ttf-arphic-ukai ttf-wqy-microhei ttf-wqy-zenhei
116
+ - sudo apt-get install texlive-xetex texlive-latex-recommended texlive-latex-extra
117
+ - gem install mkbok
118
+
119
+ rvm:
120
+ - 1.9.3
121
+ - 1.8.7
122
+ script: mkbok --lang zh --build pdf
123
+
124
+ after_script:
125
+ - which curl ; curl -v --upload-file sdcamp.zh.pdf http://blobs.ge.tt/3iBcNNC/sdcamp.zh.pdf?sig=-TY5O1GAx8xHwWiCqd8aySlQiroFAnHK2o4
126
+ </code></pre>
127
+
128
+ <p>作为用户,关心的是要哪些依赖包,然后怎么构建就行了,上面的配置每一行都没有浪费。</p>
129
+
130
+ <h3>多版本支持</h3>
131
+
132
+ <p>像上面的例子中,我要求在两个Ruby环境中运行,它就帮我做到了,我并不关心它是怎么切换的。</p>
133
+
134
+ <p><img src="http://larrycai.github.com/images/build-matrix.png" alt="多版本构建结果" /></p>
135
+
136
+ <h3>原生的云技术来分布式构建</h3>
137
+
138
+ <p>Travis CI使用的Ruby语言,一开始考虑的就是分布式构建,比Jenkins的插件式进了一步。</p>
139
+
140
+ <p>虽然Travis CI并不是直接用到了云机器,它的虚拟机部分只是Vagrant/Virtualbox,但是这一块是很容易迁移到其他的技术的。</p>
141
+
142
+ <h1>总结</h1>
143
+
144
+ <p>Jenkins有点可惜,改了名字以后,功能上面并没有突破。当然这就是开源竞争的好处,总有新的理念,新的工具产生。你不前进,别人就迎头赶上。</p>
145
+
146
+ <p>Travis CI现在只是支持Github的公开项目,但已经爆发出它的优点了。要不了多久,我相信就能运行在你公司内部了。</p>
147
+
148
+ <p>让我们一起期待这个革新吧!</p>
149
+
150
+ <h1>相关阅读</h1>
151
+
152
+ <ol>
153
+ <li>Juven Xu的“Travis CI,翩翩而至的CI云” <a href="http://www.juvenxu.com/2012/03/06/travis-ci/">http://www.juvenxu.com/2012/03/06/travis-ci/</a></li>
154
+ <li>免费的持续集成测试服务 <a href="http://saberma.me/other/2011/11/29/travis-ci-is-a-free-continuous-integration-test-server.html">http://saberma.me/other/2011/11/29/travis-ci-is-a-free-continuous-integration-test-server.html</a></li>
155
+ </ol>
156
+
157
+ </div>
158
+ <a href='/2012/03/06/travis-ci-is-evolution.html#disqus_thread'>View Comments</a>
159
+ </div>
160
+
161
+
162
+
163
+ <div class='post'>
164
+ <span class='date'>13 Jan 2012</span>
165
+ <h1><a href='/2012/01/13/ebook-chinese-fonts.html'>开源书和开源技术-PDF中蛋疼的中文字体</a></h1>
166
+ <div class='body'><h1>介绍</h1>
167
+
168
+ <p>上次我介绍了一个用<a href="http://www.ituring.com.cn/article/828">Markdown格式来写开源书和相关的开源技术</a>,还留了个在Linux下产生PDF所需要的中文字体这个大尾巴。这次我想借用我写<a href="http://weibo.com/2104936813/y0oXC350t">【跟我学企业敏捷开发】</a>的一点经验,给不太了解这一块知识的朋友一起探讨一下。</p>
169
+
170
+ <p>有些问题还是没有解决,希望有Latex的高手解答。</p>
171
+
172
+ <p>不管怎样,还是希望能借此机会推动国内电子书,特别是开源电子书的发展。</p>
173
+
174
+ <h1>Linux下的中文编码和字体</h1>
175
+
176
+ <p>首先,我用的是Linux环境并且选用的是<strong>UTF-8</strong>的编码,而不是GBK,否者在github上显示会有问题,不了解这方面的朋友自己找找资料吧,够讲个把小时的。</p>
177
+
178
+ <p>在产生PDF时,一般建议内嵌中文字体的,但是真正能用的中文字体实际很少,极大多数是有版权的:</p>
179
+
180
+ <ul>
181
+ <li><a href="http://www.arphic.com.tw/">文鼎</a>开放的四套字体(简报宋、细上海宋、简中楷、中楷),没有一点版权问题,是大部分的中文Linux的缺省安装。</li>
182
+ <li><a href="http://wenq.org/">文泉驿</a>的几套字体(微米黑、正黑、点阵宋体)是开放但是GPL性质的,所以不是随便可以商用的。</li>
183
+ <li>Adobe有两套开放字体(宋体、黑体)我认为是可以随便用的,忘了在哪里看到这个解释的了。</li>
184
+ </ul>
185
+
186
+
187
+ <p>可以看看<a href="http://wiki.ubuntu.org.cn/�%8D费中文字体">Ubuntu免费中文字体</a>的介绍有个认识。</p>
188
+
189
+ <h2>怎么选择对应字体</h2>
190
+
191
+ <p>一般缺省中文正文字体是宋体、细明体,对应英文Serif类的英文字体:Georgia、Times New Roman等。</p>
192
+
193
+ <p>标题和重要内容可以选楷体和黑体,对应英文Sans Serif类的英文字体:Arial、Tahoma、Verdana等</p>
194
+
195
+ <p>技术文章中常见的代码典型的等宽体用黑体,对应英文Monospace类的英文字体:Courier New等</p>
196
+
197
+ <p>所以对应的在<a href="https://github.com/larrycai/sdcamp/blob/master/latex/config.yml">我的中文Latex配置</a>中可选的是:</p>
198
+
199
+ <ul>
200
+ <li>font:文鼎的简报宋、细上海宋,文泉驿的点阵宋体,Adobe的宋体</li>
201
+ <li>bold: 文鼎的简中楷、中楷,文泉驿的微米黑、正黑,Adobe的黑体</li>
202
+ <li>mono: 文泉驿的微米黑、正黑,Adobe的黑体</li>
203
+ </ul>
204
+
205
+
206
+ <h2>如何安装字体</h2>
207
+
208
+ <p>我用的试验环境是Ubuntu 11.04 (Natty),大部分可以直接从Ubuntu源中下载了。</p>
209
+
210
+ <p>你可以用命令<code>fc-list :lang=zh-cn</code>查看安装好的中文字体,结果中前半部分就是字体名称(如<code>AR PL UMing CN</code>)。</p>
211
+
212
+ <pre><code>user@puppet1:~$ fc-list :lang=zh-cn | grep CN
213
+ AR PL UMing CN:style=Light
214
+ AR PL UKai CN:style=Book
215
+ </code></pre>
216
+
217
+ <p>文鼎开放的四套字体的Ubuntu包、字体名字和名称如下:</p>
218
+
219
+ <pre><code>ttf-arphic-gbsn00lp "AR PL SungtiL GB" 文鼎PL简报宋
220
+ ttf-arphic-gkai00mp "AR PL KaitiM GB" 文鼎PL简中楷
221
+ ttf-arphic-ukai "AR PL UKai" 文鼎PL中楷
222
+ ttf-arphic-uming "AR PL UMing" 文鼎PL细上海宋
223
+ </code></pre>
224
+
225
+ <p>文泉驿字体的Ubuntu包、字体名字和名称如下</p>
226
+
227
+ <pre><code>ttf-wqy-microhei "WenQuanYi Micro Hei" 文泉驿的微米黑
228
+ ttf-wqy-zenhei "WenQuanYi Zen Hei" 文泉驿的正黑
229
+ xfonts-wqy "WenQuanYi Bitmap Song" 文泉驿的点阵宋体
230
+ </code></pre>
231
+
232
+ <p>Adobe的中文字体有<a href="http://www.adobe.com/support/downloads/detail.jsp?ftpID=4421">官方下载</a></p>
233
+
234
+ <pre><code>$ tar -jzxf FontPack910_chs_i486-linux.tar.bz2
235
+ $ tar -xvf CHSKIT/LANGCHS.TAR
236
+ $ mkdir ~/.fonts
237
+ $ cp Adobe/Reader9/Resource/CIDFont/*.otf ~/.fonts
238
+ $ fc-cache -f -v
239
+ $ fc-list :lang=zh | grep Adobe
240
+ </code></pre>
241
+
242
+ <h2>蛋疼的问题</h2>
243
+
244
+ <p>只可惜现在正文在产生PDF时没有一种字体是有完美表现的。</p>
245
+
246
+ <ol>
247
+ <li>文鼎贡献的字体中台湾字形的细上海宋的句号在中间,出来的效果不伦不类的。</li>
248
+ <li>文鼎贡献的字体中大陆字形的简中楷和简报宋,标点符号的位置是对的,但是当碰到条目(Item)的时候条目的点没能显示出来。</li>
249
+ <li>Adobe的宋体,条目的时候显示一个田子框,很难看。</li>
250
+ <li>文泉驿的点阵宋体老是转化Latex时出错,搞不定。</li>
251
+ </ol>
252
+
253
+
254
+ <p>现在将就着用文鼎的细上海宋。</p>
255
+
256
+ <p>【更新】
257
+ 2、3 条目的问题,我hack成其他字符(*)显示就没问题了(如下),不知道缺省的圆点显示不对。<a href="http://wiki.ctex.org/index.php/LaTeX/%E5%88%97%E8%A1%A8">http://wiki.ctex.org/index.php/LaTeX/%E5%88%97%E8%A1%A8</a>,现在就用文鼎的细上海宋了。</p>
258
+
259
+ <pre><code>\begin{itemize}\setlength{\itemsep}{1pt}\setlength{\parskip}{0pt}\setlength{\parsep}{0pt}
260
+ \item[*]
261
+ % 原来是
262
+ % \item
263
+ </code></pre>
264
+
265
+ <h1>其他</h1>
266
+
267
+ <p>本文也是我用git记录在<a href="https://github.com/larrycai/larrycai.github.com">github</a>上的,你可以看到每次的变化。</p>
268
+
269
+ <p>如果对此文有兴趣,帮忙顶一下,别忘了 <a href="http://weibo.com/larrycaiyu">@larrycaiyu</a>。</p>
270
+
271
+ <h1>参考</h1>
272
+
273
+ <ol>
274
+ <li>中文字体没有版权问题的解决方案?http://bbs.ctex.org/viewthread.php?tid=46106&amp;extra=&amp;page=1</li>
275
+ </ol>
276
+
277
+ </div>
278
+ <a href='/2012/01/13/ebook-chinese-fonts.html#disqus_thread'>View Comments</a>
279
+ </div>
280
+
281
+
282
+
283
+ <div class='post'>
284
+ <span class='date'>31 Dec 2011</span>
285
+ <h1><a href='/2011/12/31/ebook-by-markdown.html'>开源书和开源技术-Markdown篇</a></h1>
286
+ <div class='body'><h1>开源书和开源技术-Markdown篇</h1>
287
+
288
+ <h1>背景</h1>
289
+
290
+ <p>看到<a href="http://weibo.com/1404949082/xDeyDEaDq">霍泰稳关于infoq的架构师电子书问题的微博</a>和图灵社区的文章<a href="http://www.ituring.com.cn/article/details/764">为什么写作自由书籍?</a>,我就想通过一个用Markdown格式写的<a href="http://progit.org/">Pro Git</a>开源书 的例子来介绍其中用到的技术。希望能借此机会推动国内电子书,特别是开源电子书的发展。</p>
291
+
292
+ <p>【声明】我并没有写书的经历,这里只是对电子书出版技术的入门介绍而已。</p>
293
+
294
+ <h1>从Pro Git说起</h1>
295
+
296
+ <p>如果你了解Git,或者想了解Git。那么你就应该知道<a href="http://progit.org/">Pro Git</a>,它是Git的书中写得最好的一本(至少是之一),可是你是否知道它有网络中文版,而且能在iPad上极其漂亮得阅读。并且是免费的,不是盗版的免费!如果你想要最新的,你甚至可以自己生成它。哈哈,我就是这么干的。</p>
297
+
298
+ <p>这一切就归功于开源社区和它后面用到的技术。</p>
299
+
300
+ <h1>开源书</h1>
301
+
302
+ <p>这里我不用多讲,开源书就像其他的开源产品(如维基百科)一样,只要是开放的,社区就有人会贡献。<a href="http://progit.org/">Pro Git</a>的作者Scott很慷慨得把书的内容全部共享在<a href="http://github.com/progit/progit">github/progit</a>库中,使用得是<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/">CC BY-NC-SA 3.0</a>。</p>
303
+
304
+ <p>Scott只负责英文版,其他许许多多语言的翻译都是社区贡献的,中国翻译相当有质量,你可以在线读<a href="http://progit.org/book/zh/">Pro Git中文版</a>。</p>
305
+
306
+ <h1>开源技术生成电子书</h1>
307
+
308
+ <p>这本书不仅仅开源了内容,使用的技术也是开源的。让我们看看他是怎么做的。</p>
309
+
310
+ <h2>markdown原始文件</h2>
311
+
312
+ <p>首先书的内容是用markdown格式写的。markdown格式的普及要归功于<a href="github.com">Github</a>和<a href="http://stackoverflow.com/">StackOverflow</a>。因为它们越来越流行,它们支持markdown格式也越来越流行。这里要赞一个的是,国内的<a href="http://www.ituring.com.cn/">图灵社区</a>也支持markdown,用起来超级方便。</p>
313
+
314
+ <p>简单来说,markdown格式的文件看着像一般的文本文件,里面只是加了很少的格式标记,因此看文本文件也不影响理解,这种格式也有很多工具帮你去转化,而且很容自动化解决。并且这些技术大多数是开源或免费的。</p>
315
+
316
+ <p>你可以直接看一下【Pro Git】的<a href="https://raw.github.com/progit/progit/master/zh/01-introduction/01-chapter1.markdown">“第一章 介绍” 的markdown原始文件</a>,顺便看看github自动生成的简单<a href="https://github.com/progit/progit/blob/master/zh/01-introduction/01-chapter1.markdown">“第一章 介绍” 的html</a>。</p>
317
+
318
+ <h2>产生电子书</h2>
319
+
320
+ <h3>epub/mobi格式</h3>
321
+
322
+ <p>Ruby的<a href="https://github.com/rtomayko/rdiscount">rdiscount</a>帮你从markdown转成html格式,然后有<a href="calibre">Calibre</a>附带的命令<code>ebook-convert</code>生成最终的<code>.mobi</code> (Kindle) 和 <code>.epub</code> (iPad)。</p>
323
+
324
+ <h3>PDF格式</h3>
325
+
326
+ <p>为了能达到出版的质量,Latex是一个常用的格式,PDF也能很容易的产生出来,有关Latex,自己看看参考链接学习吧。</p>
327
+
328
+ <p><a href="http://johnmacfarlane.net/pandoc/">pandoc</a>能帮着从markdown转换出latex格式,然后<a href="http://www.tug.org/texlive/">TexLive</a>软件中的<code>xelatex</code>再转成PDF格式。</p>
329
+
330
+ <h2>试验环境</h2>
331
+
332
+ <p>你只需要一台Linux机器(虚拟机就可以了)和简单的Linux命令就可以试验了。有git和ruby的知识那就更方便了。</p>
333
+
334
+ <p>我用的试验环境是Ubuntu 11.04 (Natty)</p>
335
+
336
+ <h3>下载Pro Git开源书</h3>
337
+
338
+ <p>很简单,<code>git clone</code>一下就可以了,下载它的源文件包我觉得还是烦了点。</p>
339
+
340
+ <pre><code>$ git clone https://github.com/progit/progit.git
341
+ </code></pre>
342
+
343
+ <h3>epub/mobi格式</h3>
344
+
345
+ <p>做电子书相对简单一点,因为要求没有PDF的高,<a href="http://calibre-ebook.com/">calibre</a>就可以满足了。</p>
346
+
347
+ <p>如果装的Ubuntu是服务器版的(没有X-Windows),建议安装<a href="http://en.wikipedia.org/wiki/Xvfb">xvfb</a>无头(headless)X服务器,因为不知道什么原因有几个命令需要。XMing还不行,因为需要<code>X-Input</code></p>
348
+
349
+ <pre><code>$ sudo apt-get install ruby rubygems # ruby 1.8.7 is used
350
+ $ sudo apt-get install calibre # calibre 0.7.44 for ubuntu 11.04
351
+ $ gem install rdiscount ruby-debug
352
+ $ xvfb-run ./makeebooks zh # 缺省.mobi格式
353
+ $ export FORMAT=epub
354
+ $ xvfb-run ./makeebooks zh # .epub格式
355
+ </code></pre>
356
+
357
+ <h3>PDF格式</h3>
358
+
359
+ <p>生成PDF是一个比较复杂的东西,<a href="http://johnmacfarlane.net/pandoc/">pandoc</a>用Ubuntu库里的,TexLive建议下载最新的<a href="http://www.tug.org/texlive/">TexLive</a>包安装,并配置到搜索路径中。</p>
360
+
361
+ <pre><code>$ sudo apt-get install pandoc
362
+ $ # 安装texlive 2011
363
+ </code></pre>
364
+
365
+ <p>因为是中文PDF,需要把字体嵌入在文件中,因此需要安装字体文件(如果不是Ubuntu中文版)</p>
366
+
367
+ <pre><code>$ sudo apt-get install language-support-fonts-zh-hans
368
+ </code></pre>
369
+
370
+ <p>现在你就可以生成pdf文件了。</p>
371
+
372
+ <pre><code>$ ./makepdfs zh
373
+ </code></pre>
374
+
375
+ <h1>其他常用的格式</h1>
376
+
377
+ <p>计算机类图书对格式要求不是很多,图文、章节、源代码基本就够了,就算有些复杂公式,也可用图来显示。这也从理论上说明,它不需要复杂的格式。现在对这类技术书出版我的理解主要有几种:</p>
378
+
379
+ <ol>
380
+ <li>Microsoft的Word格式,虽然国内出版界如日中天,缺省就认它(对技术没追求,鄙视)。简单好学,但是不擅长自动化,是开源的死敌。</li>
381
+ <li>Latex格式(就是Donald E. Knuth(高德纳)发明的,这是很棒的东西,特别适合学术类的各种复杂的公式等,不过学习曲线很高,国内也只有几家学术期刊使用。</li>
382
+ <li>docbook格式是最有名的(从SGML演化过来?),Orielly和Pragmatic出版社缺省就用它,它能 很方便的转化出出版要的各种样式。如<a href="http://www.wakaleo.com/books/jenkins-the-definitive-guide">Jenkins - the definition guide</a>开源书就是采用docbook。但由于是XML格式,很多人不习惯,而且多人网上协作不是很方便。</li>
383
+ <li>通过蒋鑫的<a href="http://www.worldhello.net/gotgithub/">Got Github</a>开源书,我也了解reStructureText也是和markdown差不多纯文本(plain text)的,也是蛮流行的。</li>
384
+ </ol>
385
+
386
+
387
+ <p>如果有机会,我再介绍一下docbook和reStructureText的相关技术。</p>
388
+
389
+ <h1>其他</h1>
390
+
391
+ <p>本文也是我用git记录在<a href="https://github.com/larrycai/larrycai.github.com">github</a>上的,你可以看到每次的变化。</p>
392
+
393
+ <p>如果对此文有兴趣,帮忙顶一下,别忘了 <a href="http://weibo.com/larrycaiyu">@larrycaiyu</a>。</p>
394
+
395
+ <h1>Latex的参考</h1>
396
+
397
+ <ol>
398
+ <li>http://share.chinatex.org/</li>
399
+ <li>http://manual.calibre-ebook.com/conversion.html</li>
400
+ <li>http://calibre-ebook.com/download_linux</li>
401
+ <li>http://johnmacfarlane.net/pandoc/</li>
402
+ <li>http://latex.yo2.cn/articles/latex-introduction0.html</li>
403
+ <li>http://product.china-pub.com/54569</li>
404
+ </ol>
405
+
406
+ </div>
407
+ <a href='/2011/12/31/ebook-by-markdown.html#disqus_thread'>View Comments</a>
408
+ </div>
409
+
410
+
411
+
412
+ <div class='post'>
413
+ <span class='date'>16 Dec 2011</span>
414
+ <h1><a href='/2011/12/16/visualize-quality-4-cxx-legacycode.html'>企业C++大型系统遗留代码变迁的布道之旅</a></h1>
415
+ <div class='body'><h1>企业C++大型系统遗留代码变迁的布道之旅</h1>
416
+
417
+ <h1>前沿</h1>
418
+
419
+ <p>特别声明:本文专为<a href="http://www.ituring.com.cn/activity/details/696">图灵社区活动“唤醒你心中的布道师”</a>而写,欢迎大家积极参与!</p>
420
+
421
+ <p><a href="http://www.programmer.com.cn/9072/">程序员杂志第十二期</a>中讲到了企业开发的困境,其中有一点就是企业有很多的遗留代码,而且是C/C++的大型系统。怎么处理一直是推动软件开发中的头疼问题,为什么头疼呢?</p>
422
+
423
+ <ol>
424
+ <li>旧代码,又大,怎么下手,时间在哪里?</li>
425
+ <li>C/C++代码,和java比起来没有统一的单元测试工具,又难改造,怎么办?</li>
426
+ </ol>
427
+
428
+
429
+ <p>现在我们已经基本完成了这个转变,主要代码覆盖率在60%以上,很好得支持了敏捷开发(如持续集成)。</p>
430
+
431
+ <p>在看了<a href="http://www.ituring.com.cn/book/736">布道之道</a>一书后,把我们用的一些技巧和策略用实际例子和大家一起来探讨一下。</p>
432
+
433
+ <h1>背景介绍</h1>
434
+
435
+ <p>变革开始于2007年左右,那时,这是一个有几十万行代码的C++产品,始于上个世纪末,基于Corba,XML,组件(component)的技术,由于架构的关系,没有单元测试,只有集成测试。</p>
436
+
437
+ <p>功能持续增加,开发者交付压力大。质量开始有下降、维护成本有提高的苗头。</p>
438
+
439
+ <p>我们就想通过提高C++的代码测试覆盖率来解决这些问题;这就需要把单元测试从无到有,再到一个高度。</p>
440
+
441
+ <p>基础这么差,不得不需要布道!</p>
442
+
443
+ <h1>什么样的怀疑者</h1>
444
+
445
+ <p>在推动这个变革前,先看看有什么样的怀疑者会阻碍你。</p>
446
+
447
+ <p>在大公司里最多的还是孤陋寡闻型,时间紧迫型。</p>
448
+
449
+ <p><strong>孤陋寡闻型</strong>:主要是开发者,我又想叫他们埋头苦干型。因为他们干活踏踏实实,只是由于项目压力的关系,没有额外的时间去看看外面的新技术,习惯了按步就班。</p>
450
+
451
+ <p>他们早已经习惯了用集成测试来替代单元测试。猛然间听说要上单元测试,一下子就觉得不行。Java么还可以考虑考虑,C++的产品需要搞单元测试吗?而且这种复杂的架构,能搞成功吗?就算能成,代价也太大了,那么多旧的代码,不可能!</p>
452
+
453
+ <p><strong>时间紧迫型</strong>:主要就是项目管理者,他们最大的愿望是项目准时完成,质量达到要求,项目完成后,他们基本就会转战到另一个战场。</p>
454
+
455
+ <p>所以一听说想在项目里面加点东西,还不知道干嘛呢,就问多少时间?问为什么在这个项目做(潜台词就是别在我这儿捣乱)。等到一听说要做以前都不做的单元测试,头摇得就像拨浪鼓一样,死活都不肯。</p>
456
+
457
+ <h1>对症下药:采用合适的技术</h1>
458
+
459
+ <p>对上面两种人和我们要解决的问题,我们采用了好多种方法,下面介绍主要的两种:展示技术和适当妥协</p>
460
+
461
+ <p><strong>展示技术</strong>:你要告诉他们,你要推动的变革是可以做到的,这样来消除他们的疑惑。</p>
462
+
463
+ <p>这是对付孤陋寡闻型的最好办法,告诉他们这个能做到,也没有想象中的难。</p>
464
+
465
+ <p>我记得我花了两周的时间找了一个最典型的组件,采用了CppUnit这个单元测试框架,并应用了虚函数(java中的接口)的方式把对平台架构的依赖全部隔离掉,顺利地跑通了几个测试。并且我还准备了ppt,召集大家一起来探讨确认这是一个可以工作的方式。</p>
466
+
467
+ <p>就象书上说的,孤陋寡闻型的人看到了, 了解了以后,就很容易得接受你的建议了。</p>
468
+
469
+ <p><strong>适当妥协</strong>:就是要找到折中方案,让大家都能过的去。</p>
470
+
471
+ <p>这是对付时间紧迫型的一个好办法,要求不能太高,把一下子想做的东西放在一个地方。</p>
472
+
473
+ <p>我们决定用循序渐进的方式,提出一个中肯的方案:</p>
474
+
475
+ <ol>
476
+ <li>新代码必须要用单元测试,这个没话可说,因为从项目质量上这个是可以要求的。当然怎么做单元测试,由于是新的,会有人提供培训和帮助。</li>
477
+ <li>旧代码在改变时必须要用单元测试,因为改了代码,有测试保证这也是应该的。</li>
478
+ <li>在改动的组件中,每次要对旧代码增加一些测试。</li>
479
+ </ol>
480
+
481
+
482
+ <p>这样一来,每个项目中都会对单元测试有所贡献,长而久之,会积累到比较客观的数量,虽然慢了点,但还是往前进步的。</p>
483
+
484
+ <p>时间紧迫型当然不是吃素的,老觉得亏了点,就盯着第三点说:“项目没时间做这个额外的事情”,这个要靠策略了。</p>
485
+
486
+ <h1>辅以策略:贯彻实施</h1>
487
+
488
+ <p>两个最基本的策略:竭力支持者,说服管理层。</p>
489
+
490
+ <p><strong>竭力支持者</strong> 是最该采纳的,他们会鼓动周边的人和你一起服务,要善于团结他们,这要就扭成了一股绳。</p>
491
+
492
+ <p>对大多数有经验的开发者,大家都明白单元测试是保证质量的最好办法,技术上说服以后,他们很快就变成了<strong>竭力支持者</strong>,觉得不加单元测试就是一种罪过,项目中有谁忘了,<strong>竭力支持者</strong>也会及时提醒他们,不需要你们一直跟踪,减轻了很多压力。</p>
493
+
494
+ <p><strong>说服管理层</strong> 是一个最棒的方式,当然前提是你要能说服他们。</p>
495
+
496
+ <p>实际上管理层也知道没有单元测试这一弊端,只是苦于没有行之有效的方案而已。所以当你告诉他们技术上没有问题了,代价也不是很大,并且你又提供了切实可行的计划。管理层立马会通知大家把这个落实到各个项目中去(包括上面的第三条)。</p>
497
+
498
+ <p>拿到了这个尚方宝剑,没有谁会阻碍了,我们就可以把主要精力花在技术支持上,当然千万不能搞砸了。</p>
499
+
500
+ <h1>收获果实</h1>
501
+
502
+ <p>果然,经过了几年,到2010年单元测试已经达到了60%左右(对C++来说不错了),现在开发人员也习以为常了。</p>
503
+
504
+ <h1>结束语</h1>
505
+
506
+ <p><a href="http://www.ituring.com.cn/book/736">布道之道</a> 真是一本好书(翻译要记一功),它的好多种模式一看就明白。如果你是个有经验的人,你会发现你的很多技巧都在书上提到了,它会帮你进一步的提炼升华,使你下次做的更好。</p>
507
+
508
+ <p>布道会使你有一种成就感,让我们一起来把这个软件行业变得越来越好吧。</p>
509
+
510
+ <h1>其他</h1>
511
+
512
+ <p>本文也是我用git记录在<a href="https://github.com/larrycai/larrycai.github.com">github</a>上的,你可以看到每次的变化。</p>
513
+
514
+ <p>如果对此文有兴趣,帮忙顶一下,别忘了 <a href="http://weibo.com/larrycaiyu">@larrycaiyu</a> ,希望有机会有人能帮我推荐到QConf 2012中去分享,到时我们可以探讨得更多。</p>
515
+
516
+ <p>这儿再留一个关子,如何建立一个好的C++代码质量检测框架,并且最终和其他java代码质量清晰得显示在一起又是另外一个布道故事了,而且有一些就是因为没有看这本书而得到的一个反面教材。</p>
517
+ </div>
518
+ <a href='/2011/12/16/visualize-quality-4-cxx-legacycode.html#disqus_thread'>View Comments</a>
519
+ </div>
520
+
521
+
522
+
523
+
524
+ <h3>Older Posts</h3>
525
+ <table class='post-list'>
526
+
527
+ <tr>
528
+ <th><a href='/2011/12/10/clearcase-2-git.html'>企业版本控制的改革:从ClearCase到Git--我的布道之旅</a></th>
529
+ <td>10 Dec 2011</td>
530
+ <td><a href='/2011/12/10/clearcase-2-git.html#disqus_thread'>Comments</a></td>
531
+ </tr>
532
+
533
+
534
+
535
+
536
+ <tr>
537
+ <th><a href='/2011/11/04/veewee-create-vm.html'>用veewee创建vagrant的虚拟机</a></th>
538
+ <td>04 Nov 2011</td>
539
+ <td><a href='/2011/11/04/veewee-create-vm.html#disqus_thread'>Comments</a></td>
540
+ </tr>
541
+
542
+
543
+
544
+
545
+ <tr>
546
+ <th><a href='/2011/10/25/vagrant-jenkins-ci.html'>使用vagrant+jenkins来管理虚拟机的技巧</a></th>
547
+ <td>25 Oct 2011</td>
548
+ <td><a href='/2011/10/25/vagrant-jenkins-ci.html#disqus_thread'>Comments</a></td>
549
+ </tr>
550
+
551
+
552
+
553
+
554
+ <tr>
555
+ <th><a href='/2011/08/18/agile-tools.html'>敏捷和工具</a></th>
556
+ <td>18 Aug 2011</td>
557
+ <td><a href='/2011/08/18/agile-tools.html#disqus_thread'>Comments</a></td>
558
+ </tr>
559
+
560
+
561
+ </table>
562
+ <div class='clearfix'></div>
563
+ </div>
564
+ </div>
565
+ <div id='footer'>
566
+ Copyright &copy; 2011 Larry Cai. Hosted by <a href='http://github.com/larrycai/larrycai.github.com/' target='_blank'>GitHub</a> and powered by <a href='http://github.com/mojombo/jekyll'>Jekyll</a>, and reuse the template from <a href='http://github.com/mbleigh/mbleigh.github.com/'>Michael Bleigh</a>.
567
+ </div>
568
+ <script type="text/javascript">
569
+ /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
570
+ var disqus_shortname = 'larrycaiyu'; // required: replace example with your forum shortname
571
+
572
+ /* * * DON'T EDIT BELOW THIS LINE * * */
573
+ (function () {
574
+ var s = document.createElement('script'); s.async = true;
575
+ s.type = 'text/javascript';
576
+ s.src = 'http://' + disqus_shortname + '.disqus.com/count.js';
577
+ (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
578
+ }());
579
+ </script>
580
+ </body>
581
+ </html>