Yi's Blog

不图新奇,但问优劣

常用的 Chrome 插件

我爱折腾

和一些程序员一样,我喜欢折腾。面对不断变化、让人眼花缭乱的新软件,我总结自己的折腾分为两个阶段:

  • 要折腾!首先,好的工具可以提供生产力。其次,拒绝画地为牢。最后,接触新鲜事物可以开拓自己的眼界。
  • 不折腾。折腾了一段时间后,发现自己迷失在追求更新更快的工具的路上,磨刀误了砍材工。觉得得不偿失,于是删掉自己用过的大部分软件,只留下最好用,最喜欢的工具,一切又变得清新了。自己美其名曰:返璞归真。

这样不断折腾的过程虽然花费了很长时间,但是留下了一些好用软件的使用经历,算作是花费时间的回报。

浏览器使用历史——我爱插件

浏览器就是一个真实的例子。

最初我喜欢使用 Chrome ,想到什么功能就搜相应功能的插件安装,结果安装了一大堆插件。慢慢地,不知道是不是插件的问题, Chrome 变得越来越慢(可能也和电脑的硬件性能有关),再加上我结识了 Vimperator,我就放弃了 Chrome,改用 Firefox。使用有 Vimperator 插件的 Firefox,一切键盘操作,方便快捷。但是随着 Safari 的不断进化、iOS 设备同步需求的增强以及升级后 Firefox 对插件兼容性的长时间检查的不耐心,我逐渐放弃了 Firefox,投奔了 Safari 的清爽世界。

上面的描述是我不断折腾更换浏览器的一个循环。很快我进入了下一个循环,渐渐地,我又回到了 Chrome 阵营,原因如下:

  • Mac 下的 Chrome 表现日趋好转,特别是在retina屏幕上页面滑动的流畅性达到了可用的程度。
  • Ubuntu 下表现不错。
  • 最主要的原因,有几个特别好用的插件让我用得很爽。

现在想想,除了浏览器本身的功能之外,影响我选择浏览器的重要因素只有一个:插件。

正在使用的插件

Chrome 商店里的插件实在太多,淘到自己喜欢的插件一定要记录一下,免得以后想用的时候又找不到。

一翻

什么 VPN、GOAGENT,统统不喜欢,这个插件的翻墙模式才是我最喜欢的。

任何好用的设计都应该是让人感觉不到,却又踏实工作的。我最早在使用的 GOAGENT,需要打开终端,输入一行命令,看着一行行的 LOG 不断输出,然后才能访问喜欢的网站。这个过程总是给我不舒服,很慢很费电的感觉。当然,也不指望免费的 GOAGENT 能提供多好多快的网络连接。

购买过 MxVPN 的收费服务,每次都打开那个客户端等待刷新,一大堆服务器列表,一个一个去尝试,在校园网环境下有些无法访问,有些验证出错,真是很不爽的体验。

虽然一翻是个服务收费的插件(难道你认为不应该收费吗),但是使用这个软件让我自由地右键-〉GOOGLE搜索带来的效率的提高远远超过付出的费用。其安静省心的工作方式,让任何小白用户无须配置,就可以立刻使用。

推荐购买使用。

下载地址:一翻

截图:

一翻截图

One-Click Extensions Manager

打开 Chrome 插件管理的界面是一件麻烦的事情,这个插件可以快接地启用和禁用插件,避免 Chrome 变得越来越慢。

下载地址:One-Click Extensions Manager

截图:

One-Click Extensions Manager

WhatFont

可以方便地查看网页上的文字到底使用的是什么字体。(查看作者的网站才知道,作者是个中国人,做了一些很牛X的事,值得进一步关注。)

下载地址:WhatFont

截图:

WhatFont

Hover Zoom

鼠标放在小图片上就能显示大图的神奇插件。

下载地址:Hover Zoom

截图:

Hover Zoom

Evernote Web Clipper

任何使用Evernote做整理的人都需要的软件。

下载地址:Evernote Web Clipper

截图:

Evernote Web Clipper

Clearly

有的博客的字体和配色实在不适合阅读,使用 Clearly 可以轻松地阅读,并且保存没有乱七八糟格式的内容到Evernote。

下载地址:Clearly

截图:

Clearly

cookie.txt export

