<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Teamtoy on Binary Life</title><link>http://life.urakalee.me/tags/teamtoy/</link><description>Recent content in Teamtoy on Binary Life</description><generator>Hugo -- 0.157.0</generator><language>zh-cn</language><lastBuildDate>Sat, 14 Dec 2013 14:09:00 +0800</lastBuildDate><atom:link href="http://life.urakalee.me/tags/teamtoy/index.xml" rel="self" type="application/rss+xml"/><item><title>SSH 配置解析</title><link>http://life.urakalee.me/posts/2013-12-14-ssh-configuration-explain/</link><pubDate>Sat, 14 Dec 2013 14:09:00 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-14-ssh-configuration-explain/</guid><description>&lt;ul&gt;
&lt;li&gt;使用 git (ssh 模式)和 scp 等 ssh 相关命令时也遵从该配置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;vim ~/.ssh/config
Host github.com
User git # 使用 github 时的默认用户名
IdentityFile ~/.ssh/id_rsa.github # 为不同的 host 配置不同的 key
Host gerrit.work-host.com
User work-name # 使用公司 gerrit 服务时的默认用户名
IdentityFile ~/.ssh/id_rsa.work # 为不同的 host 配置不同的 key
# ssh mctx =&gt; ssh urakalee@192.168.1.1
# 不需要配系统 host, 不过除 ssh 相关命令外, 该 host 不起作用
Host mctx
HostName 192.168.1.1 # 私人服务器 ip
User urakalee # ssh 到私人服务器时的默认用户名
IdentityFile ~/.ssh/id_rsa.urakalee # 为不同的 host 配置不同的 key
# ssh workstation 和 ssh 10.0.0.1 同时生效
# 不需要配系统 host, 不过除 ssh 相关命令外, 该 host 不起作用
Host workstation 10.0.0.1
HostName 10.0.0.1 # 公司 workstation 服务器 ip
User work-name # ssh 到公司 workstation 服务器时的默认用户名
IdentityFile ~/.ssh/id_rsa.work # 为不同的 host 配置不同的 key
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;vim ~/.ssh/known_hosts
# 通过用户认证的主机列表, 一行一个
&lt;主机名&gt;,ip1[,ip2]...[,ipN] ssh-&lt;加密方式&gt; &lt;主机指纹&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;vim ~/.ssh/authorized_keys
# 设置本机允许那些用户登录, 一行一个
ssh-&lt;加密方式&gt; &lt;公钥&gt; [user@host]
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Code Style</title><link>http://life.urakalee.me/posts/2013-12-07-code-style/</link><pubDate>Sat, 07 Dec 2013 18:07:00 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-07-code-style/</guid><description>&lt;h2 id="代码风格"&gt;代码风格&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;代码是给人看的, 偶尔也在机器上跑一跑&lt;/li&gt;
&lt;li&gt;代码应该越写越少: &lt;em&gt;&lt;strong&gt;Write Less Do More&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;所有源代码文件(包括 html/css/properties/readme 等)均为 utf-8 无 bom 格式, unix 换行&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;禁用tab&lt;/strong&gt;&lt;/em&gt;, 所有源代码文件一律使用 4 空格缩进&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="java"&gt;Java&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/java/codeconv-138413.html" title="Java 编码规范"&gt;Java Code Conventions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://doc.javanb.com/code-conventions-for-the-java-programming-language-zh/" title="Java 编码规范(中文版)"&gt;Java编码规范(中文版)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;h3 id="内部规范"&gt;内部规范&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;第三部分
&lt;ul&gt;
&lt;li&gt;每行不超过 120 字符, 一个文件不超过 600 行&lt;/li&gt;
&lt;li&gt;愿意遵循每行不超过 72 或 80 字符的也可以, 但不超过 120 是必须的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第四部分
&lt;ul&gt;
&lt;li&gt;再次强调每行不超过 120 字符, 一个文件不超过 600 行&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;换行是检验代码可读性的重要标准&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第六部分
&lt;ul&gt;
&lt;li&gt;一行声明一个变量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第七部分
&lt;ul&gt;
&lt;li&gt;语句块即使只有一行也要有括号&lt;/li&gt;
&lt;li&gt;尤其是 if 语句!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第九部分
&lt;ul&gt;
&lt;li&gt;类名为首字母大写格式&lt;/li&gt;
&lt;li&gt;包名均为小写, 视觉上应为一个倒置的域名, 比如 &lt;code&gt;com.domain.codename&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;常量为全大写, 下划线分隔&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第十部分
&lt;ul&gt;
&lt;li&gt;善用 TODO, XXX, FIXME&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;其它
&lt;ul&gt;
&lt;li&gt;避免 magic number&lt;/li&gt;
&lt;li&gt;禁用 &lt;code&gt;System.out.print&lt;/code&gt;, 使用 logger&lt;/li&gt;
&lt;li&gt;如果可能, 避免使用 &lt;code&gt;++&lt;/code&gt;, 无论是前 &lt;code&gt;++&lt;/code&gt; 还是后 &lt;code&gt;++&lt;/code&gt;, 而是用 &lt;code&gt;+= 1&lt;/code&gt;来替代&lt;/li&gt;
&lt;li&gt;文件结构: 将功能和方法分为命令和查询两类, 并将两者分别放在一起
&lt;ul&gt;
&lt;li&gt;也可以分成更多类, 比如 override/implement/public/private/getter/setter 等&lt;/li&gt;
&lt;li&gt;定义 code template 是个好办法, 但关键还是在于所有人都能坚持遵循&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;包结构: 包内文件不超过 10 个, 接口的实现要放在对应的 impl 目录下&lt;/li&gt;
&lt;li&gt;Singleton (helper): 需要初始化&lt;/li&gt;
&lt;li&gt;静态函数集合 (utils): 不需要初始化, 或者有瞬间又无异常的static初始化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="防御"&gt;防御&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;警告就是错误!&lt;/li&gt;
&lt;li&gt;报告所有的异常, 传播不能处理的异常, 禁止空 catch, 即使是临时这样做也不行!&lt;/li&gt;
&lt;li&gt;在异常发生之前使用断言, 可以避免更严重的问题(比如数据不一致)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="测试"&gt;测试&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;单元测试就是最可信的文档&lt;/li&gt;
&lt;li&gt;刚刚开始 TDD 时要用最简单的方式编写 TestCase, 而不是不断引入新的类, 否则你会强迫自己保留和使用它们&lt;/li&gt;
&lt;li&gt;像重构代码一样重构测试&lt;/li&gt;
&lt;li&gt;测试用例以 Test 开头, 测试一个类用 TestClassName, 测试一个包用 TestPackageName (为了遵循类命名规范, 包名需要首字母大写)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="调试"&gt;调试&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;善用 debug 模式, 而不是 log, 更不是 print&lt;/li&gt;
&lt;li&gt;但是, 在运行着的系统中 log 还是很有用的, 所以 log 中要展示有用的信息&lt;/li&gt;
&lt;li&gt;实验用例以 Run 开头, 后面同测试用例, 通常每个实验用例都只有一个 main 函数, 主要用来做实验&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="htmlcssjavascipt"&gt;Html/Css/Javascipt&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;html 的 id 为驼峰格式, 形如 abcXyz&lt;/li&gt;
&lt;li&gt;html 的 class 为全小写, 形如 abc-xyz&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to Wiki</title><link>http://life.urakalee.me/posts/2013-12-07-how-to-wiki/</link><pubDate>Sat, 07 Dec 2013 17:35:18 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-07-how-to-wiki/</guid><description>&lt;h2 id="什么是-wiki"&gt;什么是 wiki&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;wiki 是一种网络应用&lt;/li&gt;
&lt;li&gt;遵照一定的格式, 使用纯文本书写, 输出 html 文档&lt;/li&gt;
&lt;li&gt;方便的内链接, 在多个内部页面之间跳转&lt;/li&gt;
&lt;li&gt;多人编辑, 支持版本历史&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="如何创建一个-wiki-页面"&gt;如何创建一个 wiki 页面&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;访问一个不存在的 url, 建立一个新的页面
&lt;ul&gt;
&lt;li&gt;比如 &lt;code&gt;/APageDoesNotExist&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;页面的名字必须是 &lt;strong&gt;首字母大写&lt;/strong&gt; 的, 首字母大写的名字可以被 wiki 识别为内链接&lt;/li&gt;
&lt;li&gt;点击 &amp;ldquo;创建页面&amp;rdquo;, 编辑&lt;/li&gt;
&lt;li&gt;书写语法见 &lt;code&gt;/WikiFormatting&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;编辑完点击 &amp;ldquo;预览&amp;rdquo;, 查看输出的 html 是否符合预期&lt;/li&gt;
&lt;li&gt;如果没问题, 点击 &amp;ldquo;提交改动&amp;rdquo;, 即生成一个新的 wiki 页面&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;h2 id="添加附件"&gt;添加附件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;wiki 允许增加附件&lt;/li&gt;
&lt;li&gt;打开一个存在的 wiki 页面, 点击页面底部的 &amp;ldquo;附件&amp;rdquo;&lt;/li&gt;
&lt;li&gt;选择文件并上传&lt;/li&gt;
&lt;li&gt;如果可能, 尽量书写一份 wiki 文档而不是上传一个 word 文档作为 wiki 的附件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="规划-wiki-文档的层次结构"&gt;规划 wiki 文档的层次结构&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;wiki 中使用 &lt;code&gt;=&lt;/code&gt; 到 &lt;code&gt;======&lt;/code&gt; 代表 h1 到 h6 标签, 标识文档的层次结构&lt;/li&gt;
&lt;li&gt;书写 wiki 文档时, 需要合理地规划层次结构, 增加文档的可读性&lt;/li&gt;
&lt;li&gt;需要合理地使用表格, 列表等 html 元素, 增加文档的可读性&lt;/li&gt;
&lt;li&gt;更多格式语法见 &lt;code&gt;/WikiFormatting&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;当一个文档过长时, 可以考虑切分成几个文档, 或者当成一个项目&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="如何创建一个项目的-wiki-页面"&gt;如何创建一个项目的 wiki 页面&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一个项目通常有很多内容, 需要创建多个页面&lt;/li&gt;
&lt;li&gt;先创建项目首页, 比如 &lt;code&gt;/NewProject&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;再创建子页面, 比如:
&lt;ul&gt;
&lt;li&gt;设计文档: &lt;code&gt;/NewProject/Design&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如何部署: &lt;code&gt;/NewProject/Deploy&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;每个子页面可以根据需要再创建子页面&lt;/li&gt;
&lt;li&gt;编辑项目页面, 在底部加入下面的代码, 即可在项目页面上看到所有子页面:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;== 文章列表 ==
[[TitleIndex(NewProject)]]
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Work Style</title><link>http://life.urakalee.me/posts/2013-12-07-work-style/</link><pubDate>Sat, 07 Dec 2013 15:20:01 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-07-work-style/</guid><description>&lt;h2 id="工作模式暂行"&gt;工作模式(暂行)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;4 天计划, 前紧后松&lt;/li&gt;
&lt;li&gt;CoC, 主动 &amp;amp; 高效, 跨职能 的 技术团队&lt;/li&gt;
&lt;li&gt;执行 &lt;strong&gt;敏捷开发&lt;/strong&gt; 和 &lt;strong&gt;文档驱动&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;每日站会, 详见 &lt;strong&gt;45个习惯&lt;/strong&gt; 第 8 章&lt;/li&gt;
&lt;li&gt;代码集体所有制, 详见 &lt;strong&gt;45个习惯&lt;/strong&gt; 第 8 章&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="coc-convention-over-configuration"&gt;CoC: Convention over Configuration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;习惯优于配置&lt;/li&gt;
&lt;li&gt;达成目标的方式有很多种, 可以灵活配置, 但遵从习惯可以降低沟通成本
&lt;ul&gt;
&lt;li&gt;版本控制: Git&lt;/li&gt;
&lt;li&gt;Java 包管理和部署: Maven&lt;/li&gt;
&lt;li&gt;文档管理: wiki (Trac)&lt;/li&gt;
&lt;li&gt;项目管理: Trello&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;习惯可以改, 只要好处 &amp;raquo; 成本&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;h2 id="主动高效"&gt;主动&amp;amp;高效&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;主动提问, 站会匆匆而过, 没听明白的一定要问&lt;/li&gt;
&lt;li&gt;主动沟通, 有问题超过 1h 搞不定, 就应该想想能找谁帮忙解决&lt;/li&gt;
&lt;li&gt;主动通知, 邮件是广播 &amp;amp; 存档, 不能指望每个人都会看邮件, 但至少让 Ta 有地方去看&lt;/li&gt;
&lt;li&gt;4 天做完 1 周的事, 剩下一天提高团队战斗力, 或者爱干嘛干嘛&lt;/li&gt;
&lt;li&gt;一图抵万言, 确保大家说的 A 是同一个 A, 理解的 B 是同一个 B&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="跨职能"&gt;跨职能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;为了大家都能做一些爱做的事, 需要大家都做一些不爱做的事&lt;/li&gt;
&lt;li&gt;每项工作都需要有至少 2 个人了解, 避免某件事情由于某个人不在就搞不定&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技术团队"&gt;技术团队&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;关注解决方案, 尽可能的解决问题&lt;/li&gt;
&lt;li&gt;让 &amp;ldquo;这个很难&amp;rdquo;, &amp;ldquo;这个搞不定&amp;rdquo; 越来越少&lt;/li&gt;
&lt;li&gt;领取 &lt;strong&gt;个人项目&lt;/strong&gt;, 作为 bonus&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="借鉴-scrum-敏捷开发框架"&gt;借鉴 Scrum 敏捷开发框架&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;每周一个 Sprint, 按照大版本规划 Sprint&lt;/li&gt;
&lt;li&gt;持续交付, 每个 Sprint 产出的结果对于最终用户都是有用的&lt;/li&gt;
&lt;li&gt;每个 Sprint 需要分拆成最小 0.5D, 最大 2D 的任务&lt;/li&gt;
&lt;li&gt;每天 10 ~ 20 分钟同步进度, 解决问题&lt;/li&gt;
&lt;li&gt;使用 Trello 进行项目管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="文档驱动"&gt;文档驱动&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;任何 &lt;strong&gt;三个月后还有用的东西&lt;/strong&gt; 都需要文档&lt;/li&gt;
&lt;li&gt;文档需要回答的问题: 如果我完全不了解这个项目, 我想知道什么
&lt;ul&gt;
&lt;li&gt;怎么用: 如何部署/运行, 提供什么接口&lt;/li&gt;
&lt;li&gt;怎么开发: 代码结构/核心算法/核心模块和逻辑(数据流图)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to Git</title><link>http://life.urakalee.me/posts/2013-12-04-how-to-git/</link><pubDate>Wed, 04 Dec 2013 09:37:29 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-04-how-to-git/</guid><description>&lt;h2 id="git-入门资料"&gt;Git 入门资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;windows 客户端: &lt;a href="http://git-scm.com/download/win"&gt;http://git-scm.com/download/win&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro Git 中文版(书, 可能被墙): &lt;a href="http://git-scm.com/book/zh"&gt;http://git-scm.com/book/zh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pro Git 中文下载版(pdf): &lt;a href="http://ishare.iask.sina.com.cn/f/23292123.html"&gt;http://ishare.iask.sina.com.cn/f/23292123.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;图解 Git (推荐阅读): &lt;a href="http://my.oschina.net/xdev/blog/114383"&gt;http://my.oschina.net/xdev/blog/114383&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="windows-下-git-的配置和使用"&gt;windows 下 Git 的配置和使用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;以下命令都在 Git Bash 中运行&lt;/li&gt;
&lt;li&gt;生成公钥/私钥
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh-keygen -t rsa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;生成的密钥对的位置在 &lt;code&gt;C:\Users\&amp;lt;user-name&amp;gt;\.ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;id_rsa 为私钥, id_rsa.pub 为公钥&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;配置 Git 的用户名和邮件&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.name &amp;lt;your-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.email &amp;lt;your-email&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- more --&gt;
&lt;h3 id="进阶配置"&gt;进阶配置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;编辑 &lt;code&gt;&amp;lt;git-install-path&amp;gt;\etc\gitconfig&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;修改autocrlf = input, 确保提交的文本都是 utf8 编码&lt;/li&gt;
&lt;li&gt;在文件末尾增加下面的代码, 使 Git GUI 能显示中文&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[gui]
encoding = utf-8
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;编辑 &lt;code&gt;&amp;lt;git-install-path&amp;gt;\etc\git-completion.bash&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;在文件末尾增加下面的代码, 使 Git Bash 能显示中文&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;alias ls='ls --show-control-chars --color=auto'
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="git-使用规范"&gt;Git 使用规范&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;禁用中文文件名&lt;/li&gt;
&lt;li&gt;所有文本文件使用 utf8 编码&lt;/li&gt;
&lt;li&gt;所有文本文件使用 unix 换行 (\n), 而非 windows 换行 (\r\n)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="git-分枝管理"&gt;Git 分枝管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;master: 稳定可编译/测试通过的代码&lt;/li&gt;
&lt;li&gt;test: 测试环境的代码, 通过测试后merge到master&lt;/li&gt;
&lt;li&gt;pri-xxx: 个人开发代码 (private), 由于可能需要到部署到服务器上, 因此允许 push 到 remote&lt;/li&gt;
&lt;li&gt;dev: 开发环境的代码&lt;/li&gt;
&lt;li&gt;在 pri-xxx 上开发的代码, 可能需要 merge 到开发环境上验证&lt;/li&gt;
&lt;li&gt;验证通过后, &lt;strong&gt;禁止&lt;/strong&gt; 直接把 dev merge 到 test, 而是应该从 pri-xxx merge 到 test&lt;/li&gt;
&lt;li&gt;由于 dev 代码在多人 merge 后可能出问题, 所以定期会从 master 重开 dev 分枝&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="git-注释规范"&gt;Git 注释规范&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;所有注释, 除了 merge 时系统自动生成的, 均应符合以下规范
&lt;ol&gt;
&lt;li&gt;格式为 &lt;code&gt;&amp;lt;OPERATION&amp;gt;: description&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;OPERATION 包括 ADD/MOD/DEL/FIX/MERGE/REFACTOR/CLEAN, 全部大写, 后面跟着冒号&lt;/li&gt;
&lt;li&gt;description 需要是全英文, 包括标点&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;一次提交可以有多个 OPERATION, 但最好只有一个
&lt;ul&gt;
&lt;li&gt;多个 OPERATION 一行一个&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OPERATION&lt;/th&gt;
&lt;th&gt;何时使用&lt;/th&gt;
&lt;th&gt;description应该写什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ADD&lt;/td&gt;
&lt;td&gt;增加功能/文件&lt;/td&gt;
&lt;td&gt;增加了什么功能/文件(文件太多可以写目录)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MOD&lt;/td&gt;
&lt;td&gt;修改功能/文件&lt;/td&gt;
&lt;td&gt;修改了什么功能/文件, 以及修改原因&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEL&lt;/td&gt;
&lt;td&gt;删除功能/文件&lt;/td&gt;
&lt;td&gt;删除了什么功能/文件, 以及删除原因&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIX&lt;/td&gt;
&lt;td&gt;修复 bug&lt;/td&gt;
&lt;td&gt;bug 列表中有的, 可以只写 bug 号, 没有的需要说明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MERGE&lt;/td&gt;
&lt;td&gt;手动合并&lt;/td&gt;
&lt;td&gt;从哪里合并到哪里 (from x to y), 如何解决了冲突&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;td&gt;重构&lt;/td&gt;
&lt;td&gt;重构了什么&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLEAN&lt;/td&gt;
&lt;td&gt;清理&lt;/td&gt;
&lt;td&gt;清理了什么&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>How to code review</title><link>http://life.urakalee.me/posts/2013-12-01-how-to-code-review/</link><pubDate>Sun, 01 Dec 2013 21:17:33 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-01-how-to-code-review/</guid><description>&lt;h2 id="引"&gt;引&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;版本控制工具：Git&lt;/li&gt;
&lt;li&gt;代码 review 工具：&lt;a href="http://www.reviewboard.org/" title="Review Board"&gt;ReviewBoard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;代码 review 需要积极评估代码的设计和清晰程度，项目 owner 还要确保被review 代码的逻辑正确性，而不仅限于命名和格式&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="准备工作"&gt;准备工作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;用 ldap 账号登录&lt;/li&gt;
&lt;li&gt;确保参与 review 的人都需要登录过，否则会找不到人&lt;/li&gt;
&lt;li&gt;确保你要 review 的代码的 git 已经加入 reviewboard&lt;/li&gt;
&lt;li&gt;确保你要 review 的代码基点已经 push 到 git 服务器
&lt;ul&gt;
&lt;li&gt;代码基点: &lt;code&gt;git diff &amp;lt;src-rev&amp;gt; &amp;lt;tgt-rev&amp;gt;&lt;/code&gt; 中的 &lt;code&gt;&amp;lt;src-rev&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="提交一个-review"&gt;提交一个 review&lt;/h2&gt;
&lt;!-- more --&gt;
&lt;ol&gt;
&lt;li&gt;生成diff
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git diff &amp;lt;src-rev&amp;gt; &amp;lt;tgt-rev&amp;gt; &amp;gt; d1.diff&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;一般来说src是tgt的父节点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如何得到 &lt;code&gt;&amp;lt;src-rev&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;对于开分枝 / 开发 / merge 的工作模式而言
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;src-rev&amp;gt;&lt;/code&gt; 就是你开分枝时分枝点的版本&lt;/li&gt;
&lt;li&gt;可以用 &lt;code&gt;git merge-base &amp;lt;src-branch&amp;gt; &amp;lt;tgt-branch&amp;gt;&lt;/code&gt; 得到 &lt;code&gt;&amp;lt;src-rev&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;比如你要从 work 分枝 merge 回 master，则执行 &lt;code&gt;git merge-base master work&lt;/code&gt; 得到 &lt;code&gt;&amp;lt;src-rev&amp;gt;&lt;/code&gt;，前提是你没有 merge 过&lt;/li&gt;
&lt;li&gt;但如果你已经 merge 过，这样得到的 &lt;code&gt;&amp;lt;src-rev&amp;gt;&lt;/code&gt; 是从最后一次 merge 的版本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;对于在一个分枝上持续开发的工作模式
&lt;ul&gt;
&lt;li&gt;查看git log 找到需要的 &lt;code&gt;&amp;lt;src-rev&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;应该尽量在代码稳定时再 merge：勤开分枝，慎重 merge&lt;/li&gt;
&lt;li&gt;应该尽量使用 amend，减少 commit，git log 才好找&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;访问 reviewboard，点击 New Review Request&lt;/li&gt;
&lt;li&gt;选择 Repository，选择 diff 文件，点击 Create Review Request&lt;/li&gt;
&lt;li&gt;点击 View Diff，查看上传结果是否和预期一致&lt;/li&gt;
&lt;li&gt;填写 Summary / People / Description，注意 people 是 ldap 账号名，用 tab 补全，别按回车&lt;/li&gt;
&lt;li&gt;确认提交，系统会发邮件给 people，通知他们来 review&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="更新一个-review"&gt;更新一个 review&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;修改代码提交之后生成新 diff
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git diff &amp;lt;src-rev&amp;gt; &amp;lt;tgt-rev2&amp;gt; &amp;gt; d2.diff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt; 确保在一次 review 中，所有 diff 的 &lt;code&gt;&amp;lt;src-rev&amp;gt;&lt;/code&gt; 都是同一个&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;访问 reviewboard，打开要更新的 review
&lt;ul&gt;
&lt;li&gt;只能更新自己提交的 review&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;点击 Update 下拉菜单中的 Update Diff，选择 diff 文件，点击 Upload&lt;/li&gt;
&lt;li&gt;点击 View Diff，查看上传结果是否和预期一致&lt;/li&gt;
&lt;li&gt;填写本次更新的内容，确认提交&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="review-别人的代码"&gt;review 别人的代码&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;点击邮件通知中的链接，登录 reviewboard&lt;/li&gt;
&lt;li&gt;点击 View Diff，查看被修改的代码&lt;/li&gt;
&lt;li&gt;点击有问题的行，填写有什么问题&lt;/li&gt;
&lt;li&gt;继续 review，直到所有代码都 review 完毕&lt;/li&gt;
&lt;li&gt;点击页面上方悬浮条中的 Edit Review，预览所有你填写的内容&lt;/li&gt;
&lt;li&gt;如果没有问题，点击 Publish Review
&lt;ul&gt;
&lt;li&gt;如果需要修改，可以直接在预览页面上修改&lt;/li&gt;
&lt;li&gt;如果需要增加，点击 Cancel，增加，再 Edit Review&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果代码较多，可以 review 一页提交一页&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="根据别人的-review-修改代码"&gt;根据别人的 review 修改代码&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;别人提出的每个问题都会生成一个 issue&lt;/li&gt;
&lt;li&gt;对照这些 issue 修改代码；如果 fix 了，就点 fixed；如果有异议，可以回复讨论；如果确认不需要改，就点 drop&lt;/li&gt;
&lt;li&gt;修改完成后，提交代码，生成新的 diff&lt;/li&gt;
&lt;li&gt;更新 review，继续，直到所有 issue 都 fixed 或 drop&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>我的 Git 配置</title><link>http://life.urakalee.me/posts/2013-11-28-my-git-configuration/</link><pubDate>Thu, 28 Nov 2013 20:35:55 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-11-28-my-git-configuration/</guid><description>&lt;pre&gt;&lt;code&gt;vim ~/.gitconfig
[color]
ui = true
diff = true
status = true
branch = true
interactive = true
[alias]
st = status
ss = status -s
ci = commit
ca = commit --amend
co = checkout
ll = log --graph --color --format=format:'%C(bold)%h%C(reset) -%C(bold)%d%C(reset) %C(white)%s%C(reset) %C(bold red)- %an' --abbrev-commit
ft = fetch
pl = pull --rebase
br = branch
cp = cherry-pick
mg = merge
rb = rebase
dci = dcommit
sbi = submodule init
sbu = submodule update
sbp = submodule foreach git pull
sbc = submodule foreach git co master
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>我的 Vim 配置</title><link>http://life.urakalee.me/posts/2013-11-28-my-vim-configuration/</link><pubDate>Thu, 28 Nov 2013 20:25:20 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-11-28-my-vim-configuration/</guid><description>&lt;pre&gt;&lt;code&gt;vim ~/.vimrc
# 行号
set nu
# tab 转空格
set ts=4
set expandtab
set autoindent
# 语法高亮
syntax enable
set background=dark
colorscheme solarized
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;solarized 是一套很棒的配色方案，请参考 &lt;a href="http://www.vpsee.com/2013/09/use-the-solarized-color-theme-on-mac-os-x-terminal/" title="在 Mac OS X 终端里使用 Solarized 配色方案"&gt;vpsee&lt;/a&gt; 中的方法进行配置。&lt;/p&gt;</description></item></channel></rss>