Yi's Blog

胸中有丘壑,眼里存山河

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,有些快捷键的淡忘了。

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

``` sh 我的VIM配置文件 inoremap inoremap inoremap inoremap

nmap :bp nmap :bn nmap :bd

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 -