如果有什么内容必须登录才能下载,而你又不喜欢使用 Chrome 的下载功能,使用这个插件配合 wget 是你的另一个选择。

下载地址:cookie.txt export

截图:

cookie.txt export

json tool

遇到 JSON 内容就靠它了。虽然有很多相似功能的插件,但是还是这个插件的功能最实用。

下载地址:json tool

截图:

json tool

Better History

比 Chrome 自带更好用的历史统计和搜索。

下载地址:Better History

截图:

Better History

妈妈再也不用担心我的macbook发烫计划2.0

没有广告看 youku ,如果你使用的是 Mac 系统,还能让你的笔记本安静一些。

下载地址:妈妈再也不用担心我的macbook发烫计划2.0

截图:

妈妈再也不用担心我的macbook发烫计划2.0

Tmux 快速教程

翻译的文章:A Tmux Crash Course

译文

我已经使用 Tmux 近 4 个月了,它和 vim 一样成为了我工作流中不可或缺的部分。Pane 和 windows 的管理,在输出信息中可导航的复制模式以及 seesion 的管理让 Tmux 成为了命令行爱好者(特别是 vim 使用者)毫不费力就能使用的工具。我收集了一些我日常使用的 tmux 命令,这些命令让我的工作更加高效。

image-1

如果我提到的 tmux 命令不是默认的快捷键, 我会在介绍的间隙说明。

Session 管理

Seesion 可以有效地分离工作环境。我有一个“工作” session 和一个“娱乐” session;在“工作”中,我打开所有日常开发需要的内容,而在“娱乐”中,我只打开当前开源的 gem 或者在家 hack 的一些东西。

  • tmux new -s session_name <p>创建一个叫做 session_name 的 tmux session</p>
  • tmux attach -t session_name <p> 重新开启叫做 session_name 的 tmux session </p>
  • tmux switch -t session_name <p>转换到叫做 session_name 的 tmux session</p>
  • tmux list-sessions <p>列出现有的所有 session </p>
  • tmux detach (prefix + d) <p>离开当前开启的 session</p>

Windows

Tmux 有一个含有标签的界面,但是它命名这些标签为 “Windows”。为了保持有序,我重新命名了所有我使用的 windows;如果我正在编写一个 gem,我会使用这个 gem 的名字来命名 window。客户端的应用程序也一样。这样,我就能通过名字而不是运行的程序找到相应的 window。

  • tmux new-window (perfix + c) <p> 创建一个新的 window </p>
  • tmux select-window -t :0-9 (perfix + 0-9) <p>根据索引转到该 window</p>
  • tmux rename-window (perfix + ,)<p>重命名当前 window</p>

Panes

Panes 让我的开发时间从平淡变为棒极了。它们也是我卸载 MacVim 并且单独使用 iTem2 开发的原因。我无须切换应用程序以变换上下文(编辑,浏览 log,使用IRB,等)。任何我想做的事情,我可以在一个终端中完成。有人认为 OS X 的 Cmd + Tab 很快,我不这么认为。

  • tmux split-window (perfix + “) <p>将 window 垂直划分为两个 pane</p>
  • tmux split-window -h (perfix + %) <p>将 window 水平划分为两个 pane</p>
  • tmux swap-pane -[UDLR] (perfix + { or }) <p>在指定的方向交换 pane</p>
  • tmux select-pane -[UDLR] <p>在指定的方向选择下一个 pane</p>
  • tmux select-pane -t :.+ <p>选择按数字顺序的下一个 pane</p>

其他有益的 TMUX 命令

  • tmux list-keys <p>列出所有可以的快捷键和其运行的 tmux 命令</p>
  • tmux list-commands <p>列出所有的 tmux 命令及其参数</p>
  • tmux info <p>流出所有的 session, window, pane, 运行的进程号,等。</p>
  • tmux source-file ~/.tmux.conf <p>重新加载当前的 tmux 配置(基于一个默认的 tmux 配置)

必须用到的几条配置

这是几个我必须用到的配置:

# remap prefix to Control + a
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# force a reload of the config file
unbind r
bind r source-file ~/.tmux.conf

# quick pane cycling
unbind ^A
bind ^A select-pane -t :.+

工作流程

