Posts tagged 阅读笔记
《精通正则表达式》阅读笔记
2花了近三周的晚上的时间把《精通正则表达式》这本书看完了,说是看完,其实是只看3,4,5,6四章,前面的和后面的几章按照作者的建议觉得自己没有必要去看了。毕竟对于这本书来说,这四章才是重点,在这四章中,作者就已经把正则表达式的语法,正则表达式引擎的工作原理,以及正则表达式的调优讲完。下面是我在看这四章的过程中的一些笔记和总结。
正则表达式的语法
对于正则表达式的语法,相信大多数人都和我一样知道一些基本的语法,但是对于一些不常见的语法还是非常陌生,这边就把这些比较陌生的正则表达式语法记录一下:
- 分组且捕获的文本括号:
(),文本被捕获以后可以通过反向引用(\1,\2等等)来引用。 - 分组但是不捕获的文本括号:
(?:),文本被捕获后不能通过反向引用来引用到。 - 忽略优先量词:
*?,+?,??,{min,max}?:量词在正常情况下是“匹配优先”的,会尽量匹配更多的内容(Greedy),忽略优先量词则优先匹配尽量少的内容。 - 占有优先量词:
?+,*+,++,{m,n}+,与匹配优先量词很相似,只是从来不交还已经匹配的字符,即如果已经匹配到了,就放弃该量词表达式内的所有的回溯可能都抛弃。 - 固化分组:
(?>…),使用固化分组的匹配与正常的匹配无差别,但是如果匹配进行到此结构之后,那么此结构体中所有的备用状态都会被放弃。占有优先量词可以看做是固化分组的特殊情况。 - 条件判断:
(?if then|else):测试if条件表达式,如果测试为真,则执行then部分表达式,如果测试失败,则执行else部分表达式,if条件表达式是特殊的表达式,大概有两种情况,一种是对捕获型括号的特殊引用,比如(?(1))这样,会测试第一组捕获型括号是否参与了匹配;另一种是对环视进行匹配,如果环视能够匹配,则返回true。 - 环视,即零宽断言:
(?=…)(?!…)(?<=…)(?<!…),具体的解释可以参考我之前关于零宽断言的一篇文章:使用零宽断言来匹配不包含连续字符串的行。 - 匹配上一次匹配结束的位置:\G,首先出现在Perl中,在用于迭代匹配的时候比较有用。
正则表达式引擎的工作原理
一般上正则表达式的引擎可以分为两种:NFA和DFA,分别表示非确定性有穷自动机和确定性有穷自动机,这两者背后的理论基础大可不必去了解,只需要知道NFA引擎是在进行匹配的时候是表达式主导的,而DFA引擎在进行匹配的时候是文本主导的,下面具体来拿一个例子来将述下这两者的区别:
NFA引擎工作原理
对于NFA引擎,它会先拿出正则表达式的第一部分,然后看看文本有没有符合这个部分的,如果是,则继续表达式的下一部分进行匹配。
现在假设我们有一个正则表达式是a+b,需要用它去匹配aaaaab这个字符串,它的匹配过程大概如下:
- 首先找到正则表达式的第一个部分
a+ - 然后看文本是否匹配到了这个表达式,在文本中,前面的5个a是能够匹配
a+的,那么继续正则表达式的下面部分 - 后面是一个
b,它能够匹配到文本中5个a后面的b,也匹配成功。 - 这样正则表达式的所有部分都能够匹配,所以整个表达式就能够匹配成功。
NFA引擎还有一个重要的特性,这个特性对于理解NFA引擎的原理也是非常关键:回溯。具体来就讲,在遇到两个可能成功的分支时,会先尝试一个可能性,然后记住另一个,如果这个可能性失败了,那么就回溯到之前的可能,回溯的一个重要的原则是,如果需要在“进行尝试”和“跳过尝试”之间选择,对于匹配优先量词,引擎会优先选择“进行尝试”,对于忽略优先量词,引擎会优先选择“跳过尝试”;在进行回溯时,选择回溯的路径是距离最近存储的路径,即基于LIFO原则。
DFA引擎工作原理
对于DFA引擎,DFA引擎会在扫描子字符串时,记录当前有效的所有可能匹配。这个我们就拿书中的tonight的例子来讲。
现在我们拿to(nite|knight|night)来匹配tonight,它的匹配过程大致如下:
- 引擎看拿到文本中的
t,然后找到了表达式中的t可以与之匹配,这样,表达式就可能能够匹配到文本,这样引擎就会添加这样一种潜在的可能。 - 然后引擎继续按照文本往下移动到了
n,这个时候,表达式的多选分支里面只有两个分支可以与之匹配,knight这个分支不能匹配,有效的可能就变成了两个。 - 继续往下走到文本中的
g,这个nite这个分支也不能匹配了,有效的可能变成了一个。 - 最后当匹配到之后的
t时,night这个分支显然能够匹配,这样引擎发现匹配已经成功。
NFA引擎和DFA引擎的各自优缺点:
- 从上面的讲解中可以了解到,NFA引擎因为是正则表达式主导的,可能对文本中的同一个部分进行反复的扫描,DFA则只会对文本进行一次扫描,这样NFA引擎的速度就相对DFA要慢。
- 另外NFA是正则表达式主导的,所以不同的正则表达式对速度的影响比较大,但是DFA因为是文本主导,所以不同的正则表达式对其速度影响不大。
- 从上面一条我们也可以知道,NFA的可玩性就比较大了,相对来说比DFA要灵活很多。其实后面的调优也都是针对NFA引擎的,因为DFA实在是没有什么好调优。
正则表达式调优
正则表达式的调优是在了解了正则表达式的工作原理的基础上进行的,主要是针对NFA引擎,看完正则表达式的调优这一章以后,我自己总结了一条调优的规律:在正则表达式中尽量使用确定的字符:
比较(night|nite|nittt|niasdf)和ni(ght|te|ttt|asdf)这两个正则表达式,因为后面一个正则表达式把各个多选分支中的ni提出来了,这样引擎就能够通过字符扫描的方式快速找到匹配文本中的ni部分,然后再开始匹配后面的多选分支;而前面的那个表达式,引擎在文本的每一个位置都要尝试四个分支,显然速度要慢很多。相比而言,后一个正则表达式比前一个要“确定”,匹配的速度就更快。
针对这一条规律,还可以有很多调优的方式,比如能够加锚点就加锚点之类的,具体的大家可以翻看书的第六章。
总结
应该说这本书觉得是一本值得阅读的书,花时间去看绝对是值得的,特别是当你会一点正则表达式后再去看,收获可能更大。不过这书的翻译看起来有点吃力,读起来不是很顺畅,或许是因为正则表达式本身看起来就有点累,所以看这本书的过程中最好保持头脑清醒,保持注意力集中,这样才能跟上作者的思路。
海伯利安 — 朝圣者们沉痛的故事
2
昨天晚上看海伯利安看到凌晨一点半,终于把最后一个故事给看完了。海伯利安绝对是我迄今为止看到的最好看的科幻小说,甚至比刘慈欣的三体系列,阿西莫夫的基地系列都要精彩很多。
海伯利安这个书名取自英国诗人约翰·济慈未完成的同名长诗海伯利安,整本书的内容是七个不同职业的人被选择作为最后一批朝圣者前往伯劳鸟和光阴冢所在的偏远星球海伯利安朝圣,他们在朝圣的途中讲述了各自背后沉痛的故事,以及各自和伯劳鸟、光阴冢之间的丝丝联系。
通过朝圣者们的故事,作者也给我们描述了故事发生的宏大背景,地球灭亡,人类将其活动范围扩大到了银河系跨度1000光年的小旋臂内,人类政府霸主组成环网星球,霸主背后又有神秘的人工智能,以及在太空中飘荡的人类分支驱逐者。
作为朝圣的目的地以及联系朝圣者们的线索,伯劳鸟和光阴冢应该是整本书中最神秘的东西了,但是看到最后,我仍然无法搞懂这两者到底是什么?牧师的十字形到底什么?战士的情人莫尼塔到底是不是就是伯劳鸟?诗人的海伯利安诗篇讲述的到底是什么?学者的女儿为什么受到时间潮汐影响后时间是倒着走的?侦探的情人之前到底为什么要去海伯利安朝圣?领事打开光阴冢后会发生什么?而那个没有讲述自己故事的圣徒背后到底又有什么样沉痛的故事?
除了书名取自济慈的长诗海伯利安以外,本书中还有非常多的关于济慈的东西,海伯利安的后续安迪密恩(Endymion)的名字也是取自济慈的同名长诗,故事发生的星球名字叫海伯利安,朝圣者中的侦探的赛伯人情人甚至就是人工智能造出来重现济慈的生活的,不得不说,整本书就是作者丹·西蒙斯在向济慈致敬。
除了济慈,你还能够在书中看到乔叟、叶芝等人的身影,经常能够看到一些名家出现在本书中,让你不得不感慨下作者的博学。
无疑,海伯利安是科幻小说中的史诗巨作,作为科幻迷的你千万不要错过。
无聊的哲学
0
忘记了是在哪本书上看到这本讨论无聊的书,这本书一直躺在我豆瓣想读的书列的最后几页,正常情况下我是不会再发现它的。但是恰巧上次京东商城促销满100减50,为了凑齐100快钱,就带上了这本只有10几块钱的《无聊的哲学》,买来之后便是直接扔到书堆里面没有去动它。这次回家不知道怎么地就唯独带上了这本书,或许是因为它的封面上是一副梵高的《星夜》,我很喜欢。于是在这次从家里回杭州的路上,为了打发在火车上无聊的时间,我翻完了这本《无聊的哲学》。
看着本书的题目,其实有一点歧义,“无聊的哲学”可以是讨论哲学是如何如何的无聊,或者是以哲学的角度去讨论无聊,当然从本书的英文名“A Philosophy of Boredom”可以看出其实讨论的是后者。对大多数人来说,哲学可能就是无聊的,而一本讨论无聊的哲学书又该是多么地无聊呢!或许题目也有双关的意思在里面。
作者写这本书讨论无聊,是因为无聊成为我们现在的世界几乎每一个人都会面临的问题,以西方世界为例,在文艺复兴以前,只有僧侣和贵族才有可能感到无聊,因为他们无需担忧温饱问题,所以相对于普通的大众便有了闲暇的时间,有闲暇的时间就有可能无所事事,这样他们就有可能感到无聊。但是文艺复兴以后,无聊不再是僧侣和贵族的特权,无聊开始越来越快地在全世界蔓延开来。这主要是因为个体意识的觉醒,个体意识觉醒的结果就是“上帝已死”以及人类开始寻找自身存在的意义,本来又上帝完成的事情现在需要人类自己去完成。然而存在的意义,是极难寻找的,人类终其一身都未必能找到存在的意义。那么没有意义的人生是怎么样的,是无聊的。所以无聊的产生,本质上是因为意义的缺失,当每一件事情都是去了其存在的意义之后,自我与世界的各种联系就被切断,人会陷入到无边无尽的空虚中去,就像置身在无边无尽的黑暗之中,四周空无一物,这种无边无尽不仅仅是空间上的,当你陷入到这种深层次的无聊之后,时间也已经无所谓过得快或者过得慢了,因为无聊已经在时间维度了被拉倒了无限长,既然每一分钟每一秒钟都是无聊的单调重复,时间也就无所谓长短,瞬间就是无限。
无聊作为一种情绪状态,描述的是对时间的体验,无聊的时间总是显得空洞,匮乏的,所以摆脱无聊最有效的方法就是去想尽办法填满时间,我们的世界的各种各样的潮流便应运而生,每一个人都在各种各样的潮流之间追逐,新鲜的事物被不断地创造出来来帮助人们摆脱越来越显得无聊的时间,然而最终,“想尽办法填满时间”这件事情本身也会变得无聊,最终看来,无聊似乎是无法摆脱的。如果你以虚无主义的角度看,无论你做什么样的事情,都是一样地缺乏意义,一样地无聊。或许,正是人类的完美主义,才造成了人们总是无时无刻想摆脱无聊,大多数人都不愿意接受“无聊,孤独,痛苦”,都向往“快乐,幸福,饱满”,然而“无聊,孤独,痛苦”已经成为了我们存在的一部分,拥抱他们,接受他们,才是我们应该做的,拒绝就是否定自身的存在。
少年维特的烦恼
2阿落在评《百年孤独》的时候说:因为年少的无知和浮躁,我差一点错过了它。所以当你还未尝过痛苦,当你还未开始尝试看透生命,请好好的收着它,不要读它。
有些书就是这样,只有在适当的时候你才能够读懂它,我曾经在初中的时候不知好歹地去读《少年维特的烦恼》,结果翻了几页便放弃了,这一次适逢有这样的机会可以让我尝试去读懂维特的烦恼,关于这本书,我觉得任何评论都是多余,这里仅仅摘录一些个人感觉比较好的段落与大家共享:
- 多数人为了生计,干活耗去了大部分时间,剩下的一点儿空余的时间却令他们犯了闲愁,非得挖空心思、想方设法把它消磨。啊,人,就这么个命!
- 从这时起,日月星辰任其静静地又升又落,我却不知白天和黑夜,好像,我周围的整个世界都消失了。
- 心情不好同懒惰完全一样,它本来就是一种懒惰。人的天性就有此种倾向,可是,只要我们一旦有了振奋精神的力量,我们工作起来就会顺利,并在工作中得到真正的快乐。
- 每当聚会时有人谈到她,我表现的那副可笑的滑稽相,你真该看看。要是别人问我喜不喜欢她?—–喜欢!我确实很恨这个词。一个人假如喜欢绿蒂,但对她又不是付出所有身心,全部感情,他是人吗?喜欢!最近有个人问我,喜不喜欢莪相。
- 世上的事实际上还不统统都是毫无价值的鸡毛蒜皮的小事,一个人只是为别人而去拼命追名逐利,而丝毫没有他自己的激情,没有他自己的需要,那么,此人便是笨蛋。
- 是的,亲爱的绿蒂,一切我都愿为您操办和代劳!您常给我任务吧,多多益善!对您我有一事相求:请别再往您写给我的字条上撒沙子。今天我把您的字条激动地放在嘴上,弄得牙齿吱吱直响。
- 是的,威廉,有时在刹那,我也有振作起来摆脱一切的勇气,现在,我只要知道该往何处去,我便往那儿去。
- 我已经有好些时候没有记日记了,今天我又拿起日记本,令我大吃一惊的是看到我竟是如此有意识地一步步陷于目前的处境,真是大吃一惊!我对自己的处境一直看得很清楚,可是我的行动却像个孩子;现在我对自己的处境仍是一清二楚,可是境况并没有好转的迹象。
- 难道非得如此:使人幸福的东西,反过来又会变成他的痛苦之本。
- 清晨,我从噩梦中醒来,向她伸出双臂,结果是一场空;夜里,一个幸福无邪的梦捉弄了我,仿佛在草地上,我坐在她的身边,握着她的手,印上千百个吻,随后我在床上找她时,又是镜里之花。唉,我在半睡半醒中昏昏聩聩地向她摸索,摸了一阵就完全清醒了。——一股泪流从我压抑的心中奔流而出,我面对昏暗的前程,绝望地哭泣了。
- 真是不幸,威廉,我偏偏无所事事,虽然我有充沛的活力,闲得无聊,我不能游手好闲,却也什么都干不了。我失去了想象力,失去了对大自然的感觉,书籍令我讨厌。倘若我们失去了自我,也就失去了一切。
- 是呀,我只不过是个漂流者,尘世间的飘泊浪子!难道你们就不是吗?
- 有时我真不理解,怎么可以有另一个人能够爱她,可以爱她,难道不知我爱她爱得如此真切,如此忘情,如此缠绵悱恻,除了她我什么也不理解,什么也不知道,什么也没有呀。
- 呵,这空白!在这儿我胸中所感受到的可怕空白!——我经常想,假如你仅只一次,仅只一次能将她拥抱在心灵深处,那么,这个空白整个儿都可填满。
- 我竟到了如此的境地,对她的感情包容了一切;我竟到了如此的境地,没有她我的所有都将纸上谈兵。
- 我已有上百次起了去搂她脖子的念头!伟大的上帝知道,一个人看到眼前有那么多心爱的东西,却不能伸手去取,他心里多么痛苦呀!伸手去拿,这原本是人类最自然的本能。婴儿不是见到什么都伸手去抓吗?——可是我呢?
- 在这一瞬间,我的整个生命正在存在与虚无之间颤抖,往过犹如闪电,照亮了未来黑暗的深渊,我周围的一切都在沉没,世界正随我走向灭亡,在这可怕的瞬间,我为何还要羞涩?
- 我不能这样祈祷:“让我得到她吧!”然而,我又往往觉得她是属于我的。我不能这样祈祷:“把她给我吧!”因为她已属于别人。我没有尽头地同自己的痛苦捉迷藏;但是我一旦纵容自己的愿望,放松了束缚,那就会引出一连串相反的论点来。
最后,套用一句不知道来自哪里的话,每一个少年都曾经是一个维特。
为黑客正名
0黑客是一群什么样的人?一群试图攻破别人的计算机系统的反社会分子(看看吧,那群该死的黑客把Sony的PSN的用户数据都给搞走了)?一群一个星期不刮胡子,三个月不理发,穿得像一个民工头的土鳖(穿着拖鞋,头发像狗窝,双眼布满血丝)?一群不会说话,有交流障碍的书呆子(和他们在一起气氛可以让你尴尬地想马上找一个地缝钻下去)?
以上就是我臆想中的别人眼中的黑客的形象,当然,这些看法不能说它错,不过如果你想更准确地去了解一下黑客是一群什么样的人,那么你一定要看看硅谷的创业教父Paul Graham的写的《黑客与画家》。
最早接触到Paul Graham是一年多前在阮一峰的博客中,这也是我第一次意识到一个黑客(或者说程序员)可以做到那样的地步:创建Viaweb并且以3500万美元的价格买给雅虎,然后在网上写一些关于创业的文章,最后创办了Y Combinator,专门投资创业公司,其投资的公司包括像Reddit.com这样非常著名的公司。
后来看到阮一峰在他的博客中说他将翻译Paul Graham的著作《黑客与画家》,于是马上去网上找到了《黑客与画家》的英文版开始阅读,无奈因为英语阅读能力有限,只看了前面的几章便放弃决定耐心等待阮一峰同学翻译出来以后再读。到今年终于等到了阮一峰同学翻译完毕了这本书,我花了在飞机上的时间把这本书看了个大部分,然后在周末又把剩下地看完了,非常过瘾,不得不佩服Paul Graham的写作功力和阮一峰同学的翻译能力,文笔流畅又不乏幽默。那么,且来看一下Paul Graham是怎么看待黑客的:
黑客们在干些什么:Mark Zuckerberg,这个经常穿着个拖鞋晃荡来,晃荡去并且被《时尚先生》列入2010名人风格耻辱堂的土鳖黑客,创造了市值200亿美元的Facebook;David Heinemeier Hansson,简称D.H.H,是最有效率的公司37signals的创始人之一,并且创造了非常著名的Ruby on Rails框架,让Ruby开始在世界流行起来,现在在赛车逍遥着;Larry Page和Sergery Brin,创办了世界上最大的搜索引擎Google,改变了整个世界信息的流动方式;那么,你看出这些黑客们干了些什么事情吗?是的,他们正在改变这个世界,并且看上去正在接管这个世界,不是吗(开个玩笑,^_^)?
黑客们把聪明看得比外表重要:他们的大多数人大多数时候看上去都是不着边幅的,邋里邋遢的,这里面有一个很重要的原因就是黑客们把聪明看得比外观上的东西更重要,毕竟一个人如果想要精通一样东西,比如在这样东西上投入巨大的精力,所以你可以看到这一群一心要去精通计算机的黑客们总是不太注意自己的外表。(关于他们邋遢的外表,另一个解释是他们是一群懒人,一群什么事情都想要让计算机去干的人)
黑客们叛逆,崇尚自由:黑客是一群叛逆并且崇尚自由的人,他们对诸如封锁,专政之类的东西非常反感,所以你才会在Twitter上看到这么的程序员,因为对于他们来说,一堵把信息封闭起来的前对他们是一个极大的侮辱。 就这个品质来说,难怪世界上最优秀的黑客大多数都在美国,也只有那个开国元勋可以说出“反抗政府的精神,在某种场合是如此珍贵,我希望它永远保持活跃”的国家,才能够出现这么多优秀的黑客。
黑客像艺术家,而不是工程师,科学家:这个看上去挺奇怪,一群一天当晚对着冰冷的机器的家伙哪里有什么艺术家的气质了?黑客与艺术家之间的共同点在于他们都是创作者,他们都试图创造出优秀的作品。成为一个黑客必须要有灵感,这样才能创造出修复的作品,这正如艺术家一样。他们不是工程师,不是完成需求文档的机器;他们也不是科学家,他们去解决真正重要的问题,而不会陷入一些科学难题之中。黑客们的软件作品也和艺术家的艺术作品一样,需要不断地去雕琢;当然,艺术家现在看起来要比黑客酷多了,但是要是到计算机这东西出来也就几十年的时间,所以现在真是黑客们的黄金时代,在这个时代,必然会诞生黑客中的达芬奇。
这本书除了告诉你什么是黑客之外,还试图回答诸如创业方面的一些问题,介绍Lisp语言是如何地优秀等等(看了这本书你肯定会想去学Lisp),也都非常值得阅读;当然,毕竟这本书是写在2004年,其中的有些文章或者观点可能稍微过时了一点,但是这遮盖不了这本书的亮点。