优化数据库,解决 Evernote 越用越慢的问题

我的 Evernote 中积攒了 1200+ 的笔记条目,最近发现使用速度越来越慢,没法忍受了。于是 Google 到一个解决方法,开启 Evernote Debug 模式优化数据库,介绍如下:

1,首先备份 Evernote 数据库(*.exb文件),在”工具” -> “选项”中可以看到路径,WinXP 路径默认在

C:\Documents and Settings\Administrator\Local Settings\Application Data\Evernote\Evernote\Databases

并确认 Evernote 已经升级到最新,目前是 v4.5.6。

2,退出 Evernote,从任务管理器清理掉所有与 Evernote 相关的进程。

3,在 Evernote 程序安装路径进入 DOS 命令行,运行 "evernote /debugmenu",Win7 下也可以开始菜单直接输入这个命令。

4,Evernote 的 Debug 模式会多出来一个菜单,执行”优化数据库”,此后要等上一段时间,优化完后发现在笔记间切换速度,搜索速度的确能够提升不少:)

退出程序,下一次正常启动 Evernote 就好了。

留下评论

《时间旅行者的妻子》(全) – txt电子书下载

早就看过这本小说,挺感动的。后来一直想收藏电子版,无奈网上流传的txt只有半本,就自己动手了。

《时间旅行者的妻子》(全) txt html下载预览

附目录和序章:

《时间旅行者的妻子》

美 奥德丽·尼芬格著

内容简介

相遇那年,她六岁,他三十六岁;
结婚那年,她二十三岁,他三十一岁;
离别后再度重逢时,她八十二岁,他四十三岁……

如果生命是一场旅行,亨利的旅程肯定比常人的更加迂回,患有慢性时间错位症的他,会不知不觉地游离在时间之间。他以为他在二十八岁时是第一次遇到二十岁的克莱尔,而克莱尔却说:“我从小就认识你了”;和克莱尔结婚多年后,亨利又突然发现自己回到了童年,而这次遇见的却是六岁的克莱尔。

因为那些不由自主地消失,亨利会亲眼目睹幼小的自己一遍遍遭遇那些过往,而他却只能旁观、重复品味那些快乐、悲伤和痛苦。可是在时间的正常旅途中行走的克莱尔呢?她被丈夫远远抛在了后面,焦急地渴望着爱人能早一天回到身边。克莱尔虽然拥有时间,却只能通过捉摸亨利,来触摸时间。

是什么过滤着这一对恋人炙热的爱意,又是什么推动他们在复杂交错中的命运中勇敢地探索,终于让时间在爱面前也变得微不足道了?

这是一曲高昂的爱的颂歌,是一程常人不可思议的浪漫之旅。这像是一本科幻小说,却洋溢着浓浓的诗意。这像是一本爱情小说,却饱含了信念与时空的哲理。

这让人想起文学大师马尔克斯的巨著《霍乱时期的爱情》,书中的男主人公历经战乱和瘟疫,在长达半个世纪的时间里,痴情等待他深爱女子的感人故事。

“奥德丽·尼芬格和马尔克斯一样,他们试图告诉我们,在如此崇高的爱情里,没有悲剧可言,也永远不会被任何限制所困。”——《华盛顿邮报》

目录

第一章 脱离时间的男人

  • 初次约会(上)
  • 一切的第一次
  • 初次约会(下)
  • 生存能力课
  • 结局以后
  • 圣诞夜(一) 总是在同一辆汽车里遇难
  • 圣诞夜(二)
  • 吃或者被吃
  • 圣诞夜(三)
  • 家就是你最羞愧的地方
  • 生日
  • 化学创造美好生活
  • 转折点
  • 让我准时进教堂吧

第二章 一碗牛奶中的一滴红血

  • 婚后生活
  • 图书馆里的科幻小说
  • 一只很小的鞋子
  • 间奏曲
  • 新年之夜(上)
  • 婴儿梦
  • 介绍一下,爱尔芭
  • 诞生之日
  • 秘密
  • 经历技术难题
  • 静物
  • 生日
  • 秘密
  • 门罗街停车库里的插曲
  • 生曰
  • 不愉快的场面
  • 门罗街停车库里的插曲
  • 零星的片段
  • 关于脚的梦
  • 种什么因,得什么果
  • 即使不是几天,也是几小时
  • 新年之夜(下)

第三章 思念的协议

  • 幻灭
  • DASEIN
  • 重生
  • 总会有再一次

“钟摆上的时间只是我们的银行经理,
税务官,和警局督察;
而内在的时间则是我们的妻子。”

——普力斯特莱①《人类与时间》

①普力斯特莱(J. B. Priestley, 1894-1984),英国剧作家、小说家。——本书注释均为译注。

爱复爱

有朝一日,
你会心情振奋,
欢迎自己来到
自己门前,进入自己的镜子,
彼此报以微笑,

说:坐这儿。吃吧。
你将再度爱上那曾是你自己的陌生人。
给酒。给面包。把你的心还给
它自己,还给那爱了你一辈子的
陌生人;你忽视了他,

而去注意别人;他深知你。
从书架上取下情书、
照片、绝望的笔记来,
从镜子上剥下你自己的影像。
坐,饱餐你的生命吧!

——沃尔科特①

①沃尔科特(Derek Walcotte, 1930-),1992年诺贝尔文学奖得主。此《爱复爱》选自《德瑞克·沃尔科特诗选》,傅浩译,河北教育出版社,2004年1月版

献给

伊丽莎白·希尔曼·塔曼多
生于1915年5月20日,卒于1986年12月18曰
以及
诺伯特·查尔斯·塔曼多
生于1915年2月11曰,卒于1957年5月23日

克莱尔:被丢下的感觉真艰难。我等着亨利,不知道他在哪儿,不知道他一切可好。做等待的一方,真艰难。

