Yi's Blog

思绪来得快,去得也快

试用 Zotero

Zotero 简介

[Zotero][1] 在其主页上是这样介绍自己的:

Zetero 是一个自由且易用的工具,可以帮助你收集、整理、引用和分享你的研究源。

Zotero [zoh-TAIR-oh] is a free, easy-to-use tool to help you collect, organize, cite, and share your research sources.

首先,Zotero 是一个活跃的开源软件,代码托管在 [Github][2] 上;其次,它是一个文献管理软件,可以导入 PDF 文件。导入 PDF 时,具有神奇的 PDF 元数据搜索能力,对于已经出版的论文,结果很令人满意;最后,它是一个知识管理软件,你可以:

  • 收集信息。
    • 使用 Firefox、Chrome、Safari 插件,随手收藏喜欢的网页,包含网页的快照(个人非常喜欢这个功能)
    • 对于配置了 Translator 的网页,可以抓取网页中的信息添加到 Zotero 的数据库中。
  • 组织信息。
    • 为条目增加分组。
    • 为条目增加标签。
  • 在线同步。
  • 多用户协作。

插件 Zotfile

[Zotfile][3] 是针对 Zotero for Firefox 的一个插件,可以添加附件、重命名 Zotero 库中的 PDF 文件以及将附件复制到指定的文件夹。

根据条目信息重命名 pdf 文件的功能非常实用

注意: Zotfile 暂时还不支持 Zotero 4.0,想要使用 Zotfile 得下载 Zotero 3.0 for Firefox。

与 Evernote 的对比

月初因为 Evernote 的流量超了,所以购买了一个月的高级用户。对于高级用户的各种功能整体上非常满意(特别是每日都有很多笔记进账的成就感),所以打算继续购买。但是在使用了 Zotero 之后,不禁要重新考虑一下。以下是我对两者进行的比较:

比较方面 Zotero Evernote
采集 支持 Chrome、Safari 和 Firefox;</br>针对[部分网站][4]有数据收集功能;</br>针对文献,可以下载 PDF 全文; 支持 Chrome、Safari 和 Firefox;</br>[悦读][5]插件好用;
使用 只支持标签的搜索,全文搜索需要借助其他工具; 提供全文搜索;</br>高级版提供 PDF 的 OCR 功能;
费用 100M的免费空间;</br>可以将文件保存到 Dropbox; 免费用户每月提供 60M 免费上传流量;</br>高级用户每月 5$( 年费为 45$):</br><li>上传流量增加为 1G;</li><li>移动端离线查看;</li>
问题 需要使用第三方的同步工具,比较麻烦;</br>同一个网站的多个快照不能共享相同的文件,相同的文件被保存了多份,占空间;</br>笔记的编写不能定制字体; 无法编辑 HTML 文件,导致收藏的网页有时不够美观;</br>不能使用 Markdown;</br>需要每月 5$ 的费用;

在比较之后的感受是,Zotero 和 Evernote 是两个侧重方面不同的软件:

  • Zotero 更侧重于文献和网页的采集,而 Evernote 则更侧重于用户的自由编写。
  • Zotero 专注于信息的整理,做好一个辅助研究的工具,而 Evernote 则更倾向于成为使用者输出内容的主力。

结论是:在网页和文献的收集方面可以侧重于使用 Zotero,在输出信息或者策划活动时还得依靠 Evernote。

结论

作为一个开源软件,Zotero 竟然能做到如此贴心好用,非常值得一试,也许你也会像我一样,对它爱不释手。

更多信息

关于软件的介绍总是写得不够具体,不够明白,自己还需要多加练习才行。更多信息可以参考 [阳志平][6] 的几篇博客以及其中提到的一些链接:

  • [Zotero(1):文献管理软件Zotero基础及进阶示范][7]
  • [Zotero(2):作为知识管理工具的Zotero][8]
  • [Zotero(3):平板与社交:再谈研究辅助工具Zotero兼配套APP][9]
  • [Zotero(4):Zotero之Zotfile插件的使用][10] [1]: http://www.zotero.org/ [2]: https://github.com/zotero/zotero [3]: http://www.columbia.edu/~jpl2136/zotfile.html [4]: https://github.com/zotero/translators [5]: http://www.yinxiang.com/clearly/ [6]: http://www.yangzhiping.com/ [7]: http://www.yangzhiping.com/tech/zotero1.html [8]: http://www.yangzhiping.com/tech/zotero2.html [9]: http://www.yangzhiping.com/tech/zotero3.html [10]: http://www.yangzhiping.com/tech/zotero4.html

OS X 10.9 Mavericks 下使用 rbenv

rbenv

rvm 换到 rbenv 的原因

使用 Octopress 一段时间了,一直使用 rvm 进行 Ruby 和 gem 的版本管理。直到最近了解到 rbenv ,才知道 rvm 不是唯一选择。