在白天,我的工作包括编码一个或者两个 Rails 应用,修改我的 dotfiles,运行 irssi,还有可能在另一个窗口打开一个 vim 来做笔记。如我提到的,我会运行所有这些在一个 tmux 的 session 中, 并且在不同的 windows 中来回切换。

特别是当我在做 Rails 工作时,我必须用一个 75% / 25% 的垂直分割放置 vim 和一个终端,并在其中运行测试,和 git 交互,以及写代码。如果我在运行测试或者使用 ‘git diff’,我想要看到多余 25% 的输出,我会使用 tmux 来交换 pane 并切换到复制模式来查看我想查看的东西。

最后,我在全屏模式运行 iTems2。为了一个编辑器和终端而切换 OS X 的应用实在是太愚蠢了。

更多学习的链接

试用 Farbox

Hi, Farbox Editor.

在使用 OctopressGithub Pages 作为自己的 Blog 系统,种种原因,好久没有更新。

前阵子在 V2EX 上就看到了这个 Farbox 的项目,当时还不记得名字,只知道视频和文案做得很好,但是也没好到想让我试一试的程度。今天在 V2 上又看到发布了工具,遂觉得这个项目很有爱,就尝试了一下,结果一发一个中午都不可收拾。

但是,折腾的过程中有两点让我很不开心:

  • 没有类似 Octopress 本地测试的程序。这导致我修改一个参数,等 Dropbox 同步成功以后,一个劲地刷页面,刷到有效果为止。期待有一个可以在本地用于调试 Theme 的程序,这样既可以方便Theme的开发,又能打破程序员心里对这个服务器里“黑盒子”的结缔。(试了一下发现,试用Farbox Editor的发布按钮可以很快地查看文章的变化。)
  • 文档不够健全,比如说我想修改 Theme 中指示的 site.title 变量,于是在 site.md 中设置的 title 变量,但是没有效果。这是因为 site 中的 title 是 site.config.title 变量,我搜了半天才发现是这个问题,修改 Theme 中的变量了事。

吐槽归吐槽,用 Dropbox 来写 Blog 这个点子是好的,工具也做得简介明了,希望 Farbox 能发展得更好。

使用的地址

www.jeswang.org

使用的主题

主题来自《衣不如新》,未经过修改,直接试用,感谢他。

豆瓣图书和电影列表

一年以前写的抓取自己豆瓣电影和图书列表的脚本。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
# auther: jeswang
# finished time: 2012.2.4

import os
import stat
import urllib2
import urllib
import time
import datetime
import threading
import string
from time import sleep
from BeautifulSoup import *


BOOK_HEAD = '''---
layout: page
title: "Book"
sharing: true
footer: false
---

'''

MOVIE_HEAD = '''---
layout: page
title: "Moive"
sharing: true
footer: false
---

'''


def getList(base_url, list_kind):
  c = urllib2.urlopen(base_url + list_kind +
                      '?sort=time&start=0&filter=all&mode=grid&tags_sort=count')
  soup = BeautifulSoup(c.read())
  c.close()
  totalNumber = soup.find('span', {"class": "subject-num"}).contents[0]
  separator = "/"
#    print totalNumber
  totalNumber = totalNumber[totalNumber.find(separator) + 7:]
  totalNumber = string.atoi(totalNumber)
#    print totalNumber

  bookList = soup.findAll('a', {"class": "nbg"})
#    print bookList

  beginNumber = 15
  while totalNumber - 15 > 0:
    c = urllib2.urlopen(base_url + list_kind + '?sort=time&start=' +
                        str(beginNumber) + '&filter=all&mode=grid&tags_sort=count')
    soup = BeautifulSoup(c.read())
    c.close()
    bookList = bookList + soup.findAll('a', {"class": "nbg"})
    totalNumber = totalNumber - 15
    beginNumber += 15
  return bookList