我尽量让自己充实。那样时间会过得快一些。

我独自一人入睡,独自一人醒来。我经常走动。我工作到精疲力竭。我注视被一整个冬天的积雪覆盖的垃圾,随风飞舞。除非你停下来想这件事情,否则一切都依旧单纯。为何缺席总让爱意更浓?

很久以前,男人们出海,女人们为之守候,伫立海边,搜寻天际的轻舟。现在,我等着亨利。没有任何预兆,他就这么不情愿地消失了。等待的每分每秒,都仿佛经年累月般漫长。每个微小的时刻,如同玻璃沙漏里的细沙,缓慢而透明,每个微小的时刻,我都能看见,它们无穷无尽,汇聚成漫长的等待。但为何他的离去,我总无法相随?

亨利:感觉如何?感觉如何?

有时,像是瞬间的走神,接下来,你突然意识到捧在手中的书、红色棉布格子衬衫和上面的白色纽扣;意识到挚爱的黑色牛仔裤、栗色的就要磨破的袜跟;意识到起居室、厨房里即将鸣笛的水壶:所有的一切瞬间幻灭了。只剩下你像只赤裸的松鸦,独自兀立在乡间无名沟渠的齐踝的冰水中。你等了一分钟,或许还能突然重返书边,重返你的家之类的地方,经过大约五分钟的咒骂、颤抖和想让自己立即消失的绝望,你开始漫无目的地前行,而最后总会遇见一座农舍,那时,你可以选择偷窃或选择解释。偷窃有时会让你被捕,解释则更加冗长无味,因为解释免不了说谎,有时同样会锒铛入狱。天下还有更倒霉的事么?

就算躺在床上半梦半醒,有时也感到自己猝然站立,你听见血液涌进大脑,体验坠落时晕眩般的刺激,犹如芒刺在背,随即,手脚也没了知觉,你又一次不知身在何处了。即使稍纵即逝,你觉得应该有时机抓住些什么,你的手臂也曾用力挥舞过(结果往往伤了自己,或损坏了房间里的贵重器物),然后你就滑到一九八一年八月六日星期一清晨四点十六分,滑到俄亥俄州雅典市第六汽车旅馆那铺着深绿色地毯的走廊上。你的头一下子撞到某扇房门,于是里面的客人——一位来自费城的蒂娜,舒曼女士,开门后一阵尖叫,因为一个裸体男人正晕倒在她的脚下。你终于被一阵吵闹搅醒,却发现自己躺在郡立医院的病房里,门外一名警察正用他破旧的、充满杂音的晶体管收音机,收听费城人队的棒球赛事。老天开眼,你又被抛回无意识中,数小时后再度醒来,回到了自己的床上。妻子正探身看着你,眼神中充满焦虑。

有时,你满心欣喜,身边的一切都庄严壮观,金光笼罩,而转眼间,你又极度恶心,突然离去。你被抛在郊外的天竺葵地里,或是你父亲的网球鞋上,或是三天前卫生间的地板上,或是一九〇三年前后伊利诺伊州橡树公园里铺满木板的小道上,或是一九五几年某个晴朗秋天的网球场上,或是在各种可能的时间和地点里你自己赤裸的双脚上。

感觉如何呢?

它像极了一个梦:你突然想要裸体去参加一场你从没有修过的学科考试,而当你出门时,钱包却忘在家里了。

一旦我去了那儿,就立即被扭曲成一个绝望的自我。我成为一个窃贼、流浪汉,成为一只终日奔跑躲藏的动物。老太太被我吓倒,孩子们惊讶不已,我是一个恶作剧,我是终极幻影,我难以想象自己是一个真实的人。

是否存在一种逻辑,一种规则,掌控着我所有的来去往复、所有的时空挪移呢?是否存在一种方法,能够让我原地不动,让每个细胞都拥抱这当下的时刻?我不知道。也有一些线索,正如所有的疾病存在各种类型和各种可能:过度劳累、嘈杂声音、压力、突然的起立、泛光灯——任何一件都有可能诱发下一场故事。可是,我也许正在我们的大床上翻阅周日版的《芝加哥太阳报》,手握咖啡杯,一旁的克莱尔偎依在我身上打盹,突然,我来到了一九七六年,目睹十三岁的自己在祖父的草坪上锄草。这样的情节,有的只能维持片刻,那情形如同在汽车里收听广播时,费力地搜寻锁定某个频道。有时,我发觉自己被抛进人群里面、观众之间、暴民当中;同样有时,我发现自己独自一人落在田野里、房间里,出现在车上、海滩上,还有深更半夜的中学教室里。我害怕发现自己出没在监狱、异常拥挤的电梯和高速公路,我莫名其妙的来临,我裸露的身体,叫我如何解释得清楚。我从来带不上任何东西,没有衣服,没有钱,没有身份证。时空逗留的大部分时间里,我都在寻找遮羞的衣物,东躲西藏。幸运的是,我不戴眼镜。

令人啼笑皆非,是的,我所有的爱好都是居家的:舒适的扶手躺椅、平静家庭生活中的点点激动。我需要的一切都只是卑微的快乐:枕畔的ー本探险小说、克莱尔金红色秀发沐浴后湿湿的幽香、朋友度假中寄来的明信片、融化进咖啡里的奶油、克莱尔乳峰下那抹娇嫩的肌肤、厨房桌子上对称的两个等待被拆的食品袋,我爱等到阅览者们全部回家后,信步走在图书馆的书堆之间,轻手划过列列书脊。当我被时间随意摆布,我对它们的思念犹如针尖一样刺骨。

克莱尔,总是克莱尔,清晨克莱尔睡眼惺忪、面容紧皱;工作时克莱尔把双臂伸进纸浆大桶里,拉出模具,这样那样地搅动,搓揉着造纸纤维;看书时克莱尔的长发披散在椅子靠背上;临睡前克莱尔用精油“噼噼啪啪”地按揉摩擦。克莱尔低柔的声音总在我耳畔萦绕。