rbenv 的实现非常简洁(没有搞懂 rvm 是什么原理),简洁到作者在用几段话就说明白了。

删除 rvm

使用这条命令删除 rvm 相关的文件:

$ rvm implode

如果有文件因为权限的问题无法删除,就 sudo 删除一下。

$ sudo rm -rf .rvm

在 OS X 10.9 Mavericks 下如何安装和使用 rbenv:

  • 因为从 Xcode 5.0 开始,不再默认将头文件放在 /usr/include 中,所以在编译的过程中需要特殊指定头文件的位置,或者安装 Command Line Tools。这里推荐安装 Command Line Tools:

    ``` sudo xcode-select --reset ```
  • 安装 rbenv:

    ``` brew update brew install rbenv ```
  • 将 rbenv 初始化命令放入 .zshrc 或者其他终端启动执行的文件:

    ``` echo 'eval "$(rbenv init -)"' >> ~/.zshrc source ~/.zshrc ```
  • 安装 ruby-build 和 rbenv-gem-rehash:

    ``` brew install rbenv-gem-rehash brew install ruby-build ```
  • 安装指定版本的 ruby:

    ``` CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --without-tcl --without-tk" rbenv install 2.0.0-p195 ```

__注意:__如果你需要安装 1.9.3 以前版本的 Ruby(比如说 1.9.3-p0),可能需要安装 apple-gcc42:

brew tap homebrew/dupes
brew install apple-gcc42

然后建立软连接之类的,自行搜索吧(不知道具体从 1.9.3-p 多少开始可以使用 llvm 编译,尝试 install 就会有相关的提示)。

参考链接

  1. switching from rvm to rbenv
  2. Installing Ruby on OS X 10.9 Mavericks using Rbenv
  3. Using rbenv to manage rubies and gems

PPI vs. DPI: 有什么区别?

image-0

Photoshop 新建图像窗口中 Resolution(解析度)这个参数我一直不明白,刚好又被问到了这个问题,所以就搜了一下。搜索到的中文内容看得我一头雾水,倒是这篇英文,通读了几遍,觉得自己搞清楚了,顺带就翻译了一下,搞清楚文中的更多细节。

翻译的文章:PPI vs. DPI: what’s the difference?

如果你制作过打印出来的设计,使用过 Photoshop 或者其他修图软件,你一定遇到过这两个名词—— DPI(dots per inch)和/或 PPI(pixels per inch)。更有可能的是,你被不懂这些名词意义的客户问到过一些让人疑惑的关于 DPI 或 PPI 的问题。在你抱怨之前,不妨停下来发问:你自己对这些名词了解多少?

image-1 Adobe Phtoshop(左侧)提到 PPI 时使用的是 “pixels per inch”,但是在接下来的内容里我们会看到,“Resolution”这个词的用法仍然让人误解;Apple Preview(右侧)使用 DPI 来代表实际上的 PPI,让人误解。

在 DPI/PPI 问题上感到不知所措一点也不难堪;因为这个世界正在尽人类想象所能地使其变得难懂。在众多原因中,有一个原因起了主要的作用,那就是有一些人在使用这两个名词时,实际上指代的是完全不同的东西。但是,不必担心:在这个短文的结尾,你就能完全理解这两个名词,并让你感到足够来回答将来的客户。

Pixels Per Inch(PPI)

我们从这里开始是因为,如果你是一个设计师,你首要关心的内容将是 PPI。DPI,我们在后面会讨论,指的是打印设备的一个技术指标,这并不直接关系到你——这是打印店的领域。现在,可以这样说吧,当人们提到“DPI”时,他们实际上指的是“PPI”——实在是太多了,所以这就变成了一种你必须容忍的约定俗成(Apple,Microsoft 和 Adobe 对于这种误用都有责任)。重要的是,当别人使用 DPI 时,你能够分辨指的是真正的 DPI 还是 实际上的 PPI。阅读接下来的内容,你就会明白。

PPI 的数字基础

首先,什么是 pixel?这看起来是个原始的概念,但是很多误解都是从这里开始的。Pixel 表示的是“图片的元素”。它是人眼可分辨的电子显示设备的最小物理组成部分。足够靠近你显示屏上的图片你就会看到他们:一排一排的小方块。换句话说,他们也是一个电子图片的最小可寻址单元。

image-2 这张图中的方块代表 pixel。当你足够靠近相当低像素的图片时,你可以看到类似的东西。图片来自 PistoCasero

实际上,这些 pixel 是由一些“sub-pixel”组成的——红色,绿色和蓝色的光学元件。肉眼无法看到这些元素是因为累加颜色的过程将这些“sub-pixel”混合为一个单一的色调,并呈现为一个 pixel。但是这些内容并不和设计师直接相关。

