李卫公的长安城

过上一万年,那城就会变成黑色,永远不倒……

  DonewsBlog  |  Donews首页  |  Donews社区  |  Donews邮箱  |  我的首页  |  联系作者  |  聚合   |  登录
  373篇文章 :: 38篇收藏:: 393篇评论:: 5个Trackbacks

公告




版权声明:本 blog 上所有原创文章、图片,未有特别声明者,均遵守 Common Public License。所有翻译、转载文章和图片,版权归属原作者所有,遵守原作者声明。

warning


给我写信

文章

收藏

相册

Focus

Friend's blog

Miscellaneous

My Favourite Blogs

存档


正在读取评论……


点点滴滴

私性体验的集合


    摘要:数据库?不就是MySQL之类嘛! 关系?不就是表嘛! 数据库设计?对着界面就能想出来嘛! 考虑不周全?改表嘛! 速度不够快?你建索引了吗?加索引嘛! …… 在我的开发经验中,类似的问答并不罕见。可是,这正常吗?    (全文共2207字)——点击此处阅读全文

在用浏览器访问Gmail时,经常会遇到这样的情况,登录成功,但马上便提示无法连接服务器,这其实是因为Gmail的Web页面默认启用的聊天功能被GFW所致,解决的办法就是关掉Web中的聊天功能,具体设置如。

下面的截图是登录Gmail之后,在浏览器最下边显示的信息。在默认情况下,用户的选项是最左边的“standard with chat”,我们登录Gmail之后,抢在连接被阻断之前,选择“standard without chat”,就可以了。


因为工作不够细致,最终版本的《精通正则表达式》还存在如下问题,只能以勘误形式发布作为补救了,请各位读者见谅。
如果大家在阅读中发现其他问题,欢迎来信指出。
yusheng.regex@gmail.com


推荐序

vi页, 第1行, “那它就被成为阳春应用”,应该修改为“那它就被称为阳春应用”;

前言

Ⅱ页,倒数第3段,“读这本书以前,我以为自己了解正则表达式,但现在我才真正了解”应修改为“读这本书以前,我以为自己了解正则表达式,但现在我才真正弄明白”

Ⅱ页,倒数第2段,“在其它任何地方都难以找到这样丰富的细节”应修改为“在其它任何地方都难以找到这样完整而详尽的资料”

Ⅴ页,第1段,“来开发引擎的能力,并避免其中的缺陷”应修改为“来发掘引擎的能力,绕开引擎的缺陷”

Ⅵ页,第1段,“[…]表示一对方括号,之间的内容无关紧要;而[…]表示一对方括号,其中包含三个句点”应修改为“[…]表示其间内容无关紧要的一对方括号,而[…]表示包含三个句点的方括号”

第1章

2 页,倒数第2段,“但是它不一定能代表正则表达式在平时解决的那些“不值一提”(uninteresting)的问题。这里的“不值一提”是指这类问题并不能成为谈 资,可是不解决它们,你就没法继续干活”应修改为“但是正则表达式在平时还用来解决那些“讨人厌(uninteresting)”的问题。说“讨人厌”, 是因为它们不适合跟外人吹嘘,可是不解决它们,你就没法继续干活”

6页,标题“正则表达式的思维框架”应修改为“理解正则表达式的结构”

9页,倒数第3段,“在搜索HTML代码的头文件时这非常有用”应修改为“在搜索HTML Header时这非常有用”

12页,注4中“作为一个小孩子,那时候我感觉非常受伤”应修改为“当时我还是个孩子,很受伤”

14页,第4段,“匹配一行的起始位置,然后匹配「^From」、「Subject」或「Date」中的任意一个”应修改为“匹配一行的起始位置,然后匹配「From」、「Subject」或「Date」中的任意一个”

15页,第3段,“我使用-i参数的频率很高”应修改为“我经常使用-i参数”

15页,倒数第4段,“>”字符不应该是黑体

17页,倒数第3段,“无论u是否出现,匹配都是成功的”应修改为“无论u是否出现,匹配都会成功”