我不想呆在没有她的时空里。但我总是不停地离去,而她却不能相随。

, , ,

2条评论

在 wordpress.com 博客中使用半角引号

插入代码时发现 WordPress 会自动把引号改成全角的,且网上的解决办法(修改formatting.php设置)只是针对自建 WordPress 博客的,托管在 wordpress.com 上的博客没法这么改动。

只好曲线救国,用 <pre> 实现半角,但之后发现又出现了不能换行的问题,结果再用 CSS 属性弥补之。折腾一小番,临时解决办法如下:文章编辑时切换进入 HTML 编辑模式,用 <pre> 包裹插入的代码并设好 white-space:pre-wrap 属性,像下面这样就可以了。

<pre style="font-family: 'Courier New'; white-space: pre-wrap;"><span style="color: #ff8000;">6.8</span><span style="color: #000080;"><strong>.</strong></span> Functional Programming <span style="color: #ff8000;">6.8</span><span style="color: #000080;"><strong>.</strong></span><span style="color: #ff8000;">1.</span> 对一个Enumerable对象应用一个函数 Applying a Function to an Enumerable
...
...
...
</pre>

附:

CSS white-space 属性

定义和用法

white-space 属性设置如何处理元素内的空白。

这个属性声明建立布局过程中如何处理元素中的空白符。值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的。

默认值: normal
继承性: yes
版本: CSS1
JavaScript 语法: object.style.whiteSpace=”pre”

浏览器支持

所有浏览器都支持 white-space 属性。

注释:任何的版本的 Internet Explorer (包括 IE8)都不支持属性值 “inherit”。

可能的值

描述
normal 默认。空白会被浏览器忽略。
pre 空白会被浏览器保留。其行为方式类似 HTML 中的 <pre> 标签。
nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止。
pre-wrap 保留空白符序列,但是正常地进行换行。
pre-line 合并空白符序列,但是保留换行符。
inherit 规定应该从父元素继承 white-space 属性的值。

,

留下评论

Ruby中的函数式编程

摘自 <The Ruby Programming Language>,最近学习Ruby,于是结合着中英文版的这书把<函数式编程>章节敲出来了。

6.8. Functional Programming
6.8.1. 对一个Enumerable对象应用一个函数 Applying a Function to an Enumerable

map和inject是Enumerable类定义的两个最重要的迭代器,它们都需要一个代码块。如果用以函数为中心的方式编写程序,我们会喜欢那些可以让函数应用到Enumerable对象上的方法:

# This module defines methods and operators for functional programming.
module Functional
  # Apply this function to each element of the specified Enumerable,
  # returning an array of results. This is the reverse of Enumerable.map.
  # Use | as an operator alias. Read "|" as "over" or "applied over".
  #
  # Example:
  #   a = [[1,2],[3,4]]
  #   sum = lambda {|x,y| x+y}
  #   sums = sum|a   # => [3,7]
  def apply(enum)
    enum.map &self
  end
  alias | apply

  # Use this function to "reduce" an enumerable to a single quantity.
  # This is the inverse of Enumerable.inject.
  # Use <= as an operator alias.
  # Mnemonic: <= looks like a needle for injections
  # Example:
  #   data = [1,2,3,4]
  #   sum = lambda {|x,y| x+y}
  #   total = sum<=data   # => 10
  def reduce(enum)
    enum.inject &self
  end
  alias <= reduce
end

# Add these functional programming methods to Proc and Method classes.
class Proc; include Functional; end
class Method; include Functional; end

注意,我们是在Functional模块中定义方法,然后把这个模块包含(include)在Proc和Method类中,这样apply和reduce方法就可以用在proc和lambda对象上。后面的绝大多数方法仍然定义在Functional模块中,因此它们也可以被Proc和Method对象使用。

有了上面定义的apply和reduce方法,我们可以重构下面的统计方法:

sum = lambda {|x,y| x+}        # A function to add two numbers
mean = (sum<=a)/a.size           # Or sum.reduce(a) or a.inject(&sum)
deviation = lambda {|x| x-mean } # Function to compute difference from mean
square = lambda {|x| x*}       # Function to square a number
standardDeviation = Math.sqrt((sum<=square|(deviation|a))/(a.size-1))

值得注意的是,最后一行尽管很简洁,但是那些非标准的操作符使得它难以阅读。还要注意|符是我们自己定义的,它是左连接的,因此,上面的代码要在一个Enumerable对象上应用多个函数,则须要使用圆括号。
也就是说,必须使用 square|(deviation|a),而不能使用 square|deviation|a。

6.8.2. 复合函数 Composing Functions

如果有两个函数f、g,有时我们会希望定义一个新函数 h=f(g()),它也可被称为f由g复合。
我们可以用一个方法自动进行函数复合,其代码如下:

module Functional
  # Return a new lambda that computes self[f[args]].
  # Use * as an operator alias for compose.
  # Examples, using the * alias for this method.
  #
  # f = lambda {|x| x*x }
  # g = lambda {|x| x+1 }
  # (f*g)[2]   # => 9
  # (g*f)[2]   # => 5
  #
  # def polar(x,y)
  #   [Math.hypot(y,x), Math.atan2(y,x)]
  # end
  # def cartesian(magnitude, angle)
  #   [magnitude*Math.cos(angle), magnitude*Math.sin(angle)]
  # end
  # p,c = method :polar, method :cartesian
  # (c*p)[3,4]  # => [3,4]
  #
  def compose(f)
    if self.respond_to?(:arity) && self.arity == 1
      lambda {|*args| self[f[*args]] }
    else
      lambda {|*args| self[*f[*args]] }
    end
  end
  # * is the natural operator for function composition.
  alias * compose
end