if __name__ == "__main__":

  book_file = file('../octopress/source/book/index.markdown', 'w')
  book_file.write(BOOK_HEAD)
  print "获取正在读的书籍列表"
  base_url = 'http://book.douban.com/people/dowang/'
  book_file.write('''## 在读的书
''')

  for book in getList(base_url, 'do'):
    book_file.write(str(book).replace('spic', 'mpic') + ' ')

  print "读过的书籍列表"
  base_url = 'http://book.douban.com/people/dowang/'
  book_file.write('''
## 读过的书
''')

  for book in getList(base_url, 'collect'):
    book_file.write(str(book).replace('spic', 'mpic') + ' ')

  print "想要的书籍列表"
  base_url = 'http://book.douban.com/people/dowang/'
  book_file.write('''
## 想要读的书
''')

  for book in getList(base_url, 'wish'):
    book_file.write(str(book).replace('spic', 'mpic') + ' ')

  movie_file = file('../octopress/source/movie/index.markdown', 'w')
  movie_file.write(MOVIE_HEAD)

  print "获取正在看的电影列表"
  base_url = 'http://movie.douban.com/people/dowang/'
  movie_file.write('''## 在看的电影
''')

  for book in getList(base_url, 'do'):
    movie_file.write(str(book).replace('spic', 'mpic') + ' ')

  print "看过的电影列表"
  movie_file.write('''
## 看过的电影
''')

  for book in getList(base_url, 'collect'):
    movie_file.write(str(book).replace('spic', 'mpic') + ' ')

  print "想要的电影列表"
  movie_file.write('''
## 想要看的电影
''')

  for book in getList(base_url, 'wish'):
    movie_file.write(str(book).replace('spic', 'mpic') + ' ')

  print "Finish!"

使用方法:

  • 要把文件保存在和Octopress同级的另一个目录下

image-1

  • 修改代码中的dowang为你的豆瓣名字。
  • 给Octopress加上两个链接,方便访问。

定期运行一下,就可以让Octopress有你自己的豆瓣列表了。

我的 VIM 配置文件

这学期的课都上完了,终于有时间和代码相处了。

好久没有使用vim,有些快捷键的淡忘了。

整理一下配置文件,重新来过。

inoremap <C-e> <END>
inoremap <C-a> <HOME>
inoremap <C-f> <Right>
inoremap <C-b> <Left>

nmap <Left> :bp<CR>
nmap <Right> :bn<CR>
nmap <F4> :bd<CR>

set nocompatible
syntax on
filetype off
colorscheme desert
set nu
set mouse=a
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
Bundle 'gmarik/vundle'
filetype plugin indent on

Bundle 'Lokaltog/vim-powerline'
set nocompatible

set laststatus=2 
set t_Co=256 

Bundle 'ZenCoding.vim'

Bundle 'a.vim'
Bundle 'mileszs/ack.vim'
Bundle 'cocoa.vim'
Bundle 'FencView.vim'
Bundle 'Markdown-syntax'
Bundle 'unite.vim'
Bundle 'Syntastic'

Bundle 'Tagbar'
let g:tagbar_ctags_bin='/usr/local/bin/ctags'  
let g:tagbar_width=26                          

Bundle 'taglist.vim'
Bundle 'taglist-plus'
let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
let Tlist_Ctags_Cmd='/usr/local/bin/ctags'

Bundle 'The-NERD-tree'
let NERDTreeShowBookmarks=1

Bundle 'altercation/vim-colors-solarized'
" set background=dark
" colorscheme solarized

Bundle 'neocomplcache'
let g:neocomplcache_enable_at_startup=1 
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete 

Bundle 'pyflackes' 
Bundle 'python_flod'

if has("gui_running")
"    set guifont=Microsoft\ YaHei\ Mono:h16
    set guifont=Monaco:h14
    set guifontwide=Microsoft\ YaHei:h15
    set linespace=2
    set guioptions-=T
    set guioptions-=r
    set guioptions-=L
    set showtabline=1
    set noimd
endif

- EOF -

Octopress 新建博客脚本

重复性质的准备工作

每次用Octopress写博客,都要

  • 打开终端,转到Octopress的目录
  • 敲入rake 文章名字
  • 打开创建的文件开始写Blog
  • 在终端输入,rake preview
  • 浏览器中看到输出的样式

这样重复机械性的工作,不仅增加了写博客的准备时间,也增加了开始写博客的心理代价。

Mac下的解决方案

Shell反反复复只写过一些简单的例子,而且也忘得差不多了。写几行程序刚好可以再复习一下相关内容,就写了一段Shell来完成上面的工作。代码如下:

