优化数据库,解决 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日

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

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

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

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

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

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

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

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

感觉如何呢?

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

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

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

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

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

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

, , ,

留下评论

在 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 快盘

图片预览

, ,

一条评论

变化的位面 – 永醒者之岛

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

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

以下正文:

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

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

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

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

, , ,

留下评论

变化的位面 – 季节

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

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

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

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

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

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

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

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

, , ,

一条评论