示例中的注释演示了如何对Method对象和lambda使用compose方法。我们可以用这个新的*函数复合操作符来简化标准差的计算。仍然使用上面定义的sum、square和deviation,标准差的计算变为:

standardDeviation = Math.sqrt((sum<=square*deviation|a)/(a.size-1))

区别在于在square和deviation应用到数组a之前,我们先将它们复合成单个函数。

6.8.3. 局部应用函数 Partially Applying Functions

在函数式编程中,局部应用是指用一个函数和部分参数值产生一个新的函数,这个函数等价于用某些固定参数调用原有的函数。例如:

product = lambda {|x, y| x*}       # A function of two arguments
double = lambda {|x| product(2,x) }  # Apply one argument

局部应用可以用Functional模块中的方法(和操作符)进行简化:

module Functional
  #
  # Return a lambda equivalent to this one with one or more initial
  # arguments applied. When only a single argument
  # is being specified, the >> alias may be simpler to use.
  # Example:
  #   product = lambda {|x,y| x*y}
  #   doubler = lambda >> 2
  #
  def apply_head(*first)
    lambda {|*rest| self[*first.concat(rest)]}
  end
  #
  # Return a lambda equivalent to this one with one or more final arguments
  # applied. When only a single argument is being specified,
  # the << alias may be simpler.
  # Example:
  #  difference = lambda {|x,y| x-y }
  #  decrement = difference << 1
  #
  def apply_tail(*last)
    lambda {|*rest| self[*rest.concat(last)]}
  end
  # Here are operator alternatives for these methods. The angle brackets
  # point to the side on which the argument is shifted in.
  alias >> apply_head    # g = f >> 2 -- set first arg to 2
  alias << apply_tail    # g = f << 2 -- set last arg to 2
end

使用这些方法和操作符,可以简单地用 product>>2 来定义我们的double函数。
使用局部应用,我们使标准差计算变得更加抽象,这可以通过一个更通用的difference函数来实现:

difference = lambda {|x,y| x-}  # Compute difference of two numbers
deviation = difference<<mean      # Apply second argument

6.8.4. 缓存函数 Memoizing Functions

Memoization是函数式编程的一个术语,表示缓存函数调用的结果。如果一个函数对同样的参数输入总是返回相同的结果,另外出于某种需要我们认为这些参数会不断使用,而且执行这个函数比较消耗资源,那么memoization可能是一个有用的优化。我们可以通过下面的方法使Proc和Method对象的memoization自动化:

module Functional
  #
  # Return a new lambda that caches the results of this function and
  # only calls the function when new arguments are supplied.
  #
  def memoize
    cache = {}  # An empty cache. The lambda captures this in its closure.
    lambda {|*args|
      # notice that the hash key is the entire array of arguments!
      unless cache.has_key?(args)  # If no cached result for these args
        cache[args] = self[*args]  # Compute and cache the result
      end
      cache[args]                  # Return result from cache
    }
  end
  # A (probably unnecessary) unary + operator for memoization
  # Mnemonic: the + operator means "improved"
  alias +@ memoize        # cached_f = +f
end

下面是如何使用memoize方法或一元+操作符的例子:

# A memoized recursive factorial function
factorial = lambda {|x| return 1 if x==0; x*factorial[x-1]; }.memoize
# Or, using the unary operator syntax
factorial = +lambda {|x| return 1 if x==0; x*factorial[x-1]; }

注意这里的factorial方法是一个递归函数,它自己也会调用缓存版本的自身函数,得到最佳的缓存效果。否则,如果定义一个非缓存版本的递归函数,然后根据它定义一个缓存版本方法,优化效果就没有那么突出了:

factorial = lambda {|x| return 1 if x==0; x*factorial[x-1]; }
cached_factorial = +factorial # Recursive calls aren't cached!

6.8.5. 符号、方法和Proc Symbols, Methods, and Procs

Symbol、Method和Proc类有亲密的关系。我们已经看到method方法可以用一个Symbol对象作为参数,然后返回一个Method方法。
Ruby1.9为Symbol类增加了一个有用的to_proc方法,这个方法允许用&打头的符号作为代码块被传入到一个迭代器中。在这里,这个符号被假定为一个方法名。在用to_proc方法创建的Proc对象被调用时,它会调用第一个参数所表示的名字的方法,剩下的参数则作为参数传递给这个方法。示例如下:

# Increment an array of integers with the Fixnum.succ method
[1,2,3].map(&:succ)  # => [2,3,4]

如果不用Symbol.to_proc方法,我们会不得不更啰嗦一些:
[1,2,3].map {|n| n.succ }

Symbol.to_proc 最初是作为Ruby1.8的扩展被引入的,它通常使用如下方式实现:

class Symbol
  def to_proc
    lambda {|receiver, *args| receiver.send(self, *args)}
  end
end

这个实现使用send方法(参见第8.4.3节)来调用一个符号命名的方法。不过,也可以像下面这样做:

class Symbol
  def to_proc
    lambda {|receiver, *args| receiver.method(self)[*args]}
  end
end

除了to_proc,还能定义一些相关而且有用的工具方法,首先从Module类开始:

class Module
  # Access instance methods with array notation. Returns UnboundMethod,
  alias [] instance_method
end

这里我们为Module类的instance_method定义了一个快捷方式。注意,这个方法会返回一个UnboundMethod对象,它在绑定到一个对象前不能被调用,下面是一个使用这种新记号的例子(注意,我们可以用名字像索引一样获得一个方法!):

String[:reverse].bind("hello").call   # => "olleh"

用同样的语法糖,绑定一个无绑定的方法也可以变得简单:

class UnboundMethod
  # Allow [] as an alternative to bind. 
  alias [] bind
end

使用这里定义的别名,以及已有的用来调用方法的[]别名,上面的代码会变成:

String[:reverse]["hello"][]   # => "olleh"

