[{"content":"用 Figma 直接输出带透明背景的图标，替代之前用\u0026quot;预览\u0026quot;的方式。\n之前用\u0026quot;预览\u0026quot;的\u0026quot;即时 Alpha\u0026quot;去背，边缘总是不干净。Figma 方案从源头解决这个问题，同时顺带修正图标视觉偏大的问题（之前在 Dock 里看起来比其他 App 图标大）。\n核心原理 macOS 系统不会像 iOS 那样自动切割圆角，你必须自己做：导出一张 1024×1024、主体居中且四周留有透明边框的 PNG 图片。\n第一步：创建标准画布 新建 Frame，尺寸设为 1024 × 1024 关键：在右侧 Fill 栏点 - 删掉填充，确保背景透明 第二步：绘制图标轮廓 画一个矩形，尺寸设为 824 × 824 用对齐工具将其在 1024 画布中居中 100px 的边距（gutter）来自苹果官方模板的标准做法（参考）。\n第三步：设置超椭圆圆角 选中 824 的矩形 Corner Radius：输入 185.4 Corner Smoothing：点击半径旁边的图标，滑块拉到 60% 这能模拟出 iOS/macOS 专用的超椭圆（Squircle）弧度。\n第四步：放入图片，生成圆角 将图片拖入 Figma，置于圆角矩形图层之上 同时选中两者 右键选择 Use as mask（推荐用 Cmd + / 搜索执行，更快） 第五步：导出 选中最外层的 1024×1024 Frame 右侧 Export 栏点 +，设置 1x / PNG，点击导出 ","permalink":"http://life.urakalee.me/posts/2026-04-04-macos-app-icon-figma/","summary":"\u003cp\u003e用 Figma 直接输出带透明背景的图标，替代之前用\u0026quot;预览\u0026quot;的方式。\u003c/p\u003e","title":"macOS 应用图标：用 Figma 制作超椭圆图标"},{"content":"两步搞定：用\u0026quot;预览\u0026quot;去掉图标背景，再把透明 PNG 拖进 Xcode 的 AppIcon。\n第一步：用\u0026quot;预览\u0026quot;去背景 如果图标本身已是透明 PNG，跳过此步。\n用预览打开图片（需为 PNG 格式） View \u0026gt; Show Markup Toolbar，点击即时 Alpha（魔法棒图标） 在背景区域点击并缓慢向外拖动，直到红色覆盖全部背景但不碰到主体 松开鼠标，按 Delete 删除选区 File \u0026gt; Save 保存 有多块不连续背景时，重复步骤 3-4。\n第二步：导入 Xcode 生成所需尺寸 用以下脚本从一张 1024×1024 PNG 生成全部尺寸：\n#!/bin/bash SRC=$1 OUT=\u0026#34;icons\u0026#34; mkdir -p \u0026#34;$OUT\u0026#34; for SIZE in 16 32 64 128 256 512 1024; do sips -z $SIZE $SIZE \u0026#34;$SRC\u0026#34; --out \u0026#34;$OUT/icon_${SIZE}.png\u0026#34; \u0026gt; /dev/null done echo \u0026#34;Done → $OUT/\u0026#34; 用法：sh gen_icons.sh {path-to-original}.png\n在 Xcode 中配置 打开项目，点击左侧 Assets.xcassets 选中 AppIcon（没有则右键 \u0026gt; macOS \u0026gt; New macOS App Icon） 将 icons/ 目录里的 PNG 按尺寸拖放到对应槽位 点击项目 \u0026gt; Target \u0026gt; General \u0026gt; App Icons and Launch Images，确认 \u0026ldquo;App Icon Source\u0026rdquo; 指向 AppIcon ","permalink":"http://life.urakalee.me/posts/2026-03-28-macos-app-icon-xcode/","summary":"\u003cp\u003e两步搞定：用\u0026quot;预览\u0026quot;去掉图标背景，再把透明 PNG 拖进 Xcode 的 AppIcon。\u003c/p\u003e","title":"macOS 应用图标：去背景 + 导入 Xcode"},{"content":"两步搞定 SSH 跳板机：配置 ~/.ssh/config，再分发公钥，之后就能一条命令直连目标机器。\n第一步：配置 ~/.ssh/config # 配置跳板机 Host jump HostName \u0026lt;跳板机IP\u0026gt; User \u0026lt;跳板机用户名\u0026gt; # 配置目标机器 Host target HostName \u0026lt;目标机IP\u0026gt; User \u0026lt;目标机用户名\u0026gt; ProxyJump jump ForwardAgent yes ProxyJump 让 SSH 自动通过跳板机中转；ForwardAgent yes 把本地的 SSH Agent 转发过去，这样在跳板机上也能用本地的私钥继续往里跳。\n第二步：分发公钥 在本地生成密钥（如果还没有的话）：\nssh-keygen 将公钥分别拷贝到跳板机和目标机（首次需要输密码）：\nssh-copy-id jump ssh-copy-id target # 经由 config 中配置好的跳板机完成 完成后，直接 ssh target 一键登录。\n","permalink":"http://life.urakalee.me/posts/2026-03-20-ssh-jump-host-cheatsheet/","summary":"\u003cp\u003e两步搞定 SSH 跳板机：配置 \u003ccode\u003e~/.ssh/config\u003c/code\u003e，再分发公钥，之后就能一条命令直连目标机器。\u003c/p\u003e","title":"通过跳板机 SSH 一键登录"},{"content":"两周前同事转发了一篇《2028 全球智能危机》的文章，一问老婆居然还不知道，果然隔行如隔山。\n昨天跟 Gemini 和 Claude 分别聊了一下，还挺有意思。很多事情没想清楚（也不可能想清楚），写这篇文章主要是练练笔。\n概要 整篇文章的逻辑链不复杂：\nAI 提升生产力 → 高薪企业裁员 → 消费萎缩 → 服务业萎缩 → 失业循环\n核心概念：\n智能替代螺旋（Intelligence Displacement Spiral）：AI 的能力超出了所有人的预期，企业为了追求效率而大规模替换白领员工。 个体理性，集体灾难：对单家公司来说，用 AI 替代年薪 15 万美元的白领是理性的决策。 消费塌陷：当大量高薪专业人士失去收入，他们的消费支出（房贷、服务业等）迅速枯竭。 恶性循环：需求减少导致更多企业利润承压，企业为了生存只能进一步通过 AI 替代来降本，从而进入死循环。 幽灵 GDP（Ghost GDP） 数据上的繁荣：由于 AI 提高了生产效率，国家的 GDP 数据可能依然在增长，甚至创下新高。 体感的寒冬：这种 GDP 并没有流向大众，而是留在少数 AI 拥有者手中。钱不能在实体经济中循环，导致“纸面富裕”与“实际萧条”并存。 摩擦归零（Zero Friction） 代理接管：AI Agent 替代人类做消费决策，自动比价、续签、谈判，把“太懒、太忙、太习惯”造就的溢价全部消除。 中介崩塌：受冲击最深的是靠“信息不对称”收费的行业——保险、旅行、房地产，机器接管后护城河瞬间消失。 Anthropic 的职业替代报告 蓝条：AI 在实验室里理论上能完成的任务比例 红条：真实生产环境中实际被用到的比例 计算机与数学行业，蓝条 96%，红条 32%。商业与金融，蓝条 94%，红条 28%。法律，蓝条 88%，红条 15%。\n这个差距现在还在，更多是因为摩擦力：合规要求、工具集成成本、还有信任。律所需要人类签字负责，企业接入现有工作流需要时间。\n但红条追上来的过程不会是线性的。当 Agent 工具成熟、企业完成集成，红条可能会在很短的时间内从 30% 跳到 80%。\n不过报告里没有薪资数据。从收入金字塔来看，被替代的高薪白领还是少数，低收入群体人数更多。\n网传软件工程师需求\u0026quot;反弹\u0026quot; 这方面没有具体的考证，主要是我比较怀疑，所以就让 AI 挖了挖。\n结合 36Kr 的报告《Anthropic失业报告炸场，22-25岁年轻人被斩杀，AI淘汰75％编程》可以看到：\n回暖是真实的，但不是所有人的回暖。\n22-25 岁的年轻人，在高暴露岗位的入职率直接掉了 14%。老员工还能靠经验苟住，新人连门都摸不到了。\n这是透支未来。\n但也是我们（一部分人）正在面对的（一部分）现实。\n","permalink":"http://life.urakalee.me/posts/2026-03-15-three-charts-early-2026/","summary":"\u003cp\u003e两周前同事转发了一篇《2028 全球智能危机》的文章，一问老婆居然还不知道，果然隔行如隔山。\u003c/p\u003e\n\u003cp\u003e昨天跟 Gemini 和 Claude 分别聊了一下，还挺有意思。很多事情没想清楚（也不可能想清楚），写这篇文章主要是练练笔。\u003c/p\u003e","title":"2026 年初的三张图"},{"content":"不是所有定时任务都需要高级模型，改个配置就能省不少费用。\n手改 ~/.openclaw/cron/jobs.json 实现配置：\n\u0026#34;payload\u0026#34;: { \u0026#34;kind\u0026#34;: \u0026#34;agentTurn\u0026#34;, \u0026#34;message\u0026#34;: \u0026#34;{定时任务内容}\u0026#34;, \u0026#34;model\u0026#34;: \u0026#34;google/gemini-3.1-flash-lite-preview\u0026#34;, \u0026#34;thinking\u0026#34;: \u0026#34;low\u0026#34; }, 另外，大部分定时任务可以选择 isolate 模式，这样请求时就不带主 agent 的上下文（减少 token）：\n\u0026#34;sessionTarget\u0026#34;: \u0026#34;isolated\u0026#34;, 在 web 管理页面上也可以修改模型和 sessionTarget，但列表里只有官方支持的模型可选，像 gemini-3.1-flash-lite-preview 就只能手改了。\n","permalink":"http://life.urakalee.me/posts/2026-03-10-openclaw-cron-job-model-config/","summary":"\u003cp\u003e不是所有定时任务都需要高级模型，改个配置就能省不少费用。\u003c/p\u003e","title":"自定义 OpenClaw 定时任务的模型"},{"content":"主目录是 Git 仓库，子目录也是 Git 仓库时，用 Cursor 查看子目录文件的 Git 历史时，Timeline 面板显示为空。\n配置修改 Cmd + , 打开设置，修改两项：\ngit.autoRepositoryDetection → true git.repositoryScanMaxDepth → 3 Note 不确定是否需要同时修改 User 和 Workspace 级别的配置，保险起见两个我都改了。\n生效 Cmd + Shift + P → Developer: Reload Window 即可。\nNote 我用的方式是完全关闭 Cursor 再打开，Gemini 说这个也可以。\n","permalink":"http://life.urakalee.me/posts/2026-03-08-cursor-nested-git-repo-timeline-fix/","summary":"\u003cp\u003e主目录是 Git 仓库，子目录也是 Git 仓库时，用 Cursor 查看子目录文件的 Git 历史时，Timeline 面板显示为空。\u003c/p\u003e","title":"修复嵌套 Git 仓库 Cursor Timeline 为空问题"},{"content":"Gemini 3.1 Flash Lite 跑的飞快。\n官方好像还没有支持，或者不想立刻升级的同学，可以手改 openclaw.json：\n\u0026#34;google\u0026#34;: { \u0026#34;baseUrl\u0026#34;: \u0026#34;https://generativelanguage.googleapis.com/v1beta\u0026#34;, \u0026#34;api\u0026#34;: \u0026#34;google-generative-ai\u0026#34;, \u0026#34;models\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;gemini-3.1-flash-lite-preview\u0026#34;, \u0026#34;name\u0026#34;: \u0026#34;Gemini 3.1 Flash Lite\u0026#34;, \u0026#34;reasoning\u0026#34;: true, \u0026#34;input\u0026#34;: [ \u0026#34;text\u0026#34; ], \u0026#34;contextWindow\u0026#34;: 400000, \u0026#34;maxTokens\u0026#34;: 8192 } ] } 加好之后重启 OpenClaw 就能在模型列表里看到了。\n","permalink":"http://life.urakalee.me/posts/2026-03-08-gemini-flash-lite-in-openclaw/","summary":"\u003cp\u003eGemini 3.1 Flash Lite 跑的飞快。\u003c/p\u003e","title":"在 OpenClaw 中使用 Gemini 3.1 Flash Lite"},{"content":"我的 OpenClaw 是部署在 Parallels 虚拟机里的，最近想让它通过浏览器帮我收集一些信息，结果遇到了一个非常“玄学”的问题：明明能 ping 通内网代理，但 Chrome 插件（ZeroOmega）死活连不上。和 Gemini 联手排查了半天，终于搞定了。\n必杀技：关闭 Chrome 的\u0026quot;安全 DNS\u0026quot; (DoH) 操作步骤：\n打开 Chrome，访问 chrome://settings/security 找到 \u0026ldquo;使用安全 DNS\u0026rdquo; (Use secure DNS) 选项 关掉 其它检查 Ping： 先确保能 ping 通 Allow LAN： 内网代理软件必须\u0026quot;允许局域网连接\u0026quot; Bridged Network： 使用\u0026quot;桥接模式\u0026quot;，手动指定正确的网卡 断断续续折腾了好几天，终于搞定了，应该早问 AI。\n","permalink":"http://life.urakalee.me/posts/2026-03-08-parallels-chrome-proxy-fix/","summary":"\u003cp\u003e我的 OpenClaw 是部署在 Parallels 虚拟机里的，最近想让它通过浏览器帮我收集一些信息，结果遇到了一个非常“玄学”的问题：明明能 ping 通内网代理，但 Chrome 插件（ZeroOmega）死活连不上。和 Gemini 联手排查了半天，终于搞定了。\u003c/p\u003e","title":"避坑指南：Parallels 虚拟机 Chrome 连不上内网代理"},{"content":"距离上一次更新这个博客，已经过去了整整十年。\n当年用 Octopress 搭的，最后一篇是 2016 年；这次跟 Cursor 聊，换成了 Hugo。\n为什么选 Hugo 上面说了是跟 Cursor 聊的 零依赖：主要考虑这个，Ruby 太烦了，这个 brew install hugo 就搞定了 部署简单：配合 GitHub Actions，push 即发布 迁移过程 完全在 Cursor 里完成的 Cursor 自己写了脚本，做了格式转换 大致看了一下没啥问题 转换好的文章放到 content/posts/，配置 hugo.toml，本地 hugo server 预览。\n部署到 GitHub Pages GitHub 也比 10 年前更自动化了 在 .github/workflows/deploy.yml 里配置了 GitHub Actions，push 到 main 分支就会自动构建和部署。原来的 master 分支（旧的静态 HTML）和 source 分支（Octopress 源码）都保留着，作为历史备份。\n如何写新文章和发布 创建文章 cd /path/to/blog hugo new content posts/YYYY-MM-DD-my-post-title.md 会在 content/posts/ 下生成一个带 front matter 模板的 Markdown 文件。\n--- title: \u0026#34;文章标题\u0026#34; date: YYYY-MM-DD draft: false tags: [\u0026#34;tag1\u0026#34;, \u0026#34;tag2\u0026#34;] --- draft: true 的文章不会被发布，改成 false 才会出现在线上。\n本地预览 hugo server -D pkill hugo -D 表示包含草稿。打开 http://localhost:1313/ 就能看到效果。\n发布 git add -A git commit -m \u0026#34;新文章: xxx\u0026#34; git push push 到 main 分支后，GitHub Actions 会自动构建并部署。\n样式 默认样式有点丑，让 Cursor 帮忙改了一下 但不知道是我的审美有问题，还是 Cursor 有问题，Opus 和 Gemini 3.1 都改不好 去掉了深色模式之后（大概还好改一点了），就还行 附件 链接 费了半天劲，最终还是 Opus 搞定了，不知道为什么 Sonnet 不行（位置搞不对） 公众号链接没搞定（感觉现在微信已经不支持了，但 AI 搜到的还都是过时消息），最后放了二维码 留言 Cursor 提供了一些方案，先保存了一下没有实施 打赏 未调研，目前需求不大 发布到其它平台 Wechatsync：Chrome 插件；试了一下发布到公众号时代码格式有点问题 ","permalink":"http://life.urakalee.me/posts/2026-03-07-revive-my-blog-with-hugo/","summary":"\u003cp\u003e距离上一次更新这个博客，已经过去了整整十年。\u003c/p\u003e\n\u003cp\u003e当年用 Octopress 搭的，最后一篇是 2016 年；这次跟 Cursor 聊，换成了 Hugo。\u003c/p\u003e","title":"重启十年前的博客"},{"content":"https://www.evernote.com/l/ABCVzpSbJs1HoKym6kJDBZQsyMlFtgXKYpM\n","permalink":"http://life.urakalee.me/posts/2016-03-10-android-night-theme-for-9-patch/","summary":"\u003cp\u003e\u003ca href=\"https://www.evernote.com/l/ABCVzpSbJs1HoKym6kJDBZQsyMlFtgXKYpM\"\u003ehttps://www.evernote.com/l/ABCVzpSbJs1HoKym6kJDBZQsyMlFtgXKYpM\u003c/a\u003e\u003c/p\u003e","title":"Android: 9-patch的夜间模式"},{"content":"https://www.evernote.com/l/ABC9oWR2d7xBaK-bic2LbgXHmwIsthq2-HI\n","permalink":"http://life.urakalee.me/posts/2016-03-10-optimize-question-and-solution-of-yuantiku-1/","summary":"\u003cp\u003e\u003ca href=\"https://www.evernote.com/l/ABC9oWR2d7xBaK-bic2LbgXHmwIsthq2-HI\"\u003ehttps://www.evernote.com/l/ABC9oWR2d7xBaK-bic2LbgXHmwIsthq2-HI\u003c/a\u003e\u003c/p\u003e","title":"做题解析性能优化始末(1)"},{"content":"https://www.evernote.com/l/ABDmk4yr90FNi6-Pa69oLDK291tym7e00qE\n","permalink":"http://life.urakalee.me/posts/2016-03-10-android-mechanism-asynctask/","summary":"\u003cp\u003e\u003ca href=\"https://www.evernote.com/l/ABDmk4yr90FNi6-Pa69oLDK291tym7e00qE\"\u003ehttps://www.evernote.com/l/ABDmk4yr90FNi6-Pa69oLDK291tym7e00qE\u003c/a\u003e\u003c/p\u003e","title":"Android机制: AsyncTask"},{"content":"我有一个坏习惯, 开巨多 Chrome 标签页, 然后幻想着有一天可以一个一个看完并记录\u0026hellip;\n以前的解决方案是使用 OneTab, 实际情况是内存占满, 从未看完过.\n在一天两次 Cmd+Q 把所有标签页都关掉之后, 我要继续 hack 这个问题. Quora 上已经有人遇到并解决了这个问题, copy 过来:\nSystem Pref - Keyboard - Shortcuts - App Shortcuts - Add App: Chrome Title: Quit Google Chrome Shortcut: Cmd+Opt+Q ","permalink":"http://life.urakalee.me/posts/2015-04-19-disable-cmd-q-for-chrome/","summary":"\u003cp\u003e我有一个坏习惯, 开巨多 Chrome 标签页, 然后幻想着有一天可以一个一个看完并记录\u0026hellip;\u003c/p\u003e\n\u003cp\u003e以前的解决方案是使用 \u003ca href=\"https://chrome.google.com/webstore/detail/onetab/chphlpgkkbolifaimnlloiipkdnihall\" title=\"OneTab\"\u003eOneTab\u003c/a\u003e, 实际情况是内存占满, 从未看完过.\u003c/p\u003e\n\u003cp\u003e在一天两次 Cmd+Q 把所有标签页都关掉之后, 我要继续 hack 这个问题. \u003ca href=\"http://www.quora.com/How-do-I-disable-Command-q-in-OS-X\" title=\"Disable Cmd+Q in OS X\"\u003eQuora\u003c/a\u003e 上已经有人遇到并解决了这个问题, copy 过来:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSystem Pref - Keyboard - Shortcuts - App Shortcuts - Add\n\u003cul\u003e\n\u003cli\u003eApp: Chrome\u003c/li\u003e\n\u003cli\u003eTitle: Quit Google Chrome\u003c/li\u003e\n\u003cli\u003eShortcut: Cmd+Opt+Q\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Mac Tips: 对 Chrome 禁用 Cmd+Q"},{"content":" transfer 出来的 Mac 系统, 有一些地方需要重新设置 关闭 guest: Pref - User - Unlock - Guest User - Uncheck 修改机器名1: Pref - Share - Computer Name 修改机器名2: sudo scutil --set HostName \u0026lt;name\u0026gt; 修改 Terminal 提示符 vim ~/.bash_profile export PS1=\u0026#34;[\\u@\\h \\W]\\$ \u0026#34; # 增加这一行 source ~/.bash_profile 开启 TRIM 方法 1: 使用 Terminal 命令 方法 2: 使用 Chameleon SSD Optimizer 我是在使用过方法 1 之后才找到方法 2 的, 不过以后再有需要会先用方法 2 检查安装的软件 Dropbox CloudStation -\u0026gt; 家用 ONLY GoAgentX: 升个级吧 -\u0026gt; 买个 VPN 吧 Alfred: 设置 Spotlight 索引, 重建 Alfred 索引 配置 hosts/ssh-config/known_hosts/vimrc/gitconfig/SwitchySharp 各种清理 清理个人的 Login Items: Pref - User - Login Items 使用 CleanMyMac 清理全局的 Login Items 使用 CleanMyMac 删除没用的软件 到 ~/ 下删除没用的目录和没用软件的残留 到 ~/Library/Application Support/ 和 Preferences, Caches, Logs 目录下删除没用软件的残留 运行 Disk Utility 修复 HomeBrew 按照 brew doctor 的提示做即可 Update@2015.04.13: 修改\u0026quot;检查安装的软件\u0026quot;部分\n","permalink":"http://life.urakalee.me/posts/2015-04-19-mac-migration/","summary":"\u003cul\u003e\n\u003cli\u003etransfer 出来的 Mac 系统, 有一些地方需要重新设置\n\u003col\u003e\n\u003cli\u003e关闭 guest: Pref - User - Unlock - Guest User - Uncheck\u003c/li\u003e\n\u003cli\u003e修改机器名1: Pref - Share - Computer Name\u003c/li\u003e\n\u003cli\u003e修改机器名2: \u003ccode\u003esudo scutil --set HostName \u0026lt;name\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e修改 Terminal 提示符\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evim ~/.bash_profile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003ePS1\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[\\u@\\h \\W]\\$ \u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 增加这一行\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003esource\u003c/span\u003e ~/.bash_profile\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e开启 TRIM\n\u003cul\u003e\n\u003cli\u003e方法 1: 使用 \u003ca href=\"http://bbs.weiphone.com/read-htm-tid-7173782.html\" title=\"[求助] 10.9 怎么开启TRIM\"\u003eTerminal 命令\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e方法 2: 使用 \u003ca href=\"http://chameleon.alessandroboschini.it/index.php\" title=\"Chameleon SSD Optimizer\"\u003eChameleon SSD Optimizer\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e我是在使用过方法 1 之后才找到方法 2 的, 不过以后再有需要会先用方法 2\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e检查安装的软件\n\u003cul\u003e\n\u003cli\u003e\u003cdel\u003eDropbox\u003c/del\u003e\u003c/li\u003e\n\u003cli\u003e\u003cdel\u003eCloudStation\u003c/del\u003e -\u0026gt; 家用 ONLY\u003c/li\u003e\n\u003cli\u003e\u003cdel\u003eGoAgentX: 升个级吧\u003c/del\u003e -\u0026gt; 买个 VPN 吧\u003c/li\u003e\n\u003cli\u003eAlfred: \u003ca href=\"/blog/2013/11/25/confused-alfred-and-spotlight/\" title=\"Alfred \u0026amp; Spotlight\"\u003e设置 Spotlight 索引\u003c/a\u003e, 重建 Alfred 索引\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e配置 hosts/ssh-config/known_hosts/vimrc/gitconfig/SwitchySharp\u003c/li\u003e\n\u003cli\u003e各种清理\n\u003cul\u003e\n\u003cli\u003e清理个人的 Login Items: Pref - User - Login Items\u003c/li\u003e\n\u003cli\u003e使用 CleanMyMac 清理全局的 Login Items\u003c/li\u003e\n\u003cli\u003e使用 CleanMyMac 删除没用的软件\u003c/li\u003e\n\u003cli\u003e到 \u003ccode\u003e~/\u003c/code\u003e 下删除没用的目录和没用软件的残留\u003c/li\u003e\n\u003cli\u003e到 \u003ccode\u003e~/Library/Application Support/\u003c/code\u003e 和 \u003ccode\u003ePreferences\u003c/code\u003e, \u003ccode\u003eCaches\u003c/code\u003e, \u003ccode\u003eLogs\u003c/code\u003e 目录下删除没用软件的残留\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e运行 Disk Utility\u003c/li\u003e\n\u003cli\u003e修复 HomeBrew\n\u003cul\u003e\n\u003cli\u003e按照 \u003ccode\u003ebrew doctor\u003c/code\u003e 的提示做即可\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003ca href=\"mailto:Update@2015.04.13\"\u003eUpdate@2015.04.13\u003c/a\u003e: 修改\u0026quot;检查安装的软件\u0026quot;部分\u003c/p\u003e","title":"Mac 重装/数据迁移"},{"content":"在猿题库工作一年多, 新功能做了不少, bug 也改了许多, 近期开始做更多的优化工作. 本篇博客的内容来自\u0026quot;错题锁屏\u0026quot;功能的优化.\n我们 2014 年 9 月开始做\u0026quot;错题锁屏\u0026quot;功能, 希望增加曝光, 提高存留. 开发该功能的同学现在已经结束实习出国工作了, 但做这个功能的时候我就知道坑很多, 而且上线前为了避免风险留了一些坑没改. 上线后, 发现该功能比较受欢迎, 所以又有了多次拉锯式的修改, 不过对于锁屏本身的坑并没有填.\n关于如何防止锁屏进程被杀, 我可能会开另外一篇博客来说明, 不过其实你也可以逆向工程我们的 apk 自己去看. 还有就是错题锁屏变成一个独立进程之后, 进程间共享数据变成了一个新的大坑\u0026hellip;\n由于我们一开始就不想把错题锁屏做得很暴力, 所以虽然禁用了 Back 键(按 Back 键不能退出锁屏), 却还是保留了按 Home 键退出的可能性, 避免用户因为答不对题而无法解锁(我们可能低估用户了).\n于是有一个问题, 按 Home 键退出锁屏之后, 用户可以在\u0026quot;最近使用\u0026quot;中重新打开锁屏界面, 而我们只想让用户在\u0026quot;最近使用\u0026quot;中看到猿题库本身. 我开始寻找如何在用户按 Home 键时让锁屏界面自己把自己 finish 掉的方法.\n首先查到的方法是 onUserLeaveHint, 按 Home 键时确实会调用这个函数. 不过遇到的问题也很坑: 当有其它锁屏, 甚至 QQ 弹窗(实际上也是用类似锁屏的方法实现的)出现时, 我们的锁屏可能被挤掉(onUserLeaveHint 被调用).\n然后开始寻找能够捕获 Home 键的方法:\noverride onKeyDown, 不过 no longer works as of 4.0, 这里给出了完整的代码 这篇 vote 比较少的文章其实离最终答案很近了, 不过因为 vote 太少, 我一开始没有相信它\u0026hellip; 中文网络上看起来有更多人搞过这个问题: 文章 A B C 大同小异, 这里分析得更详细一些. 其中 B 的代码更漂亮一些, 我试过可行 (Android4.+) 可行之后, 我发现又掉到了坑里: 即使 finish 掉了, 用户还是可以在最近使用中重新打开锁屏界面!!!\n最后, 我解决这个问题的方法与捕获 Home 键没有任何关系, 只能把锁屏的 activity 设为最近不可见 (excludeFromRecents=\u0026ldquo;true\u0026rdquo;). 这充分体现了坚持做一个 SB 程序员的必要性: 过于相信一知半解的既有信息是错误的根源.\n","permalink":"http://life.urakalee.me/posts/2015-01-21-android-home-watcher/","summary":"\u003cp\u003e在\u003ca href=\"http://yuantiku.com\"\u003e猿题库\u003c/a\u003e工作一年多, 新功能做了不少, bug 也改了许多, 近期开始做更多的优化工作. 本篇博客的内容来自\u0026quot;错题锁屏\u0026quot;功能的优化.\u003c/p\u003e\n\u003cp\u003e我们 2014 年 9 月开始做\u0026quot;错题锁屏\u0026quot;功能, 希望增加曝光, 提高存留. 开发该功能的同学现在已经结束实习出国工作了, 但做这个功能的时候我就知道坑很多, 而且上线前为了避免风险留了一些坑没改. 上线后, 发现该功能比较受欢迎, 所以又有了多次拉锯式的修改, 不过对于锁屏本身的坑并没有填.\u003c/p\u003e\n\u003cp\u003e关于如何防止锁屏进程被杀, 我可能会开另外一篇博客来说明, 不过其实你也可以逆向工程我们的 apk 自己去看. 还有就是错题锁屏变成一个独立进程之后, 进程间共享数据变成了一个新的大坑\u0026hellip;\u003c/p\u003e\n\u003cp\u003e由于我们一开始就不想把错题锁屏做得很暴力, 所以虽然禁用了 Back 键(按 Back 键不能退出锁屏), 却还是保留了按 Home 键退出的可能性, 避免用户因为答不对题而无法解锁(我们可能低估用户了).\u003c/p\u003e\n\u003cp\u003e于是有一个问题, 按 Home 键退出锁屏之后, 用户可以在\u0026quot;最近使用\u0026quot;中重新打开锁屏界面, 而我们只想让用户在\u0026quot;最近使用\u0026quot;中看到猿题库本身. 我开始寻找如何在用户按 Home 键时让锁屏界面自己把自己 finish 掉的方法.\u003c/p\u003e\n\u003cp\u003e首先查到的方法是 onUserLeaveHint, 按 Home 键时确实会调用这个函数. 不过遇到的问题也很坑: 当有其它锁屏, 甚至 QQ 弹窗(实际上也是用类似锁屏的方法实现的)出现时, 我们的锁屏可能被挤掉(onUserLeaveHint 被调用).\u003c/p\u003e\n\u003cp\u003e然后开始寻找能够捕获 Home 键的方法:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"http://stackoverflow.com/questions/8881951/detect-home-button-press-in-android\"\u003eoverride onKeyDown\u003c/a\u003e, 不过 no longer works as of 4.0, \u003ca href=\"http://www.coderzheaven.com/2012/06/02/override-hardware-home-button-android-listen-home-button-click-android/\"\u003e这里\u003c/a\u003e给出了完整的代码\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://stackoverflow.com/questions/5907102/home-button-listener\"\u003e这篇 vote 比较少的文章\u003c/a\u003e其实离最终答案很近了, 不过因为 vote 太少, 我一开始没有相信它\u0026hellip;\u003c/li\u003e\n\u003cli\u003e中文网络上看起来有更多人搞过这个问题: 文章 \u003ca href=\"http://blog.csdn.net/way_ping_li/article/details/8953622\"\u003eA\u003c/a\u003e \u003ca href=\"http://blog.csdn.net/watt520/article/details/18959897\"\u003eB\u003c/a\u003e \u003ca href=\"http://blog.csdn.net/ekeuy/article/details/39400939\"\u003eC\u003c/a\u003e 大同小异, \u003ca href=\"http://862123204-qq-com.iteye.com/blog/1888532\"\u003e这里\u003c/a\u003e分析得更详细一些. 其中 \u003ca href=\"http://blog.csdn.net/watt520/article/details/18959897\"\u003eB\u003c/a\u003e 的代码更漂亮一些, 我试过可行 (Android4.+)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e可行之后, 我发现又掉到了坑里: \u003cstrong\u003e即使 finish 掉了, 用户还是可以在最近使用中重新打开锁屏界面!!!\u003c/strong\u003e\u003c/p\u003e","title":"Android: 捕获 Home 键"},{"content":"记录 圣诞节, Mimi 怀孕 14 周 2 天; 大风; 上线结束的时间还好, 9点到家. 本周体重 51kg, 没有增加; 食欲仍然一般, 胃有胀气, 偶尔拉肚子; 睡 8 小时, 但梦比较多. 第一次产前筛查已经过了一周; 约了 1 月 5 号的孕期课程第一节. 致 Weiwei 你的名字叫李 Weiling, 因为还不知道你是男宝宝还是女宝宝, 所以字还没有定. Weiling 这个名字是爸爸起的, 依照 willing 的发音, 希望你能够有自己的意志, 不随波逐流. 不过名字只是个祝愿, 健康快乐才最重要, 爸爸妈妈都清楚这一点.\n因为你曾经离开过爸爸妈妈一次, 所以这一次爸爸妈妈都有点紧张. 说什么放轻松那是骗人, 但着急也没用却是真的. 一方面担心你是不是能顺利地到来, 另一方面也希望能在你到来之前做好更多的准备.\n两个月前爸爸刚换了一份工作, 降薪来到了一家创业公司. 虽然心态好了不少, 也有了努力的方向, 但钱少了是个事实. 于是爸爸开始尝试理财, 赶上比特币大涨, 小赚了一笔. 投资还是投机, 一开始爸爸没有把握好, 赚了又赔, 身心疲惫. 反复几次之后, 爸爸开始尝试给自己设定几条规则:\n投资自己(学习)最重要 投机没有关系, 但要自律, 不能违背第一条 设定合理的收益目标, 有助于平衡上述关系 这几条规则并不一定普遍适用, 但至少符合爸爸目前的情况. 同时, 爸爸也意识到目前物质基础还算牢固, 但快速增长也不现实, 应该更关注精神方面的准备. 这一点妈妈做得很棒呢! 从很久以前就开始看书, 还给爸爸普及了许多妈妈和宝宝相关的健康知识. 不过爸爸偶尔还是会神经兮兮地在削苹果的过程中洗 3 次手, 生怕妈妈吃到什么脏东西.\n\u0026ldquo;对命运保持敬意, 对现实冷静分析\u0026rdquo;\n想想这么多年都好好地过来了, 而且妈妈的体质很好, 爸爸也无非就是对于各种未知的指标有些焦虑, 应该可以尽快调整好的. 然后陪妈妈一起度过之后的 N 周, 一起期待着你的降临.\nPS1, 爸爸会坚持锻炼身体, 减肥+增强体能, 带妈妈和你去看极光 PS2, 爸爸会逐步总结经验, 并分享给你, 也许在你焦虑/失望/恐惧的时候会用得上 ","permalink":"http://life.urakalee.me/posts/2013-12-25-to-weiwei-waiting-for-you/","summary":"\u003ch2 id=\"记录\"\u003e记录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e圣诞节, Mimi 怀孕 14 周 2 天; 大风; 上线结束的时间还好, 9点到家.\u003c/li\u003e\n\u003cli\u003e本周体重 51kg, 没有增加; 食欲仍然一般, 胃有胀气, 偶尔拉肚子; 睡 8 小时, 但梦比较多.\u003c/li\u003e\n\u003cli\u003e第一次产前筛查已经过了一周; 约了 1 月 5 号的孕期课程第一节.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"致-weiwei\"\u003e致 Weiwei\u003c/h2\u003e\n\u003cp\u003e你的名字叫李 Weiling, 因为还不知道你是男宝宝还是女宝宝, 所以字还没有定. Weiling 这个名字是爸爸起的, 依照 willing 的发音, 希望你能够有自己的意志, 不随波逐流. 不过名字只是个祝愿, 健康快乐才最重要, 爸爸妈妈都清楚这一点.\u003c/p\u003e\n\u003cp\u003e因为你曾经离开过爸爸妈妈一次, 所以这一次爸爸妈妈都有点紧张. 说什么放轻松那是骗人, 但着急也没用却是真的. 一方面担心你是不是能顺利地到来, 另一方面也希望能在你到来之前做好更多的准备.\u003c/p\u003e\n\u003cp\u003e两个月前爸爸刚换了一份工作, 降薪来到了一家创业公司. 虽然心态好了不少, 也有了努力的方向, 但钱少了是个事实. 于是爸爸开始尝试理财, 赶上比特币大涨, 小赚了一笔. 投资还是投机, 一开始爸爸没有把握好, 赚了又赔, 身心疲惫. 反复几次之后, 爸爸开始尝试给自己设定几条规则:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e投资自己(学习)最重要\u003c/li\u003e\n\u003cli\u003e投机没有关系, 但要自律, 不能违背第一条\u003c/li\u003e\n\u003cli\u003e设定合理的收益目标, 有助于平衡上述关系\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这几条规则并不一定普遍适用, 但至少符合爸爸目前的情况. 同时, 爸爸也意识到目前物质基础还算牢固, 但快速增长也不现实, 应该更关注精神方面的准备. 这一点妈妈做得很棒呢! 从很久以前就开始看书, 还给爸爸普及了许多妈妈和宝宝相关的健康知识. 不过爸爸偶尔还是会神经兮兮地在削苹果的过程中洗 3 次手, 生怕妈妈吃到什么脏东西.\u003c/p\u003e","title":"致 Weiwei: 我们期待着你的降临"},{"content":" 直接升级失败, Error 12 找到官方解决方案 ~/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/Resources/install.py --uninstall # Mac 10.9 上无此文件 sudo /Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/Resources/install.py --uninstall 折腾半天还是不行, 最后从官网下载了最新版的 Chrome, 覆盖安装 Update@2016.03.10: 使用 Homebrew Cask brew install caskroom/cask/brew-cask brew cask search chrome brew cask install google-chrome ","permalink":"http://life.urakalee.me/posts/2013-12-25-mac-chrome-upgrade/","summary":"\u003col\u003e\n\u003cli\u003e直接升级失败, Error 12\u003c/li\u003e\n\u003cli\u003e找到\u003ca href=\"https://support.google.com/chrome/answer/1367288?hl=zh-Hans\" title=\"无法在苹果机上更新 Google Chrome 浏览器\"\u003e官方解决方案\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e~/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/Resources/install.py --uninstall \u003cspan class=\"c1\"\u003e# Mac 10.9 上无此文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo /Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/Resources/install.py --uninstall\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e折腾半天还是不行, 最后从官网下载了最新版的 Chrome, 覆盖安装\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"mailto:Update@2016.03.10\"\u003eUpdate@2016.03.10\u003c/a\u003e: 使用 Homebrew Cask\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install caskroom/cask/brew-cask\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew cask search chrome\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew cask install google-chrome\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Mac Chrome 升级"},{"content":"Manifest 弹出键盘 android:windowSoftInputMode 控制弹出键盘 stateHidden 为刚进入 activity 时不显示键盘 控件 EditText 与弹出键盘 在 xml 中设置 android:inputType, 常用的有: default, 中文手机会弹出中文输入法, 并切换到默认输入模式(通常是中文模式) phone, 电话号码键盘, 不过我们通常还是会用 number 彻底限制只能输入数字 textEmailAddress, 虽然名字是 email, 但是也可以输入电话号码 java 中可以 setInputType, 对应的 type 在 InputType 找到: 比如 textEmailAddress 对应 TYPE_TEXT_VARIATION_EMAIL_ADDRESS 注意 textPassword 对应 TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD 详见 官方文档 工具 sleep SystemClock.sleep 不会抛出 InterruptedException, 同时也无法 thread.interrupt Thread.sleep 则正相反 线程 UI 线程 UI 控件不是线程安全的, 所以只能在 UI 线程上操作 Activity.runOnUiThread View.post/postDelayed Handler AsyncTask doInBackground 在 worker 线程 onPre/PostExecute 和 onProgressUpdate 在 UI 线程 WebView 使用 HttpClient 的 cookie /** * @param url - 形如 http://xxx.domain.com/yyy/zzz.z?mmm=nnn * @param cookie - 从 HttpClient 取得的 cookie */ public static void synCookies(Context context, String url, Cookie cookie) { CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); // 这句可能可以不要 String cookieString = cookie.getName() + \u0026#34;=\u0026#34; + cookie.getValue() + \u0026#34;; domain=\u0026#34; + cookie.getDomain(); cookieManager.setCookie(url, cookieString); CookieSyncManager.getInstance().sync(); } ","permalink":"http://life.urakalee.me/posts/2013-12-20-android-tips/","summary":"\u003ch2 id=\"manifest\"\u003eManifest\u003c/h2\u003e\n\u003ch3 id=\"弹出键盘\"\u003e弹出键盘\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eandroid:windowSoftInputMode\u003c/code\u003e 控制弹出键盘\n\u003cul\u003e\n\u003cli\u003estateHidden 为刚进入 activity 时不显示键盘\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"控件\"\u003e控件\u003c/h2\u003e\n\u003ch3 id=\"edittext-与弹出键盘\"\u003eEditText 与弹出键盘\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e在 xml 中设置 \u003ccode\u003eandroid:inputType\u003c/code\u003e, 常用的有:\n\u003cul\u003e\n\u003cli\u003edefault, 中文手机会弹出中文输入法, 并切换到默认输入模式(通常是中文模式)\u003c/li\u003e\n\u003cli\u003ephone, 电话号码键盘, 不过我们通常还是会用 number 彻底限制只能输入数字\u003c/li\u003e\n\u003cli\u003etextEmailAddress, 虽然名字是 email, 但是也可以输入电话号码\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ejava 中可以 \u003ccode\u003esetInputType\u003c/code\u003e, 对应的 type 在 \u003ccode\u003eInputType\u003c/code\u003e 找到:\n\u003cul\u003e\n\u003cli\u003e比如 textEmailAddress 对应 TYPE_TEXT_VARIATION_EMAIL_ADDRESS\u003c/li\u003e\n\u003cli\u003e注意 textPassword 对应 TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e详见 \u003ca href=\"http://developer.android.com/guide/topics/ui/controls/text.html\" title=\"Text Fields\"\u003e官方文档\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"工具\"\u003e工具\u003c/h2\u003e\n\u003ch3 id=\"sleep\"\u003esleep\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eSystemClock.sleep\u003c/code\u003e 不会抛出 \u003ccode\u003eInterruptedException\u003c/code\u003e, 同时也无法 \u003ccode\u003ethread.interrupt\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003eThread.sleep 则正相反\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"线程\"\u003e线程\u003c/h2\u003e\n\u003ch3 id=\"ui-线程\"\u003eUI 线程\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUI 控件不是线程安全的, 所以只能在 UI 线程上操作\n\u003cul\u003e\n\u003cli\u003eActivity.runOnUiThread\u003c/li\u003e\n\u003cli\u003eView.post/postDelayed\u003c/li\u003e\n\u003cli\u003eHandler\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eAsyncTask\n\u003cul\u003e\n\u003cli\u003edoInBackground 在 worker 线程\u003c/li\u003e\n\u003cli\u003eonPre/PostExecute 和 onProgressUpdate 在 UI 线程\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"webview\"\u003eWebView\u003c/h2\u003e\n\u003ch3 id=\"使用-httpclient-的-cookie\"\u003e使用 HttpClient 的 cookie\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param url - 形如 http://xxx.domain.com/yyy/zzz.z?mmm=nnn\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param cookie - 从 HttpClient 取得的 cookie\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003esynCookies\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eContext\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCookie\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecookie\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eCookieSyncManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ecreateInstance\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eCookieManager\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecookieManager\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCookieManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetInstance\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003ecookieManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetAcceptCookie\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 这句可能可以不要\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecookieString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecookie\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;=\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecookie\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetValue\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;; domain=\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecookie\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetDomain\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003ecookieManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetCookie\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecookieString\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eCookieSyncManager\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetInstance\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"na\"\u003esync\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Android 开发点滴"},{"content":" 本文仅用于有洁癖者(本人)统一 markdown 风格, 以及 check style 行文 标点 除非必要, 所有标点都使用英文标点 强调 说明性的词和短语用双引号(\u0026quot;\u0026quot;)强调 提示性的词和短语用双星号(**)强调 结论性的短语和句子用三星号(***)强调 删除 ~~删除的文字~~ -\u0026gt; 删除的文字 空格 第一级列表标记(比如*)前不需要空格 英文单词的前后都需要空格 行首不需要前面的空格, 句尾不需要后面的空格 如果英文单词在括号里, 则前后的空格写在括号外, 比如 \u0026quot; (abc) \u0026quot; 或 \u0026quot; (abc 很不错)\u0026quot; 左引号前和右引号后都需要空格 行首不需要前面的空格, 句尾不需要后面的空格 强调标记的前后都需要空格 行首不需要前面的空格, 句尾不需要后面的空格 链接 行文中需要文字的, 使用引用方式 直接贴链接不影响行文的, 可以直接贴连接 比如 少量 不是很长 且 在行尾 的链接 比如 少量 不是很长 的链接列表 其它情况均需要使用引用方式, 引用需要集中写在文章或段落末尾 [Display Name][name] ... [name]: http://external.link \"Link Description\" [name]: /blog/yyyy/MM/dd/internal-link/ \"Link Description\" 更新 在文档末尾添加 **** Update@yyyy.MM.dd: 更新的内容 大小写 TODO 用词 举例时用 \u0026ldquo;比如\u0026rdquo;, 不用 \u0026ldquo;如\u0026rdquo;; \u0026ldquo;比如\u0026rdquo; 后面不加冒号, 除非后面跟着列表 并列时用 \u0026ldquo;和\u0026rdquo;, 不用 \u0026ldquo;及\u0026rdquo;; 除非需要使用 \u0026ldquo;以及\u0026rdquo; \u0026ldquo;其他\u0026rdquo; 修饰人, \u0026ldquo;其它\u0026rdquo; 修饰非人 代码 单行模式 一行可执行代码使用变音符号(`)单行模式 一行文本内容使用变音符号单行模式或 pre-code 多行模式 特殊记号使用变音符号单行模式 比如文件路径 C:\\Windows 比如代码元素 ++ -- 变音符号单行模式的空格规则同引号 可执行代码和支持代码高亮的文本 使用变音符号(`)多行模式 支持代码高亮的语言列表: http://pygments.org/docs/lexers/ 不支持代码高亮的文本内容 使用 pre-code 多行模式 打开该文本文件的命令可以写在一起, 命令和文本之间空一行 ","permalink":"http://life.urakalee.me/posts/2013-12-16-markdown-style/","summary":"\u003cul\u003e\n\u003cli\u003e本文仅用于有洁癖者(本人)统一 markdown 风格, 以及 check style\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"行文\"\u003e行文\u003c/h2\u003e\n\u003ch3 id=\"标点\"\u003e标点\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e除非必要, 所有标点都使用英文标点\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"强调\"\u003e强调\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e说明性的词和短语用双引号(\u0026quot;\u0026quot;)强调\u003c/li\u003e\n\u003cli\u003e提示性的词和短语用双星号(**)强调\u003c/li\u003e\n\u003cli\u003e结论性的短语和句子用三星号(***)强调\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"删除\"\u003e删除\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e~~删除的文字~~\u003c/code\u003e -\u0026gt; \u003cdel\u003e删除的文字\u003c/del\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"空格\"\u003e空格\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e第一级列表标记(比如*)前不需要空格\u003c/li\u003e\n\u003cli\u003e英文单词的前后都需要空格\n\u003cul\u003e\n\u003cli\u003e行首不需要前面的空格, 句尾不需要后面的空格\u003c/li\u003e\n\u003cli\u003e如果英文单词在括号里, 则前后的空格写在括号外, 比如 \u0026quot; (abc) \u0026quot; 或 \u0026quot; (abc 很不错)\u0026quot;\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e左引号前和右引号后都需要空格\n\u003cul\u003e\n\u003cli\u003e行首不需要前面的空格, 句尾不需要后面的空格\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e强调标记的前后都需要空格\n\u003cul\u003e\n\u003cli\u003e行首不需要前面的空格, 句尾不需要后面的空格\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch3 id=\"链接\"\u003e链接\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e行文中需要文字的, 使用引用方式\u003c/li\u003e\n\u003cli\u003e直接贴链接不影响行文的, 可以直接贴连接\n\u003cul\u003e\n\u003cli\u003e比如 \u003cstrong\u003e少量\u003c/strong\u003e \u003cstrong\u003e不是很长\u003c/strong\u003e 且 \u003cstrong\u003e在行尾\u003c/strong\u003e 的链接\u003c/li\u003e\n\u003cli\u003e比如 \u003cstrong\u003e少量\u003c/strong\u003e \u003cstrong\u003e不是很长\u003c/strong\u003e 的链接列表\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e其它情况均需要使用引用方式, 引用需要集中写在文章或段落末尾\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\n[Display Name][name]\n...\n\n [name]: http://external.link \"Link Description\"\n [name]: /blog/yyyy/MM/dd/internal-link/ \"Link Description\"\n\u003c/pre\u003e\n\u003ch3 id=\"更新\"\u003e更新\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e在文档末尾添加\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\n****\nUpdate@yyyy.MM.dd: 更新的内容\n\u003c/pre\u003e\n\u003ch3 id=\"大小写\"\u003e大小写\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eTODO\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"用词\"\u003e用词\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e举例时用 \u0026ldquo;比如\u0026rdquo;, 不用 \u0026ldquo;如\u0026rdquo;; \u0026ldquo;比如\u0026rdquo; 后面不加冒号, 除非后面跟着列表\u003c/li\u003e\n\u003cli\u003e并列时用 \u0026ldquo;和\u0026rdquo;, 不用 \u0026ldquo;及\u0026rdquo;; 除非需要使用 \u0026ldquo;以及\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;其他\u0026rdquo; 修饰人, \u0026ldquo;其它\u0026rdquo; 修饰非人\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"代码\"\u003e代码\u003c/h2\u003e\n\u003ch3 id=\"单行模式\"\u003e单行模式\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e一行可执行代码使用变音符号(`)单行模式\u003c/li\u003e\n\u003cli\u003e一行文本内容使用变音符号单行模式或 pre-code 多行模式\u003c/li\u003e\n\u003cli\u003e特殊记号使用变音符号单行模式\n\u003cul\u003e\n\u003cli\u003e比如文件路径 \u003ccode\u003eC:\\Windows\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e比如代码元素 \u003ccode\u003e++\u003c/code\u003e \u003ccode\u003e--\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e变音符号单行模式的空格规则同引号\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"可执行代码和支持代码高亮的文本\"\u003e可执行代码和支持代码高亮的文本\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e使用变音符号(`)多行模式\u003c/li\u003e\n\u003cli\u003e支持代码高亮的语言列表: \u003ca href=\"http://pygments.org/docs/lexers/\"\u003ehttp://pygments.org/docs/lexers/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"不支持代码高亮的文本内容\"\u003e不支持代码高亮的文本内容\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e使用 pre-code 多行模式\u003c/li\u003e\n\u003cli\u003e打开该文本文件的命令可以写在一起, 命令和文本之间空一行\u003c/li\u003e\n\u003c/ul\u003e","title":"Markdown Style"},{"content":" 使用 git (ssh 模式)和 scp 等 ssh 相关命令时也遵从该配置 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 =\u003e 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 vim ~/.ssh/known_hosts # 通过用户认证的主机列表, 一行一个 \u003c主机名\u003e,ip1[,ip2]...[,ipN] ssh-\u003c加密方式\u003e \u003c主机指纹\u003e vim ~/.ssh/authorized_keys # 设置本机允许那些用户登录, 一行一个 ssh-\u003c加密方式\u003e \u003c公钥\u003e [user@host] ","permalink":"http://life.urakalee.me/posts/2013-12-14-ssh-configuration-explain/","summary":"\u003cul\u003e\n\u003cli\u003e使用 git (ssh 模式)和 scp 等 ssh 相关命令时也遵从该配置\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode\u003evim ~/.ssh/config\n\nHost github.com\n    User git # 使用 github 时的默认用户名\n    IdentityFile ~/.ssh/id_rsa.github # 为不同的 host 配置不同的 key\n\nHost gerrit.work-host.com\n    User work-name # 使用公司 gerrit 服务时的默认用户名\n    IdentityFile ~/.ssh/id_rsa.work # 为不同的 host 配置不同的 key\n\n# ssh mctx =\u003e ssh urakalee@192.168.1.1\n# 不需要配系统 host, 不过除 ssh 相关命令外, 该 host 不起作用\nHost mctx\n    HostName 192.168.1.1 # 私人服务器 ip\n    User urakalee # ssh 到私人服务器时的默认用户名\n    IdentityFile ~/.ssh/id_rsa.urakalee # 为不同的 host 配置不同的 key\n\n# ssh workstation 和 ssh 10.0.0.1 同时生效\n# 不需要配系统 host, 不过除 ssh 相关命令外, 该 host 不起作用\nHost workstation 10.0.0.1\n    HostName 10.0.0.1 # 公司 workstation 服务器 ip\n    User work-name # ssh 到公司 workstation 服务器时的默认用户名\n    IdentityFile ~/.ssh/id_rsa.work # 为不同的 host 配置不同的 key\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003evim ~/.ssh/known_hosts\n\n# 通过用户认证的主机列表, 一行一个\n\u003c主机名\u003e,ip1[,ip2]...[,ipN] ssh-\u003c加密方式\u003e \u003c主机指纹\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003evim ~/.ssh/authorized_keys\n\n# 设置本机允许那些用户登录, 一行一个\nssh-\u003c加密方式\u003e \u003c公钥\u003e [user@host]\n\u003c/code\u003e\u003c/pre\u003e","title":"SSH 配置解析"},{"content":"安装 下载安装后, 需要更新到最新版本 不更新可能会遇到一些奇葩问题 如果能直接更新或者翻墙更新的, 请直接更新 不能更新的, 请参考下列文章手动更新 http://www.cnsecer.com/842.html http://blog.csdn.net/hil2000/article/details/11395485 关键命令 java -classpath AI-\u0026lt;old-edition\u0026gt;-\u0026lt;new-edition\u0026gt;-patch-\u0026lt;os\u0026gt;.jar com.intellij.updater.Runner install . 新建项目 新建一个项目时, 视选择的 SDK 版本, 可能会失败, 原因是包不全 打开 SDK Manager, 勾选需要的包, 点击 Install X package[s]\u0026hellip; 注意: 接受协议时可能需要在弹出的对话框里逐个接受, 才能一并下载 模拟器 以下问题仅限于 windows, Mac 用户可以直接放弃模拟器\u0026hellip; 运行模拟器失败, 需要把 X盘/.android/avd 拷贝到 C盘/用户目录/.android 下 运行模拟器慢, 需要下载和安装 intel x86 emulator, 创建 avd 时也要选这个 用 SDK Manager 下载 intel x86 emulator 和对应的 rom 注意: 下载 emulator 后需要安装, 可执行文件在 sdk/extras/intel 中 数据目录 Android Studio 目前还不太稳定, 偶尔折腾, 甚至需要把数据目录清空 下面的内容摘自 Intellij 官网, 只要把路径换成 AndroidStudioPreview 即可 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. Update@2015.04.13: Android Studio 在升级到 1+ 之后奇葩问题少多了 Update@2016.03.10: 模拟器建议使用 Genymotion ","permalink":"http://life.urakalee.me/posts/2013-12-08-newbie-to-android-studio/","summary":"\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e下载安装后, 需要更新到最新版本\n\u003cul\u003e\n\u003cli\u003e不更新可能会遇到一些奇葩问题\u003c/li\u003e\n\u003cli\u003e如果能直接更新或者翻墙更新的, 请直接更新\u003c/li\u003e\n\u003cli\u003e不能更新的, 请参考下列文章手动更新\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.cnsecer.com/842.html\"\u003ehttp://www.cnsecer.com/842.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://blog.csdn.net/hil2000/article/details/11395485\"\u003ehttp://blog.csdn.net/hil2000/article/details/11395485\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e关键命令\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejava -classpath AI-\u0026lt;old-edition\u0026gt;-\u0026lt;new-edition\u0026gt;-patch-\u0026lt;os\u0026gt;.jar com.intellij.updater.Runner install .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"新建项目\"\u003e新建项目\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e新建一个项目时, 视选择的 SDK 版本, 可能会失败, 原因是包不全\n\u003cul\u003e\n\u003cli\u003e打开 SDK Manager, 勾选需要的包, 点击 Install X package[s]\u0026hellip;\u003c/li\u003e\n\u003cli\u003e注意: 接受协议时可能需要在弹出的对话框里逐个接受, 才能一并下载\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"模拟器\"\u003e模拟器\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e以下问题仅限于 windows, Mac 用户可以直接放弃模拟器\u0026hellip;\u003c/li\u003e\n\u003cli\u003e运行模拟器失败, 需要把 \u003ccode\u003eX盘/.android/avd\u003c/code\u003e 拷贝到 \u003ccode\u003eC盘/用户目录/.android\u003c/code\u003e 下\u003c/li\u003e\n\u003cli\u003e运行模拟器慢, 需要下载和安装 intel x86 emulator, 创建 avd 时也要选这个\n\u003cul\u003e\n\u003cli\u003e用 SDK Manager 下载 intel x86 emulator 和对应的 rom\u003c/li\u003e\n\u003cli\u003e注意: 下载 emulator 后需要安装, 可执行文件在 \u003ccode\u003esdk/extras/intel\u003c/code\u003e 中\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"数据目录\"\u003e数据目录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAndroid Studio 目前还不太稳定, 偶尔折腾, 甚至需要把数据目录清空\u003c/li\u003e\n\u003cli\u003e下面的内容摘自 \u003ca href=\"http://www.jetbrains.com/idea/webhelp/project-and-ide-settings.html\" title=\"Project and IDE Settings\"\u003eIntellij 官网\u003c/a\u003e, 只要把路径换成 AndroidStudioPreview 即可\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode\u003eMac\n~/Library/Application Support/IntelliJIdeaXX contains the catalog with plugins.\n~/Library/Preferences/IntelliJIdeaXX contains the rest of the configuration settings.\n~/Library/Caches/IntelliJIdeaXX contains data caches, logs, local history, etc. These files can be quite significant in size.\n9.0+ ~/Library/Logs/IntelliJIdeaXX contains logs\nWindows\n~\\.IntelliJIdeaXX\\config that contains user-specific settings.\n~\\.IntelliJIdeaXX\\system that stores IntelliJ IDEA data caches.\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"mailto:Update@2015.04.13\"\u003eUpdate@2015.04.13\u003c/a\u003e: Android Studio 在升级到 1+ 之后奇葩问题少多了\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:Update@2016.03.10\"\u003eUpdate@2016.03.10\u003c/a\u003e: 模拟器建议使用 Genymotion\u003c/li\u003e\n\u003c/ul\u003e","title":"Android Studio 新手小记"},{"content":"常用命令 find find . -name \u0026#34;*.xyz\u0026#34; find . -name \u0026#34;*abc*\u0026#34; -delete grep grep -i \u0026#34;abc\u0026#34; * # 忽略大小写 grep -R \u0026#34;abc\u0026#34; . wc wc -l find -name \u0026#34;*.java\u0026#34; # 统计 java 代码行数 权限 chmod u+x \u0026lt;file\u0026gt; # 设为可执行文件 chown \u0026lt;name\u0026gt; \u0026lt;file\u0026gt; chown -R \u0026lt;name\u0026gt; \u0026lt;dir\u0026gt; chgrp ... # 格式同 chown 系统工具 ssh ssh-add -D删除所有记住的key 解决 Mac 下所有使用过的 key 都会被记住，删除 key 文件没用的问题 链接库 查看链接库是否缺失: ldd \u0026lt;可执行文件\u0026gt; 修改系统加载库 vim /etc/ld.so.conf /sbin/ldconfig ","permalink":"http://life.urakalee.me/posts/2013-12-08-linux-cheatsheet/","summary":"\u003ch2 id=\"常用命令\"\u003e常用命令\u003c/h2\u003e\n\u003ch3 id=\"find\"\u003efind\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efind . -name \u003cspan class=\"s2\"\u003e\u0026#34;*.xyz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efind . -name \u003cspan class=\"s2\"\u003e\u0026#34;*abc*\u0026#34;\u003c/span\u003e -delete\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"grep\"\u003egrep\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egrep -i \u003cspan class=\"s2\"\u003e\u0026#34;abc\u0026#34;\u003c/span\u003e * \u003cspan class=\"c1\"\u003e# 忽略大小写\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egrep -R \u003cspan class=\"s2\"\u003e\u0026#34;abc\u0026#34;\u003c/span\u003e .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"wc\"\u003ewc\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewc -l find -name \u003cspan class=\"s2\"\u003e\u0026#34;*.java\u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 统计 java 代码行数\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"权限\"\u003e权限\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmod u+x \u0026lt;file\u0026gt; \u003cspan class=\"c1\"\u003e# 设为可执行文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echown \u0026lt;name\u0026gt; \u0026lt;file\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echown -R \u0026lt;name\u0026gt; \u0026lt;dir\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echgrp ... \u003cspan class=\"c1\"\u003e# 格式同 chown\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"系统工具\"\u003e系统工具\u003c/h2\u003e\n\u003ch3 id=\"ssh\"\u003essh\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003essh-add -D删除所有记住的key\n\u003cul\u003e\n\u003cli\u003e解决 Mac 下所有使用过的 key 都会被记住，删除 key 文件没用的问题\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"链接库\"\u003e链接库\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e查看链接库是否缺失: \u003ccode\u003eldd \u0026lt;可执行文件\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e修改系统加载库\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evim /etc/ld.so.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/sbin/ldconfig\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Linux 手册"},{"content":" 坦诚 信任（支持） 尊重 包容（耐心） ","permalink":"http://life.urakalee.me/posts/2013-12-08-family-culture/","summary":"\u003cul\u003e\n\u003cli\u003e坦诚 信任（支持）\u003c/li\u003e\n\u003cli\u003e尊重 包容（耐心）\u003c/li\u003e\n\u003c/ul\u003e","title":"家庭文化"},{"content":"概述 这本书并没有告诉我们应该确立什么样的人生目标, 但书中的观点可以帮助我们衡量目标的可行性, 并关注实现目标的过程中可能发生的问题\n目标: 资源•应用流程•价值取向 资源是 Ta 所利用的东西 应用流程是 Ta 做事的方法 价值取向是 Ta 做某件事的动机 -\u0026gt; 用于评估什么样的目标可以实现, 什么样的目标遥不可及 衡量目标的可行性: 资源是否足够, 如果不够, 可能需要一个更短期的目标来增加资源 实现目标的方法已经有了吗? 可能没有, 那么需要 \u0026ldquo;根据机遇权衡计划\u0026rdquo; 目标是否符合你的价值取向, 如果不符合, 那么可能需要放弃这个目标 每天都会面临的基本挑战: 接受哪些信息 采纳哪些建议 忽视哪些问题 去做哪些事情 -\u0026gt; 这些挑战归结为: 如何选择 目标 - 选择 所谓目标, 虽然分长期和短期, 却依然很难直接指导具体的选择 相反, 选择的过程往往体现了 \u0026ldquo;资源•应用流程•价值取向\u0026rdquo; 这三要素 实现目标过程中可能会发生的问题: 重点不明确, 要关注你的价值取向中最重要的那部分 \u0026ldquo;根据机遇权衡计划\u0026rdquo; 既然是重点, 就要分配资源 战略: 重点•根据机遇权衡计划•分配资源 战略, 是指为实现某种目标而制定的大规模, 全方位的长期行动计划 战略是长期的事情, 短期的事情不能通过战略搞定, 但应符合战略需要 重点 重点是你做决策时的核心标准 薪水是一个基础因素, 不是动力因素 工作满意和没有不满是两回事 权衡 \u0026ldquo;哪些假设条件需要得到验证, 才能说明这个战略有效\u0026rdquo; 根据机遇权衡计划的重点是小成本尝试和拥抱变化, 是一个情况多样, 难以控制的连续过程, 很可能不是一开始就想到的 没有哪个方法一经提出就更好或更糟, 而是要根据你走到哪个阶段来确定 分配资源 任何一个战略 - 不论是企业战略还是个人生活战略 - 都是从数百次日常决定中产生的, 它是关于如何安排时间(人)和金钱(物)的决定 生活中的每一个有关如何分配时间盒金钱的决定, 都表明了你真正在乎的是什么 你可以尽情地谈论自己的生活, 谈论有什么清晰的目标和战略, 但是如果你投入的资源和你的战略方向不一致, 这些谈论都毫无意义 如果最终不能有效实施, 你的战略只能是一个良好的愿望 -\u0026gt; 如果家庭是重点, 就要家庭建设上分配资源 我的目标 我的目标是帮助家人(包括自己)过上满足的生活 谈 \u0026ldquo;幸福(的生活)\u0026rdquo; 太虚幻, 说 \u0026ldquo;满足\u0026rdquo; 比较实际 满足某些欲望并不能真的让人满足 为了生活得满足, 我需要更有竞争力, 更有效率; 所以 重点是生活 重点 生活包括兴趣(工作), 收入(工作), 家庭 兴趣(工作)使生活有成就感? 家庭也能使生活有成就感, 但我还是不愿意放弃兴趣(工作)的成就感 收入(工作)让生活更有质量 家庭是生活的保障 权衡 兴趣需要投入时间 收入的多少虽然不直接与时间发生关系, 但间接需要投入时间去争取(比如加班) 家庭建设需要投入时间, 可能还需要人脉 人脉需要时间, 也需要金钱? 目前金钱不是关键问题, 如果真的是关键, 也拿不出来\u0026hellip; 持续性是生活中潜在的重要因素, 也是人的基本需求(安全感) -\u0026gt; 当前战略的主要问题是如何分配时间 分配资源 兴趣: 4hr 收入: 4hr, 包括理财 学习是支撑兴趣和收入的基础 家庭: 1~1.5hr 人脉: 0.5~1hr 身体是一切的基础: 1hr 关于家庭 好钱和坏钱 在事业刚起步阶段, 你或许还不知道公司策略是否能够成功, 你必须耐心等候公司成长, 同时把目光放在获利上面; 如此一来, 就要用最少的资金找到一个可行的策略, 不至于花了很多钱才知道走错了路; 如果投入资金之后, 急于看到成长而非获利, 则是 \u0026ldquo;坏钱\u0026rdquo; 在所有成功的企业当中, 有93%都必须改变最初的策略; 也就是说一定会有拐点, 所以需要提前准备; 准备的方式则是投入 \u0026ldquo;好钱\u0026rdquo; 家庭生活会有类似的问题, 同样需要提前准备, 投入\u0026quot;好钱\u0026quot;; 常见的问题是对孩子的教育 奶昔是被雇佣来做什么的 学校是被雇佣来做什么的: 获得成功的感觉, 每天都会有朋友 你是被雇佣来做什么的 -\u0026gt; 不要将未来外包出去 家庭文化 家庭文化是父母与孩子共同价值取向的保证 文化, 是人们朝着一个共同的目标一起工作的方式, 这种方式一直以来被大家所沿用并且一直行之有效, 以至于人们根本不会想到要以另一种方式去做事 特定文化一经形成, 人们就会自动地区做要取得成功需要做的事 问题出现时, 要做的不仅仅是解决问题本身, 还要在解决问题的过程中明确什么事重要的, 在这个过程中形成了对价值取向的理解, 并学会如何去实践这一价值取向 -\u0026gt; 文化是在 处理问题的过程和做选择时的价值取向被一个组织不断重复使用, 且被证明有效 的基础上形成的 一个组织的文化是否健康, 需要看该组织的成员需要选择如何去做一件事情时, 他们的选择是不是组织的文化所要求的? 收到的效果是否也符合组织文化的要求? 我的父母没为我做的事 孩子们在成长过程中很少有机会负担重要的责任, 也很少有机会能为自己或他人解决复杂的问题 \u0026ldquo;我不害怕面对这个问题, 我相信自己能解决它\u0026rdquo;, 这样的自信不是来自丰富的资源, 而是来自完成某件困难且重要的事情 我们将孩子保护起来, 让他们远离生活中出现的各种问题, 但是却无意中阻止了孩子掌握成功所需的 \u0026ldquo;应用流程\u0026rdquo; 和 \u0026ldquo;价值取向\u0026rdquo; 孩子们在自己准备好学习时才能学到东西, 而不是在我们准备好教导他们的时候 孩子在各种 \u0026ldquo;经验学校\u0026rdquo; 中学到了什么, 是比奖励或奖品更能保证他们在外面世界的冒险中取得成功的关键 其它 第一代必须要辛苦一些, 不过 \u0026ldquo;要与人交流\u0026rdquo; 这件事情应该与是否第一代无关 第一代只是资源匮乏一些, 应用流程与价值取向方面还是一样的, 都要靠实践 总结 资源•应用流程•价值取向 -\u0026gt; 目标 是确立目标的过程 重点•根据机遇权衡计划•分配资源 -\u0026gt; 战略 是实现目标的过程 价值取向和重点决定了方向, 应用流程和权衡决定了成败, 资源分配是杠杆 ","permalink":"http://life.urakalee.me/posts/2013-12-07-measure-your-life/","summary":"\u003ch2 id=\"概述\"\u003e概述\u003c/h2\u003e\n\u003cp\u003e这本书并没有告诉我们应该确立什么样的人生目标, 但书中的观点可以帮助我们衡量目标的可行性, 并关注实现目标的过程中可能发生的问题\u003c/p\u003e\n\u003ch2 id=\"目标-资源应用流程价值取向\"\u003e目标: 资源•应用流程•价值取向\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e资源是 Ta 所利用的东西\u003c/li\u003e\n\u003cli\u003e应用流程是 Ta 做事的方法\u003c/li\u003e\n\u003cli\u003e价值取向是 Ta 做某件事的动机\u003c/li\u003e\n\u003cli\u003e-\u0026gt; \u003cem\u003e\u003cstrong\u003e用于评估什么样的目标可以实现, 什么样的目标遥不可及\u003c/strong\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"衡量目标的可行性\"\u003e衡量目标的可行性:\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e资源是否足够, 如果不够, 可能需要一个更短期的目标来增加资源\u003c/li\u003e\n\u003cli\u003e实现目标的方法已经有了吗? 可能没有, 那么需要 \u0026ldquo;根据机遇权衡计划\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e目标是否符合你的价值取向, 如果不符合, 那么可能需要放弃这个目标\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch3 id=\"每天都会面临的基本挑战\"\u003e每天都会面临的基本挑战:\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e接受哪些信息\u003c/li\u003e\n\u003cli\u003e采纳哪些建议\u003c/li\u003e\n\u003cli\u003e忽视哪些问题\u003c/li\u003e\n\u003cli\u003e去做哪些事情\u003c/li\u003e\n\u003cli\u003e-\u0026gt; 这些挑战归结为: \u003cem\u003e\u003cstrong\u003e如何选择\u003c/strong\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"目标---选择\"\u003e目标 - 选择\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e所谓目标, 虽然分长期和短期, 却依然很难直接指导具体的选择\u003c/li\u003e\n\u003cli\u003e相反, 选择的过程往往体现了 \u0026ldquo;资源•应用流程•价值取向\u0026rdquo; 这三要素\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"实现目标过程中可能会发生的问题\"\u003e实现目标过程中可能会发生的问题:\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e重点不明确, 要关注你的价值取向中最重要的那部分\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;根据机遇权衡计划\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e既然是重点, 就要分配资源\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"战略-重点根据机遇权衡计划分配资源\"\u003e战略: 重点•根据机遇权衡计划•分配资源\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e战略, 是指为实现某种目标而制定的大规模, 全方位的长期行动计划\u003c/li\u003e\n\u003cli\u003e战略是长期的事情, 短期的事情不能通过战略搞定, 但应符合战略需要\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"重点\"\u003e重点\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e重点是你做决策时的核心标准\u003c/li\u003e\n\u003cli\u003e薪水是一个基础因素, 不是动力因素\u003c/li\u003e\n\u003cli\u003e工作满意和没有不满是两回事\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"权衡\"\u003e权衡\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026ldquo;哪些假设条件需要得到验证, 才能说明这个战略有效\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e根据机遇权衡计划的重点是小成本尝试和拥抱变化, 是一个情况多样, 难以控制的连续过程, 很可能不是一开始就想到的\u003c/li\u003e\n\u003cli\u003e没有哪个方法一经提出就更好或更糟, 而是要根据你走到哪个阶段来确定\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"分配资源\"\u003e分配资源\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e任何一个战略 - 不论是企业战略还是个人生活战略 - 都是从数百次日常决定中产生的, 它是关于如何安排时间(人)和金钱(物)的决定\u003c/li\u003e\n\u003cli\u003e生活中的每一个有关如何分配时间盒金钱的决定, 都表明了你真正在乎的是什么\u003c/li\u003e\n\u003cli\u003e你可以尽情地谈论自己的生活, 谈论有什么清晰的目标和战略, 但是如果你投入的资源和你的战略方向不一致, 这些谈论都毫无意义\n如果最终不能有效实施, 你的战略只能是一个良好的愿望\u003c/li\u003e\n\u003cli\u003e-\u0026gt; \u003cem\u003e\u003cstrong\u003e如果家庭是重点, 就要家庭建设上分配资源\u003c/strong\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"我的目标\"\u003e我的目标\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e我的目标是帮助家人(包括自己)过上满足的生活\n\u003cul\u003e\n\u003cli\u003e谈 \u0026ldquo;幸福(的生活)\u0026rdquo; 太虚幻, 说 \u0026ldquo;满足\u0026rdquo; 比较实际\u003c/li\u003e\n\u003cli\u003e满足某些欲望并不能真的让人满足\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e为了生活得满足, 我需要更有竞争力, 更有效率; 所以 \u003cem\u003e\u003cstrong\u003e重点是生活\u003c/strong\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"重点-1\"\u003e重点\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e生活包括兴趣(工作), 收入(工作), 家庭\u003c/li\u003e\n\u003cli\u003e兴趣(工作)使生活有成就感? 家庭也能使生活有成就感, 但我还是不愿意放弃兴趣(工作)的成就感\u003c/li\u003e\n\u003cli\u003e收入(工作)让生活更有质量\u003c/li\u003e\n\u003cli\u003e家庭是生活的保障\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"权衡-1\"\u003e权衡\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e兴趣需要投入时间\u003c/li\u003e\n\u003cli\u003e收入的多少虽然不直接与时间发生关系, 但间接需要投入时间去争取(比如加班)\u003c/li\u003e\n\u003cli\u003e家庭建设需要投入时间, 可能还需要人脉\u003c/li\u003e\n\u003cli\u003e人脉需要时间, 也需要金钱? 目前金钱不是关键问题, 如果真的是关键, 也拿不出来\u0026hellip;\u003c/li\u003e\n\u003cli\u003e持续性是生活中潜在的重要因素, 也是人的基本需求(安全感)\u003c/li\u003e\n\u003cli\u003e-\u0026gt; \u003cem\u003e\u003cstrong\u003e当前战略的主要问题是如何分配时间\u003c/strong\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"分配资源-1\"\u003e分配资源\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e兴趣: 4hr\u003c/li\u003e\n\u003cli\u003e收入: 4hr, 包括理财\u003c/li\u003e\n\u003cli\u003e学习是支撑兴趣和收入的基础\u003c/li\u003e\n\u003cli\u003e家庭: 1~1.5hr\u003c/li\u003e\n\u003cli\u003e人脉: 0.5~1hr\u003c/li\u003e\n\u003cli\u003e身体是一切的基础: 1hr\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"关于家庭\"\u003e关于家庭\u003c/h2\u003e\n\u003ch3 id=\"好钱和坏钱\"\u003e好钱和坏钱\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e在事业刚起步阶段, 你或许还不知道公司策略是否能够成功, 你必须耐心等候公司成长, 同时把目光放在获利上面; 如此一来, 就要用最少的资金找到一个可行的策略, 不至于花了很多钱才知道走错了路; 如果投入资金之后, 急于看到成长而非获利, 则是 \u0026ldquo;坏钱\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e在所有成功的企业当中, 有93%都必须改变最初的策略; 也就是说一定会有拐点, 所以需要提前准备; 准备的方式则是投入 \u0026ldquo;好钱\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e家庭生活会有类似的问题, 同样需要提前准备, 投入\u0026quot;好钱\u0026quot;; 常见的问题是对孩子的教育\n\u003cul\u003e\n\u003cli\u003e奶昔是被雇佣来做什么的\u003c/li\u003e\n\u003cli\u003e学校是被雇佣来做什么的: 获得成功的感觉, 每天都会有朋友\u003c/li\u003e\n\u003cli\u003e你是被雇佣来做什么的\u003c/li\u003e\n\u003cli\u003e-\u0026gt; \u003cem\u003e\u003cstrong\u003e不要将未来外包出去\u003c/strong\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"家庭文化\"\u003e家庭文化\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e家庭文化是父母与孩子共同价值取向的保证\u003c/li\u003e\n\u003cli\u003e文化, 是人们朝着一个共同的目标一起工作的方式, 这种方式一直以来被大家所沿用并且一直行之有效, 以至于人们根本不会想到要以另一种方式去做事\u003c/li\u003e\n\u003cli\u003e特定文化一经形成, 人们就会自动地区做要取得成功需要做的事\n问题出现时, 要做的不仅仅是解决问题本身, 还要在解决问题的过程中明确什么事重要的, 在这个过程中形成了对价值取向的理解, 并学会如何去实践这一价值取向\u003c/li\u003e\n\u003cli\u003e-\u0026gt; 文化是在 \u003cem\u003e\u003cstrong\u003e处理问题的过程和做选择时的价值取向被一个组织不断重复使用, 且被证明有效\u003c/strong\u003e\u003c/em\u003e 的基础上形成的\u003c/li\u003e\n\u003cli\u003e一个组织的文化是否健康, 需要看该组织的成员需要选择如何去做一件事情时, 他们的选择是不是组织的文化所要求的? 收到的效果是否也符合组织文化的要求?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"我的父母没为我做的事\"\u003e我的父母没为我做的事\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e孩子们在成长过程中很少有机会负担重要的责任, 也很少有机会能为自己或他人解决复杂的问题\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;我不害怕面对这个问题, 我相信自己能解决它\u0026rdquo;, 这样的自信不是来自丰富的资源, 而是来自完成某件困难且重要的事情\u003c/li\u003e\n\u003cli\u003e我们将孩子保护起来, 让他们远离生活中出现的各种问题, 但是却无意中阻止了孩子掌握成功所需的 \u0026ldquo;应用流程\u0026rdquo; 和 \u0026ldquo;价值取向\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e孩子们在自己准备好学习时才能学到东西, 而不是在我们准备好教导他们的时候\u003c/li\u003e\n\u003cli\u003e孩子在各种 \u0026ldquo;经验学校\u0026rdquo; 中学到了什么, 是比奖励或奖品更能保证他们在外面世界的冒险中取得成功的关键\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"其它\"\u003e其它\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e第一代必须要辛苦一些, 不过 \u0026ldquo;要与人交流\u0026rdquo; 这件事情应该与是否第一代无关\u003c/li\u003e\n\u003cli\u003e第一代只是资源匮乏一些, 应用流程与价值取向方面还是一样的, 都要靠实践\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e资源•应用流程•价值取向 -\u0026gt; 目标 是确立目标的过程\u003c/li\u003e\n\u003cli\u003e重点•根据机遇权衡计划•分配资源 -\u0026gt; 战略 是实现目标的过程\u003c/li\u003e\n\u003cli\u003e价值取向和重点决定了方向, 应用流程和权衡决定了成败, 资源分配是杠杆\u003c/li\u003e\n\u003c/ul\u003e","title":"你要如何衡量你的人生"},{"content":"代码风格 代码是给人看的, 偶尔也在机器上跑一跑 代码应该越写越少: Write Less Do More 所有源代码文件(包括 html/css/properties/readme 等)均为 utf-8 无 bom 格式, unix 换行 禁用tab, 所有源代码文件一律使用 4 空格缩进 Java Java Code Conventions Java编码规范(中文版) 内部规范 第三部分 每行不超过 120 字符, 一个文件不超过 600 行 愿意遵循每行不超过 72 或 80 字符的也可以, 但不超过 120 是必须的 第四部分 再次强调每行不超过 120 字符, 一个文件不超过 600 行 换行是检验代码可读性的重要标准 第六部分 一行声明一个变量 第七部分 语句块即使只有一行也要有括号 尤其是 if 语句! 第九部分 类名为首字母大写格式 包名均为小写, 视觉上应为一个倒置的域名, 比如 com.domain.codename 常量为全大写, 下划线分隔 第十部分 善用 TODO, XXX, FIXME 其它 避免 magic number 禁用 System.out.print, 使用 logger 如果可能, 避免使用 ++, 无论是前 ++ 还是后 ++, 而是用 += 1来替代 文件结构: 将功能和方法分为命令和查询两类, 并将两者分别放在一起 也可以分成更多类, 比如 override/implement/public/private/getter/setter 等 定义 code template 是个好办法, 但关键还是在于所有人都能坚持遵循 包结构: 包内文件不超过 10 个, 接口的实现要放在对应的 impl 目录下 Singleton (helper): 需要初始化 静态函数集合 (utils): 不需要初始化, 或者有瞬间又无异常的static初始化 防御 警告就是错误! 报告所有的异常, 传播不能处理的异常, 禁止空 catch, 即使是临时这样做也不行! 在异常发生之前使用断言, 可以避免更严重的问题(比如数据不一致) 测试 单元测试就是最可信的文档 刚刚开始 TDD 时要用最简单的方式编写 TestCase, 而不是不断引入新的类, 否则你会强迫自己保留和使用它们 像重构代码一样重构测试 测试用例以 Test 开头, 测试一个类用 TestClassName, 测试一个包用 TestPackageName (为了遵循类命名规范, 包名需要首字母大写) 调试 善用 debug 模式, 而不是 log, 更不是 print 但是, 在运行着的系统中 log 还是很有用的, 所以 log 中要展示有用的信息 实验用例以 Run 开头, 后面同测试用例, 通常每个实验用例都只有一个 main 函数, 主要用来做实验 Html/Css/Javascipt html 的 id 为驼峰格式, 形如 abcXyz html 的 class 为全小写, 形如 abc-xyz ","permalink":"http://life.urakalee.me/posts/2013-12-07-code-style/","summary":"\u003ch2 id=\"代码风格\"\u003e代码风格\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e代码是给人看的, 偶尔也在机器上跑一跑\u003c/li\u003e\n\u003cli\u003e代码应该越写越少: \u003cem\u003e\u003cstrong\u003eWrite Less Do More\u003c/strong\u003e\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e所有源代码文件(包括 html/css/properties/readme 等)均为 utf-8 无 bom 格式, unix 换行\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e\u003cstrong\u003e禁用tab\u003c/strong\u003e\u003c/em\u003e, 所有源代码文件一律使用 4 空格缩进\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"java\"\u003eJava\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.oracle.com/technetwork/java/codeconv-138413.html\" title=\"Java 编码规范\"\u003eJava Code Conventions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://doc.javanb.com/code-conventions-for-the-java-programming-language-zh/\" title=\"Java 编码规范(中文版)\"\u003eJava编码规范(中文版)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch3 id=\"内部规范\"\u003e内部规范\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e第三部分\n\u003cul\u003e\n\u003cli\u003e每行不超过 120 字符, 一个文件不超过 600 行\u003c/li\u003e\n\u003cli\u003e愿意遵循每行不超过 72 或 80 字符的也可以, 但不超过 120 是必须的\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e第四部分\n\u003cul\u003e\n\u003cli\u003e再次强调每行不超过 120 字符, 一个文件不超过 600 行\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e\u003cstrong\u003e换行是检验代码可读性的重要标准\u003c/strong\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e第六部分\n\u003cul\u003e\n\u003cli\u003e一行声明一个变量\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e第七部分\n\u003cul\u003e\n\u003cli\u003e语句块即使只有一行也要有括号\u003c/li\u003e\n\u003cli\u003e尤其是 if 语句!\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e第九部分\n\u003cul\u003e\n\u003cli\u003e类名为首字母大写格式\u003c/li\u003e\n\u003cli\u003e包名均为小写, 视觉上应为一个倒置的域名, 比如 \u003ccode\u003ecom.domain.codename\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e常量为全大写, 下划线分隔\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e第十部分\n\u003cul\u003e\n\u003cli\u003e善用 TODO, XXX, FIXME\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e其它\n\u003cul\u003e\n\u003cli\u003e避免 magic number\u003c/li\u003e\n\u003cli\u003e禁用 \u003ccode\u003eSystem.out.print\u003c/code\u003e, 使用 logger\u003c/li\u003e\n\u003cli\u003e如果可能, 避免使用 \u003ccode\u003e++\u003c/code\u003e, 无论是前 \u003ccode\u003e++\u003c/code\u003e 还是后 \u003ccode\u003e++\u003c/code\u003e, 而是用 \u003ccode\u003e+= 1\u003c/code\u003e来替代\u003c/li\u003e\n\u003cli\u003e文件结构: 将功能和方法分为命令和查询两类, 并将两者分别放在一起\n\u003cul\u003e\n\u003cli\u003e也可以分成更多类, 比如 override/implement/public/private/getter/setter 等\u003c/li\u003e\n\u003cli\u003e定义 code template 是个好办法, 但关键还是在于所有人都能坚持遵循\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e包结构: 包内文件不超过 10 个, 接口的实现要放在对应的 impl 目录下\u003c/li\u003e\n\u003cli\u003eSingleton (helper): 需要初始化\u003c/li\u003e\n\u003cli\u003e静态函数集合 (utils): 不需要初始化, 或者有瞬间又无异常的static初始化\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"防御\"\u003e防御\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e警告就是错误!\u003c/li\u003e\n\u003cli\u003e报告所有的异常, 传播不能处理的异常, 禁止空 catch, 即使是临时这样做也不行!\u003c/li\u003e\n\u003cli\u003e在异常发生之前使用断言, 可以避免更严重的问题(比如数据不一致)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"测试\"\u003e测试\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e单元测试就是最可信的文档\u003c/li\u003e\n\u003cli\u003e刚刚开始 TDD 时要用最简单的方式编写 TestCase, 而不是不断引入新的类, 否则你会强迫自己保留和使用它们\u003c/li\u003e\n\u003cli\u003e像重构代码一样重构测试\u003c/li\u003e\n\u003cli\u003e测试用例以 Test 开头, 测试一个类用 TestClassName, 测试一个包用 TestPackageName (为了遵循类命名规范, 包名需要首字母大写)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"调试\"\u003e调试\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e善用 debug 模式, 而不是 log, 更不是 print\u003c/li\u003e\n\u003cli\u003e但是, 在运行着的系统中 log 还是很有用的, 所以 log 中要展示有用的信息\u003c/li\u003e\n\u003cli\u003e实验用例以 Run 开头, 后面同测试用例, 通常每个实验用例都只有一个 main 函数, 主要用来做实验\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"htmlcssjavascipt\"\u003eHtml/Css/Javascipt\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ehtml 的 id 为驼峰格式, 形如 abcXyz\u003c/li\u003e\n\u003cli\u003ehtml 的 class 为全小写, 形如 abc-xyz\u003c/li\u003e\n\u003c/ul\u003e","title":"Code Style"},{"content":"什么是 wiki wiki 是一种网络应用 遵照一定的格式, 使用纯文本书写, 输出 html 文档 方便的内链接, 在多个内部页面之间跳转 多人编辑, 支持版本历史 如何创建一个 wiki 页面 访问一个不存在的 url, 建立一个新的页面 比如 /APageDoesNotExist 页面的名字必须是 首字母大写 的, 首字母大写的名字可以被 wiki 识别为内链接 点击 \u0026ldquo;创建页面\u0026rdquo;, 编辑 书写语法见 /WikiFormatting 编辑完点击 \u0026ldquo;预览\u0026rdquo;, 查看输出的 html 是否符合预期 如果没问题, 点击 \u0026ldquo;提交改动\u0026rdquo;, 即生成一个新的 wiki 页面 添加附件 wiki 允许增加附件 打开一个存在的 wiki 页面, 点击页面底部的 \u0026ldquo;附件\u0026rdquo; 选择文件并上传 如果可能, 尽量书写一份 wiki 文档而不是上传一个 word 文档作为 wiki 的附件 规划 wiki 文档的层次结构 wiki 中使用 = 到 ====== 代表 h1 到 h6 标签, 标识文档的层次结构 书写 wiki 文档时, 需要合理地规划层次结构, 增加文档的可读性 需要合理地使用表格, 列表等 html 元素, 增加文档的可读性 更多格式语法见 /WikiFormatting 当一个文档过长时, 可以考虑切分成几个文档, 或者当成一个项目 如何创建一个项目的 wiki 页面 一个项目通常有很多内容, 需要创建多个页面 先创建项目首页, 比如 /NewProject 再创建子页面, 比如: 设计文档: /NewProject/Design 如何部署: /NewProject/Deploy 每个子页面可以根据需要再创建子页面 编辑项目页面, 在底部加入下面的代码, 即可在项目页面上看到所有子页面: == 文章列表 == [[TitleIndex(NewProject)]] ","permalink":"http://life.urakalee.me/posts/2013-12-07-how-to-wiki/","summary":"\u003ch2 id=\"什么是-wiki\"\u003e什么是 wiki\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ewiki 是一种网络应用\u003c/li\u003e\n\u003cli\u003e遵照一定的格式, 使用纯文本书写, 输出 html 文档\u003c/li\u003e\n\u003cli\u003e方便的内链接, 在多个内部页面之间跳转\u003c/li\u003e\n\u003cli\u003e多人编辑, 支持版本历史\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"如何创建一个-wiki-页面\"\u003e如何创建一个 wiki 页面\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e访问一个不存在的 url, 建立一个新的页面\n\u003cul\u003e\n\u003cli\u003e比如 \u003ccode\u003e/APageDoesNotExist\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e页面的名字必须是 \u003cstrong\u003e首字母大写\u003c/strong\u003e 的, 首字母大写的名字可以被 wiki 识别为内链接\u003c/li\u003e\n\u003cli\u003e点击 \u0026ldquo;创建页面\u0026rdquo;, 编辑\u003c/li\u003e\n\u003cli\u003e书写语法见 \u003ccode\u003e/WikiFormatting\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e编辑完点击 \u0026ldquo;预览\u0026rdquo;, 查看输出的 html 是否符合预期\u003c/li\u003e\n\u003cli\u003e如果没问题, 点击 \u0026ldquo;提交改动\u0026rdquo;, 即生成一个新的 wiki 页面\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"添加附件\"\u003e添加附件\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ewiki 允许增加附件\u003c/li\u003e\n\u003cli\u003e打开一个存在的 wiki 页面, 点击页面底部的 \u0026ldquo;附件\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e选择文件并上传\u003c/li\u003e\n\u003cli\u003e如果可能, 尽量书写一份 wiki 文档而不是上传一个 word 文档作为 wiki 的附件\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"规划-wiki-文档的层次结构\"\u003e规划 wiki 文档的层次结构\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ewiki 中使用 \u003ccode\u003e=\u003c/code\u003e 到 \u003ccode\u003e======\u003c/code\u003e 代表 h1 到 h6 标签, 标识文档的层次结构\u003c/li\u003e\n\u003cli\u003e书写 wiki 文档时, 需要合理地规划层次结构, 增加文档的可读性\u003c/li\u003e\n\u003cli\u003e需要合理地使用表格, 列表等 html 元素, 增加文档的可读性\u003c/li\u003e\n\u003cli\u003e更多格式语法见 \u003ccode\u003e/WikiFormatting\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e当一个文档过长时, 可以考虑切分成几个文档, 或者当成一个项目\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"如何创建一个项目的-wiki-页面\"\u003e如何创建一个项目的 wiki 页面\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e一个项目通常有很多内容, 需要创建多个页面\u003c/li\u003e\n\u003cli\u003e先创建项目首页, 比如 \u003ccode\u003e/NewProject\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e再创建子页面, 比如:\n\u003cul\u003e\n\u003cli\u003e设计文档: \u003ccode\u003e/NewProject/Design\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e如何部署: \u003ccode\u003e/NewProject/Deploy\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e每个子页面可以根据需要再创建子页面\u003c/li\u003e\n\u003cli\u003e编辑项目页面, 在底部加入下面的代码, 即可在项目页面上看到所有子页面:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode\u003e== 文章列表 ==\n[[TitleIndex(NewProject)]]\n\u003c/code\u003e\u003c/pre\u003e","title":"How to Wiki"},{"content":"工作模式(暂行) 4 天计划, 前紧后松 CoC, 主动 \u0026amp; 高效, 跨职能 的 技术团队 执行 敏捷开发 和 文档驱动 每日站会, 详见 45个习惯 第 8 章 代码集体所有制, 详见 45个习惯 第 8 章 CoC: Convention over Configuration 习惯优于配置 达成目标的方式有很多种, 可以灵活配置, 但遵从习惯可以降低沟通成本 版本控制: Git Java 包管理和部署: Maven 文档管理: wiki (Trac) 项目管理: Trello 习惯可以改, 只要好处 \u0026raquo; 成本 主动\u0026amp;高效 主动提问, 站会匆匆而过, 没听明白的一定要问 主动沟通, 有问题超过 1h 搞不定, 就应该想想能找谁帮忙解决 主动通知, 邮件是广播 \u0026amp; 存档, 不能指望每个人都会看邮件, 但至少让 Ta 有地方去看 4 天做完 1 周的事, 剩下一天提高团队战斗力, 或者爱干嘛干嘛 一图抵万言, 确保大家说的 A 是同一个 A, 理解的 B 是同一个 B 跨职能 为了大家都能做一些爱做的事, 需要大家都做一些不爱做的事 每项工作都需要有至少 2 个人了解, 避免某件事情由于某个人不在就搞不定 技术团队 关注解决方案, 尽可能的解决问题 让 \u0026ldquo;这个很难\u0026rdquo;, \u0026ldquo;这个搞不定\u0026rdquo; 越来越少 领取 个人项目, 作为 bonus 借鉴 Scrum 敏捷开发框架 每周一个 Sprint, 按照大版本规划 Sprint 持续交付, 每个 Sprint 产出的结果对于最终用户都是有用的 每个 Sprint 需要分拆成最小 0.5D, 最大 2D 的任务 每天 10 ~ 20 分钟同步进度, 解决问题 使用 Trello 进行项目管理 文档驱动 任何 三个月后还有用的东西 都需要文档 文档需要回答的问题: 如果我完全不了解这个项目, 我想知道什么 怎么用: 如何部署/运行, 提供什么接口 怎么开发: 代码结构/核心算法/核心模块和逻辑(数据流图) ","permalink":"http://life.urakalee.me/posts/2013-12-07-work-style/","summary":"\u003ch2 id=\"工作模式暂行\"\u003e工作模式(暂行)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e4 天计划, 前紧后松\u003c/li\u003e\n\u003cli\u003eCoC, 主动 \u0026amp; 高效, 跨职能 的 技术团队\u003c/li\u003e\n\u003cli\u003e执行 \u003cstrong\u003e敏捷开发\u003c/strong\u003e 和 \u003cstrong\u003e文档驱动\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e每日站会, 详见 \u003cstrong\u003e45个习惯\u003c/strong\u003e 第 8 章\u003c/li\u003e\n\u003cli\u003e代码集体所有制, 详见 \u003cstrong\u003e45个习惯\u003c/strong\u003e 第 8 章\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"coc-convention-over-configuration\"\u003eCoC: Convention over Configuration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e习惯优于配置\u003c/li\u003e\n\u003cli\u003e达成目标的方式有很多种, 可以灵活配置, 但遵从习惯可以降低沟通成本\n\u003cul\u003e\n\u003cli\u003e版本控制: Git\u003c/li\u003e\n\u003cli\u003eJava 包管理和部署: Maven\u003c/li\u003e\n\u003cli\u003e文档管理: wiki (Trac)\u003c/li\u003e\n\u003cli\u003e项目管理: Trello\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e习惯可以改, 只要好处 \u0026raquo; 成本\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"主动高效\"\u003e主动\u0026amp;高效\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e主动提问, 站会匆匆而过, 没听明白的一定要问\u003c/li\u003e\n\u003cli\u003e主动沟通, 有问题超过 1h 搞不定, 就应该想想能找谁帮忙解决\u003c/li\u003e\n\u003cli\u003e主动通知, 邮件是广播 \u0026amp; 存档, 不能指望每个人都会看邮件, 但至少让 Ta 有地方去看\u003c/li\u003e\n\u003cli\u003e4 天做完 1 周的事, 剩下一天提高团队战斗力, 或者爱干嘛干嘛\u003c/li\u003e\n\u003cli\u003e一图抵万言, 确保大家说的 A 是同一个 A, 理解的 B 是同一个 B\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"跨职能\"\u003e跨职能\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e为了大家都能做一些爱做的事, 需要大家都做一些不爱做的事\u003c/li\u003e\n\u003cli\u003e每项工作都需要有至少 2 个人了解, 避免某件事情由于某个人不在就搞不定\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"技术团队\"\u003e技术团队\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e关注解决方案, 尽可能的解决问题\u003c/li\u003e\n\u003cli\u003e让 \u0026ldquo;这个很难\u0026rdquo;, \u0026ldquo;这个搞不定\u0026rdquo; 越来越少\u003c/li\u003e\n\u003cli\u003e领取 \u003cstrong\u003e个人项目\u003c/strong\u003e, 作为 bonus\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"借鉴-scrum-敏捷开发框架\"\u003e借鉴 Scrum 敏捷开发框架\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e每周一个 Sprint, 按照大版本规划 Sprint\u003c/li\u003e\n\u003cli\u003e持续交付, 每个 Sprint 产出的结果对于最终用户都是有用的\u003c/li\u003e\n\u003cli\u003e每个 Sprint 需要分拆成最小 0.5D, 最大 2D 的任务\u003c/li\u003e\n\u003cli\u003e每天 10 ~ 20 分钟同步进度, 解决问题\u003c/li\u003e\n\u003cli\u003e使用 Trello 进行项目管理\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"文档驱动\"\u003e文档驱动\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e任何 \u003cstrong\u003e三个月后还有用的东西\u003c/strong\u003e 都需要文档\u003c/li\u003e\n\u003cli\u003e文档需要回答的问题: 如果我完全不了解这个项目, 我想知道什么\n\u003cul\u003e\n\u003cli\u003e怎么用: 如何部署/运行, 提供什么接口\u003c/li\u003e\n\u003cli\u003e怎么开发: 代码结构/核心算法/核心模块和逻辑(数据流图)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"Work Style"},{"content":"Git 入门资料 windows 客户端: http://git-scm.com/download/win Pro Git 中文版(书, 可能被墙): http://git-scm.com/book/zh Pro Git 中文下载版(pdf): http://ishare.iask.sina.com.cn/f/23292123.html 图解 Git (推荐阅读): http://my.oschina.net/xdev/blog/114383 windows 下 Git 的配置和使用 以下命令都在 Git Bash 中运行 生成公钥/私钥 ssh-keygen -t rsa 生成的密钥对的位置在 C:\\Users\\\u0026lt;user-name\u0026gt;\\.ssh id_rsa 为私钥, id_rsa.pub 为公钥 配置 Git 的用户名和邮件 git config --global user.name \u0026lt;your-name\u0026gt; git config --global user.email \u0026lt;your-email\u0026gt; 进阶配置 编辑 \u0026lt;git-install-path\u0026gt;\\etc\\gitconfig 修改autocrlf = input, 确保提交的文本都是 utf8 编码 在文件末尾增加下面的代码, 使 Git GUI 能显示中文 [gui] encoding = utf-8 编辑 \u0026lt;git-install-path\u0026gt;\\etc\\git-completion.bash 在文件末尾增加下面的代码, 使 Git Bash 能显示中文 alias ls='ls --show-control-chars --color=auto' Git 使用规范 禁用中文文件名 所有文本文件使用 utf8 编码 所有文本文件使用 unix 换行 (\\n), 而非 windows 换行 (\\r\\n) Git 分枝管理 master: 稳定可编译/测试通过的代码 test: 测试环境的代码, 通过测试后merge到master pri-xxx: 个人开发代码 (private), 由于可能需要到部署到服务器上, 因此允许 push 到 remote dev: 开发环境的代码 在 pri-xxx 上开发的代码, 可能需要 merge 到开发环境上验证 验证通过后, 禁止 直接把 dev merge 到 test, 而是应该从 pri-xxx merge 到 test 由于 dev 代码在多人 merge 后可能出问题, 所以定期会从 master 重开 dev 分枝 Git 注释规范 所有注释, 除了 merge 时系统自动生成的, 均应符合以下规范 格式为 \u0026lt;OPERATION\u0026gt;: description OPERATION 包括 ADD/MOD/DEL/FIX/MERGE/REFACTOR/CLEAN, 全部大写, 后面跟着冒号 description 需要是全英文, 包括标点 一次提交可以有多个 OPERATION, 但最好只有一个 多个 OPERATION 一行一个 OPERATION 何时使用 description应该写什么 ADD 增加功能/文件 增加了什么功能/文件(文件太多可以写目录) MOD 修改功能/文件 修改了什么功能/文件, 以及修改原因 DEL 删除功能/文件 删除了什么功能/文件, 以及删除原因 FIX 修复 bug bug 列表中有的, 可以只写 bug 号, 没有的需要说明 MERGE 手动合并 从哪里合并到哪里 (from x to y), 如何解决了冲突 REFACTOR 重构 重构了什么 CLEAN 清理 清理了什么 ","permalink":"http://life.urakalee.me/posts/2013-12-04-how-to-git/","summary":"\u003ch2 id=\"git-入门资料\"\u003eGit 入门资料\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ewindows 客户端: \u003ca href=\"http://git-scm.com/download/win\"\u003ehttp://git-scm.com/download/win\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePro Git 中文版(书, 可能被墙): \u003ca href=\"http://git-scm.com/book/zh\"\u003ehttp://git-scm.com/book/zh\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePro Git 中文下载版(pdf): \u003ca href=\"http://ishare.iask.sina.com.cn/f/23292123.html\"\u003ehttp://ishare.iask.sina.com.cn/f/23292123.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e图解 Git (推荐阅读): \u003ca href=\"http://my.oschina.net/xdev/blog/114383\"\u003ehttp://my.oschina.net/xdev/blog/114383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"windows-下-git-的配置和使用\"\u003ewindows 下 Git 的配置和使用\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e以下命令都在 Git Bash 中运行\u003c/li\u003e\n\u003cli\u003e生成公钥/私钥\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003essh-keygen -t rsa\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e生成的密钥对的位置在 \u003ccode\u003eC:\\Users\\\u0026lt;user-name\u0026gt;\\.ssh\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eid_rsa 为私钥, id_rsa.pub 为公钥\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e配置 Git 的用户名和邮件\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global user.name \u0026lt;your-name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global user.email \u0026lt;your-email\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c!-- more --\u003e\n\u003ch3 id=\"进阶配置\"\u003e进阶配置\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e编辑 \u003ccode\u003e\u0026lt;git-install-path\u0026gt;\\etc\\gitconfig\u003c/code\u003e\n\u003col\u003e\n\u003cli\u003e修改autocrlf = input, 确保提交的文本都是 utf8 编码\u003c/li\u003e\n\u003cli\u003e在文件末尾增加下面的代码, 使 Git GUI 能显示中文\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode\u003e[gui]\n    encoding = utf-8\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003e编辑 \u003ccode\u003e\u0026lt;git-install-path\u0026gt;\\etc\\git-completion.bash\u003c/code\u003e\n\u003col\u003e\n\u003cli\u003e在文件末尾增加下面的代码, 使 Git Bash 能显示中文\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode\u003ealias ls='ls --show-control-chars --color=auto'\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"git-使用规范\"\u003eGit 使用规范\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e禁用中文文件名\u003c/li\u003e\n\u003cli\u003e所有文本文件使用 utf8 编码\u003c/li\u003e\n\u003cli\u003e所有文本文件使用 unix 换行 (\\n), 而非 windows 换行 (\\r\\n)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"git-分枝管理\"\u003eGit 分枝管理\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003emaster: 稳定可编译/测试通过的代码\u003c/li\u003e\n\u003cli\u003etest: 测试环境的代码, 通过测试后merge到master\u003c/li\u003e\n\u003cli\u003epri-xxx: 个人开发代码 (private), 由于可能需要到部署到服务器上, 因此允许 push 到 remote\u003c/li\u003e\n\u003cli\u003edev: 开发环境的代码\u003c/li\u003e\n\u003cli\u003e在 pri-xxx 上开发的代码, 可能需要 merge 到开发环境上验证\u003c/li\u003e\n\u003cli\u003e验证通过后, \u003cstrong\u003e禁止\u003c/strong\u003e 直接把 dev merge 到 test, 而是应该从 pri-xxx merge 到 test\u003c/li\u003e\n\u003cli\u003e由于 dev 代码在多人 merge 后可能出问题, 所以定期会从 master 重开 dev 分枝\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"git-注释规范\"\u003eGit 注释规范\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e所有注释, 除了 merge 时系统自动生成的, 均应符合以下规范\n\u003col\u003e\n\u003cli\u003e格式为 \u003ccode\u003e\u0026lt;OPERATION\u0026gt;: description\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eOPERATION 包括 ADD/MOD/DEL/FIX/MERGE/REFACTOR/CLEAN, 全部大写, 后面跟着冒号\u003c/li\u003e\n\u003cli\u003edescription 需要是全英文, 包括标点\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e一次提交可以有多个 OPERATION, 但最好只有一个\n\u003cul\u003e\n\u003cli\u003e多个 OPERATION 一行一个\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eOPERATION\u003c/th\u003e\n          \u003cth\u003e何时使用\u003c/th\u003e\n          \u003cth\u003edescription应该写什么\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eADD\u003c/td\u003e\n          \u003ctd\u003e增加功能/文件\u003c/td\u003e\n          \u003ctd\u003e增加了什么功能/文件(文件太多可以写目录)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMOD\u003c/td\u003e\n          \u003ctd\u003e修改功能/文件\u003c/td\u003e\n          \u003ctd\u003e修改了什么功能/文件, 以及修改原因\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eDEL\u003c/td\u003e\n          \u003ctd\u003e删除功能/文件\u003c/td\u003e\n          \u003ctd\u003e删除了什么功能/文件, 以及删除原因\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eFIX\u003c/td\u003e\n          \u003ctd\u003e修复 bug\u003c/td\u003e\n          \u003ctd\u003ebug 列表中有的, 可以只写 bug 号, 没有的需要说明\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMERGE\u003c/td\u003e\n          \u003ctd\u003e手动合并\u003c/td\u003e\n          \u003ctd\u003e从哪里合并到哪里 (from x to y), 如何解决了冲突\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eREFACTOR\u003c/td\u003e\n          \u003ctd\u003e重构\u003c/td\u003e\n          \u003ctd\u003e重构了什么\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eCLEAN\u003c/td\u003e\n          \u003ctd\u003e清理\u003c/td\u003e\n          \u003ctd\u003e清理了什么\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"How to Git"},{"content":"基本操作 创建版本库: git init 克隆版本库 git clone /path/to/repo git clone user@host:/path/to/repo 多版本库: git remote add \u0026lt;repo-name\u0026gt; \u0026lt;repo\u0026gt; 多版本库列表: git remote -v 更新版本库 git pull [repo-name] repo-name 默认为 origin git pull --rebase 可以避免无意义的 pull-merge, 使版本树尽可能是一条直线 git fetch [repo-name] - git pull does a git fetch followed by a git merge repo-name 默认为 origin 会把 repo-name 的更新都 fetch 到本地, 包括新分枝和新标签, 但不会建立本地分枝 提交到本地 stage: git add \u0026lt;file/dir\u0026gt; git commit -m \u0026quot;\u0026lt;comment\u0026gt;\u0026quot; 对于已经处于版本控制中的文件, 可以使用 git commit -am \u0026quot;\u0026lt;comment\u0026gt;\u0026quot; 略过 stage 有时需要构造空提交: git commit --allow-empty -m \u0026quot;EMPTY\u0026quot; 提交到远程 git push [repo-name] [branch] repo-name 默认为 origin, branch 默认为当前分枝 git push -u \u0026lt;repo-name\u0026gt; \u0026lt;branch\u0026gt; 设置 push/pull 时默认使用的 repo-name git push \u0026lt;repo-name\u0026gt; \u0026lt;branch\u0026gt;:\u0026lt;remote-branch\u0026gt; - 如果本地和远程分枝名字不同 反悔 revert stage: git reset HEAD \u0026lt;file\u0026gt; reset working: git checkout -- \u0026lt;file\u0026gt; restore(1+2): git checkout HEAD \u0026lt;file\u0026gt; checkout 上一个版本, 放在 stage/working 中: git checkout HEAD~ \u0026lt;file\u0026gt; 如果改动, add, 再改动, 使用 1. 不会恢复到第一次改动的结果; 使用 2. 才行! git reset \u0026lt;rev\u0026gt; [file] 没有 file 把 HEAD/branch 指向 rev 有 file 把 rev 版本的 file checkout 出来 如果 --hard, 那么 stage 和 working 都更新为 rev; 如果 --soft, 那么 stage 和 working 都不变(但 git status 会发现有文件 stage 了, 这是相对运动的结果); 如果 --mixed (默认), 那么只更新 stage (这时 git status 会发现 working 中有改动, 原因同上) rev 默认为 HEAD: 如果 --hard, 那么 stage 和 working 都更新为 HEAD (和 3. 效果一样); --soft 没意义; 如果 --mixed, 那么只更新 stage (就是 1. 咯~) 没有 file 时 --hard 类似于 checkout, 区别在于 reset \u0026lt;rev\u0026gt; 会移动 branch 指针, checkout \u0026lt;branch\u0026gt; 回不去, 而 checkout \u0026lt;rev\u0026gt; 再 checkout \u0026lt;branch\u0026gt; 可以回去 放弃所有本地改动(含本地提交): git reset --hard \u0026lt;repo-name\u0026gt;/\u0026lt;remote-branch\u0026gt; git checkout \u0026lt;rev\u0026gt; [file] 没有 file 会建立一个 detached HEAD (匿名分枝) - 最好别用! 有 file 把 rev 版本的 file checkout 出来 rev 默认为 -- 即 stage, 从 stage checkout 到 working 其它 rev 从 rev checkout 到 stage 再到 working git revert \u0026lt;rev\u0026gt;: 类似 svn 中的倒着 merge, 生成一个新版本 V+, 和 V-完全一样 - 仅用于 revert 一个很久以前的错误改动! 修改已经 push 到远程的提交 使用下面的方法修改已经 push 到远程的提交 git push \u0026lt;repo-name\u0026gt; +\u0026lt;branch\u0026gt;:\u0026lt;remote-branch\u0026gt; 修改上一个提交: git commit --amend 修改多个提交(交互式) git rebase -i \u0026lt;rev\u0026gt;, 编辑 rev 之后的提交, rev 默认为 repo-name/remote-branch 对于想合并到前一个的提交, 选择 fixup 对于想删除的提交, 直接删除对应的行 将上 N 个提交合并成一个 git reset --soft HEAD^(N-1) git commit --amend 分枝 建立分枝: git checkout -b \u0026lt;branch\u0026gt; 在当前 HEAD 上创建分枝并切换到新分枝 git checkout -b \u0026lt;branch\u0026gt; \u0026lt;repo-name\u0026gt;/\u0026lt;remote-branch\u0026gt; 跟踪远程分枝 切换分枝: git checkout \u0026lt;branch\u0026gt; 删除分枝: git branch -d \u0026lt;branch\u0026gt; 对于没有合并或提交到远程的分枝, 删除时会提示用 -D 强制删除 将分枝提交到远程(在远程建立新分枝): git push \u0026lt;repo-name\u0026gt; \u0026lt;branch\u0026gt; 提交到远程之后, 如果希望能够 pull 该分枝, 需要 git push -u 删除远程分枝: git push \u0026lt;repo-name\u0026gt; :\u0026lt;remote-branch\u0026gt; 删除已删除远程分枝的本地缓存: git remote prune origin 查看所有分枝: git branch -av git branch 不显示远程分枝 diff 分枝 diff: git diff \u0026lt;src-branch\u0026gt; \u0026lt;tgt-branch\u0026gt; (tgt 默认为当前分枝) 如果是和 master 比较, src-branch 应该是master 版本 diff: git diff \u0026lt;src-rev\u0026gt; \u0026lt;tgt-rev\u0026gt; (tgt 默认为当前版本) src-rev 应该是比 tgt-rev 更老的版本(祖先版本) git merge-base \u0026lt;src-branch\u0026gt; \u0026lt;tgt-branch\u0026gt; 可能可以得到你需要的 src-rev 其它 diff working 和 stage 的 diff: git diff stage 和 HEAD 的 diff: git diff --cached working 和 HEAD 的 diff: git diff HEAD 注意 上述 3 种方式都不会 diff 新文件(未处于版本控制中的文件) 合并 合并 branch 到当前分枝: git merge \u0026lt;branch\u0026gt; fetch 后用 git merge \u0026lt;repo-name\u0026gt;/\u0026lt;remote-branch\u0026gt; merge 如果 merge \u0026lt;branch\u0026gt;, 修改 branch, 再 merge, 只 merge 修改的部分 合并冲突时, 不 merge 而是指定某个版本: git checkout --ours/--theirs \u0026lt;file\u0026gt; \u0026ldquo;复制\u0026rdquo; 一次提交(比如某个分枝只有一次提交需要保留): git cherry-pick \u0026lt;rev\u0026gt; 停止 \u0026ldquo;复制\u0026rdquo;: git cherry-pick --abort 将当前分枝 rebase 到 tgt-branch: git rebase \u0026lt;tgt-branch\u0026gt; merge 与 rebase 的区别 merge 建立了一个新版本, 而 rebase 是分枝上有多少新版本, 就会建立多少新版本 rebase 后需要再做一次快速 merge, 才能使 tgt-branch 的指针正确(两者指针移动方式不同) 查看状态信息 git status git log git reflog: 查看 HEAD 指针的移动历史 git branch --merge: 查看哪些分枝已被合并到当前分枝 git branch --no-merged: 查看尚未合并的分枝 git remote show \u0026lt;repo-name\u0026gt;: 查看远程信息 暂存 git stash git stash pop git stash list git stash clear git stash apply stash@{x} git stash drop stash@{x} git stash branch \u0026lt;branch\u0026gt; 标签 git tag # 标签列表 git tag \u0026lt;tag\u0026gt; # 在当前版本上打标签 git show \u0026lt;tag\u0026gt; # 查看标签 git tag -d \u0026lt;tag\u0026gt; # 删除标签 git push \u0026lt;repo-name\u0026gt; \u0026lt;tag\u0026gt; # 提交标签 git push \u0026lt;repo-name\u0026gt; :\u0026lt;tag\u0026gt; # 删除远程标签 submodule @2015.04.13 git submodule add \u0026lt;remote-path\u0026gt; [\u0026lt;local-path\u0026gt;] # 添加 remote-path 为当前项目的 submodule git rm -r \u0026lt;local-path\u0026gt; # 如果有问题, 试试 git rm --cached \u0026lt;local-path\u0026gt; vim .gitmodules # 通常会在 git rm 时自动执行 git commit rm -rf .git/modules/\u0026lt;local-path\u0026gt; # 可能不必要 vim .git/config ","permalink":"http://life.urakalee.me/posts/2013-12-03-git-cheatsheet/","summary":"\u003ch2 id=\"基本操作\"\u003e基本操作\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e创建版本库: \u003ccode\u003egit init\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e克隆版本库\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egit clone /path/to/repo\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit clone user@host:/path/to/repo\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e多版本库: \u003ccode\u003egit remote add \u0026lt;repo-name\u0026gt; \u0026lt;repo\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e多版本库列表: \u003ccode\u003egit remote -v\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e更新版本库\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egit pull [repo-name]\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003erepo-name 默认为 origin\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit pull --rebase\u003c/code\u003e 可以避免无意义的 pull-merge, 使版本树尽可能是一条直线\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit fetch [repo-name]\u003c/code\u003e - \u003ccode\u003egit pull\u003c/code\u003e does a \u003ccode\u003egit fetch\u003c/code\u003e followed by a \u003ccode\u003egit merge\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003erepo-name 默认为 origin\u003c/li\u003e\n\u003cli\u003e会把 repo-name 的更新都 fetch 到本地, 包括新分枝和新标签, 但不会建立本地分枝\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e提交到本地\n\u003cul\u003e\n\u003cli\u003estage: \u003ccode\u003egit add \u0026lt;file/dir\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit commit -m \u0026quot;\u0026lt;comment\u0026gt;\u0026quot;\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e对于已经处于版本控制中的文件, 可以使用 \u003ccode\u003e git commit -am \u0026quot;\u0026lt;comment\u0026gt;\u0026quot;\u003c/code\u003e 略过 stage\u003c/li\u003e\n\u003cli\u003e有时需要构造空提交: \u003ccode\u003egit commit --allow-empty -m \u0026quot;EMPTY\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e提交到远程\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egit push [repo-name] [branch] \u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003erepo-name 默认为 origin, branch 默认为当前分枝\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit push -u \u0026lt;repo-name\u0026gt; \u0026lt;branch\u0026gt;\u003c/code\u003e 设置 push/pull 时默认使用的 repo-name\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit push \u0026lt;repo-name\u0026gt; \u0026lt;branch\u0026gt;:\u0026lt;remote-branch\u0026gt;\u003c/code\u003e - 如果本地和远程分枝名字不同\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"反悔\"\u003e反悔\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003erevert stage: \u003ccode\u003egit reset HEAD \u0026lt;file\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ereset working: \u003ccode\u003egit checkout -- \u0026lt;file\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003erestore(1+2): \u003ccode\u003egit checkout HEAD \u0026lt;file\u0026gt;\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003echeckout 上一个版本, 放在 stage/working 中: \u003ccode\u003egit checkout HEAD~ \u0026lt;file\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e如果改动, add, 再改动, 使用 \u003ccode\u003e1.\u003c/code\u003e 不会恢复到第一次改动的结果; 使用 \u003ccode\u003e2.\u003c/code\u003e 才行!\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit reset \u0026lt;rev\u0026gt; [file]\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e没有 file 把 HEAD/branch 指向 rev\u003c/li\u003e\n\u003cli\u003e有 file 把 rev 版本的 file checkout 出来\u003c/li\u003e\n\u003cli\u003e如果 \u003ccode\u003e--hard\u003c/code\u003e, 那么 stage 和 working 都更新为 rev; 如果 \u003ccode\u003e--soft\u003c/code\u003e, 那么 stage 和 working 都不变(但 \u003ccode\u003egit status\u003c/code\u003e 会发现有文件 stage 了, 这是相对运动的结果); 如果 \u003ccode\u003e--mixed\u003c/code\u003e (默认), 那么只更新 stage (这时 \u003ccode\u003egit status\u003c/code\u003e 会发现 working 中有改动, 原因同上)\u003c/li\u003e\n\u003cli\u003erev 默认为 HEAD: 如果 \u003ccode\u003e--hard\u003c/code\u003e, 那么 stage 和 working 都更新为 HEAD (和 \u003ccode\u003e3.\u003c/code\u003e 效果一样); \u003ccode\u003e--soft\u003c/code\u003e 没意义; 如果 \u003ccode\u003e--mixed\u003c/code\u003e, 那么只更新 stage (就是 \u003ccode\u003e1.\u003c/code\u003e 咯~)\u003c/li\u003e\n\u003cli\u003e没有 file 时 \u003ccode\u003e--hard\u003c/code\u003e 类似于 checkout, 区别在于 \u003ccode\u003ereset \u0026lt;rev\u0026gt;\u003c/code\u003e 会移动 branch 指针, \u003ccode\u003echeckout \u0026lt;branch\u0026gt;\u003c/code\u003e 回不去, 而 \u003ccode\u003echeckout \u0026lt;rev\u0026gt;\u003c/code\u003e 再 \u003ccode\u003echeckout \u0026lt;branch\u0026gt;\u003c/code\u003e 可以回去\u003c/li\u003e\n\u003cli\u003e放弃所有本地改动(含本地提交): \u003ccode\u003egit reset --hard \u0026lt;repo-name\u0026gt;/\u0026lt;remote-branch\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit checkout \u0026lt;rev\u0026gt; [file]\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e没有 file 会建立一个 detached HEAD (匿名分枝) - 最好别用!\u003c/li\u003e\n\u003cli\u003e有 file 把 rev 版本的 file checkout 出来\u003c/li\u003e\n\u003cli\u003erev 默认为 \u003ccode\u003e--\u003c/code\u003e 即 stage, 从 stage checkout 到 working\u003c/li\u003e\n\u003cli\u003e其它 rev 从 rev checkout 到 stage 再到 working\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit revert \u0026lt;rev\u0026gt;\u003c/code\u003e: 类似 svn 中的倒着 merge, 生成一个新版本 V+, 和 V-完全一样 - 仅用于 revert 一个很久以前的错误改动!\u003c/li\u003e\n\u003cli\u003e修改已经 push 到远程的提交\n\u003col\u003e\n\u003cli\u003e使用下面的方法修改已经 push 到远程的提交\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit push \u0026lt;repo-name\u0026gt; +\u0026lt;branch\u0026gt;:\u0026lt;remote-branch\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e修改上一个提交: \u003ccode\u003egit commit --amend\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e修改多个提交(交互式)\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003egit rebase -i \u0026lt;rev\u0026gt;\u003c/code\u003e, 编辑 rev 之后的提交, rev 默认为 repo-name/remote-branch\u003c/li\u003e\n\u003cli\u003e对于想合并到前一个的提交, 选择 fixup\u003c/li\u003e\n\u003cli\u003e对于想删除的提交, 直接删除对应的行\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e将上 N 个提交合并成一个\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit reset --soft HEAD^\u003cspan class=\"o\"\u003e(\u003c/span\u003eN-1\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit --amend\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"分枝\"\u003e分枝\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e建立分枝:\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egit checkout -b \u0026lt;branch\u0026gt;\u003c/code\u003e 在当前 HEAD 上创建分枝并切换到新分枝\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit checkout -b \u0026lt;branch\u0026gt; \u0026lt;repo-name\u0026gt;/\u0026lt;remote-branch\u0026gt;\u003c/code\u003e 跟踪远程分枝\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e切换分枝: \u003ccode\u003egit checkout \u0026lt;branch\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e删除分枝: \u003ccode\u003egit branch -d \u0026lt;branch\u0026gt;\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e对于没有合并或提交到远程的分枝, 删除时会提示用 \u003ccode\u003e-D\u003c/code\u003e 强制删除\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e将分枝提交到远程(在远程建立新分枝): \u003ccode\u003egit push \u0026lt;repo-name\u0026gt; \u0026lt;branch\u0026gt;\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e提交到远程之后, 如果希望能够 pull 该分枝, 需要 \u003ccode\u003egit push -u\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e删除远程分枝: \u003ccode\u003egit push \u0026lt;repo-name\u0026gt; :\u0026lt;remote-branch\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e删除已删除远程分枝的本地缓存: \u003ccode\u003egit remote prune origin\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e查看所有分枝: \u003ccode\u003egit branch -av\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egit branch\u003c/code\u003e 不显示远程分枝\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"diff\"\u003ediff\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e分枝 diff: \u003ccode\u003egit diff \u0026lt;src-branch\u0026gt; \u0026lt;tgt-branch\u0026gt;\u003c/code\u003e (tgt 默认为当前分枝)\n\u003cul\u003e\n\u003cli\u003e如果是和 master 比较, src-branch 应该是master\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e版本 diff: \u003ccode\u003egit diff \u0026lt;src-rev\u0026gt; \u0026lt;tgt-rev\u0026gt;\u003c/code\u003e (tgt 默认为当前版本)\n\u003cul\u003e\n\u003cli\u003esrc-rev 应该是比 tgt-rev 更老的版本(祖先版本)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit merge-base \u0026lt;src-branch\u0026gt; \u0026lt;tgt-branch\u0026gt;\u003c/code\u003e 可能可以得到你需要的 src-rev\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e其它 diff\n\u003cul\u003e\n\u003cli\u003eworking 和 stage 的 diff: \u003ccode\u003egit diff\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003estage 和 HEAD 的 diff: \u003ccode\u003egit diff --cached\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eworking 和 HEAD 的 diff: \u003ccode\u003egit diff HEAD\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e注意\u003c/strong\u003e 上述 3 种方式都不会 diff 新文件(未处于版本控制中的文件)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"合并\"\u003e合并\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e合并 branch 到当前分枝: \u003ccode\u003egit merge \u0026lt;branch\u0026gt;\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003efetch 后用 \u003ccode\u003egit merge \u0026lt;repo-name\u0026gt;/\u0026lt;remote-branch\u0026gt;\u003c/code\u003e merge\u003c/li\u003e\n\u003cli\u003e如果 \u003ccode\u003emerge \u0026lt;branch\u0026gt;\u003c/code\u003e, 修改 branch, 再 merge, 只 merge 修改的部分\u003c/li\u003e\n\u003cli\u003e合并冲突时, 不 merge 而是指定某个版本: \u003ccode\u003egit checkout --ours/--theirs \u0026lt;file\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;复制\u0026rdquo; 一次提交(比如某个分枝只有一次提交需要保留): \u003ccode\u003egit cherry-pick \u0026lt;rev\u0026gt;\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e停止 \u0026ldquo;复制\u0026rdquo;: \u003ccode\u003egit cherry-pick --abort\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e将当前分枝 rebase 到 tgt-branch: \u003ccode\u003egit rebase \u0026lt;tgt-branch\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003emerge 与 rebase 的区别\n\u003cul\u003e\n\u003cli\u003emerge 建立了一个新版本, 而 rebase 是分枝上有多少新版本, 就会建立多少新版本\u003c/li\u003e\n\u003cli\u003erebase 后需要再做一次快速 merge, 才能使 tgt-branch 的指针正确(两者指针移动方式不同)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"查看状态信息\"\u003e查看状态信息\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egit status\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit log\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit reflog\u003c/code\u003e: 查看 HEAD 指针的移动历史\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit branch --merge\u003c/code\u003e: 查看哪些分枝已被合并到当前分枝\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit branch --no-merged\u003c/code\u003e: 查看尚未合并的分枝\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egit remote show \u0026lt;repo-name\u0026gt;\u003c/code\u003e: 查看远程信息\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"暂存\"\u003e暂存\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit stash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit stash pop\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit stash list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit stash clear\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit stash apply stash@\u003cspan class=\"o\"\u003e{\u003c/span\u003ex\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit stash drop stash@\u003cspan class=\"o\"\u003e{\u003c/span\u003ex\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit stash branch \u0026lt;branch\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"标签\"\u003e标签\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit tag \u003cspan class=\"c1\"\u003e# 标签列表\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit tag \u0026lt;tag\u0026gt; \u003cspan class=\"c1\"\u003e# 在当前版本上打标签\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit show \u0026lt;tag\u0026gt; \u003cspan class=\"c1\"\u003e# 查看标签\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit tag -d \u0026lt;tag\u0026gt; \u003cspan class=\"c1\"\u003e# 删除标签\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push \u0026lt;repo-name\u0026gt; \u0026lt;tag\u0026gt; \u003cspan class=\"c1\"\u003e# 提交标签\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push \u0026lt;repo-name\u0026gt; :\u0026lt;tag\u0026gt; \u003cspan class=\"c1\"\u003e# 删除远程标签\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"submodule-20150413\"\u003esubmodule @2015.04.13\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit submodule add \u0026lt;remote-path\u0026gt; \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u0026lt;local-path\u0026gt;\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 添加 remote-path 为当前项目的 submodule\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit rm -r \u0026lt;local-path\u0026gt; \u003cspan class=\"c1\"\u003e# 如果有问题, 试试 git rm --cached \u0026lt;local-path\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evim .gitmodules \u003cspan class=\"c1\"\u003e# 通常会在 git rm 时自动执行\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf .git/modules/\u0026lt;local-path\u0026gt; \u003cspan class=\"c1\"\u003e# 可能不必要\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evim .git/config\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Git 手册"},{"content":"引 版本控制工具：Git 代码 review 工具：ReviewBoard 代码 review 需要积极评估代码的设计和清晰程度，项目 owner 还要确保被review 代码的逻辑正确性，而不仅限于命名和格式 准备工作 用 ldap 账号登录 确保参与 review 的人都需要登录过，否则会找不到人 确保你要 review 的代码的 git 已经加入 reviewboard 确保你要 review 的代码基点已经 push 到 git 服务器 代码基点: git diff \u0026lt;src-rev\u0026gt; \u0026lt;tgt-rev\u0026gt; 中的 \u0026lt;src-rev\u0026gt; 提交一个 review 生成diff git diff \u0026lt;src-rev\u0026gt; \u0026lt;tgt-rev\u0026gt; \u0026gt; d1.diff 一般来说src是tgt的父节点 如何得到 \u0026lt;src-rev\u0026gt; 对于开分枝 / 开发 / merge 的工作模式而言 \u0026lt;src-rev\u0026gt; 就是你开分枝时分枝点的版本 可以用 git merge-base \u0026lt;src-branch\u0026gt; \u0026lt;tgt-branch\u0026gt; 得到 \u0026lt;src-rev\u0026gt; 比如你要从 work 分枝 merge 回 master，则执行 git merge-base master work 得到 \u0026lt;src-rev\u0026gt;，前提是你没有 merge 过 但如果你已经 merge 过，这样得到的 \u0026lt;src-rev\u0026gt; 是从最后一次 merge 的版本 对于在一个分枝上持续开发的工作模式 查看git log 找到需要的 \u0026lt;src-rev\u0026gt; 应该尽量在代码稳定时再 merge：勤开分枝，慎重 merge 应该尽量使用 amend，减少 commit，git log 才好找 访问 reviewboard，点击 New Review Request 选择 Repository，选择 diff 文件，点击 Create Review Request 点击 View Diff，查看上传结果是否和预期一致 填写 Summary / People / Description，注意 people 是 ldap 账号名，用 tab 补全，别按回车 确认提交，系统会发邮件给 people，通知他们来 review 更新一个 review 修改代码提交之后生成新 diff git diff \u0026lt;src-rev\u0026gt; \u0026lt;tgt-rev2\u0026gt; \u0026gt; d2.diff 注意 确保在一次 review 中，所有 diff 的 \u0026lt;src-rev\u0026gt; 都是同一个 访问 reviewboard，打开要更新的 review 只能更新自己提交的 review 点击 Update 下拉菜单中的 Update Diff，选择 diff 文件，点击 Upload 点击 View Diff，查看上传结果是否和预期一致 填写本次更新的内容，确认提交 review 别人的代码 点击邮件通知中的链接，登录 reviewboard 点击 View Diff，查看被修改的代码 点击有问题的行，填写有什么问题 继续 review，直到所有代码都 review 完毕 点击页面上方悬浮条中的 Edit Review，预览所有你填写的内容 如果没有问题，点击 Publish Review 如果需要修改，可以直接在预览页面上修改 如果需要增加，点击 Cancel，增加，再 Edit Review 如果代码较多，可以 review 一页提交一页 根据别人的 review 修改代码 别人提出的每个问题都会生成一个 issue 对照这些 issue 修改代码；如果 fix 了，就点 fixed；如果有异议，可以回复讨论；如果确认不需要改，就点 drop 修改完成后，提交代码，生成新的 diff 更新 review，继续，直到所有 issue 都 fixed 或 drop ","permalink":"http://life.urakalee.me/posts/2013-12-01-how-to-code-review/","summary":"\u003ch2 id=\"引\"\u003e引\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e版本控制工具：Git\u003c/li\u003e\n\u003cli\u003e代码 review 工具：\u003ca href=\"http://www.reviewboard.org/\" title=\"Review Board\"\u003eReviewBoard\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e代码 review 需要积极评估代码的设计和清晰程度，项目 owner 还要确保被review 代码的逻辑正确性，而不仅限于命名和格式\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"准备工作\"\u003e准备工作\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e用 ldap 账号登录\u003c/li\u003e\n\u003cli\u003e确保参与 review 的人都需要登录过，否则会找不到人\u003c/li\u003e\n\u003cli\u003e确保你要 review 的代码的 git 已经加入 reviewboard\u003c/li\u003e\n\u003cli\u003e确保你要 review 的代码基点已经 push 到 git 服务器\n\u003cul\u003e\n\u003cli\u003e代码基点: \u003ccode\u003egit diff \u0026lt;src-rev\u0026gt; \u0026lt;tgt-rev\u0026gt;\u003c/code\u003e 中的 \u003ccode\u003e\u0026lt;src-rev\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"提交一个-review\"\u003e提交一个 review\u003c/h2\u003e\n\u003c!-- more --\u003e\n\u003col\u003e\n\u003cli\u003e生成diff\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egit diff \u0026lt;src-rev\u0026gt; \u0026lt;tgt-rev\u0026gt; \u0026gt; d1.diff\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e一般来说src是tgt的父节点\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e如何得到 \u003ccode\u003e\u0026lt;src-rev\u0026gt;\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e对于开分枝 / 开发 / merge 的工作模式而言\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e\u0026lt;src-rev\u0026gt;\u003c/code\u003e 就是你开分枝时分枝点的版本\u003c/li\u003e\n\u003cli\u003e可以用 \u003ccode\u003egit merge-base \u0026lt;src-branch\u0026gt; \u0026lt;tgt-branch\u0026gt;\u003c/code\u003e 得到 \u003ccode\u003e\u0026lt;src-rev\u0026gt;\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e比如你要从 work 分枝 merge 回 master，则执行 \u003ccode\u003egit merge-base master work\u003c/code\u003e 得到 \u003ccode\u003e\u0026lt;src-rev\u0026gt;\u003c/code\u003e，前提是你没有 merge 过\u003c/li\u003e\n\u003cli\u003e但如果你已经 merge 过，这样得到的 \u003ccode\u003e\u0026lt;src-rev\u0026gt;\u003c/code\u003e 是从最后一次 merge 的版本\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e对于在一个分枝上持续开发的工作模式\n\u003cul\u003e\n\u003cli\u003e查看git log 找到需要的 \u003ccode\u003e\u0026lt;src-rev\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e应该尽量在代码稳定时再 merge：勤开分枝，慎重 merge\u003c/li\u003e\n\u003cli\u003e应该尽量使用 amend，减少 commit，git log 才好找\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e访问 reviewboard，点击 New Review Request\u003c/li\u003e\n\u003cli\u003e选择 Repository，选择 diff 文件，点击 Create Review Request\u003c/li\u003e\n\u003cli\u003e点击 View Diff，查看上传结果是否和预期一致\u003c/li\u003e\n\u003cli\u003e填写 Summary / People / Description，注意 people 是 ldap 账号名，用 tab 补全，别按回车\u003c/li\u003e\n\u003cli\u003e确认提交，系统会发邮件给 people，通知他们来 review\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"更新一个-review\"\u003e更新一个 review\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e修改代码提交之后生成新 diff\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egit diff \u0026lt;src-rev\u0026gt; \u0026lt;tgt-rev2\u0026gt; \u0026gt; d2.diff\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e注意\u003c/strong\u003e 确保在一次 review 中，所有 diff 的 \u003ccode\u003e\u0026lt;src-rev\u0026gt;\u003c/code\u003e 都是同一个\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e访问 reviewboard，打开要更新的 review\n\u003cul\u003e\n\u003cli\u003e只能更新自己提交的 review\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e点击 Update 下拉菜单中的 Update Diff，选择 diff 文件，点击 Upload\u003c/li\u003e\n\u003cli\u003e点击 View Diff，查看上传结果是否和预期一致\u003c/li\u003e\n\u003cli\u003e填写本次更新的内容，确认提交\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"review-别人的代码\"\u003ereview 别人的代码\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e点击邮件通知中的链接，登录 reviewboard\u003c/li\u003e\n\u003cli\u003e点击 View Diff，查看被修改的代码\u003c/li\u003e\n\u003cli\u003e点击有问题的行，填写有什么问题\u003c/li\u003e\n\u003cli\u003e继续 review，直到所有代码都 review 完毕\u003c/li\u003e\n\u003cli\u003e点击页面上方悬浮条中的 Edit Review，预览所有你填写的内容\u003c/li\u003e\n\u003cli\u003e如果没有问题，点击 Publish Review\n\u003cul\u003e\n\u003cli\u003e如果需要修改，可以直接在预览页面上修改\u003c/li\u003e\n\u003cli\u003e如果需要增加，点击 Cancel，增加，再 Edit Review\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e如果代码较多，可以 review 一页提交一页\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"根据别人的-review-修改代码\"\u003e根据别人的 review 修改代码\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e别人提出的每个问题都会生成一个 issue\u003c/li\u003e\n\u003cli\u003e对照这些 issue 修改代码；如果 fix 了，就点 fixed；如果有异议，可以回复讨论；如果确认不需要改，就点 drop\u003c/li\u003e\n\u003cli\u003e修改完成后，提交代码，生成新的 diff\u003c/li\u003e\n\u003cli\u003e更新 review，继续，直到所有 issue 都 fixed 或 drop\u003c/li\u003e\n\u003c/ol\u003e","title":"How to code review"},{"content":"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 ","permalink":"http://life.urakalee.me/posts/2013-11-28-my-git-configuration/","summary":"\u003cpre\u003e\u003ccode\u003evim ~/.gitconfig\n\n[color]\n    ui = true\n    diff = true\n    status = true\n    branch = true\n    interactive = true\n[alias]\n    st = status\n    ss = status -s\n    ci = commit\n    ca = commit --amend\n    co = checkout\n    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\n    ft = fetch\n    pl = pull --rebase\n    br = branch\n    cp = cherry-pick\n    mg = merge\n    rb = rebase\n    dci = dcommit\n    sbi = submodule init\n    sbu = submodule update\n    sbp = submodule foreach git pull\n    sbc = submodule foreach git co master\n\u003c/code\u003e\u003c/pre\u003e","title":"我的 Git 配置"},{"content":"vim ~/.vimrc # 行号 set nu # tab 转空格 set ts=4 set expandtab set autoindent # 语法高亮 syntax enable set background=dark colorscheme solarized solarized 是一套很棒的配色方案，请参考 vpsee 中的方法进行配置。\n","permalink":"http://life.urakalee.me/posts/2013-11-28-my-vim-configuration/","summary":"\u003cpre\u003e\u003ccode\u003evim ~/.vimrc\n\n# 行号\nset nu\n# tab 转空格\nset ts=4\nset expandtab\nset autoindent\n# 语法高亮\nsyntax enable\nset background=dark\ncolorscheme solarized\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003esolarized 是一套很棒的配色方案，请参考 \u003ca href=\"http://www.vpsee.com/2013/09/use-the-solarized-color-theme-on-mac-os-x-terminal/\" title=\"在 Mac OS X 终端里使用 Solarized 配色方案\"\u003evpsee\u003c/a\u003e 中的方法进行配置。\u003c/p\u003e","title":"我的 Vim 配置"},{"content":"信息焦虑的第三个症状：随时需要“清理”自己的电脑，虽然完全不知道究竟“清理”了啥。\nCleanMyMac 满足了我的这个愿望，但也给我带来了一些麻烦。首当其冲的就是图标缓存问题——每次清理完之后，缓存就会瘫痪，不仅 Launchpad 中有的图标显示不出来，Alfred 也难以幸免，最让人无法接受的是 Finder 会崩溃（Path Finder 貌似无碍）。好在重启之后一切如常。\n今天终于不淡定了，因为重启也不能解决问题了！按照 Apple 社区上给出的解决办法，打开终端，运行命令，图标找回，分组消失。。。\nrm ~/Library/Application\\ Support/Dock/*.db killall Dock 好吧，本来分组这种东西也是我蛋疼搞的，消失就消失吧，有 Alfred 呢。。。\nUpdate@2013.11.26: 最新版的 CleanMyMac 2.2.0 貌似不会有清理完缓存瘫痪的问题了 Update@2015.01.21: 最新版的 MacOS 10.10 已经不能用上述命令行清理 Launchpad 了 Update@2016.03.10: 可以使用如下命令重置 Launchpad 图标 defaults write com.apple.dock ResetLaunchPad -bool true; killall Dock ","permalink":"http://life.urakalee.me/posts/2013-11-25-about-mac-icon-cache/","summary":"\u003cp\u003e信息焦虑的第三个症状：随时需要“清理”自己的电脑，虽然完全不知道究竟“清理”了啥。\u003c/p\u003e\n\u003cp\u003eCleanMyMac 满足了我的这个愿望，但也给我带来了一些麻烦。首当其冲的就是图标缓存问题——每次清理完之后，缓存就会瘫痪，不仅 Launchpad 中有的图标显示不出来，Alfred 也难以幸免，最让人无法接受的是 Finder 会崩溃（Path Finder 貌似无碍）。好在重启之后一切如常。\u003c/p\u003e\n\u003cp\u003e今天终于不淡定了，因为重启也不能解决问题了！按照 \u003ca href=\"https://discussions.apple.com/message/23541241#23541241\" title=\"Mavericks Launchpad, missing icons\"\u003eApple 社区\u003c/a\u003e上给出的解决办法，打开终端，运行命令，图标找回，分组消失。。。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm ~/Library/Application\u003cspan class=\"se\"\u003e\\ \u003c/span\u003eSupport/Dock/*.db\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekillall Dock\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e好吧，本来分组这种东西也是我蛋疼搞的，消失就消失吧，有 Alfred 呢。。。\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"mailto:Update@2013.11.26\"\u003eUpdate@2013.11.26\u003c/a\u003e: 最新版的 CleanMyMac 2.2.0 貌似不会有清理完缓存瘫痪的问题了\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:Update@2015.01.21\"\u003eUpdate@2015.01.21\u003c/a\u003e: 最新版的 MacOS 10.10 已经不能用上述命令行清理 Launchpad 了\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"mailto:Update@2016.03.10\"\u003eUpdate@2016.03.10\u003c/a\u003e: 可以使用如下命令重置 Launchpad 图标\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edefaults write com.apple.dock ResetLaunchPad -bool true\u003cspan class=\"p\"\u003e;\u003c/span\u003e killall Dock\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Mac 图标缓存的二三事"},{"content":"既然已经不用 Spotlight 了，就打算把它的索引彻底关掉。Google 到若干相关文章，操作也都很简单，Apple 官网也有，于是就照着做了。\n然后 Alfred 就挂了。新安装的 app 在 Alfred 中找不到，清了 cache 之后更是啥都没有了。\n继续搞！没有找到确切的答案，但也能根据现有知识猜个差不离。无非是 Alfred 要调用 Spotlight 的结果，所以 Spotlight 关得不对 Alfred 也就不 work了。\n于是还得打开 Spotlight，但是怎么打开还要考虑一下。目标是：Application 索引，而其它不索引。所以先把 HD 加到 privacy 中，再把 HD 下面 Application 之外的都加到 privacy 中；重启；查看一下索引大小，大概 12K；最后把 HD 从 privacy 中移除，DONE！\nPS1: Spotlight 索引文件的位置（from Apple 社区）在磁盘根目录 / PS2: 查看其大小需要 root 权限: sudo du -sh .Spotlight-V100 PS3: Path Finder 居然也要调用 Spotlight 的结果 PS4: Spotlight 真应该搞白名单机制，黑名单太纠结了 ","permalink":"http://life.urakalee.me/posts/2013-11-25-confused-alfred-and-spotlight/","summary":"\u003cp\u003e既然已经不用 Spotlight 了，就打算把它的索引彻底关掉。Google 到若干相关文章，操作也都很简单，\u003ca href=\"http://support.apple.com/kb/HT2409?viewlocale=zh_CN\" title=\"Spotlight：如何重建文件夹或宗卷的索引\"\u003eApple 官网也有\u003c/a\u003e，于是就照着做了。\u003c/p\u003e\n\u003cp\u003e然后 Alfred 就挂了。新安装的 app 在 Alfred 中找不到，清了 cache 之后更是啥都没有了。\u003c/p\u003e\n\u003cp\u003e继续搞！没有找到确切的答案，但也能根据现有知识猜个差不离。无非是 Alfred 要调用 Spotlight 的结果，所以 Spotlight 关得不对 Alfred 也就不 work了。\u003c/p\u003e\n\u003cp\u003e于是还得打开 Spotlight，但是怎么打开还要考虑一下。目标是：Application 索引，而其它不索引。所以先把 HD 加到 privacy 中，再把 HD 下面 Application 之外的都加到 privacy 中；重启；查看一下索引大小，大概 12K；最后把 HD 从 privacy 中移除，DONE！\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003ePS1: Spotlight 索引文件的位置（from \u003ca href=\"https://discussions.apple.com/thread/2429947\" title=\"backup Spotlight index file - where is it?\"\u003eApple 社区\u003c/a\u003e）在磁盘根目录 \u003ccode\u003e/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePS2: 查看其大小需要 root 权限: \u003ccode\u003esudo du -sh .Spotlight-V100\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePS3: Path Finder 居然也要调用 Spotlight 的结果\u003c/li\u003e\n\u003cli\u003ePS4: Spotlight 真应该搞白名单机制，黑名单太纠结了\u003c/li\u003e\n\u003c/ul\u003e","title":"纠结的 Alfred 与 Spotlight"},{"content":"信息焦虑的第二个症状：换过好几个博客，但都因为配置复杂、格式不可控、备份麻烦等原因放弃了。\n作为一个程序员，深深地为自己不能迅速地把博客搞定而惭愧。在构思许久之后，终于还是决定先偷懒，把习惯陪养起来再说。Octopress 还是非常符合我审美的，没有太多可配置的东西，所有格式都能自己掌控，更不用说备份——噢！又犯病了。。。\n唐巧的博客很容易搜到，但我还是建议第一次搞的同学看一下官网。如果你像我一样在使用最新版的 MacOS，那么 ruby 部分就会简化许多：\ngit clone git://github.com/imathis/octopress.git octopress cd octopress sudo gem install bundler bundle install rake install rake new_post[\u0026#39;Article Name\u0026#39;] 写作就是 MarkDown 了, 虽然和 wiki 的写法有些差异, 容易记混. 通常我都会使用 Sublime Text + MarkDown 插件, 同时运行 rake preview 进行调试(-___-b). Preview 模式下, published:false 的文章会是可见的; 可能由于 bug, 如果你开着 preview 运行 deploy, published:false 的文章也会是可见的\u0026hellip; rake deploy 前务必退出 preview, 并运行 rake generate.\nrake deploy 之前，要 git add 和 git push origin source, git 新手（像我）往往都习惯于顺手来个 git pull。唔，然后就悲剧了。因为这个时候 git 已经很傻地把你的 source 分枝和远程的 master 分枝关联在一起了，所以 pull 的时候会没头没脑地要 merge 这两个分枝。已经 merge 的怎么回退我就不说了，还没 pull 的，先修改一下 config 文件。\nvim .git/config ... [branch \"source\"] remote = origin merge = refs/heads/source 如果你像我一样，公司用 git，但博客是私人的，那么最好配置一个 local 的 user，这样博客的提交会好看些。知道格式的也可以直接修改 config 文件。\ngit config user.name \u0026lt;your-name\u0026gt; git config user.email \u0026lt;your-email\u0026gt; 最后，在多台机器上部署。同样要先搞定 ruby 部分，但不需要运行 rake install 和 rake setup_github_pages 了。\ngit clone \u0026lt;your-blog-repo\u0026gt; cd \u0026lt;your-blog-name\u0026gt;.github.io checkout source git branch -D master # 不 checkout master git clone \u0026lt;your-blog-repo\u0026gt; _deploy # 模拟 rake setup_github_pages 更多设置 设置导航栏和增加文章分类的方法可以参考冯威的博客 输入和显示表格的方法可以参考 @samwize 的博客 增加 disqus 的评论只需要申请 disqus 账号并修改 _config.yml @2013.12.14 PS: 由于可以使用 rake preview 进行调试，master 分枝仅用于发布，所以完全没有必要 checkout master；不 checkout 还避免了 pull 和 push 时会捎上 master 的问题 Update@2016.03.10: 更新Octopress, 解决升级 Mac 后无法 preview 的问题 git merge octopress/master sudo gem install bundler # 可能不必要 bundle update bundle install brew update brew install rbenv ruby-build rbenv install 2.2.4 rbenv local 2.2.4 sudo gem install bundler rbenv rehash ","permalink":"http://life.urakalee.me/posts/2013-11-24-newbie-to-octopress/","summary":"\u003cp\u003e信息焦虑的第二个症状：换过好几个博客，但都因为配置复杂、格式不可控、备份麻烦等原因放弃了。\u003c/p\u003e\n\u003cp\u003e作为一个程序员，深深地为自己不能迅速地把博客搞定而惭愧。在构思许久之后，终于还是决定先偷懒，把习惯陪养起来再说。Octopress 还是非常符合我审美的，没有太多可配置的东西，所有格式都能自己掌控，更不用说备份——噢！又犯病了。。。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.devtang.com/blog/2012/02/10/setup-blog-based-on-github/\" title=\"象写程序一样写博客：搭建基于github的博客\"\u003e唐巧的博客\u003c/a\u003e很容易搜到，但我还是建议第一次搞的同学看一下官网。如果你像我一样在使用最新版的 MacOS，那么 ruby 部分就会简化许多：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone git://github.com/imathis/octopress.git octopress\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e octopress\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo gem install bundler\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebundle install\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erake install\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erake new_post\u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Article Name\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c!-- more --\u003e\n\u003cp\u003e写作就是 MarkDown 了, 虽然和 wiki 的写法有些差异, 容易记混. 通常我都会使用 Sublime Text + MarkDown 插件, 同时运行 \u003ccode\u003erake preview\u003c/code\u003e 进行调试(-___-b). Preview 模式下, published:false 的文章会是可见的; 可能由于 bug, 如果你开着 preview 运行 deploy, published:false 的文章也会是可见的\u0026hellip; \u003cem\u003e\u003cstrong\u003e\u003ccode\u003erake deploy\u003c/code\u003e 前务必退出 preview, 并运行 \u003ccode\u003erake generate\u003c/code\u003e\u003c/strong\u003e\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003erake deploy\u003c/code\u003e 之前，要 \u003ccode\u003egit add\u003c/code\u003e 和 \u003ccode\u003egit push origin source\u003c/code\u003e, git 新手（像我）往往都习惯于顺手来个 \u003ccode\u003egit pull\u003c/code\u003e。唔，然后就悲剧了。因为这个时候 git 已经很傻地把你的 source 分枝和远程的 master 分枝关联在一起了，所以 pull 的时候会没头没脑地要 merge 这两个分枝。已经 merge 的怎么回退我就不说了，还没 pull 的，先修改一下 config 文件。\u003c/p\u003e","title":"Octopress 新手小记"}]