__困惑点:__可悲的是,一些生产厂商将这些 sub-pixel 描述为“dot”,因为这些 sub-pixel 和打印机中的 CMYK dot 相似,工作方式相同,但是是抵消光源的过程(后文详述)。然后,这些厂商开始吹嘘他们显示屏幕的“DPI”。如果你看到这些,请无视!这是一种令人恼怒的名词误用,也很有可能“击倒”你。

image-3 这两张图给你了一个物理或者机械上对于 pixel 本质的认识,向你展示了红色、绿色和蓝色的 sub-pixel 的光学元件。左侧是一个巨大 LED 显示屏的 pixel 阵列(来自 BruceTurner);右侧是一个 iPad 4 屏幕的超近距离照片(来自 citoki0815

需要注意的是,pixel 是一个固定大小的物理物体(尽管还没有一个标准;不同的设备的 pixel 有着不同的形状和尺寸,已知最小的只有11¼ μm)。因此,一个屏幕上的 PPI 是固定的——不是你在某个地方输入一个新的数字就能够更改的。大部显示器都是 66 - 130ppi。

image-4 上面所示的方块是在被缩放为 100% 时的 200 x 200 pixel 的方块。查看你显示器的 PPI,可以把你的显示器也缩放为 100%, 然后量正方形的长和高。用 200 除以长和高就是显示的水平和垂直 PPI。

这是什么意思?__如果你只是在一个屏幕上看图片,屏幕的 PPI 并不重要,因为你屏幕的 PPI 已经是确定的了。__所以,下一次有人告诉你向一个网站上传一个 72ppi 的图片(因为 72ppi 是“网络的解析率”)时,你可以告诉他们,他们增加了一个可笑的额外步骤。除非他们关心网站的访问者可能将图片拷贝出去并打印出来,否则 PPI 无关紧要。一个 72ppi 的图片和一个 3000ppi 的图片在屏幕上是一样的。

需要了解的内容:PPI 和打印的目标

所以我们现在知道了:只有要打印出来时,设定 PPI 才有效——将数字化的图片转化为非数字化的图片的转变过程。“但是,等一等”你说,“我们讨论的是每英寸有多少个 pixel,但是打印纸没有 pixel 啊!”对,这很让人困惑。请继续读。

在打印的过程中,所有在屏幕上组成图片的物理 pixel 都被转换成不同色调的小正方形。显而易见的是,纸上没有发光设备意义上的 pixel,而是更加抽象意义的一个方块形元素的“pixel”(这里为了以示区分,这种“pixel”以引号标注)。

image-5 Yuriy Babich 的艺术品使用一种粗糙的、打印出来的“pixel”样式的来显示出抽象的效果(来自 Укларочить

这是什么意思?纸上的“pixel”没有固定的大小。如果你增加图片的大小 300%,那么纸上的“pixel”就会增大三倍,结果就是一个更大,而且看上去更加模糊的图像。

你要如何增加或者减小输出图像的大小呢?通过调节 PPI 的数值。

假设你有一个 300 x 300 pixel 的图像。如果你设定 PPI 为10,那么图像将会相对非常大:将会是 30 x 30 inch。如果你设定 PPI 为 300,那么打印出来将会非常小:每英寸 300 个 pixel,纸张将会是 1 x 1 inch。这回合理了?

__简单来说: 对于最终的打印输出而言,将 PPI 输入认为是一种调节物理大小的方式,而不是分辨率。__减少 PPI,相应的就增大了打印出的大小,输出的图片看上去质量也比较差,因为“pixel”也更大更可见。到那时记住,这只是一种相对的标准;如果你站的足够远,图片又会和原来一样清楚。图像的绝对分辨率并没有改变;还是有和原来一样多的“pixel”。所以,增加一个图像的分辨率的方式是让图像拥有更多额外的 pixel,而不是增加 PPI。

__注意:__简单地扩大一个图像的 pixel 数目通常不是增加质量的一个好方法,因为计算机将会用奇怪的像素塞满整幅图像。

image-6 凑近仔细看这个广告牌,像素清晰可见(上面的 dot 也一样,接下来会进一步讨论 dot)。但是在一定距离之外的路人看到它时,会觉得这张图片很清楚(来自 Friction NYC

Dots Per Inch (DPI )

这个章节会很短,因为如果你是一个设计师,DPI 基本上不会困扰到你。但是,这也是一个需要理解的重要概念。

image-7 这是来自 Nick Sherman 的一张图片,其标题为 “Bits of Bits”,展示了一幅使用了低 DPI 的低分辨率的图片,很好的说明了 PPI 和 DPI 的概念。

打印机不能通过纸上通过叠加像素的方式重现一张图片。取而代之的方式是通过散出4种颜色(青色,品红,黄色和黑色,即Cyan, Magenta, Yellow and Black,简称为CMYK)组合(通过减色模型可以得到一定范围的色调)的 dot 来重现一幅图像。这些 dot 之间一定会有空隙,而这就是 DPI 所描述的:它们的密度。

image-8 左侧的图片说明了一个打印机是如何使用 dot 重组一幅图片的;右侧的图片是打印出的 dot 的近距离观看,很有可能是在很低的 DPI 的情况下(两幅均来自 Wikipedia)。

比如说,你以 600 dpi 来打印一幅 150ppi 的图像,那么每个“pixel”将会包括16个 dot(600 dot/150 “pixel” = 4 x 4 / “pixel”)。

客户关心这个是因为,根据经验来说,DPI 越高,图像的色调和颜色混合的平滑程度就越好(但是同时也需要使用更多的抹灰和花费更长的时间打印,所以在家庭打印的时候要注意这一点)。150dpi 通常被认为是图书杂志这类高质量摄影制品的最低标准。报纸通常使用 85dpi 并且结果也很明显:独立的 dot 可见,而且丢失了一些细节。广告版通常使用的是 45dpi,因为你通常在很远的地方看,所以无法分辨。通常来说,dot 矩阵打印机可打印的 dpi 范围为 60 - 90,喷墨打印机的 dpi 范围为 300 - 600,而激光打印机为 600 - 1800。

__注意:__更高的 dpi 也不一定等统一更好的质量,因为 dot 的大小和形状并没有标准,这几意味着一个厂商的 1200dpi 可能和另一个厂商的 700 dpi 效果相同。但是总之,这不是你的问题。

__简而言之:__DPI 只是打印机的技术参数,就像是你电脑显示器的 pixel 分辨率。作为一个设计师,你无法控制这个参数。你所能只的就是向你的用户推荐一个专业的打印店,并且了解这个店设备的参数,并使用这些参数。

关于 PPI vs. DPI 是否还有其他的问题或者指点?

相关文章:

History of the polka dot: art, the cosmos and graphic design

Correct file formats: RGB and CMYK

99designs glossary for contest holders and designers

新相机 —— GF5

GF5

今年的7月24日是我的24岁生日,买了我人生的第一部相机—— GF5。

记录生活

人是很健忘的,昨天去家附近很久没有去的游泳馆,只是感觉到一点点熟悉,曾经这里发生的故事和结识的朋友都已经完全模糊了。

如果生活缺少了记录,我们要如何知道自己是谁,曾经做了些什么,有过什么样的梦想,将要去向何方?记录生活就像是为岁月刻下印记,记录过了,你才终于可以完全放下遗忘的包袱,尽情地出发。

年初换手机很大一部分原因是想要一个好用的摄像头,能随时随地地记录我的生活。一直向往一台单反,但是心里也有诸多的抵触,向往是因为对于物的喜爱,抵触一部分是因为个头太大,携带不方便,还有被认为装B的嫌疑,另一部分是因为害怕本末倒置,本该注重生活本身,却过于追求记录。

买 GF5 我也没经过太多的比较,一方面预算比较有限,一方面对于参数的比较也有点疲了,买最新款的肯定没有错,如果天天盯着性价比,盯着这个功能,那个功能的,就又沦为了比较的奴隶,忘了自己为什么要买个相机。作为一个微单,它还是可以换镜头的,待学习一段时间的摄影,有了一些预算,可以再买几个实用的镜头。

学习摄影

想要拍出好的照片,甚至是清晰的照片,都需要学习摄影的知识,了解基本的成像原理。学习的过程中我发现,学习摄影和计算机有些不同,计算机方面的知识很容在实践中掌握内在的规律,但是相机是个不能拆开的黑盒子,想要轻易地知道咔嚓一声的背后发生了什么有点困难。

作为一个喜欢刨根问底的程序员,找不到一本说得特别明白的摄影书很让我苦恼,大部分我看到的书都在讲怎么构图之类的高级的主题,而对于成像的原理说明得很少,大概是写书人觉得这些内容太过于简单了吧。但是同时,摄影中的名词和规律相比计算机要少,哪怕一个名词理解个几天,个把月也都弄清楚了,而且进步立竿见影,拍出来就看到了,不必等待用户的反馈。

美不要理论

虽然摄影需要学习技巧,但是好照片居然是不需要任何理论和技巧的。一张好的照片给人的冲击就像是一则寓言,久久凝视,就能给人感动,让人好奇,渴望追随,找回初心。

人与人成长的环境不同,资质也有所差异,所以在面对我和别人取得成绩上的差距时,我也多了一份从容。

Mike Matas 的照片实在是太美了,值得去看一看。

PS: 附上两张在北京海洋馆拍的样张

1

2

- EOF -

常用的 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 -