第一个方括号索引一个方法,第二个方括号将它绑定,而第三个方括号则调用它。

接下来,既然我们用[]操作符来索引一个类的方法,那么就用[]=来定义一个实例方法:

class Module
  # Define a instance method with name sym and body f.
  # Example: String[:backwards] = lambda { reverse }
  def []=(sym, f)
    self.instance_eval { define_method(sym, f) }
  end
end

[]=操作符的定义有点让人费解——这是Ruby的髙级内容。
define_method是Module的私有方法,我们用instance_eval方法(Object的一个公开方法)运行一个代码块(包括一个私有方法的调用),就像它位于方法定义的模块中一样。
在第8章中我们将再次看到instance_eval和define_method方法。

让我们用新的[]=操作符定义一个新的Enumerable.average方法:

Enumerable[:average] = lambda do
  sum, n = 0.0, 0
  self.each {|x| sum += x; n += 1 }
  if n == 0
    nil
  else
    sum/n
  end
end

现在我们有了[][]=操作符,它们可以用于获得和设置一个类或模块的成员方法。我们也可以对类的单键方法做相似的事情(也包括类或模块的类方法)。任何对象都可以有单键方法,不过给Object类定义一个[]操作符有点说不通,因为已经有太多的子类已经定义了这个操作符,因此我们可以用另外一种方式,给Symbol类定义这样的操作符:

#
# Add [] and []= operators to the Symbol class for accessing and setting
# singleton methods of objects. Read : as "method" and [] as "of".
# So :m[o] reads "method m of o".
#
class Symbol
  # Return the Method of obj named by this symbol. This may be a singleton
  # method of obj (such as a class method) or an instance method defined
  # by obj.class or inherited from a superclass.
  # Examples:
  #   creator = :new[Object]  # Class method Object.new
  #   doubler = :*[2]         # * method of Fixnum 2
  #
  def [](obj)
    obj.method(self)
  end
  # Define a singleton method on object o, using Proc or Method f as its body.
  # This symbol is used as the name of the method.
  # Examples:
  #
  #  :singleton[o] = lambda { puts "this is a singleton method of o" }
  #  :class_method[String] = lambda { puts "this is a class method" }
  #
  # Note that you can't create instance methods this way. See Module.[]=
  #
  def []=(o,f)
    # We can't use self in the block below, as it is evaluated in the
    # context of a different object. So we have to assign self to a variable.
    sym = self
    # This is the object we define singleton methods on.
    eigenclass = (class << o; self end)
    # define_method is private, so we have to use instance_eval to execute it.
    eigenclass.instance_eval { define_method(sym, f) }
  end
end

通过这里定义的Symbol.[]方法,以及前面描述的Functional模块,我们可以写出如下精巧的(也是难读的)代码:

dashes = :*['-']       # Method * of '-'
puts dashes[10]        # Prints "----------"= (:+[1]*:*[2])[x]   # Another way to write y = 2*x + 1

Symbol类定义的[]=与Module类的[]=相似,都使用instance_eval调用define_method方法。不同点在于单键方法并不像实例方法一样在类中定义,而是在对象的中定义,在第7章中,我们还将见到eigenclass。

,

留下评论

摄影社区 500px.com 推荐作品打包下载

500px.com 是最近比较热门的摄影社区,作品质量相当高(比如编辑推荐页面),网站设计也是赏心悦目。我花了点时间写了脚本,把上述页面的图片批量下载了下来,总共下载了 1500+ 图片,选了个人比较喜欢的 185 张打包分享给大家。

下载 (500px.com-favs.7z, 54m) – min.us网盘 or 快盘

图片预览

, ,

一条评论

变化的位面 – 永醒者之岛

这是《变化的位面》的另一篇小说,连同刚才那篇一并识别了出来。小说写科学家为实现超人计划,操控基因制造出了不睡觉的孩子,期望他们每时每刻都学习新知识。最后实验失败了,孩子们变成了永远的梦游者,无法存在于真实的世界之中。文末关于梦境与现实的论述十分精彩:

“若一个人要成为自我,则必须同时成为虚无,若人要了解其自我,则必先了解何谓虚无。永醒者每时每刻都能感受世界,没有空闲的时间,也没有自我可以存在的空间。他们没有梦,所以不会讲故事,所以语言对他们没有用。他们没有语言,所以没有谎言,因此他们没有未来。他们只生活在此时此刻,一切触手可及。他们生活在纯粹的事实当中。但他们不能生活在真实的世界中。因为,通向真实的道路必须首先踏过谎言和梦想。”

以下正文:

变化的位面 – 永醒者之岛
厄休拉·勒奎恩

那些在二十四小时之内只需要睡眠两到三个小时的人一般都是天才,至少你听说过的这样的人都是天才,要是你没听说过的这样的人都是傻瓜,那也不用介意。失眠是天才的表现,定然如此。想想看,在那些蠢笨如牛的呆子们躺在床上鼾声如雷的时候,你能做多少工作,思考多少问题,阅读多少本书,做多少次爱呢?奧里奇位面与我们的位面有很多相似之处,但不同的是,那里有一些根本不用睡觉的人。

在奥里奇位面上一个叫做海·布里萨尔的国度中,有一群科学家相信,睡眠是一种残留的行为模式,对于低等哺乳动物来说是必要的,但对高等的人类而言则并非如此。睡眠可能会使得脆弱的猿类在夜间保持安静并避开危险,但对于文明化的生活则造成了相当的不便——就好像冬眠那么糟糕。而更糟糕的是,睡眠是对智力发展的一种阻碍——对大脑活动的反复抑制。每天晚上,睡眠都会中断大脑正在进行中的功能,粗暴地干扰连贯的想法,从而阻止人类的心智发展到其最大的潜力限度。这些奥里奇科学家的信条就是:睡眠使人愚笨。