18页,倒数第3段,“因为它们限定了所作用元素的匹配次数”应修改为“因为它们限定了所作用元素的重现次数”

19页,第2段,“一个字符组是一个“元素”(unit),所以它可以直接加加号、星号等,而不需要用括号”应修改为“一个字符组就是一个“元素”(unit),可以对它直接使用加号、星号等,而不需要括号”

19页,倒数第1段,“每个量词都规定了匹配成功至少需要的次数下限,以及尝试匹配的次数上限”应修改为“每个量词都规定了匹配成功至少需要的重现次数下限,以及尝试匹配的重现次数上限”

20页,表1-2中:“可以不出现,也可以只出现一次”修改为“可以出现,也可以只重现一次”;“可以出现无数次,也可以不出现”修改为“可以重现无穷多次,也可以不出现”; “可以出现无数次,但至少要出现一次”修改为“可以重现无穷多次,但至少要出现一次”

21页,倒数第2段,“这并不是正则表达式的错误”应修改为“正则表达式对此无能为力”

27 页,第1段,“而且说“如果你写一个正则”,“巧妙的正则”(budding regexers),甚至是“正则化”(regexification)”修改为“而且说“如果你写一个正则”,“巧妙的正则”(budding regexers),甚至是“正则化”(regexification)听起来更顺一些。我说的“正则引擎(regex engine)”指的是程序中实际执行匹配尝试的那个部分”

第2章

37页,第1段,“它们都非常不同于“传统”的预言,例如C和Pascal”应修改为“它们截然不同于C和Pascal之类“传统”的预言”

38页,倒数第1段,“运算符==用来测试两个数字是否相等”修改为“运算符==用来测试两个数值是否相等”

40 页,第1段,“我不想在本章中讨论Perl的细节,但是我告诉你用printf(“格式化输出(print formatted)”)可以解决这个问题”修改为“我不想在本章中讨论Perl的细节,不过我还是想说,printf(“格式化输出(print formatted)”)可以解决这个问题”

40页,第3段,“Perl通常情况下不区分整数和浮点数”修改为“Perl一般不区分整数和浮点数”

41页,倒数第1段,“我们发现,这个图让我们很容易地决定匹配之后应该干什么”修改为“看了这张图,我们很容易就能决定匹配之后应该干什么”

46页,补充内容的最后1段,“尽管因为第4章将会解释其原因,字符组的效率通常还是会高一点”修改为“不过根据第4章解释的原因,字符组的效率通常要高一些”

