<?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>Binary Life</title><link>http://life.urakalee.me/</link><description>Recent content on Binary Life</description><generator>Hugo -- 0.157.0</generator><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://life.urakalee.me/index.xml" rel="self" type="application/rss+xml"/><item><title>macOS 应用图标：用 Figma 制作超椭圆图标</title><link>http://life.urakalee.me/posts/2026-04-04-macos-app-icon-figma/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>http://life.urakalee.me/posts/2026-04-04-macos-app-icon-figma/</guid><description>&lt;p&gt;用 Figma 直接输出带透明背景的图标，替代之前用&amp;quot;预览&amp;quot;的方式。&lt;/p&gt;</description></item><item><title>macOS 应用图标：去背景 + 导入 Xcode</title><link>http://life.urakalee.me/posts/2026-03-28-macos-app-icon-xcode/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><guid>http://life.urakalee.me/posts/2026-03-28-macos-app-icon-xcode/</guid><description>&lt;p&gt;两步搞定：用&amp;quot;预览&amp;quot;去掉图标背景，再把透明 PNG 拖进 Xcode 的 AppIcon。&lt;/p&gt;</description></item><item><title>通过跳板机 SSH 一键登录</title><link>http://life.urakalee.me/posts/2026-03-20-ssh-jump-host-cheatsheet/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>http://life.urakalee.me/posts/2026-03-20-ssh-jump-host-cheatsheet/</guid><description>&lt;p&gt;两步搞定 SSH 跳板机：配置 &lt;code&gt;~/.ssh/config&lt;/code&gt;，再分发公钥，之后就能一条命令直连目标机器。&lt;/p&gt;</description></item><item><title>2026 年初的三张图</title><link>http://life.urakalee.me/posts/2026-03-15-three-charts-early-2026/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>http://life.urakalee.me/posts/2026-03-15-three-charts-early-2026/</guid><description>&lt;p&gt;两周前同事转发了一篇《2028 全球智能危机》的文章，一问老婆居然还不知道，果然隔行如隔山。&lt;/p&gt;
&lt;p&gt;昨天跟 Gemini 和 Claude 分别聊了一下，还挺有意思。很多事情没想清楚（也不可能想清楚），写这篇文章主要是练练笔。&lt;/p&gt;</description></item><item><title>自定义 OpenClaw 定时任务的模型</title><link>http://life.urakalee.me/posts/2026-03-10-openclaw-cron-job-model-config/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>http://life.urakalee.me/posts/2026-03-10-openclaw-cron-job-model-config/</guid><description>&lt;p&gt;不是所有定时任务都需要高级模型，改个配置就能省不少费用。&lt;/p&gt;</description></item><item><title>修复嵌套 Git 仓库 Cursor Timeline 为空问题</title><link>http://life.urakalee.me/posts/2026-03-08-cursor-nested-git-repo-timeline-fix/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>http://life.urakalee.me/posts/2026-03-08-cursor-nested-git-repo-timeline-fix/</guid><description>&lt;p&gt;主目录是 Git 仓库，子目录也是 Git 仓库时，用 Cursor 查看子目录文件的 Git 历史时，Timeline 面板显示为空。&lt;/p&gt;</description></item><item><title>在 OpenClaw 中使用 Gemini 3.1 Flash Lite</title><link>http://life.urakalee.me/posts/2026-03-08-gemini-flash-lite-in-openclaw/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>http://life.urakalee.me/posts/2026-03-08-gemini-flash-lite-in-openclaw/</guid><description>&lt;p&gt;Gemini 3.1 Flash Lite 跑的飞快。&lt;/p&gt;</description></item><item><title>避坑指南：Parallels 虚拟机 Chrome 连不上内网代理</title><link>http://life.urakalee.me/posts/2026-03-08-parallels-chrome-proxy-fix/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>http://life.urakalee.me/posts/2026-03-08-parallels-chrome-proxy-fix/</guid><description>&lt;p&gt;我的 OpenClaw 是部署在 Parallels 虚拟机里的，最近想让它通过浏览器帮我收集一些信息，结果遇到了一个非常“玄学”的问题：明明能 ping 通内网代理，但 Chrome 插件（ZeroOmega）死活连不上。和 Gemini 联手排查了半天，终于搞定了。&lt;/p&gt;</description></item><item><title>重启十年前的博客</title><link>http://life.urakalee.me/posts/2026-03-07-revive-my-blog-with-hugo/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>http://life.urakalee.me/posts/2026-03-07-revive-my-blog-with-hugo/</guid><description>&lt;p&gt;距离上一次更新这个博客，已经过去了整整十年。&lt;/p&gt;
&lt;p&gt;当年用 Octopress 搭的，最后一篇是 2016 年；这次跟 Cursor 聊，换成了 Hugo。&lt;/p&gt;</description></item><item><title>Android: 9-patch的夜间模式</title><link>http://life.urakalee.me/posts/2016-03-10-android-night-theme-for-9-patch/</link><pubDate>Thu, 10 Mar 2016 19:59:31 +0800</pubDate><guid>http://life.urakalee.me/posts/2016-03-10-android-night-theme-for-9-patch/</guid><description>&lt;p&gt;&lt;a href="https://www.evernote.com/l/ABCVzpSbJs1HoKym6kJDBZQsyMlFtgXKYpM"&gt;https://www.evernote.com/l/ABCVzpSbJs1HoKym6kJDBZQsyMlFtgXKYpM&lt;/a&gt;&lt;/p&gt;</description></item><item><title>做题解析性能优化始末(1)</title><link>http://life.urakalee.me/posts/2016-03-10-optimize-question-and-solution-of-yuantiku-1/</link><pubDate>Thu, 10 Mar 2016 19:51:45 +0800</pubDate><guid>http://life.urakalee.me/posts/2016-03-10-optimize-question-and-solution-of-yuantiku-1/</guid><description>&lt;p&gt;&lt;a href="https://www.evernote.com/l/ABC9oWR2d7xBaK-bic2LbgXHmwIsthq2-HI"&gt;https://www.evernote.com/l/ABC9oWR2d7xBaK-bic2LbgXHmwIsthq2-HI&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Android机制: AsyncTask</title><link>http://life.urakalee.me/posts/2016-03-10-android-mechanism-asynctask/</link><pubDate>Thu, 10 Mar 2016 19:35:34 +0800</pubDate><guid>http://life.urakalee.me/posts/2016-03-10-android-mechanism-asynctask/</guid><description>&lt;p&gt;&lt;a href="https://www.evernote.com/l/ABDmk4yr90FNi6-Pa69oLDK291tym7e00qE"&gt;https://www.evernote.com/l/ABDmk4yr90FNi6-Pa69oLDK291tym7e00qE&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Mac Tips: 对 Chrome 禁用 Cmd+Q</title><link>http://life.urakalee.me/posts/2015-04-19-disable-cmd-q-for-chrome/</link><pubDate>Sun, 19 Apr 2015 10:34:27 +0800</pubDate><guid>http://life.urakalee.me/posts/2015-04-19-disable-cmd-q-for-chrome/</guid><description>&lt;p&gt;我有一个坏习惯, 开巨多 Chrome 标签页, 然后幻想着有一天可以一个一个看完并记录&amp;hellip;&lt;/p&gt;
&lt;p&gt;以前的解决方案是使用 &lt;a href="https://chrome.google.com/webstore/detail/onetab/chphlpgkkbolifaimnlloiipkdnihall" title="OneTab"&gt;OneTab&lt;/a&gt;, 实际情况是内存占满, 从未看完过.&lt;/p&gt;
&lt;p&gt;在一天两次 Cmd+Q 把所有标签页都关掉之后, 我要继续 hack 这个问题. &lt;a href="http://www.quora.com/How-do-I-disable-Command-q-in-OS-X" title="Disable Cmd+Q in OS X"&gt;Quora&lt;/a&gt; 上已经有人遇到并解决了这个问题, copy 过来:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System Pref - Keyboard - Shortcuts - App Shortcuts - Add
&lt;ul&gt;
&lt;li&gt;App: Chrome&lt;/li&gt;
&lt;li&gt;Title: Quit Google Chrome&lt;/li&gt;
&lt;li&gt;Shortcut: Cmd+Opt+Q&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mac 重装/数据迁移</title><link>http://life.urakalee.me/posts/2015-04-19-mac-migration/</link><pubDate>Sun, 19 Apr 2015 10:14:44 +0800</pubDate><guid>http://life.urakalee.me/posts/2015-04-19-mac-migration/</guid><description>&lt;ul&gt;
&lt;li&gt;transfer 出来的 Mac 系统, 有一些地方需要重新设置
&lt;ol&gt;
&lt;li&gt;关闭 guest: Pref - User - Unlock - Guest User - Uncheck&lt;/li&gt;
&lt;li&gt;修改机器名1: Pref - Share - Computer Name&lt;/li&gt;
&lt;li&gt;修改机器名2: &lt;code&gt;sudo scutil --set HostName &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改 Terminal 提示符&lt;/li&gt;
&lt;/ol&gt;
&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;vim ~/.bash_profile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[\u@\h \W]\$ &amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 增加这一行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bash_profile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;开启 TRIM
&lt;ul&gt;
&lt;li&gt;方法 1: 使用 &lt;a href="http://bbs.weiphone.com/read-htm-tid-7173782.html" title="[求助] 10.9 怎么开启TRIM"&gt;Terminal 命令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;方法 2: 使用 &lt;a href="http://chameleon.alessandroboschini.it/index.php" title="Chameleon SSD Optimizer"&gt;Chameleon SSD Optimizer&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;我是在使用过方法 1 之后才找到方法 2 的, 不过以后再有需要会先用方法 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;检查安装的软件
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Dropbox&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;CloudStation&lt;/del&gt; -&amp;gt; 家用 ONLY&lt;/li&gt;
&lt;li&gt;&lt;del&gt;GoAgentX: 升个级吧&lt;/del&gt; -&amp;gt; 买个 VPN 吧&lt;/li&gt;
&lt;li&gt;Alfred: &lt;a href="http://life.urakalee.me/blog/2013/11/25/confused-alfred-and-spotlight/" title="Alfred &amp;amp; Spotlight"&gt;设置 Spotlight 索引&lt;/a&gt;, 重建 Alfred 索引&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;配置 hosts/ssh-config/known_hosts/vimrc/gitconfig/SwitchySharp&lt;/li&gt;
&lt;li&gt;各种清理
&lt;ul&gt;
&lt;li&gt;清理个人的 Login Items: Pref - User - Login Items&lt;/li&gt;
&lt;li&gt;使用 CleanMyMac 清理全局的 Login Items&lt;/li&gt;
&lt;li&gt;使用 CleanMyMac 删除没用的软件&lt;/li&gt;
&lt;li&gt;到 &lt;code&gt;~/&lt;/code&gt; 下删除没用的目录和没用软件的残留&lt;/li&gt;
&lt;li&gt;到 &lt;code&gt;~/Library/Application Support/&lt;/code&gt; 和 &lt;code&gt;Preferences&lt;/code&gt;, &lt;code&gt;Caches&lt;/code&gt;, &lt;code&gt;Logs&lt;/code&gt; 目录下删除没用软件的残留&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;运行 Disk Utility&lt;/li&gt;
&lt;li&gt;修复 HomeBrew
&lt;ul&gt;
&lt;li&gt;按照 &lt;code&gt;brew doctor&lt;/code&gt; 的提示做即可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="mailto:Update@2015.04.13"&gt;Update@2015.04.13&lt;/a&gt;: 修改&amp;quot;检查安装的软件&amp;quot;部分&lt;/p&gt;</description></item><item><title>Android: 捕获 Home 键</title><link>http://life.urakalee.me/posts/2015-01-21-android-home-watcher/</link><pubDate>Wed, 21 Jan 2015 17:12:00 +0800</pubDate><guid>http://life.urakalee.me/posts/2015-01-21-android-home-watcher/</guid><description>&lt;p&gt;在&lt;a href="http://yuantiku.com"&gt;猿题库&lt;/a&gt;工作一年多, 新功能做了不少, bug 也改了许多, 近期开始做更多的优化工作. 本篇博客的内容来自&amp;quot;错题锁屏&amp;quot;功能的优化.&lt;/p&gt;
&lt;p&gt;我们 2014 年 9 月开始做&amp;quot;错题锁屏&amp;quot;功能, 希望增加曝光, 提高存留. 开发该功能的同学现在已经结束实习出国工作了, 但做这个功能的时候我就知道坑很多, 而且上线前为了避免风险留了一些坑没改. 上线后, 发现该功能比较受欢迎, 所以又有了多次拉锯式的修改, 不过对于锁屏本身的坑并没有填.&lt;/p&gt;
&lt;p&gt;关于如何防止锁屏进程被杀, 我可能会开另外一篇博客来说明, 不过其实你也可以逆向工程我们的 apk 自己去看. 还有就是错题锁屏变成一个独立进程之后, 进程间共享数据变成了一个新的大坑&amp;hellip;&lt;/p&gt;
&lt;p&gt;由于我们一开始就不想把错题锁屏做得很暴力, 所以虽然禁用了 Back 键(按 Back 键不能退出锁屏), 却还是保留了按 Home 键退出的可能性, 避免用户因为答不对题而无法解锁(我们可能低估用户了).&lt;/p&gt;
&lt;p&gt;于是有一个问题, 按 Home 键退出锁屏之后, 用户可以在&amp;quot;最近使用&amp;quot;中重新打开锁屏界面, 而我们只想让用户在&amp;quot;最近使用&amp;quot;中看到猿题库本身. 我开始寻找如何在用户按 Home 键时让锁屏界面自己把自己 finish 掉的方法.&lt;/p&gt;
&lt;p&gt;首先查到的方法是 onUserLeaveHint, 按 Home 键时确实会调用这个函数. 不过遇到的问题也很坑: 当有其它锁屏, 甚至 QQ 弹窗(实际上也是用类似锁屏的方法实现的)出现时, 我们的锁屏可能被挤掉(onUserLeaveHint 被调用).&lt;/p&gt;
&lt;p&gt;然后开始寻找能够捕获 Home 键的方法:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/8881951/detect-home-button-press-in-android"&gt;override onKeyDown&lt;/a&gt;, 不过 no longer works as of 4.0, &lt;a href="http://www.coderzheaven.com/2012/06/02/override-hardware-home-button-android-listen-home-button-click-android/"&gt;这里&lt;/a&gt;给出了完整的代码&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/5907102/home-button-listener"&gt;这篇 vote 比较少的文章&lt;/a&gt;其实离最终答案很近了, 不过因为 vote 太少, 我一开始没有相信它&amp;hellip;&lt;/li&gt;
&lt;li&gt;中文网络上看起来有更多人搞过这个问题: 文章 &lt;a href="http://blog.csdn.net/way_ping_li/article/details/8953622"&gt;A&lt;/a&gt; &lt;a href="http://blog.csdn.net/watt520/article/details/18959897"&gt;B&lt;/a&gt; &lt;a href="http://blog.csdn.net/ekeuy/article/details/39400939"&gt;C&lt;/a&gt; 大同小异, &lt;a href="http://862123204-qq-com.iteye.com/blog/1888532"&gt;这里&lt;/a&gt;分析得更详细一些. 其中 &lt;a href="http://blog.csdn.net/watt520/article/details/18959897"&gt;B&lt;/a&gt; 的代码更漂亮一些, 我试过可行 (Android4.+)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可行之后, 我发现又掉到了坑里: &lt;strong&gt;即使 finish 掉了, 用户还是可以在最近使用中重新打开锁屏界面!!!&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>致 Weiwei: 我们期待着你的降临</title><link>http://life.urakalee.me/posts/2013-12-25-to-weiwei-waiting-for-you/</link><pubDate>Wed, 25 Dec 2013 21:56:02 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-25-to-weiwei-waiting-for-you/</guid><description>&lt;h2 id="记录"&gt;记录&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;圣诞节, Mimi 怀孕 14 周 2 天; 大风; 上线结束的时间还好, 9点到家.&lt;/li&gt;
&lt;li&gt;本周体重 51kg, 没有增加; 食欲仍然一般, 胃有胀气, 偶尔拉肚子; 睡 8 小时, 但梦比较多.&lt;/li&gt;
&lt;li&gt;第一次产前筛查已经过了一周; 约了 1 月 5 号的孕期课程第一节.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="致-weiwei"&gt;致 Weiwei&lt;/h2&gt;
&lt;p&gt;你的名字叫李 Weiling, 因为还不知道你是男宝宝还是女宝宝, 所以字还没有定. Weiling 这个名字是爸爸起的, 依照 willing 的发音, 希望你能够有自己的意志, 不随波逐流. 不过名字只是个祝愿, 健康快乐才最重要, 爸爸妈妈都清楚这一点.&lt;/p&gt;
&lt;p&gt;因为你曾经离开过爸爸妈妈一次, 所以这一次爸爸妈妈都有点紧张. 说什么放轻松那是骗人, 但着急也没用却是真的. 一方面担心你是不是能顺利地到来, 另一方面也希望能在你到来之前做好更多的准备.&lt;/p&gt;
&lt;p&gt;两个月前爸爸刚换了一份工作, 降薪来到了一家创业公司. 虽然心态好了不少, 也有了努力的方向, 但钱少了是个事实. 于是爸爸开始尝试理财, 赶上比特币大涨, 小赚了一笔. 投资还是投机, 一开始爸爸没有把握好, 赚了又赔, 身心疲惫. 反复几次之后, 爸爸开始尝试给自己设定几条规则:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;投资自己(学习)最重要&lt;/li&gt;
&lt;li&gt;投机没有关系, 但要自律, 不能违背第一条&lt;/li&gt;
&lt;li&gt;设定合理的收益目标, 有助于平衡上述关系&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这几条规则并不一定普遍适用, 但至少符合爸爸目前的情况. 同时, 爸爸也意识到目前物质基础还算牢固, 但快速增长也不现实, 应该更关注精神方面的准备. 这一点妈妈做得很棒呢! 从很久以前就开始看书, 还给爸爸普及了许多妈妈和宝宝相关的健康知识. 不过爸爸偶尔还是会神经兮兮地在削苹果的过程中洗 3 次手, 生怕妈妈吃到什么脏东西.&lt;/p&gt;</description></item><item><title>Mac Chrome 升级</title><link>http://life.urakalee.me/posts/2013-12-25-mac-chrome-upgrade/</link><pubDate>Wed, 25 Dec 2013 14:05:13 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-25-mac-chrome-upgrade/</guid><description>&lt;ol&gt;
&lt;li&gt;直接升级失败, Error 12&lt;/li&gt;
&lt;li&gt;找到&lt;a href="https://support.google.com/chrome/answer/1367288?hl=zh-Hans" title="无法在苹果机上更新 Google Chrome 浏览器"&gt;官方解决方案&lt;/a&gt;&lt;/li&gt;
&lt;/ol&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;~/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/Resources/install.py --uninstall &lt;span class="c1"&gt;# Mac 10.9 上无此文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo /Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/Resources/install.py --uninstall
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;折腾半天还是不行, 最后从官网下载了最新版的 Chrome, 覆盖安装&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="mailto:Update@2016.03.10"&gt;Update@2016.03.10&lt;/a&gt;: 使用 Homebrew Cask&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;brew install caskroom/cask/brew-cask
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew cask search chrome
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew cask install google-chrome
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Android 开发点滴</title><link>http://life.urakalee.me/posts/2013-12-20-android-tips/</link><pubDate>Fri, 20 Dec 2013 13:27:02 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-20-android-tips/</guid><description>&lt;h2 id="manifest"&gt;Manifest&lt;/h2&gt;
&lt;h3 id="弹出键盘"&gt;弹出键盘&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;android:windowSoftInputMode&lt;/code&gt; 控制弹出键盘
&lt;ul&gt;
&lt;li&gt;stateHidden 为刚进入 activity 时不显示键盘&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="控件"&gt;控件&lt;/h2&gt;
&lt;h3 id="edittext-与弹出键盘"&gt;EditText 与弹出键盘&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 xml 中设置 &lt;code&gt;android:inputType&lt;/code&gt;, 常用的有:
&lt;ul&gt;
&lt;li&gt;default, 中文手机会弹出中文输入法, 并切换到默认输入模式(通常是中文模式)&lt;/li&gt;
&lt;li&gt;phone, 电话号码键盘, 不过我们通常还是会用 number 彻底限制只能输入数字&lt;/li&gt;
&lt;li&gt;textEmailAddress, 虽然名字是 email, 但是也可以输入电话号码&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;java 中可以 &lt;code&gt;setInputType&lt;/code&gt;, 对应的 type 在 &lt;code&gt;InputType&lt;/code&gt; 找到:
&lt;ul&gt;
&lt;li&gt;比如 textEmailAddress 对应 TYPE_TEXT_VARIATION_EMAIL_ADDRESS&lt;/li&gt;
&lt;li&gt;注意 textPassword 对应 TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;详见 &lt;a href="http://developer.android.com/guide/topics/ui/controls/text.html" title="Text Fields"&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="工具"&gt;工具&lt;/h2&gt;
&lt;h3 id="sleep"&gt;sleep&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SystemClock.sleep&lt;/code&gt; 不会抛出 &lt;code&gt;InterruptedException&lt;/code&gt;, 同时也无法 &lt;code&gt;thread.interrupt&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Thread.sleep 则正相反&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="线程"&gt;线程&lt;/h2&gt;
&lt;h3 id="ui-线程"&gt;UI 线程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;UI 控件不是线程安全的, 所以只能在 UI 线程上操作
&lt;ul&gt;
&lt;li&gt;Activity.runOnUiThread&lt;/li&gt;
&lt;li&gt;View.post/postDelayed&lt;/li&gt;
&lt;li&gt;Handler&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AsyncTask
&lt;ul&gt;
&lt;li&gt;doInBackground 在 worker 线程&lt;/li&gt;
&lt;li&gt;onPre/PostExecute 和 onProgressUpdate 在 UI 线程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="webview"&gt;WebView&lt;/h2&gt;
&lt;h3 id="使用-httpclient-的-cookie"&gt;使用 HttpClient 的 cookie&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * @param url - 形如 http://xxx.domain.com/yyy/zzz.z?mmm=nnn
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * @param cookie - 从 HttpClient 取得的 cookie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;synCookies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cookie&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CookieSyncManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CookieManager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cookieManager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CookieManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cookieManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAcceptCookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 这句可能可以不要&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cookieString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;=&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;; domain=&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDomain&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cookieManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cookieString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CookieSyncManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Markdown Style</title><link>http://life.urakalee.me/posts/2013-12-16-markdown-style/</link><pubDate>Mon, 16 Dec 2013 15:26:28 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-16-markdown-style/</guid><description>&lt;ul&gt;
&lt;li&gt;本文仅用于有洁癖者(本人)统一 markdown 风格, 以及 check style&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="行文"&gt;行文&lt;/h2&gt;
&lt;h3 id="标点"&gt;标点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;除非必要, 所有标点都使用英文标点&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="强调"&gt;强调&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;说明性的词和短语用双引号(&amp;quot;&amp;quot;)强调&lt;/li&gt;
&lt;li&gt;提示性的词和短语用双星号(**)强调&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;code&gt;~~删除的文字~~&lt;/code&gt; -&amp;gt; &lt;del&gt;删除的文字&lt;/del&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;英文单词的前后都需要空格
&lt;ul&gt;
&lt;li&gt;行首不需要前面的空格, 句尾不需要后面的空格&lt;/li&gt;
&lt;li&gt;如果英文单词在括号里, 则前后的空格写在括号外, 比如 &amp;quot; (abc) &amp;quot; 或 &amp;quot; (abc 很不错)&amp;quot;&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;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;h3 id="链接"&gt;链接&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;行文中需要文字的, 使用引用方式&lt;/li&gt;
&lt;li&gt;直接贴链接不影响行文的, 可以直接贴连接
&lt;ul&gt;
&lt;li&gt;比如 &lt;strong&gt;少量&lt;/strong&gt; &lt;strong&gt;不是很长&lt;/strong&gt; 且 &lt;strong&gt;在行尾&lt;/strong&gt; 的链接&lt;/li&gt;
&lt;li&gt;比如 &lt;strong&gt;少量&lt;/strong&gt; &lt;strong&gt;不是很长&lt;/strong&gt; 的链接列表&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;其它情况均需要使用引用方式, 引用需要集中写在文章或段落末尾&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
[Display Name][name]
...
[name]: http://external.link "Link Description"
[name]: /blog/yyyy/MM/dd/internal-link/ "Link Description"
&lt;/pre&gt;
&lt;h3 id="更新"&gt;更新&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在文档末尾添加&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
****
Update@yyyy.MM.dd: 更新的内容
&lt;/pre&gt;
&lt;h3 id="大小写"&gt;大小写&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TODO&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="用词"&gt;用词&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;举例时用 &amp;ldquo;比如&amp;rdquo;, 不用 &amp;ldquo;如&amp;rdquo;; &amp;ldquo;比如&amp;rdquo; 后面不加冒号, 除非后面跟着列表&lt;/li&gt;
&lt;li&gt;并列时用 &amp;ldquo;和&amp;rdquo;, 不用 &amp;ldquo;及&amp;rdquo;; 除非需要使用 &amp;ldquo;以及&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;其他&amp;rdquo; 修饰人, &amp;ldquo;其它&amp;rdquo; 修饰非人&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="代码"&gt;代码&lt;/h2&gt;
&lt;h3 id="单行模式"&gt;单行模式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一行可执行代码使用变音符号(`)单行模式&lt;/li&gt;
&lt;li&gt;一行文本内容使用变音符号单行模式或 pre-code 多行模式&lt;/li&gt;
&lt;li&gt;特殊记号使用变音符号单行模式
&lt;ul&gt;
&lt;li&gt;比如文件路径 &lt;code&gt;C:\Windows&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;比如代码元素 &lt;code&gt;++&lt;/code&gt; &lt;code&gt;--&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&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;支持代码高亮的语言列表: &lt;a href="http://pygments.org/docs/lexers/"&gt;http://pygments.org/docs/lexers/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="不支持代码高亮的文本内容"&gt;不支持代码高亮的文本内容&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 pre-code 多行模式&lt;/li&gt;
&lt;li&gt;打开该文本文件的命令可以写在一起, 命令和文本之间空一行&lt;/li&gt;
&lt;/ul&gt;</description></item><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>Android Studio 新手小记</title><link>http://life.urakalee.me/posts/2013-12-08-newbie-to-android-studio/</link><pubDate>Sun, 08 Dec 2013 18:13:10 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-08-newbie-to-android-studio/</guid><description>&lt;h2 id="安装"&gt;安装&lt;/h2&gt;
&lt;ul&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;li&gt;&lt;a href="http://www.cnsecer.com/842.html"&gt;http://www.cnsecer.com/842.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.csdn.net/hil2000/article/details/11395485"&gt;http://blog.csdn.net/hil2000/article/details/11395485&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;关键命令&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&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;java -classpath AI-&amp;lt;old-edition&amp;gt;-&amp;lt;new-edition&amp;gt;-patch-&amp;lt;os&amp;gt;.jar com.intellij.updater.Runner install .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="新建项目"&gt;新建项目&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;新建一个项目时, 视选择的 SDK 版本, 可能会失败, 原因是包不全
&lt;ul&gt;
&lt;li&gt;打开 SDK Manager, 勾选需要的包, 点击 Install X package[s]&amp;hellip;&lt;/li&gt;
&lt;li&gt;注意: 接受协议时可能需要在弹出的对话框里逐个接受, 才能一并下载&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="模拟器"&gt;模拟器&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;以下问题仅限于 windows, Mac 用户可以直接放弃模拟器&amp;hellip;&lt;/li&gt;
&lt;li&gt;运行模拟器失败, 需要把 &lt;code&gt;X盘/.android/avd&lt;/code&gt; 拷贝到 &lt;code&gt;C盘/用户目录/.android&lt;/code&gt; 下&lt;/li&gt;
&lt;li&gt;运行模拟器慢, 需要下载和安装 intel x86 emulator, 创建 avd 时也要选这个
&lt;ul&gt;
&lt;li&gt;用 SDK Manager 下载 intel x86 emulator 和对应的 rom&lt;/li&gt;
&lt;li&gt;注意: 下载 emulator 后需要安装, 可执行文件在 &lt;code&gt;sdk/extras/intel&lt;/code&gt; 中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="数据目录"&gt;数据目录&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Android Studio 目前还不太稳定, 偶尔折腾, 甚至需要把数据目录清空&lt;/li&gt;
&lt;li&gt;下面的内容摘自 &lt;a href="http://www.jetbrains.com/idea/webhelp/project-and-ide-settings.html" title="Project and IDE Settings"&gt;Intellij 官网&lt;/a&gt;, 只要把路径换成 AndroidStudioPreview 即可&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Mac
~/Library/Application Support/IntelliJIdeaXX contains the catalog with plugins.
~/Library/Preferences/IntelliJIdeaXX contains the rest of the configuration settings.
~/Library/Caches/IntelliJIdeaXX contains data caches, logs, local history, etc. These files can be quite significant in size.
9.0+ ~/Library/Logs/IntelliJIdeaXX contains logs
Windows
~\.IntelliJIdeaXX\config that contains user-specific settings.
~\.IntelliJIdeaXX\system that stores IntelliJ IDEA data caches.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="mailto:Update@2015.04.13"&gt;Update@2015.04.13&lt;/a&gt;: Android Studio 在升级到 1+ 之后奇葩问题少多了&lt;/li&gt;
&lt;li&gt;&lt;a href="mailto:Update@2016.03.10"&gt;Update@2016.03.10&lt;/a&gt;: 模拟器建议使用 Genymotion&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Linux 手册</title><link>http://life.urakalee.me/posts/2013-12-08-linux-cheatsheet/</link><pubDate>Sun, 08 Dec 2013 12:13:45 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-08-linux-cheatsheet/</guid><description>&lt;h2 id="常用命令"&gt;常用命令&lt;/h2&gt;
&lt;h3 id="find"&gt;find&lt;/h3&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;find . -name &lt;span class="s2"&gt;&amp;#34;*.xyz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find . -name &lt;span class="s2"&gt;&amp;#34;*abc*&amp;#34;&lt;/span&gt; -delete
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="grep"&gt;grep&lt;/h3&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;grep -i &lt;span class="s2"&gt;&amp;#34;abc&amp;#34;&lt;/span&gt; * &lt;span class="c1"&gt;# 忽略大小写&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -R &lt;span class="s2"&gt;&amp;#34;abc&amp;#34;&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="wc"&gt;wc&lt;/h3&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;wc -l find -name &lt;span class="s2"&gt;&amp;#34;*.java&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 统计 java 代码行数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="权限"&gt;权限&lt;/h3&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;chmod u+x &amp;lt;file&amp;gt; &lt;span class="c1"&gt;# 设为可执行文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown &amp;lt;name&amp;gt; &amp;lt;file&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown -R &amp;lt;name&amp;gt; &amp;lt;dir&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chgrp ... &lt;span class="c1"&gt;# 格式同 chown&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="系统工具"&gt;系统工具&lt;/h2&gt;
&lt;h3 id="ssh"&gt;ssh&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ssh-add -D删除所有记住的key
&lt;ul&gt;
&lt;li&gt;解决 Mac 下所有使用过的 key 都会被记住，删除 key 文件没用的问题&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;code&gt;ldd &amp;lt;可执行文件&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改系统加载库&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;vim /etc/ld.so.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/sbin/ldconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>家庭文化</title><link>http://life.urakalee.me/posts/2013-12-08-family-culture/</link><pubDate>Sun, 08 Dec 2013 11:12:02 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-08-family-culture/</guid><description>&lt;ul&gt;
&lt;li&gt;坦诚 信任（支持）&lt;/li&gt;
&lt;li&gt;尊重 包容（耐心）&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>你要如何衡量你的人生</title><link>http://life.urakalee.me/posts/2013-12-07-measure-your-life/</link><pubDate>Sat, 07 Dec 2013 20:08:40 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-07-measure-your-life/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;这本书并没有告诉我们应该确立什么样的人生目标, 但书中的观点可以帮助我们衡量目标的可行性, 并关注实现目标的过程中可能发生的问题&lt;/p&gt;
&lt;h2 id="目标-资源应用流程价值取向"&gt;目标: 资源•应用流程•价值取向&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;资源是 Ta 所利用的东西&lt;/li&gt;
&lt;li&gt;应用流程是 Ta 做事的方法&lt;/li&gt;
&lt;li&gt;价值取向是 Ta 做某件事的动机&lt;/li&gt;
&lt;li&gt;-&amp;gt; &lt;em&gt;&lt;strong&gt;用于评估什么样的目标可以实现, 什么样的目标遥不可及&lt;/strong&gt;&lt;/em&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;实现目标的方法已经有了吗? 可能没有, 那么需要 &amp;ldquo;根据机遇权衡计划&amp;rdquo;&lt;/li&gt;
&lt;li&gt;目标是否符合你的价值取向, 如果不符合, 那么可能需要放弃这个目标&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;h3 id="每天都会面临的基本挑战"&gt;每天都会面临的基本挑战:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;接受哪些信息&lt;/li&gt;
&lt;li&gt;采纳哪些建议&lt;/li&gt;
&lt;li&gt;忽视哪些问题&lt;/li&gt;
&lt;li&gt;去做哪些事情&lt;/li&gt;
&lt;li&gt;-&amp;gt; 这些挑战归结为: &lt;em&gt;&lt;strong&gt;如何选择&lt;/strong&gt;&lt;/em&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;相反, 选择的过程往往体现了 &amp;ldquo;资源•应用流程•价值取向&amp;rdquo; 这三要素&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;&amp;ldquo;根据机遇权衡计划&amp;rdquo;&lt;/li&gt;
&lt;li&gt;既然是重点, 就要分配资源&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;战略是长期的事情, 短期的事情不能通过战略搞定, 但应符合战略需要&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;薪水是一个基础因素, 不是动力因素&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;&amp;ldquo;哪些假设条件需要得到验证, 才能说明这个战略有效&amp;rdquo;&lt;/li&gt;
&lt;li&gt;根据机遇权衡计划的重点是小成本尝试和拥抱变化, 是一个情况多样, 难以控制的连续过程, 很可能不是一开始就想到的&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;生活中的每一个有关如何分配时间盒金钱的决定, 都表明了你真正在乎的是什么&lt;/li&gt;
&lt;li&gt;你可以尽情地谈论自己的生活, 谈论有什么清晰的目标和战略, 但是如果你投入的资源和你的战略方向不一致, 这些谈论都毫无意义
如果最终不能有效实施, 你的战略只能是一个良好的愿望&lt;/li&gt;
&lt;li&gt;-&amp;gt; &lt;em&gt;&lt;strong&gt;如果家庭是重点, 就要家庭建设上分配资源&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我的目标"&gt;我的目标&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;我的目标是帮助家人(包括自己)过上满足的生活
&lt;ul&gt;
&lt;li&gt;谈 &amp;ldquo;幸福(的生活)&amp;rdquo; 太虚幻, 说 &amp;ldquo;满足&amp;rdquo; 比较实际&lt;/li&gt;
&lt;li&gt;满足某些欲望并不能真的让人满足&lt;/li&gt;
&lt;/ul&gt;
&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;h3 id="重点-1"&gt;重点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;生活包括兴趣(工作), 收入(工作), 家庭&lt;/li&gt;
&lt;li&gt;兴趣(工作)使生活有成就感? 家庭也能使生活有成就感, 但我还是不愿意放弃兴趣(工作)的成就感&lt;/li&gt;
&lt;li&gt;收入(工作)让生活更有质量&lt;/li&gt;
&lt;li&gt;家庭是生活的保障&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="权衡-1"&gt;权衡&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;兴趣需要投入时间&lt;/li&gt;
&lt;li&gt;收入的多少虽然不直接与时间发生关系, 但间接需要投入时间去争取(比如加班)&lt;/li&gt;
&lt;li&gt;家庭建设需要投入时间, 可能还需要人脉&lt;/li&gt;
&lt;li&gt;人脉需要时间, 也需要金钱? 目前金钱不是关键问题, 如果真的是关键, 也拿不出来&amp;hellip;&lt;/li&gt;
&lt;li&gt;持续性是生活中潜在的重要因素, 也是人的基本需求(安全感)&lt;/li&gt;
&lt;li&gt;-&amp;gt; &lt;em&gt;&lt;strong&gt;当前战略的主要问题是如何分配时间&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分配资源-1"&gt;分配资源&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;兴趣: 4hr&lt;/li&gt;
&lt;li&gt;收入: 4hr, 包括理财&lt;/li&gt;
&lt;li&gt;学习是支撑兴趣和收入的基础&lt;/li&gt;
&lt;li&gt;家庭: 1~1.5hr&lt;/li&gt;
&lt;li&gt;人脉: 0.5~1hr&lt;/li&gt;
&lt;li&gt;身体是一切的基础: 1hr&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="关于家庭"&gt;关于家庭&lt;/h2&gt;
&lt;h3 id="好钱和坏钱"&gt;好钱和坏钱&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在事业刚起步阶段, 你或许还不知道公司策略是否能够成功, 你必须耐心等候公司成长, 同时把目光放在获利上面; 如此一来, 就要用最少的资金找到一个可行的策略, 不至于花了很多钱才知道走错了路; 如果投入资金之后, 急于看到成长而非获利, 则是 &amp;ldquo;坏钱&amp;rdquo;&lt;/li&gt;
&lt;li&gt;在所有成功的企业当中, 有93%都必须改变最初的策略; 也就是说一定会有拐点, 所以需要提前准备; 准备的方式则是投入 &amp;ldquo;好钱&amp;rdquo;&lt;/li&gt;
&lt;li&gt;家庭生活会有类似的问题, 同样需要提前准备, 投入&amp;quot;好钱&amp;quot;; 常见的问题是对孩子的教育
&lt;ul&gt;
&lt;li&gt;奶昔是被雇佣来做什么的&lt;/li&gt;
&lt;li&gt;学校是被雇佣来做什么的: 获得成功的感觉, 每天都会有朋友&lt;/li&gt;
&lt;li&gt;你是被雇佣来做什么的&lt;/li&gt;
&lt;li&gt;-&amp;gt; &lt;em&gt;&lt;strong&gt;不要将未来外包出去&lt;/strong&gt;&lt;/em&gt;&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;文化, 是人们朝着一个共同的目标一起工作的方式, 这种方式一直以来被大家所沿用并且一直行之有效, 以至于人们根本不会想到要以另一种方式去做事&lt;/li&gt;
&lt;li&gt;特定文化一经形成, 人们就会自动地区做要取得成功需要做的事
问题出现时, 要做的不仅仅是解决问题本身, 还要在解决问题的过程中明确什么事重要的, 在这个过程中形成了对价值取向的理解, 并学会如何去实践这一价值取向&lt;/li&gt;
&lt;li&gt;-&amp;gt; 文化是在 &lt;em&gt;&lt;strong&gt;处理问题的过程和做选择时的价值取向被一个组织不断重复使用, 且被证明有效&lt;/strong&gt;&lt;/em&gt; 的基础上形成的&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;&amp;ldquo;我不害怕面对这个问题, 我相信自己能解决它&amp;rdquo;, 这样的自信不是来自丰富的资源, 而是来自完成某件困难且重要的事情&lt;/li&gt;
&lt;li&gt;我们将孩子保护起来, 让他们远离生活中出现的各种问题, 但是却无意中阻止了孩子掌握成功所需的 &amp;ldquo;应用流程&amp;rdquo; 和 &amp;ldquo;价值取向&amp;rdquo;&lt;/li&gt;
&lt;li&gt;孩子们在自己准备好学习时才能学到东西, 而不是在我们准备好教导他们的时候&lt;/li&gt;
&lt;li&gt;孩子在各种 &amp;ldquo;经验学校&amp;rdquo; 中学到了什么, 是比奖励或奖品更能保证他们在外面世界的冒险中取得成功的关键&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="其它"&gt;其它&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;第一代必须要辛苦一些, 不过 &amp;ldquo;要与人交流&amp;rdquo; 这件事情应该与是否第一代无关&lt;/li&gt;
&lt;li&gt;第一代只是资源匮乏一些, 应用流程与价值取向方面还是一样的, 都要靠实践&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;资源•应用流程•价值取向 -&amp;gt; 目标 是确立目标的过程&lt;/li&gt;
&lt;li&gt;重点•根据机遇权衡计划•分配资源 -&amp;gt; 战略 是实现目标的过程&lt;/li&gt;
&lt;li&gt;价值取向和重点决定了方向, 应用流程和权衡决定了成败, 资源分配是杠杆&lt;/li&gt;
&lt;/ul&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>Git 手册</title><link>http://life.urakalee.me/posts/2013-12-03-git-cheatsheet/</link><pubDate>Tue, 03 Dec 2013 18:13:53 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-12-03-git-cheatsheet/</guid><description>&lt;h2 id="基本操作"&gt;基本操作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;创建版本库: &lt;code&gt;git init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;克隆版本库
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git clone /path/to/repo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git clone user@host:/path/to/repo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;多版本库: &lt;code&gt;git remote add &amp;lt;repo-name&amp;gt; &amp;lt;repo&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;多版本库列表: &lt;code&gt;git remote -v&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;更新版本库
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git pull [repo-name]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;repo-name 默认为 origin&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull --rebase&lt;/code&gt; 可以避免无意义的 pull-merge, 使版本树尽可能是一条直线&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git fetch [repo-name]&lt;/code&gt; - &lt;code&gt;git pull&lt;/code&gt; does a &lt;code&gt;git fetch&lt;/code&gt; followed by a &lt;code&gt;git merge&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;repo-name 默认为 origin&lt;/li&gt;
&lt;li&gt;会把 repo-name 的更新都 fetch 到本地, 包括新分枝和新标签, 但不会建立本地分枝&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;提交到本地
&lt;ul&gt;
&lt;li&gt;stage: &lt;code&gt;git add &amp;lt;file/dir&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit -m &amp;quot;&amp;lt;comment&amp;gt;&amp;quot;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;对于已经处于版本控制中的文件, 可以使用 &lt;code&gt; git commit -am &amp;quot;&amp;lt;comment&amp;gt;&amp;quot;&lt;/code&gt; 略过 stage&lt;/li&gt;
&lt;li&gt;有时需要构造空提交: &lt;code&gt;git commit --allow-empty -m &amp;quot;EMPTY&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;提交到远程
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git push [repo-name] [branch] &lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;repo-name 默认为 origin, branch 默认为当前分枝&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push -u &amp;lt;repo-name&amp;gt; &amp;lt;branch&amp;gt;&lt;/code&gt; 设置 push/pull 时默认使用的 repo-name&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push &amp;lt;repo-name&amp;gt; &amp;lt;branch&amp;gt;:&amp;lt;remote-branch&amp;gt;&lt;/code&gt; - 如果本地和远程分枝名字不同&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;
&lt;h2 id="反悔"&gt;反悔&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;revert stage: &lt;code&gt;git reset HEAD &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;reset working: &lt;code&gt;git checkout -- &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;restore(1+2): &lt;code&gt;git checkout HEAD &amp;lt;file&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;checkout 上一个版本, 放在 stage/working 中: &lt;code&gt;git checkout HEAD~ &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果改动, add, 再改动, 使用 &lt;code&gt;1.&lt;/code&gt; 不会恢复到第一次改动的结果; 使用 &lt;code&gt;2.&lt;/code&gt; 才行!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git reset &amp;lt;rev&amp;gt; [file]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;没有 file 把 HEAD/branch 指向 rev&lt;/li&gt;
&lt;li&gt;有 file 把 rev 版本的 file checkout 出来&lt;/li&gt;
&lt;li&gt;如果 &lt;code&gt;--hard&lt;/code&gt;, 那么 stage 和 working 都更新为 rev; 如果 &lt;code&gt;--soft&lt;/code&gt;, 那么 stage 和 working 都不变(但 &lt;code&gt;git status&lt;/code&gt; 会发现有文件 stage 了, 这是相对运动的结果); 如果 &lt;code&gt;--mixed&lt;/code&gt; (默认), 那么只更新 stage (这时 &lt;code&gt;git status&lt;/code&gt; 会发现 working 中有改动, 原因同上)&lt;/li&gt;
&lt;li&gt;rev 默认为 HEAD: 如果 &lt;code&gt;--hard&lt;/code&gt;, 那么 stage 和 working 都更新为 HEAD (和 &lt;code&gt;3.&lt;/code&gt; 效果一样); &lt;code&gt;--soft&lt;/code&gt; 没意义; 如果 &lt;code&gt;--mixed&lt;/code&gt;, 那么只更新 stage (就是 &lt;code&gt;1.&lt;/code&gt; 咯~)&lt;/li&gt;
&lt;li&gt;没有 file 时 &lt;code&gt;--hard&lt;/code&gt; 类似于 checkout, 区别在于 &lt;code&gt;reset &amp;lt;rev&amp;gt;&lt;/code&gt; 会移动 branch 指针, &lt;code&gt;checkout &amp;lt;branch&amp;gt;&lt;/code&gt; 回不去, 而 &lt;code&gt;checkout &amp;lt;rev&amp;gt;&lt;/code&gt; 再 &lt;code&gt;checkout &amp;lt;branch&amp;gt;&lt;/code&gt; 可以回去&lt;/li&gt;
&lt;li&gt;放弃所有本地改动(含本地提交): &lt;code&gt;git reset --hard &amp;lt;repo-name&amp;gt;/&amp;lt;remote-branch&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout &amp;lt;rev&amp;gt; [file]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;没有 file 会建立一个 detached HEAD (匿名分枝) - 最好别用!&lt;/li&gt;
&lt;li&gt;有 file 把 rev 版本的 file checkout 出来&lt;/li&gt;
&lt;li&gt;rev 默认为 &lt;code&gt;--&lt;/code&gt; 即 stage, 从 stage checkout 到 working&lt;/li&gt;
&lt;li&gt;其它 rev 从 rev checkout 到 stage 再到 working&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git revert &amp;lt;rev&amp;gt;&lt;/code&gt;: 类似 svn 中的倒着 merge, 生成一个新版本 V+, 和 V-完全一样 - 仅用于 revert 一个很久以前的错误改动!&lt;/li&gt;
&lt;li&gt;修改已经 push 到远程的提交
&lt;ol&gt;
&lt;li&gt;使用下面的方法修改已经 push 到远程的提交&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push &amp;lt;repo-name&amp;gt; +&amp;lt;branch&amp;gt;:&amp;lt;remote-branch&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;修改上一个提交: &lt;code&gt;git commit --amend&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改多个提交(交互式)
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git rebase -i &amp;lt;rev&amp;gt;&lt;/code&gt;, 编辑 rev 之后的提交, rev 默认为 repo-name/remote-branch&lt;/li&gt;
&lt;li&gt;对于想合并到前一个的提交, 选择 fixup&lt;/li&gt;
&lt;li&gt;对于想删除的提交, 直接删除对应的行&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;将上 N 个提交合并成一个&lt;/li&gt;
&lt;/ol&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 reset --soft HEAD^&lt;span class="o"&gt;(&lt;/span&gt;N-1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit --amend
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="分枝"&gt;分枝&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;建立分枝:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git checkout -b &amp;lt;branch&amp;gt;&lt;/code&gt; 在当前 HEAD 上创建分枝并切换到新分枝&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -b &amp;lt;branch&amp;gt; &amp;lt;repo-name&amp;gt;/&amp;lt;remote-branch&amp;gt;&lt;/code&gt; 跟踪远程分枝&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;切换分枝: &lt;code&gt;git checkout &amp;lt;branch&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除分枝: &lt;code&gt;git branch -d &amp;lt;branch&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;对于没有合并或提交到远程的分枝, 删除时会提示用 &lt;code&gt;-D&lt;/code&gt; 强制删除&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将分枝提交到远程(在远程建立新分枝): &lt;code&gt;git push &amp;lt;repo-name&amp;gt; &amp;lt;branch&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;提交到远程之后, 如果希望能够 pull 该分枝, 需要 &lt;code&gt;git push -u&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;删除远程分枝: &lt;code&gt;git push &amp;lt;repo-name&amp;gt; :&amp;lt;remote-branch&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除已删除远程分枝的本地缓存: &lt;code&gt;git remote prune origin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;查看所有分枝: &lt;code&gt;git branch -av&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git branch&lt;/code&gt; 不显示远程分枝&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="diff"&gt;diff&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;分枝 diff: &lt;code&gt;git diff &amp;lt;src-branch&amp;gt; &amp;lt;tgt-branch&amp;gt;&lt;/code&gt; (tgt 默认为当前分枝)
&lt;ul&gt;
&lt;li&gt;如果是和 master 比较, src-branch 应该是master&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;版本 diff: &lt;code&gt;git diff &amp;lt;src-rev&amp;gt; &amp;lt;tgt-rev&amp;gt;&lt;/code&gt; (tgt 默认为当前版本)
&lt;ul&gt;
&lt;li&gt;src-rev 应该是比 tgt-rev 更老的版本(祖先版本)&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; 可能可以得到你需要的 src-rev&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;其它 diff
&lt;ul&gt;
&lt;li&gt;working 和 stage 的 diff: &lt;code&gt;git diff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;stage 和 HEAD 的 diff: &lt;code&gt;git diff --cached&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;working 和 HEAD 的 diff: &lt;code&gt;git diff HEAD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt; 上述 3 种方式都不会 diff 新文件(未处于版本控制中的文件)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="合并"&gt;合并&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;合并 branch 到当前分枝: &lt;code&gt;git merge &amp;lt;branch&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;fetch 后用 &lt;code&gt;git merge &amp;lt;repo-name&amp;gt;/&amp;lt;remote-branch&amp;gt;&lt;/code&gt; merge&lt;/li&gt;
&lt;li&gt;如果 &lt;code&gt;merge &amp;lt;branch&amp;gt;&lt;/code&gt;, 修改 branch, 再 merge, 只 merge 修改的部分&lt;/li&gt;
&lt;li&gt;合并冲突时, 不 merge 而是指定某个版本: &lt;code&gt;git checkout --ours/--theirs &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;复制&amp;rdquo; 一次提交(比如某个分枝只有一次提交需要保留): &lt;code&gt;git cherry-pick &amp;lt;rev&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;停止 &amp;ldquo;复制&amp;rdquo;: &lt;code&gt;git cherry-pick --abort&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将当前分枝 rebase 到 tgt-branch: &lt;code&gt;git rebase &amp;lt;tgt-branch&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;merge 与 rebase 的区别
&lt;ul&gt;
&lt;li&gt;merge 建立了一个新版本, 而 rebase 是分枝上有多少新版本, 就会建立多少新版本&lt;/li&gt;
&lt;li&gt;rebase 后需要再做一次快速 merge, 才能使 tgt-branch 的指针正确(两者指针移动方式不同)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="查看状态信息"&gt;查看状态信息&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git reflog&lt;/code&gt;: 查看 HEAD 指针的移动历史&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git branch --merge&lt;/code&gt;: 查看哪些分枝已被合并到当前分枝&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git branch --no-merged&lt;/code&gt;: 查看尚未合并的分枝&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git remote show &amp;lt;repo-name&amp;gt;&lt;/code&gt;: 查看远程信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="暂存"&gt;暂存&lt;/h2&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 stash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash pop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash clear
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash apply stash@&lt;span class="o"&gt;{&lt;/span&gt;x&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash drop stash@&lt;span class="o"&gt;{&lt;/span&gt;x&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash branch &amp;lt;branch&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="标签"&gt;标签&lt;/h2&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 tag &lt;span class="c1"&gt;# 标签列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git tag &amp;lt;tag&amp;gt; &lt;span class="c1"&gt;# 在当前版本上打标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git show &amp;lt;tag&amp;gt; &lt;span class="c1"&gt;# 查看标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git tag -d &amp;lt;tag&amp;gt; &lt;span class="c1"&gt;# 删除标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push &amp;lt;repo-name&amp;gt; &amp;lt;tag&amp;gt; &lt;span class="c1"&gt;# 提交标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push &amp;lt;repo-name&amp;gt; :&amp;lt;tag&amp;gt; &lt;span class="c1"&gt;# 删除远程标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="submodule-20150413"&gt;submodule @2015.04.13&lt;/h2&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 submodule add &amp;lt;remote-path&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;local-path&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 添加 remote-path 为当前项目的 submodule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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 rm -r &amp;lt;local-path&amp;gt; &lt;span class="c1"&gt;# 如果有问题, 试试 git rm --cached &amp;lt;local-path&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vim .gitmodules &lt;span class="c1"&gt;# 通常会在 git rm 时自动执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf .git/modules/&amp;lt;local-path&amp;gt; &lt;span class="c1"&gt;# 可能不必要&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vim .git/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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><item><title>Mac 图标缓存的二三事</title><link>http://life.urakalee.me/posts/2013-11-25-about-mac-icon-cache/</link><pubDate>Mon, 25 Nov 2013 13:50:02 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-11-25-about-mac-icon-cache/</guid><description>&lt;p&gt;信息焦虑的第三个症状：随时需要“清理”自己的电脑，虽然完全不知道究竟“清理”了啥。&lt;/p&gt;
&lt;p&gt;CleanMyMac 满足了我的这个愿望，但也给我带来了一些麻烦。首当其冲的就是图标缓存问题——每次清理完之后，缓存就会瘫痪，不仅 Launchpad 中有的图标显示不出来，Alfred 也难以幸免，最让人无法接受的是 Finder 会崩溃（Path Finder 貌似无碍）。好在重启之后一切如常。&lt;/p&gt;
&lt;p&gt;今天终于不淡定了，因为重启也不能解决问题了！按照 &lt;a href="https://discussions.apple.com/message/23541241#23541241" title="Mavericks Launchpad, missing icons"&gt;Apple 社区&lt;/a&gt;上给出的解决办法，打开终端，运行命令，图标找回，分组消失。。。&lt;/p&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;rm ~/Library/Application&lt;span class="se"&gt;\ &lt;/span&gt;Support/Dock/*.db
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;killall Dock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;好吧，本来分组这种东西也是我蛋疼搞的，消失就消失吧，有 Alfred 呢。。。&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="mailto:Update@2013.11.26"&gt;Update@2013.11.26&lt;/a&gt;: 最新版的 CleanMyMac 2.2.0 貌似不会有清理完缓存瘫痪的问题了&lt;/li&gt;
&lt;li&gt;&lt;a href="mailto:Update@2015.01.21"&gt;Update@2015.01.21&lt;/a&gt;: 最新版的 MacOS 10.10 已经不能用上述命令行清理 Launchpad 了&lt;/li&gt;
&lt;li&gt;&lt;a href="mailto:Update@2016.03.10"&gt;Update@2016.03.10&lt;/a&gt;: 可以使用如下命令重置 Launchpad 图标&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;defaults write com.apple.dock ResetLaunchPad -bool true&lt;span class="p"&gt;;&lt;/span&gt; killall Dock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>纠结的 Alfred 与 Spotlight</title><link>http://life.urakalee.me/posts/2013-11-25-confused-alfred-and-spotlight/</link><pubDate>Mon, 25 Nov 2013 12:59:02 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-11-25-confused-alfred-and-spotlight/</guid><description>&lt;p&gt;既然已经不用 Spotlight 了，就打算把它的索引彻底关掉。Google 到若干相关文章，操作也都很简单，&lt;a href="http://support.apple.com/kb/HT2409?viewlocale=zh_CN" title="Spotlight：如何重建文件夹或宗卷的索引"&gt;Apple 官网也有&lt;/a&gt;，于是就照着做了。&lt;/p&gt;
&lt;p&gt;然后 Alfred 就挂了。新安装的 app 在 Alfred 中找不到，清了 cache 之后更是啥都没有了。&lt;/p&gt;
&lt;p&gt;继续搞！没有找到确切的答案，但也能根据现有知识猜个差不离。无非是 Alfred 要调用 Spotlight 的结果，所以 Spotlight 关得不对 Alfred 也就不 work了。&lt;/p&gt;
&lt;p&gt;于是还得打开 Spotlight，但是怎么打开还要考虑一下。目标是：Application 索引，而其它不索引。所以先把 HD 加到 privacy 中，再把 HD 下面 Application 之外的都加到 privacy 中；重启；查看一下索引大小，大概 12K；最后把 HD 从 privacy 中移除，DONE！&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;PS1: Spotlight 索引文件的位置（from &lt;a href="https://discussions.apple.com/thread/2429947" title="backup Spotlight index file - where is it?"&gt;Apple 社区&lt;/a&gt;）在磁盘根目录 &lt;code&gt;/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;PS2: 查看其大小需要 root 权限: &lt;code&gt;sudo du -sh .Spotlight-V100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;PS3: Path Finder 居然也要调用 Spotlight 的结果&lt;/li&gt;
&lt;li&gt;PS4: Spotlight 真应该搞白名单机制，黑名单太纠结了&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Octopress 新手小记</title><link>http://life.urakalee.me/posts/2013-11-24-newbie-to-octopress/</link><pubDate>Sun, 24 Nov 2013 21:10:28 +0800</pubDate><guid>http://life.urakalee.me/posts/2013-11-24-newbie-to-octopress/</guid><description>&lt;p&gt;信息焦虑的第二个症状：换过好几个博客，但都因为配置复杂、格式不可控、备份麻烦等原因放弃了。&lt;/p&gt;
&lt;p&gt;作为一个程序员，深深地为自己不能迅速地把博客搞定而惭愧。在构思许久之后，终于还是决定先偷懒，把习惯陪养起来再说。Octopress 还是非常符合我审美的，没有太多可配置的东西，所有格式都能自己掌控，更不用说备份——噢！又犯病了。。。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.devtang.com/blog/2012/02/10/setup-blog-based-on-github/" title="象写程序一样写博客：搭建基于github的博客"&gt;唐巧的博客&lt;/a&gt;很容易搜到，但我还是建议第一次搞的同学看一下官网。如果你像我一样在使用最新版的 MacOS，那么 ruby 部分就会简化许多：&lt;/p&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 clone git://github.com/imathis/octopress.git octopress
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; octopress
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo gem install bundler
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bundle install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rake install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rake new_post&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Article Name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- more --&gt;
&lt;p&gt;写作就是 MarkDown 了, 虽然和 wiki 的写法有些差异, 容易记混. 通常我都会使用 Sublime Text + MarkDown 插件, 同时运行 &lt;code&gt;rake preview&lt;/code&gt; 进行调试(-___-b). Preview 模式下, published:false 的文章会是可见的; 可能由于 bug, 如果你开着 preview 运行 deploy, published:false 的文章也会是可见的&amp;hellip; &lt;em&gt;&lt;strong&gt;&lt;code&gt;rake deploy&lt;/code&gt; 前务必退出 preview, 并运行 &lt;code&gt;rake generate&lt;/code&gt;&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rake deploy&lt;/code&gt; 之前，要 &lt;code&gt;git add&lt;/code&gt; 和 &lt;code&gt;git push origin source&lt;/code&gt;, git 新手（像我）往往都习惯于顺手来个 &lt;code&gt;git pull&lt;/code&gt;。唔，然后就悲剧了。因为这个时候 git 已经很傻地把你的 source 分枝和远程的 master 分枝关联在一起了，所以 pull 的时候会没头没脑地要 merge 这两个分枝。已经 merge 的怎么回退我就不说了，还没 pull 的，先修改一下 config 文件。&lt;/p&gt;</description></item></channel></rss>