这些科学家所属的政府非常惧怕敌国纳姆国的入侵,因此政府鼓励进行任何可能为海·布里萨尔国带来更强的武器或更强的大脑能力的研究。这些科学家的计划得到了政府的资金支持,雇用了最出色的基因工程师,还得到了二十名有生育能力的志愿者,男女各半——他们都是狂热的爱国青年。所有这些人都居住在一个封闭的基地里,科学家们开始了一个绰号为“超智能计划”的研究程序——这个绰号是全国新闻网络的记者给取的,他们非常支持这个计划。四年之后,第一批完全不需要睡觉的婴儿诞生了。(数以百万计的连眼睛都难以睁开的年轻父母也许会怀疑地表示:婴儿根本就不需要睡觉;但正常的婴儿确实会睡觉,一般是在他的父母不得不起床的时候就睡着了。) 阅读更多 »

, , ,

留下评论

变化的位面 – 季节

这是幻想小说作家厄休拉·勒奎恩的短篇作品,我非常喜欢这篇,于是从扫描的电子书中将其文字识别出来。我一直觉得,像书中描写的这样在两种状态间的迁徙,是很好的生活状态,对网络与现实的二元生活也挺有参考价值。这种主动刻意的缺失,使我们免于落入庸常之熵的陷阱。让意志聚集到一个方向,让渴求激发灵感,这是促使生命活力积极流动的势能。
以下正文:

变化的位面 – 季节
厄休拉·勒奎恩

——献给麦肯锡桥的鱼鹰,
它们的生活方式赋予了我写作此文的灵感

我曾与一位安萨老人交谈了很长时间。我是在他开设的位面旅行者宾馆里见到他的,这座宾馆坐落于安萨的“大西洋”中一座地处偏远的远离安萨人迁徙线路的大岛。近来这些日子,这里是安萨唯一一个允许其他位面游客来访的地方。

克格梅戈居住在这里,充当向导和东道主,他的工作就是向游客们略微介绍一下本地的特色,因为这个地方看起来和许多位面上的热带岛屿没什么两样——天空晴朗,微风和煦,气氛懒散,风景优美,树上长着羽毛状的叶子,金黄的沙滩,还有广阔无垠、蓝绿色的大海,以及泻湖的悬崖边那泛着白色泡沫的海浪。大多数游客来此的目的是驾驶帆船、钓鱼、捡拾贝壳、痛饮发酵的椰汁,等等。他们对这个位面上的其他地方以及他们所见到的唯一一个当地人都没什么兴趣。他们最初会看到他,而且肯定会跟他一起照相,这是因为他的样子很特别:身髙约有七英尺,瘦削、强壮、棱角分明,因为年龄的关系,他有些驼背;他的头部细长,眼睛是黑色和金色,而且又大又圆,还长着一个鸟嘴。对于那些鼻子和嘴分开的人而言,一个长着鸟嘴的人一定显得很特别,但事实上,长着鸟嘴的人对他们的看法也是一样——克格梅戈的眼睛和眉毛很清楚地揭示了他的想法。他也许已经老了,但他是一个很有激情的人。

在这些无动于衷的游客中间,他有点厌烦和寂寞,当他发现我愿意聆听他讲的事情时(当然,我不是第一个愿意听他说话的人,也不会是最后一个,但当时我是唯一的一个),他很高兴地为我讲述了他这个种群的事情。那是个悠长而柔和的夜晚,我们相对坐在深紫色的黑暗中,闪烁的星光,海浪中的发光生物,还有树叶周围的大群萤火虫照亮了我们——大杯冰镇饮料放在我们的面前。

他说,从那久远到无法记起的彼时开始,安萨人就遵循着某种存在的方式。他将这方式叫做“玛丹”——人们的行为方式、事情的解决方式、事物的存在方式、前进的方式,还有“始终”这个词里隐藏着的方式:但和我们一样,他并没有把这些含义全部说出来。“然后,我们偏离了我们的存在方式,”他说,“但是时间不长。现在,我们仍然像一直以来的那样做事。”

人们总是会告诉你,他们“一直以来都是这样做的”,然而你会发现,他们所谓的“一直以来”实际上只是一、二代人,或一、二个世纪,最多不过一、二千年。相对于人体的进化以及种族的进化,文化习惯只能维持相当短暂的时间。在我们位面上,人类一直以来都在做的事情并没有多少,大概只有寻找食物和水源、睡眠、歌唱、谈话、生儿育女,另外,这些事情综合起来也许会形成一种更重要的东西,那可以视为是人类的本质,而与我们的行为方式无关。我们发现有新的事情可做、新的行为方式可以遵循的时候,非常容易变通。我们巧妙地、独辟蹊径地、急切地寻找正确的行为方式,真正的行为方式,那种我们相信已在错综复杂的新奇事物、机会和选择中丢掉了许久的行为方式……
阅读更多 »

, , ,

一条评论

《大问题 – 简明哲学导论》附录术语表

这是《大问题 – 简明哲学导论》一书中对某些哲学概念的简要解释。我花了点时间OCR了出来。

(以汉语拼音为序)

阿渡罗式的(尼采)[Apollonian (Nictzsche)]: 艺术的理性原则;形式。

白板(tabula rasa): 洛克哲学中的术语。洛克认为心灵就像一块白板,从而与天赋观念存在的学说相对立。换句话说,心灵在人刚出生时是”空白的”,我们所知道的任何东西都必须通过经验”印上去”。

悲观主义(pessimism): 认为生活是不快乐的,而且也没有最终的目标。宽泛地说,悲观主义者是料想事情最终会最糟的人。康德(他根本不是一个悲观主义者)的追随者,19世纪的德国哲学家叔本华是历史上的悲观主义者中最重要的人物之一。

悖论(paradox): 基于表面上看没有问题的论证而得出的自相矛盾的或似乎荒谬的结论。