``` sh 简化创建博客的流程 export BLOG=”/Path/to/octopress”

function post() { BLOG_NAME=$1 BLOG_ADDR=$BLOG cd $BLOG_ADDR/source/_posts;

rake new_post\[${BLOG_NAME}\];

open $BLOG_ADDR/source/_posts
open $BLOG_ADDR/source/images

NEW_POST_NAME=`ls -t|head -1`
echo $NEW_POST_NAME
open -a Marked $NEW_POST_NAME
open -a Sublime\ Text\ 2 $NEW_POST_NAME
cd - }

```

这样,每次写博客,只需要在命令行输入 post 文章名字 就行了。

- EOF -

2012 年读书总结

2012年是进入研究生学习的第一个半年,尽管了解了很多学习的方向和名词,但是认真阅读的时间很少,深入思考的时间也很少。看的书多是娱乐休闲,好几本有难度需要思考总结的图书都没有完整看完,很惭愧。

决心要在2013年,有一个完整的,有总结的读书计划。读更多的有益之书,读更多英文原著。

Stay hungry, stay foolish

最近两周的生活有点不太规律,总是在被任务追着走,效率不高,连每天做了什么都无法记录。问题出在哪里?

~~~~

这两天看到了两次关于“初心”的议论:

第一次,是在柴静对采访李安时,李安提到的。他没有说初心这个词,他说的是纯洁。我想,李安说的纯洁,是指跟随自己内心的想法去拍摄和表达,是指对于电影中很纯粹的东西的追求,是指《少年派》中派,或者是李安自己,对人性和信仰的理解和追问。

纯洁,就是不管你曾经做过什么,你如今擅长什么,放下内心对于世界的偏见,不受过往经验的影响,像一个婴儿一样体验这个世界,尽情地发现自己,表达自己。

第二次是是在知乎上看到有人提问:什么是“初心”?

答案有很多,大致都是在说,所谓“初心”,就是“初学者的心”。看到这个答案,我一下就明白了,这正是我很长时间以来所缺少的。

作为一个学计算机的人,免不了学习很多技术。初学这些技术时,兴致盎然,再后来这种好奇越加衰减,最终就懒得再去看了,转而去学什么新的东西了。结果是,并没有什么真正深入学习的东西。

其实,这些技术之中有很多值得推敲,让人着迷的细节,如果能保持一颗好奇之心,认真去寻找茫茫草原之上的野花,静静地体验逐渐圆满的感觉,不也是一件美事?

我原来不是很理解乔布斯在斯坦福毕业典礼上说的最后一句话:

Stay hungry, stay foolish.

现在我懂了,这句话讲了一个朴素而深刻的道理:放下从前发生的事情,把心掏空,用空空的心重新去认识这个世界,重新认识我们自己。

Stay hungry, stay foolish.

- EOF -

「影响力」我读到了什么?

为什么读?

假期里,认真地读了李笑来老师的《把时间当朋友》和刘未鹏的《暗时间》(准确的说是一部分),书里都提到了《影响力》这本书。然后就用了大约1周的时间,在公交车上仔细的读了一下。虽然读的断断续续的,但是读的时候都很投入,很被书里的内容吸引,内容上也很受启发。

读到了什么?

我发觉我更关心的是其中对自身和他人看法的方面,而不是如何获利。关于对自身和他人的看法,给我感触最深的有这么两点:

承诺和一致对人的影响

人总是试图让自己的言和行一致起来,这样才能显示自己的诚信,让社会中的更多人认同,并愿意与你协作。这是承诺的意义,给人和人之间的交易带来了可能。

但是,书中发现,如果你做出了承诺,你就会被自己的承诺左右甚至改变。简单地说,就是你要为你的承诺付出相应的代价,并有责任。从得到许诺的一方来说,有的时候,他会从你不经意的许诺中获得利益。比如说:

每一个销售人员都会打电话向客户约拜访,客户也经常会推托我们说下个星期吧,或者下个月之类的话,等到下次打电话的时候又会说下个星期,无限期的拖延下去,其实,有时候改变一下说法,成功率就会大大增加:“先生,上次我们沟通,您建议我们这个星期找个时间会面,我周二过去怎么样?”由于电话当中提到了客户原来的承诺,邀约成功的可能行就会很大。