67页,第3段下面,正则表达式“$text =~ s/(\d)(?=(\d\d\d)+(?!\d)/$1,/g”应修改为“$text =~ s/(\d)(?=(\d\d\d)+(?!\d))/$1,/g”,少了一个括号

70页,第2段,所以整个正则表达式的意义就不再是“寻找空行及只包含空白字符的行”,而是“寻找连续、空行和只包括空白字符的行的结合”
应修改为
所以整个正则表达式的意义就不再是“寻找空行或只包含空白字符的行”,而是“寻找空行和只包含空白字符的行的结合”

76页,倒数第2段,“此外,我们的匹配主机名的正则表达式只存在一个“主源(main source)””应修改为“此外,我们的匹配主机名的正则表达式只存在一个“源头(main source)”,”

第78页
示例2-3中第4标注
{\e[7m$1\e[m$2\e[7m$3\e[m ] igx;
应修改为
{\e[7m$1\e[m$2\e[7m$3\e[m } igx;

第3章

89页,第1段,“不支持字符组中的\w(完全不支持\d和\s)”应修改为“在字符组中无法使用\w(\d和\s在任何地方都无法使用)”

92页,倒数第2段,“在极端的情况下,反向引用的“行为”有意义吗?”应修改为“在极端的情况下,反向引用还能正常工作吗?”

95页,标题“函数式处理的例子”应修改为“程序式处理的例子”

95页,倒数第1段,“不过,Java也提供了一些函数式处理的……”应修改为“不过,Java也提供了一些程序式处理的……”

95页,Pattern r = Pattern.compile("^Sujbcet:(.*)",Pattern.CASE_INSENSITIVE);
其中的Sujbcet应写为Subject

96页,第2段,“Sun的package同时提供了程序式和面向对象式的处理方式是常见的做法”应修改为“Sun的package同时提供了程序式和面向对象式的处理方式,这是种常见的做法”

111页,第1段,“常见的例子是大写的ß是两个字符的组合“SS”。这种情况只有Perl能够正确处理”应修改为“常见的例子是,大写的ß由两个字符“SS”组合而成。这种情况只有Perl能够正确处理”

114页,“字符组及相关结构”中,“字符组缩略表示法”应修改为“字符组简记法”

130页,3-11表名“脚本语言中的行锚点”应修改为“若干语言中的行锚点”

131页,第1段,“如果结合上面那一点”应修改为“结合第一点”

132页,第3段,“但是这段程序的执行单位不是一次表达式而是一次匹配”应修改为“但是,循环的单位不是单个的表达式,而以一组表达式的匹配”

134页,“中间一级不过是“语法(syntactic sugar)”,表达方式更美观而已,”应修改为“中间一级不过是用起来更方便而已(syntactic sugar)”

第4章

152页,倒数第1段,括号内,“抑制自己的天性”应修改为“克制自己的本能”

156 页,第3段,“也就是说“不到最后关头不能分胜负(It’s not over until the fat lady sings)”,但这段话又不符合本段的语境”
应修改为
“也就是说“不到最后关头不能分胜负(It’s not over until the fat lady sings)””

156页 第3段 第2行
原文: 即使某个字表达式能够匹配
应改为:即使某个子表达式能够匹配

160页 文字部分的 第5行
原文: 字符串的b之前(也就是当前的位置)匹配
应该为:字符串的c之前(也就是当前的位置)匹配

172页,第2段,“就可以命令正则引擎不必检查它们:「^(?>\w+)」”应修改为“就可以命令正则引擎不必检查它们:「^(?>\w+):」

第5章

188页 文字部分的 第4段 第2行 结尾
原文: 也不比担心
应该为:也不必担心

191页,代码段中的注释大小写错误,“#利用正则表达式检测wholePath”应修改为“#利用正则表达式检测WholePath”

195页,倒数第1段,“虽然这个表达式比最开始的好得多”应修改为“虽然这个表达式比开头那个好一些”

197页,第3段,“所以,我们得用别的办法来解决”应修改为“所以,得想点别的办法”

197页,第4段,“仔细想想我们想要匹配的位于开始分隔符和结束分隔符之间的文本”应修改为“仔细想想要匹配的位于开始分隔符和结束分隔符之间的文本”

197页,倒数第3段,“如果回溯会导致不期望,与多选结构有关的匹配结果”应修改为“如果回溯会导致不期望的、与多选结构有关的匹配结果”

199页,第5段,“这个正则表达式曾被用作降解忽略优先量词的绝佳例子”应修改为“这个正则表达式曾被用作讲解忽略优先量词的绝佳例子”

199页,倒数第2段,“但它并不正确(其实这三个表达式都不正确)”应修改为“但它并没有错(其实这三个表达式都没有错)”

203页,标题“检查HTTP URL”应修改为“校验HTTP URL”,目录中也应同样修改

205页,代码段注释中,“零个或多个据点分隔的部分”应修改为“零个或多个点号分隔的部分”

210页 最后一行
原文:导致逆序环视(?!44)失败
应改为:导致否定顺序环视(?!44)失败

第6章

225页,第2段,“对于没有转义字符的字符串来说,这样会一次读入整个字符串”应修改为“不包含转义字符的字符串,会被一次读入”

233页,倒数第1段,“所以,对这个例子来说,多选结构要比字符组快22倍左右”应修改为“所以,对这个例子来说,字符组比多选结构快22倍左右”

234页,第4段,“新增的开销大约花费了5s的时间”应修改为“新增的开销大约是5秒”

234页 正文部分第2行
原文:现在,测试字符串只是上面的长度的1/1000,而测试需要进行1000次。
应该为:现在,测试字符串只是上面的长度的1/1000,而测试需要进行1000000次。

246页,第1段,“也能够减少传动装置真正应用正则表达式的位置”应修改为“也能减少传动装置真正应用正则表达式的次数”

266页,第3段,“你就能把这几条推广开来”应修改为“就能把这几条推广开来”

266页,倒数第4段,“事实上,如果点号不能匹配换行符”应修改为“事实上,如果点号能够匹配换行符”

269页,第1段,“不会在匹配时陷入徒劳的尝试”应修改为“无法匹配时会陷入徒劳的尝试”

274页 上数第4行
原文:紧跟在x之后的斜线
改正:[^x]/ 是紧跟在不是x的字母后面的斜线

第7章

293页,倒数第1段,“动态作用域会临时“保护”全局变量”应修改为“动态作用域会把全局变量临时“遮蔽”起来”

296页,倒数第2段,“为方便起见,我们也可以给本地变量赋一个值 local($SomeVar),这等于把undef赋值给$SomeVar”应修改为“为方便起见,我们也可以给 local($SomeVar)赋值,这等于给$SomeVar明确赋值,而不是使用undef”

299页,第3段,“分散在散落的 local、子程序和本地变量引用之间的复杂交互”应修改为“分布在散落的 local、子程序和本地变量引用之间的复杂交互”

300页,正文第1段,“你可以期望$ 的起点是开始尝试位置的文本,但它每次都是从整个字符串的开始位置开始的”应修改为“你可能认为$ 的起点是开始尝试位置的文本,其实它每次都是从整个字符串的开始位置开始的”

301页,倒数第1段,“明确设定的$1 等变量中,闭括号在最后”应修改为“明确设定的$1 等变量中,闭括号在最后的那对括号”

308页,标题“指定目标运算元”应修改为“指定匹配目标运算元”

326页,第2段,“split 没有返回的部分或全部的文本”应修改为“通常情况下split不会返回的部分或全部的文本”

327页,标题“嵌套代码结构”应修改为“内嵌代码结构”

356页,第1段,“不包含捕获型括号的正则表达式可以不必保存拷贝”应修改为“不包含捕获型括号的正则表达式可以不必保存副本”

361页,第4段,“这很适合检查单个的正则表达式的编译方法”应修改为“这很适合检查单个正则表达式的编译过程”

第8章

368页,表8-3倒数第3行,“对Unicode字符进行不区分大小写的匹配”应修改为“对非ASCII字符进行不区分大小写的匹配”

369页,倒数第4段,“Unicode block的支持要求使用‘In’前缀”应修改为“Unicode区块的支持必须使用‘In’前缀”

371页,第2段,“就我个人来说,更喜欢简称前两个为“pattern”和“matcher””应修改为“我自己更喜欢把前两者简称为“pattern”和“matcher””

374页,倒数第6段,“当前pattern的捕获型括号的数目”应修改为“当前pattern中捕获型括号的数目”

377页 倒数第7行
原文:int end()
次方法返回整个匹配的终点的绝对偏移值
改为:此方法返回整个匹配的终点的绝对偏移值

377页,函数“String gropu(int num)”应修改为“String group(int num)”

388页,最后一段,“即检索范围不等于整个目标字符串”应修改为“即使检索范围不等于整个目标字符串也是如此”

389页,标题“构建扫描程序”应修改为“构建扫描程序的方法”

第9章

410页,第5段,“即用即编译(On-The-Fly Compilation)”应修改为“直接编译(On-The-Fly Compilation)”

410页,倒数第2段,“来进行“即用即编译”的编译”应修改为“来进行“直接编译”的编译”

432页,标题“支持函数”应修改为“辅助函数”

432页,倒数第4段,“还有一些静态的支持函数”应修改为“还有一些静态辅助函数”

438页,倒数第3段,“尽管涌出并不大”应修改为“尽管用处并不大”

第10章

442页,第3段,“十进制转义只能接受两到三位八位数值”应修改为“八进制转义只能接受两到三位八进制数字”

445页,倒数第5段,“第448也给出了一个“不好”的原因”应修改为“第448页给出了一个“不好”的理由”

455页,第3段,“这就是默认的配列方式”应修改为“这就是默认的排列方式”

459页,第3段,“这个简单的例子把HTML中的bold tag全部转换为大写”应修改为“这个简单的例子在HTML中的所有大写单词两端加上bold tag”

459页,倒数第4段,“下面这个扩展的例子把bold tag里的单词变为小写”应修改为“下面这个扩展的例子在添加bold tag的同时把单词转换为小写”

460页的表格,第三行开头应该为“数组 数组”,第四行开头应该为“字符串 数组”


很久没有用音箱听音乐,周末本来准备去买一对惠威M200 MK2,之前先试试已经服役7年的Creative Soundworks SW300,却发现T60的声卡在Ubuntu下的音质比Windows下差很多,买音箱的念头只好暂时作罢。
不甘心地在网上搜索了半天,找了个办法,自己编译一个ALSA驱动,更换Ubuntu自带的驱动,换上去听听,确实有了不小的进步,以下是操作步骤:

首先,获取编译需要的软件包:
sudo apt-get install build-essential ncurses-dev gettext
然后
sudo apt-get install linux-headers-`uname -r`

在编译替换之前,必须首先停止当前的ALSA服务:
sudo /etc/init.d/alsa-utils stop
sudo /etc/init.d/alsasound stop

现在创建一个目录,用于编译alsa的驱动
mkdir alsa-src
cd alsa-src

然后下载
wget ftp://ftp.alsa-project.org/pub/driver/alsa-driver-1.0.14rc3.tar.bz2
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.14rc3.tar.bz2
wget ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.14rc2.tar.bz2

解包
tar xvjf alsa-driver-1.0.14rc3.tar.bz2
tar xvjf alsa-lib-1.0.14rc3.tar.bz2
tar xvjf alsa-utils-1.0.14rc2.tar.bz2

在编译之前,还要下载对应的补丁文件
wget http://lenovo.dropshock.com/files/realtek6.tar.gz

用补丁文件替换源文件
tar xvzf realtek6.tar.gz
cp patch_realtek.c ~/alsa-src/alsa-driver-1.0.14rc3/alsa-kernel/pci/hda/

现在开始编译
cd alsa-driver-1.0.14rc3
./configure --with-cards=hda-intel
make
sudo make install

cd ../alsa-lib-1.0.14rc3
./configure
sudo make install

cd ../alsa-utils-1.0.14rc2
./configure
sudo make install

好了,编译完成,剩下的就是替换掉原有的alsa驱动
sudo modprobe -r snd-hda-intel && sudo modprobe snd-hda-intel

重新启动alsa
sudo /etc/init.d/alsa-utils restart
sudo /etc/init.d/alsasound restart

然后重新启动Ubuntu,可能会发现音量图标上有个红叉,需要在音量控制界面中将PCM的静音取消。
再听听,音质果然好了不少。

花周末的时间,看完了《傅雷谈翻译》。

溢美之词,不感冒;意外的是见到了原文的片段,‌一经对比,收获颇丰。
之前只是觉得傅雷的翻译功力很深厚,译文中完全看不到原文的影子,但究竟是怎么做的,一直不清楚,甚至猜测他在“意译”中修改了太多。
看到原文才恍然大悟:他完全是把原文的长句子拆散,再按照中文的思维组装起来——意思绝对还是原来的意思,变化的只是语法结构。

比如下面这个例子:
after reading that, I found my conviction that handel’s music, specially his oratorio is the nearest to the Greek spirit in music strengthened.His optimism, his radiant poetry, which is as simple as one can imagine but never vulgar …
读了丹纳的文章,我更相信过去的看法不错:亨德尔的音乐,尤其神剧,是音乐中最接近希腊精神的东西。他有那种乐天的倾向,豪华的诗意,同时亦极尽朴素,而且从来不流于庸俗….

之前自己虽然也明白变化结构,但终究不够大胆(或者手法不够纯熟),受原文的影响,掣肘颇多。看了这段文字,豁然开朗,第一句的“我更相信过去的看法不错”,我大概会采用和他一样的译法来处理,但第二句的那个“有”字,就非常巧妙,绝不是一般人能够想到的。

以他的译文为榜样,我拿下面这个句子练了练手:
Del Mar, Calif., is known for its beautiful beaches and appealing downtown, yet inland are dry stretches of scenic canyons dotted with multimillion dollar hillside homes.
说起加州的Del Mar,人人都知道那里海滩秀丽,城市宜人,内陆的峡谷风景如画,之中散布着价值百万的住宅。

p.s.
读这本书的副作用就是,会抬高我们对译文的要求。我猛然发现自己正在看的毛姆的《月亮和六便士》(傅唯慈译),一页之间就有三处值得改进:
原译:我比大多数人对他更为熟悉。
拟议:我比大多数人更熟悉他。

原译:但如果不是战争的动乱使我有机会踏上塔希提岛的话,我是不会有机会把一些回忆写在纸上的。
拟议: 为了躲避战争,我踏上塔希提岛,因此有机会写下那些回忆。
(作者此处要表达的意思是“为躲避战争,才在岛上遇到画家,写了这本书”,故可以直接意译为:“所以才有那些回忆”或者“所以才有这本书”)

原译:为了使灵魂宁静,一个人每天要做两件他不喜欢的事。
拟议: 人每天得做两件自己不喜欢的事情,才能平慰自己的灵魂。

Update:
用来练手的那个句子,韩磊的翻译是:
加州Del Mar以秀丽海滩和宜人市景而闻名,峡谷直延伸入内陆,景色可观,散布着多处价值百万的半山豪宅。
这个要比我的好多了~~

1.Be sure to keep this in mind.
不是
“确认把这点记在脑海中。”
而是
“万不可忘记这一点。”

2.The situation was so bad that even the CEO broke his promise.
不是
“形势是如此的糟糕,以致于甚至是CEO也不能兑现自己的承诺。”
而是
“形势太糟糕,连CEO都无法兑现自己的承诺。”

常言说,屁股决定脑袋,身份决定立场。
现实生活中,处处可见这条规律的身影——不过,一旦涉及到某些问题,情况就变得复杂起来了。
最常见的论调就是:中国这样做,是有道理的……

这样的说法,我是很反感的。
须知,人首先必须是人,其次才是一国的国民。考虑问题的时候,基本的出发点应该是人的良知,人的道德,而不是政府(国家)的道德——人的道德叫做道德,政府的“道德”,如果有的话,应该叫做权谋、利益。放弃道德而取权谋,说得不好听一点,就是自作贱。
其次,我们作为普通公民,当然应该有普通公民的价值体系,不同于政府的价值体系。否则,何来公域与私域的区分?何来权力与权利的博弈?抛弃自己的立场,替对方考虑,对亲人或许还适用,但对于政府,就成了一种错位——敢问那些为利维坦辩护的人,你时刻为它着想,关键的时候,它会知恩图报地为你着想吗?

哈维尔曾说:国家是人的产物,而人是上帝的产物。
这话,真是一点也没有错。

如果要学Shell编程,我推荐一个好的网站:LinuxCommand.org,那里有我看过最清晰的Tutorial。

在那里乱逛的时候,发现两个错误的链接,按照链接的文本,用Google搜出了正确的地址,写了email给站长(奇怪的是我很久没练习英语作文了,居然还算流畅)。

昨天收到回信,说已经修正了,非常感谢提醒。

考研的时候,我曾给参考书的作者(其实应该是编者,也是报考院系的教师)写信指出书中的错误。对方回信把我教育了一通,说我理解有错,死抠细节云云。

适应能力与生活感受,其实是不相干的。


煮玉米+蚕豆爆肉末
读书的时候,冬天下自习以后,经常会跑去买两个煮玉米(当时流行一个笑话:吉林农大的考研题是,玉米和苞米有什么区别)。我总是要等图书馆关门了才离开,不一定每次都能买到嫩的玉米,现在终于可以自己掌握火候了。



冰糖蒸雪梨
秋冬天气干燥,嗓子容易发涩。吃一晚冰糖蒸雪梨,清热润喉,非常有效。


第1页,共14页