本体论(ontology): 对存在的研究:”什么是最真实的?””一个事物存在意味着什么?”

本体论的(ontological): 与存在的观念相关的。

本体论论证(ontological argument): 试图从”上帝”这个概念证明上帝存在的一个(或一套)论证。例如,”上帝”根据定义就是拥有各种可能的完美性的存在;存在是完美性的一种;因此上帝存在。

本真的自我(authentic self): 存在主义的一种说法,指真正的、个体的自我认同,从而与非本真的自我相区别,非本真的自我只是一个人所扮演的角色和公众的认同而已。这个词在20世纪经由马丁·海德格尔的哲学向变得盛极一时。参见本质自我。

本质自我(essencial self): 使一个人成为那个特殊的人的特征。见本真的自我。

必然真理(necessary truth): 某种既可能是另一种样子,也不可能被想像成另一种样子的事物。在哲学中,根据物理定律(比如引力定律)是”必然的”,或者根据风俗习惯(比如打击逃税的法律的”必然性”,或者饭后抽烟的必然性)是”必然的”,并不足以说明某种事物是必然的。必然性甚至不允许想像中的反例。因此,二加二得四是必然真理,我们不但对此确信不移,而且发现我们没有能力怀疑它,无论我们的想像力有多么丰富,也不可能说出它如果错了会是怎样一种情况。

辩证法(dialectic): 一种被黑格尔和马克思大加使用的哲学方法,在辩证法中,矛盾之间互相对抗以达到真理。辩证法的起源可以在古希腊哲学中找到。

不合理的(论证)[unsound (argument)]: 一种坏的论证;—个无效的或前提为假的演绎论证(或两者兼而有之)。

不可知论(agnosticism): 既不愿意相信上帝存在,也不愿意相信他不存在。理由通常是这两种看法都没有充分的证据。

不可知论者(agnostic): 接受不可知论的人。

不一致的(incoherent): 缺乏一致性;不能以一种有序的或逻辑上相容的方式搭配在一起。使用一些没有准确含义的花哨的行话也许是不一致的一个来源。随便拉一张信念的清单,而没有按照任何秩序或逻辑把它们排在一起也会出现这种情况(它们甚至可能是相互矛盾的)。一种不一致的哲学也许是富有洞见的,或者部分上正确的,但由于它永远也不可能构成一个系统,所以它看起来很可能就像是一堆胡言乱语或只言片语。还有一些时候,不一致的哲学也许是一种无法理解的哲学。它的术语完全让人摸不着头脑,它的原理只是一些凌乱的堆积,而没有明确的关联或解释。

禅宗(Zen Buddhism): 见佛教(Buddhism)。

阐释(interpretation): 一种理解的方式,从某种眼光出发去看一套事实。

超人(ubermensch): 尼采著作中的一个概念,指一个有可能在未来取代我们的卓越的人。

超验的(transcendent): 独立的。在宗教哲学中,超验的上帝与他所创造的宇宙是相分离的和迥然不同的。这与内在的上帝概念相反,比如在泛神论中,上帝是等同于他的造物的,或可举一个不同的例子,在某种形式的人本主义那里,上帝是与人类相等同的(黑格尔主张这种观点)。

沉思(的生活)[contemplation (the life)]: 按照亚里士多德(和其他哲学家)的说法,这是最幸福的生活,即是思想和哲学的生活。

承诺(commitment): 一种自愿形成的需要遵守的义务。

存在的世界(world of Being): 柏拉图形而上学中的术语,指理想中的”形式”的世界,这个世界是没有变化的,我们只能通过理性和思想来认识这个世界。

存在主义(existentialism): 20世纪的一种哲学运动,在法德两国通过海德格尔、萨特和其他一些哲学家的著作而展开。它的基本主题是人的自由和责任、既定规则的缺乏以及我们需要对自己的行动负责。 阅读更多 »

,

留下评论

2011年我听过的音乐推荐

2011年很多遗憾的事,唯独在欣赏音乐上没觉得后悔。

这一年听到的最好的专辑是 Obiymy Doschu – <Elehia>,来自乌克兰的厄运/民谣。仿佛走在空旷的海边,时间的潮水冲刷着漆黑的沉船,脚下的沙空中的云都苍白闪耀。迷蒙的雾气柔和了所有事物的分野,安详如初生,飘摇如梦境。在我心中,这张专辑的水准可以跟 <A Sombre Dance> 有一拼了,我曾以为 <A Sombre Dance> 在这世界上再不会遇见敌手。去官网查 <Elehia> 这专辑,居然还是基于CC协议免费分享的,又令我大为敬佩。最遗憾的是俄文歌词看不懂,也没找到英文翻译。

其实我更喜欢把专辑拆散了听,因为只有碎片的时间,很少能感到乐评里提到的“整张专辑的前后呼应和连贯气势”……所以回顾一下在2011年听到最好的歌曲。这一年主要听了不少金属乐,但是ACG领域音乐几乎没进展,国外主要是欧洲那些团,国内音乐人发现王三溥和钟立风很对我胃口,非常喜欢。记录最好的几曲如下——

流行金属最喜欢 Hard To Find The Words(Cinderella – <Still Climbing>),其实整张专辑没啥好听的,但就为这一首摇滚,作者写给妈妈的歌。

听到最好的森林金属是 In the Shadow of Our Pale Companion(Agalloch – <The Mantle>),阴沉忧郁的鼓点,冰冷苍凉的吉他,还有近乎温柔的黑嗓,一起勾勒出极地密林的幽黯深邃。今年玩过一个游戏《Limbo/地狱边境》跟这首曲子气质很相近。