从自身角度出发,你可能需要小心地写出你的Blog,因为一旦你写出了大家都能读到的东西,他就变成了一种公开的承诺。我想写之前,你最少应该知道这些:

  • 你真的已经完全了解了你想说的东西?
  • 你在讲的东西是不是真的是你经过了思考才写下的内容,还是只是读到了别人的想法,你想装的很博学?
  • 你写出的内容很可能会影响到你的行为,它可能会潜移默化的变成你的一部分。

读到这里,我发觉自己总是说的太多,想的太少。更多说出去的东西,只是别人思考的结果,缺少自己思考的过程。而这些说出的东西呢,又不知不觉变成了我自己的一部分。

我应当更多地去读,去想,而不是去说,去通过简单的方式说服自己这就是我思考的结果。

相似性带来的喜好

相似性会带来好感,这个结论毋庸置疑。但是,《影响力》中提到的结论就是这样,在日常生活中,你可能都在不知不觉地使用,但是你就是没有意识到这种结论的存在。

拿我自己来说,我总是喜欢逢迎别人,说得通俗一点,就是巴结别人。具体来说,就是在不同意别人观点,或者根本就没在听别人讲话的时候,装作听明白了,不同意也不直接进行反驳;就是潜意识地学习对方说话的习惯和内容,与之交流;就是在不想笑的时候,装作很好笑。

我想,和人相处用到以上我的这些做法,有时是必要的,但是这个度往往不好把握。最近我在想和人相处的过程中的“卑亢”这个问题,过于谦虚逢迎别人就没了自己的特点和想法,而过于自尊自爱了呢又显得不尊重他人,与人无法交流。我还在想这个问题,大概会想一阵子。

可能的解决办法,我想就是找到骨子里就和你比较相似的人,也无所谓巴结逢迎或者装,大家本来就一样,这样最简单,大概这就是所说的 道同志合。

End

这就是我读这本书想到的内容,只是书中的一小丢丢,要想把更多的内容读明白,应该再读几遍。

谋求利益不是全部,更是在社会中成为更好的自己。

-EOF-

制作 iOS App 会用到的资源

image-1

接触iOS开发已经有一段时间了,虽然没有什么拿得出手作品,但是积累了一些在制作App的过程中会用到的资源,拿出来整理一下。

图片资源

App Icon

首先需要的是一个好看的icon:

  • iOS App Icon Template 可以帮助你只用一张1024 * 1024 的icon图片输出你需要的各种尺寸的icon图片。

  • 通过iTunes或者其他方式下载到的每个ipa文件中有一个artwork的文件,将文件后缀重命名为png,就可以看到是一个最大尺寸的icon图标。通过学习其他人设计的icon可以更好的设计自己的icon。

UI相关图片

然后是设计UI过程中需要的灵感和资料:

你需要的灵感:

  • 下载流行的应用,看看人家的UI是什么的。

  • iPhone界面截图收集的网站:pttrns

  • dribbbleForrstDeviantart找灵感,看看优秀的设计师都在做什么。

你需要的材料:

作为独立开发者,如果你没有设计师和你合作,那么UI的工作也得自己来。

  • 打开ipa,看看人家是怎么实现的。

  • 使用这个开源的工具把系统UI实现的图片和其他程序中的图片取出来看看:UIKit-Artwork-Extractor

  • 然后就是制作你自己的UI(效果图可用到的资源:iOS GUI PSD)。如果真的做不出来,也可以找一些free psd,比如说:365psd

程序设计

  • 找一本iPhone程序设计的书,系统地读一下,写几个例子。

  • 在遇到不懂的地方,试着读一下Apple的文档。最近发现了这个读文档的好东西:Dash

  • Stack Overflow是个好地方。遇到的绝大多数问题都有人遇到并且解决了,提问也很快会有人回应。

  • Github上有很多很有用的类库,找到合适的类库能节约很多开发上的时间,并且通过读别人的程序,能学到很多东西。

  • 实现比较绚的效果要用什么样的类库?Cocoa Contrls(貌似需要翻墙才能访问)、Code4App

结束

以上是我在搜索的工程中找到的资源,整理一下留给自己看,希望也能帮助搜索到这里来的人。

【1】V2EX-一个找灵感的好地方

【2】V2EX-Dash 是个好东西,Snippet管理和Cocoa文档浏览

【3】大部分资源是在V2EX上了解到的,但是找不到了原文。V2EX真是个好地方。