|
41 | 41 |
|
42 | 42 | 
|
43 | 43 |
|
44 |
| -支持作者,可以加入作者的小密圈: |
45 |
| - |
46 |
| - |
47 |
| - |
48 |
| -或者转账: |
49 |
| - |
50 |
| -  |
51 |
| - |
52 | 44 | 我的 GitHub 主页上写着加入的时间——``Joined on Nov 8, 2010``,那时才大一,在那之后的那么长的日子里我都没有登录过。也许是因为我学的不是计算机,到了今天——``2015.3.9``,我才发现这其实是程序员的社交网站。
|
53 | 45 |
|
54 | 46 | 过去,曾经有很长的一些时间我试过在 GitHub 上连击,也试着去了解别人是如何用好这个工具的。当然粉丝在 GitHub 上也是很重要的。
|
|
127 | 119 |
|
128 | 120 | 如果我们想创造出更好、强大地框架时,那么认识更多的人可能会带来更多的帮助。有时候会同上面那一点一样的效果
|
129 | 121 |
|
| 122 | +#介绍 |
| 123 | + |
| 124 | +##Github |
| 125 | + |
| 126 | +Wiki百科上是这么说的 |
| 127 | + |
| 128 | +> GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目。它由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath、PJ Hyett和Tom Preston-Werner |
| 129 | +使用Ruby on Rails编写而成。 |
| 130 | + |
| 131 | +当然让我们看看官方的介绍: |
| 132 | + |
| 133 | +> GitHub is the best place to share code with friends, co-workers, classmates, and complete strangers. Over eight million people use GitHub to build amazing things together. |
| 134 | +
|
| 135 | + |
| 136 | +它还是什么? |
| 137 | + |
| 138 | +- 网站 |
| 139 | +- 免费博客 |
| 140 | +- 管理配置文件 |
| 141 | +- 收集资料 |
| 142 | +- 简历 |
| 143 | +- 管理代码片段 |
| 144 | +- 托管编程环境 |
| 145 | +- 写作 |
| 146 | + |
| 147 | +等等。看上去像是大餐,但是你还需要了解点什么? |
| 148 | + |
| 149 | +###版本管理与软件部署 |
| 150 | + |
| 151 | +jQuery[^jQuery]在发布版本``2.1.3``,一共有152个commit。我们可以看到如下的提交信息: |
| 152 | + |
| 153 | + - Ajax: Always use script injection in globalEval … bbdfbb4 |
| 154 | + - Effects: Reintroduce use of requestAnimationFrame … 72119e0 |
| 155 | + - Effects: Improve raf logic … 708764f |
| 156 | + - Build: Move test to appropriate module fbdbb6f |
| 157 | + - Build: Update commitplease dev dependency |
| 158 | + - ... |
| 159 | + |
| 160 | +###Github与Git |
| 161 | + |
| 162 | +> Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中。目前,包括Rubinius、Merb和Bitcoin在内的很多知名项目都使用了Git。Git同样可以被诸如Capistrano和Vlad the Deployer这样的部署工具所使用。 |
| 163 | +
|
| 164 | +> GitHub可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为代码玩家的MySpace。 |
| 165 | +
|
| 166 | +[^jQuery]: jQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作。 |
| 167 | + |
| 168 | +##用好Github |
| 169 | + |
| 170 | +如何用好Github,并实践一些敏捷软件开发是一个很有意思的事情.我们可以在上面做很多事情,从测试到CI,再到自动部署. |
| 171 | + |
| 172 | +###敏捷软件开发 |
| 173 | + |
| 174 | +显然我是在扯淡,这和敏捷软件开发没有什么关系。不过我也不知道瀑布流是怎样的。说说我所知道的一个项目的组成吧: |
| 175 | + |
| 176 | + - 看板式管理应用程序(如trello,简单地说就是管理软件功能) |
| 177 | + - CI(持续集成) |
| 178 | + - 测试覆盖率 |
| 179 | + - 代码质量(code smell) |
| 180 | + |
| 181 | +对于一个不是远程的团队(如只有一个人的项目) 来说,Trello、Jenkin、Jira不是必需的: |
| 182 | + |
| 183 | +> 你存在,我深深的脑海里 |
| 184 | +
|
| 185 | +当只有一个人的时候,你只需要明确知道自己想要什么就够了。我们还需要的是CI、测试,以来提升代码的质量。 |
| 186 | + |
| 187 | +###测试 |
| 188 | + |
| 189 | +通常我们都会找Document,如果没有的话,你会找什么?看源代码,还是看测试? |
| 190 | + |
| 191 | +```javascript |
| 192 | +it("specifying response when you need it", function (done) { |
| 193 | + var doneFn = jasmine.createSpy("success"); |
| 194 | + |
| 195 | + lettuce.get('/some/cool/url', function (result) { |
| 196 | + expect(result).toEqual("awesome response"); |
| 197 | + done(); |
| 198 | + }); |
| 199 | + |
| 200 | + expect(jasmine.Ajax.requests.mostRecent().url).toBe('/some/cool/url'); |
| 201 | + expect(doneFn).not.toHaveBeenCalled(); |
| 202 | + |
| 203 | + jasmine.Ajax.requests.mostRecent().respondWith({ |
| 204 | + "status": 200, |
| 205 | + "contentType": 'text/plain', |
| 206 | + "responseText": 'awesome response' |
| 207 | + }); |
| 208 | +}); |
| 209 | +``` |
| 210 | + |
| 211 | +代码来源: [https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) |
| 212 | + |
| 213 | +上面的测试用例,清清楚楚地写明了用法,虽然写得有点扯。 |
| 214 | + |
| 215 | +等等,测试是用来干什么的。那么,先说说我为什么会想去写测试吧: |
| 216 | + |
| 217 | + - 我不希望每次做完一个个新功能的时候,再手动地去测试一个个功能。(自动化测试) |
| 218 | + - 我不希望在重构的时候发现破坏了原来的功能,而我还一无所知。 |
| 219 | + - 我不敢push代码,因为我没有把握。 |
| 220 | + |
| 221 | +虽然,我不是TDD的死忠,测试的目的是保证功能正常,TDD没法让我们写出质量更高的代码。但是有时TDD是不错的,可以让我们写出逻辑更简单地代码。 |
| 222 | + |
| 223 | +也许你已经知道了``Selenium``、``Jasmine``、``Cucumber``等等的框架,看到过类似于下面的测试 |
| 224 | + |
| 225 | +``` |
| 226 | + Ajax |
| 227 | + ✓ specifying response when you need it |
| 228 | + ✓ specifying html when you need it |
| 229 | + ✓ should be post to some where |
| 230 | + Class |
| 231 | + ✓ respects instanceof |
| 232 | + ✓ inherits methods (also super) |
| 233 | + ✓ extend methods |
| 234 | + Effect |
| 235 | + ✓ should be able fadein elements |
| 236 | + ✓ should be able fadeout elements |
| 237 | +``` |
| 238 | + |
| 239 | +代码来源: [https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) |
| 240 | + |
| 241 | +看上去似乎每个测试都很小,不过补完每一个测试之后我们就得到了测试覆盖率 |
| 242 | + |
| 243 | +File | Statements | Branches | Functions | Lines |
| 244 | +-----|------------|----------|-----------|------ |
| 245 | +lettuce.js | 98.58% (209 / 212)| 82.98%(78 / 94) | 100.00% (54 / 54) | 98.58% (209 / 212) |
| 246 | + |
| 247 | +本地测试都通过了,于是我们添加了``Travis-CI``来跑我们的测试 |
| 248 | + |
| 249 | +###CI |
| 250 | + |
| 251 | +虽然node.js不算是一门语言,但是因为我们用的node,下面的是一个简单的``.travis.yml``示例: |
| 252 | + |
| 253 | +```yml |
| 254 | +language: node_js |
| 255 | +node_js: |
| 256 | + - "0.10" |
| 257 | + |
| 258 | +notifications: |
| 259 | + email: false |
| 260 | + |
| 261 | +before_install: npm install -g grunt-cli |
| 262 | +install: npm install |
| 263 | +after_success: CODECLIMATE_REPO_TOKEN=321480822fc37deb0de70a11931b4cb6a2a3cc411680e8f4569936ac8ffbb0ab codeclimate < coverage/lcov.info |
| 264 | +``` |
| 265 | +
|
| 266 | +代码来源: [https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) |
| 267 | +
|
| 268 | +我们把这些集成到``README.md``之后,就有了之前那张图。 |
| 269 | +
|
| 270 | +CI对于一个开发者在不同城市开发同一项目上来说是很重要的,这意味着当你添加的部分功能有测试覆盖的时候,项目代码会更加强壮。 |
| 271 | +
|
| 272 | +###代码质量 |
| 273 | +
|
| 274 | +像``jslint``这类的工具,只能保证代码在语法上是正确的,但是不能保证你没有写一堆bad smell的代码。 |
| 275 | +
|
| 276 | + - 重复代码 |
| 277 | + - 过长的函数 |
| 278 | + - 等等 |
| 279 | + |
| 280 | +``Code Climate``是一个与github集成的工具,我们不仅仅可以看到测试覆盖率,还有代码质量。 |
| 281 | +
|
| 282 | +先看看上面的ajax类: |
| 283 | +
|
| 284 | +```javascript |
| 285 | +Lettuce.get = function (url, callback) { |
| 286 | + Lettuce.send(url, 'GET', callback); |
| 287 | +}; |
| 288 | + |
| 289 | +Lettuce.send = function (url, method, callback, data) { |
| 290 | + data = data || null; |
| 291 | + var request = new XMLHttpRequest(); |
| 292 | + if (callback instanceof Function) { |
| 293 | + request.onreadystatechange = function () { |
| 294 | + if (request.readyState === 4 && (request.status === 200 || request.status === 0)) { |
| 295 | + callback(request.responseText); |
| 296 | + } |
| 297 | + }; |
| 298 | + } |
| 299 | + request.open(method, url, true); |
| 300 | + if (data instanceof Object) { |
| 301 | + data = JSON.stringify(data); |
| 302 | + request.setRequestHeader('Content-Type', 'application/json'); |
| 303 | + } |
| 304 | + request.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); |
| 305 | + request.send(data); |
| 306 | +}; |
| 307 | +``` |
| 308 | + |
| 309 | +代码来源: [https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) |
| 310 | + |
| 311 | +在[Code Climate](https://codeclimate.com/github/phodal/lettuce/src/ajax.js)在出现了一堆问题 |
| 312 | + |
| 313 | + - Missing "use strict" statement. (Line 2) |
| 314 | + - Missing "use strict" statement. (Line 14) |
| 315 | + - 'Lettuce' is not defined. (Line 5) |
| 316 | + |
| 317 | +而这些都是小问题啦,有时可能会有 |
| 318 | + |
| 319 | + - Similar code found in two :expression_statement nodes (mass = 86) |
| 320 | + |
| 321 | +这就意味着我们可以对上面的代码进行重构,他们是重复的代码。 |
| 322 | + |
| 323 | +###重构 |
| 324 | + |
| 325 | +不想在这里说太多关于``重构``的东西,可以参考Martin Flower的《重构》一书去多了解一些重构的细节。 |
| 326 | + |
| 327 | +这时想说的是,只有代码被测试覆盖住了,那么才能保证重构的过程没有出错。 |
| 328 | + |
130 | 329 | 创建开源项目
|
131 | 330 | ===
|
132 | 331 |
|
@@ -745,7 +944,7 @@ branches:
|
745 | 944 |
|
746 | 945 | 最后的 ``test/spec`` 是指定测试的目录。
|
747 | 946 |
|
748 |
| -### Jshint |
| 947 | +### JSLint |
749 | 948 |
|
750 | 949 | > JSLint定义了一组编码约定,这比ECMA定义的语言更为严格。这些编码约定汲取了多年来的丰富编码经验,并以一条年代久远的编程原则 作为宗旨:能做并不意味着应该做。JSLint会对它认为有的编码实践加标志,另外还会指出哪些是明显的错误,从而促使你养成好的 JavaScript编码习惯。
|
751 | 950 |
|
@@ -1031,7 +1230,7 @@ Git 提交信息及几种不同的规范
|
1031 | 1230 | 开源应用、开源库写法
|
1032 | 1231 | ---
|
1033 | 1232 |
|
1034 |
| -与我们日常工作稍有不同的是:工作中的 Release 计划一般都是事先安排好的,不需要一些 CHANGELOG 什么的。而开源应用、开源库需要有对应的 CHANELOG,则添加了什么功能、修改了什么等等。毕竟有很多东西是由社区来维护的。 |
| 1233 | +与我们日常工作稍有不同的是:工作中的 Release 计划一般都是事先安排好的,不需要一些 CHANGELOG 什么的。而开源应用、开源库需要有对应的 CHANGELOG,则添加了什么功能、修改了什么等等。毕竟有很多东西是由社区来维护的。 |
1035 | 1234 |
|
1036 | 1235 | 因此,这里以做得比较好的开源项目 Angular 为例展示。Angular 团队建议采用以下的形式:
|
1037 | 1236 |
|
@@ -1201,6 +1400,7 @@ regexobject: {
|
1201 | 1400 | code: /\s\`\`\`\n?([^`]+)\`\`\`/g
|
1202 | 1401 | ```
|
1203 | 1402 |
|
| 1403 | +他会匹配对应的 Markdown 类型,随后进行替换和处理。而``str``,就是管理口的输入和输出。 |
1204 | 1404 | 他会匹配对应的 Markdown 类型,随后进行替换和处理。而``str``,就是管理口的输入和输出。
|
1205 | 1405 |
|
1206 | 1406 | 接着,我们就可以对其进行简单的重构。
|
@@ -1530,7 +1730,7 @@ public class replaceTemp {
|
1530 | 1730 | 便会有下面的结果:
|
1531 | 1731 |
|
1532 | 1732 |
|
1533 |
| -```javas |
| 1733 | +```java |
1534 | 1734 | import java.lang.String;
|
1535 | 1735 |
|
1536 | 1736 | public class replaceTemp {
|
@@ -2201,7 +2401,7 @@ minuteswithcount = [(x, dataarray.count(x)) for x in set(dataarray)]
|
2201 | 2401 |
|
2202 | 2402 | ### Matplotlib
|
2203 | 2403 |
|
2204 |
| -开始之前需要安装``matplotlib |
| 2404 | +开始之前需要安装`matplotlib` |
2205 | 2405 |
|
2206 | 2406 | ```bash
|
2207 | 2407 | sudo pip install matplotlib
|
@@ -3559,7 +3759,7 @@ GitHub 里程碑
|
3559 | 3759 |
|
3560 | 3760 | # GitHub 寻宝指南
|
3561 | 3761 |
|
3562 |
| -作为一个资深的咨询师、程序员,GitHub 是我用过的最好工具,因为 Google 并非总是那么用。GitHub 是一个宝藏库,可没有藏宝图,GitHub 一1亿的仓库也和你没有关系。这么一些年下来,也算是掌握了一定的技巧,写篇文章记录一下,也就顺其自然了。 |
| 3762 | +作为一个资深的咨询师、程序员,GitHub 是我用过的最好工具,因为 Google 并非总是那么好用。GitHub 是一个宝藏库,可没有藏宝图,GitHub 一1亿的仓库也和你没有关系。这么一些年下来,也算是掌握了一定的技巧,写篇文章记录一下,也就顺其自然了。 |
3563 | 3763 |
|
3564 | 3764 | 总结一句话便是:GitHub 来搜索 Google 搜索不到的。它们可以 work 的原因,都是因为**我们想做的事情,已经有人已经走过**。如果你走的是一条新的路,那么这篇文章对你来说,意义可能没有那么大。
|
3565 | 3765 |
|
|
0 commit comments