民谣,推荐女声版的 Sternblumennacht(Anna Varney & Constance – <Nenia C’Alladhan>),歌名中文译作”紫菀之夜”,唯美浪漫的叙事音乐,编曲中反复回旋着的那个章节令人无比沉醉。这歌没找到中德对照版的lrc歌词,只好自己同步了一个,发现同步歌词也不是容易的活儿啊……还有感谢 Sopor Aeternus 的音乐伴我度过一年中最失意的时刻。

维京金,推荐 Kurzes Epos(Equilibrium – <Rekreatur>),这是战士之歌!有如在《冰与火之歌》莽莽北境中生长的人,像奔放不羁的铁乌贼,更像坚韧顽强的史塔克。我最喜欢从中间开始的那段突兀的、云开见日般的磅礴旋律,铁灰色和青色的画面中,持剑的勇士拼尽最后的力气,依然屹立于战场,他失去色彩的双眼望着天空中的Valkyrie,等待英灵之殿的召唤。

年末回顾的时候以为就这些了,但后来居然让我听到这么一首——

交响/力量:Song of Myself(Nightwish – <Imaginaerum>),虽然觉得整张专辑像糖放多了似的,但就论这一首,这首歌是关于斗志,关于失落,关于灵感的来袭与退却,关于生活的愤怒与释然。其中梦幻般的念白让我印象太深,灵魂冲出了身体,附在世人身上,以他们的耳聆听,用他们的眼观看。这灵魂历遍了世事,否定了身份,否定了牺牲,否定了未来和信仰……最终回归本真,发现当开放自己去接纳时,乞丐的心中也有昂扬的意志,罪人的心中的也有静寂的禅。

听到了这几首今年就值了。其他过耳未忘的大赞音乐还有:

渡边雅二的 Reminiscence / Memories ,和月的纯钢琴曲。听得快哭了。

钟立风的 麦田上的乌鸦,国产小清新……有朴实真诚的美。

Lunik的 Fall,国外小清新……有孤独自由的美。

王三溥的 七月 / 送别,为了逝去的人。

就想到这些了,这一年没看电影动画,很少玩游戏,想了半天,这些领域的居然一个都没有……ToT……

留下评论

《黑客与画家》摘抄

对书呆子来说,意识到学校并非全部的人生,是很重要的事情。学校是一个很奇怪的,人为设计出来的体系,一半像是无菌室,一半像是野蛮洪荒之地。它就像人生一样,里面无所不包,但又不是事物的真实样子。它只是一个暂时的过程,只要你向前看,就能超越它,哪怕现在还身处其中。
如果你觉得人生糟透了,那不是因为体内激素分泌失调(你父母相信这种说法),也不是因为人生真的糟透了(你本人相信这种说法)。那是因为你对成年人不再具有经济价值(与工业社会以前的时期相比),所以他们把你扔在学校里,一关就是好几年,根本没有真正的事情可做。任何这种类型的组织都是可怕的生存环境。你根本不需要寻找其他的原因就能解释为什么青少年是不快乐的。<P17>

我一直不喜欢“计算机科学”(computer science)这个词。主要原因是根本不存在这东西。计算机科学就像一个大杂烩,由于某些历史意外,很多不相干的领域被强行拼装在一起。这个学科的一端是纯粹的数学家,他们自称“计算机科学家”,只是为了得到国防部研究局的项目资助。中间部分是计算机博物学家,研究各种专门性的题目,比如网络数据的路由算法。另一端则是黑客,只想写出有趣的软件,对他们来说计算机只是一种表达的媒介,就像建筑师手里的混凝土,或者画家手里的颜料。所以在“计算机科学”的名下,数学家、物理学家、建筑师都不得不待在同一个系里。<P18>

编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。它应该是一支铅笔,而不是钢笔。……我们需要的是一种可以随意涂抹、擦擦改改的语言,我们不想正襟危坐,把一个盛满各种变量类型的茶杯,小心翼翼放在自己的膝盖上,为了与一丝不苟的编译器大婶交谈,努力地挑选词语,确保变量类型匹配,好让自己显得礼貌又周到。<P22>

科学界的每一个人,暗地里都相信数学家比自己聪明。……最后的结果就是科学家往往会把自己的工作尽可能弄得看上去像数学。……一页写满了数学公式的纸真是令人印象深刻啊。(小窍门:用希腊字母表示变量名会令人印象更深刻。)因此你就受到巨大的诱惑,去解决那些能够用数学公式处理的问题,而不是真正重要的问题。
如果黑客认识到自己与其他创作者——比如作家和画家——是一类人,这种诱惑对他就不起作用。作家和画家没有“对数学家的妒忌”,他们认为自己在从事与数学完全不相关的事情。我认为,黑客也是如此。<P22>

坚持一丝不苟,就能取得优秀的成果。因为那些看不见的细节累加起来,就变得可见了。当人们从达·芬奇的《女性肖像》前面走过的时候,他们的注意力往往立刻就被它吸引住了,那时他们甚至还没有看到说明的标签牌,没有意识到这是达·芬奇的作品。所有那些看不见的细节合并在一起,就使得这样东西产生了惊人的效果,仿佛上千个细微的声音都以同一个音调在歌唱。
同样地,优秀的软件也需要对美的狂热追求。如果你查看优秀软件的内部,就会发现那些预料中的没有人会看见的部分也是优美的。我对待代码的认真程度远远超过我对待其他的事情,如果我以这种态度对待日常生活的每件事,那么我就够资格找心理医生开处方药了。看到代码前面的缩进乱七八糟,或者看到丑陋的变量名、都会把我逼疯的。<P29>

判断一个人是否具备“换位思考”的能力有个好办法,那就是看他怎样向没有技术背景的人解释技术问题。<P31>

源代码应该可以自己解释自己。如果我只能让别人记住一句关于编程的名言,那么这句名言就是《计算机程序的结构与解释》一书的卷首语:程序写出来是给人看的,附带能在机器上运行。<P32> 阅读更多 »

, ,

留下评论