OS X 10.6 的 AppleScript 中文 bug

前几天一个偶然的机会我发现了 Shawn Blanc 的 blog。这个 blog 包含了一些时尚科技的评论,更新速度比较高。作者 Shawn Blanc 目前是专职维护这个 blog,blog 本身有收费会员订阅的项目,每月花 3 美元就可以阅读一些更多的内容。但免费的内容已经非常丰富了,作者有这个底气征收付款,在中文 blog 圈子中应该是比较难以想象的吧。

我从这个 blog 中看到一篇 MarsEdit 的评论,因为我自己也在用 MarsEdit,它是我的计算机上的几个花钱购买的商业软件之一,于是我就花了点之间仔细看了一下作者的评论,从中知道了我之前一直以为不存在的字数统计功能,竟然在脚本菜单下面。我知道自己还不是一个比较资深的 Mac 用户,比如像 mac script menu 这样的菜单我从来没有点过。这次知道在 MarsEdit 这个菜单下面,就有对文章的统计功能。于是我点了统计功能后,MarsEdit 的 CPU 占用率马上飙倒了 99%。最后只能把这个进程给杀掉。杀死进程后 MarsEdit 有崩溃报告功能,我就顺便把这个 bug 给报告了。

Apple 本身也有这种功能,不过可能用户量太大,Apple 应该只把它当作一个记录统计的作用。而 MarsEdit 的开发公司 Red Sweater 这种规模不大的公司,收到这种报告的次数可能不多吧,反正我第二天就收到了 Red Sweater 的回信,请我帮助他们 debug。我把造成问题的那篇文章发送了过去,因为我的文章是中文的,我以为 MarsEdit 可能对多语言支持的不够完善,就提了一句是不是 Unicode 方面的问题。

之后对方发来邮件,包含了一个另一个版本的字数统计脚本的附件,让我用这个脚本来试试。我试了一下,仍然有问题。脚本是用 AppleScript 写的,我从来没有学过这门语言,但据说它非常简单,脚本本身也不长,我看了几眼就大体上知道是怎么回事了。稍微研究一下,我想找出来是我的文章的哪个部分让这个程序的哪一行卡住了。于是排除了一下,发现造成问题的原因比较古怪,也不是所有中文都通不过,我发现的一种情况是只有字符串中包含一个汉字,跟上一个空格,再加上一个数字的时候,words of inputString 就会卡住。inputString 就是输入的字符串,脚本中用了 number of words of inputString 来获得字符串中包含的字符或汉字。我的那篇文章中正好有这种情况。实际上,我从几年前写文章就习惯再汉字跟数字及英文字母之间加上空格,这样更清晰一些,所以我的 blog 中一定会出现很多这种情况,我的大部分的文章都没办法用这种办法来统计字数。

我把我的发现发给了 Red Sweater,对方回信告诉我说这个问题在 OS X Lion 中不存在,因此似乎是 Mac 系统本身的问题。出问题的代码仅仅是调用了系统给的函数,因此也不好解决。对方说他们会想别的办法来获得字数统计功能。

另外,我还询问了对方能不能加上一个实时的字数统计功能,在编辑窗口中显示。结果对方告诉我目前 MarsEdit 已经有这个功能了,在状态栏里有显示。只是默认情况下状态栏是隐藏的,但对方担心他们做的统计功能可能不适合中文,因此他们也询问了我对于中文字数统计的要求。我看了对方的说法,他们或许是因为英文统计的是单词而不是字母的关系,所以考虑做中文分词,统计文章中出现的中文词组。我一看这可差老鼻子远了,中文分词本身就发展的不怎么样,还让老外来做这个,猴年马月才能弄出来啊,更何况中国人看字数统计也不管里面用了多少词组啊。所以我赶紧发邮件说别搞这个了,我们关心的仅仅是字数。

之后,不知道什么时候可以解决这个 bug。老外对于中国语言,大概从文化上就和西方语言有差异吧,我用过一些编辑器,里面也有字数统计的功能,但对中文来说都是没法用,因为它们全部是针对英文的单词设计的,字符之前没有空格就认为是一个单词,比如说这篇文章写到这里,MarsEdit 告诉我一共有 173 个 words,这就差的相当远了。不知道是不是所有写软件的老外都有类似的误会,考虑做什么分词,要能统一的给他们纠正过来就好了。

解密辅助工具

我们的密码学课程的作业之一就是老师给你一段字母拼成的文字,单词已经划分好了,每个字母都代表另外一个字母,让你翻译成原文。翻译的方法是通过找出一些特殊的部分,不如两个相同字母结尾的单词、单字母单词之类的,来找出更多的字母。对于这种方法的难处,我在之前的文章里有过描述。其中也说了我要写个工具来帮我干这个事情。今天用Ruby简单的写了这么一个。放在了这里

经过测试,程序能按照我的想法来做事。比如那篇文章里说的SKYQD一词,我有了arge结尾后,怎么也想不到large这个词。有了这个工具,运行match.rb SKYQD | grep arge就可以了返回large了,应该会给我的工作有很大帮助。程序的原理也很简单:对于SKYQD,先把它处理成一个标准的模式──ABCDE(更好的例子是HYTOOW,处理成标准模式后是ABCDDE)。然后再从保存了处理成标准模式的英文单词的Hash中查找就可以了。我是Ruby初学者,因此写的代码也没有什么优化,应该也挺罗唆。

目前这个程序有几个问题。

一是程序中上来先把我之前获得的英文单词都处理成我要的模式,这样每次运行都来一遍,应该挺废时间。我在想说不定把处理完毕的Hash保存起来可能会更有效率。

二是我目前的单词列表非常不够。我目前的单词列表是在这篇文章里说的,通过一个小程序在一个网站上抓取的所谓“常用单词3000字”。有很多单词都却是,因此我得到的常常就是Not Found。我无法在网上找到非常全面的单词列表,因此可能要写个程序从网络上解析网页抓单词。因为我们的这些句子经常是老师从Winnipeg Free Press上得到的,如果能把这个网站上用到的单词都作为程序的基础,那么破解起来应该会更方便。

第三点就有点提高了。目前这个程序只是按照我的要求来寻找合适的单词,并不能更进一步帮助我。如果能把我的单词列表中的单词都配上一些属性,通过人工智能上的一些技术来做进一步的筛选的话,应该会更方便。我在一年前学《人工智能》的时候,有一项作业是用Prolog来写一个检验一句话是否符合日本俳句的标准。如果能结合这两点,让程序帮忙整句的筛选,那就更理想了。

英文单词列表

《密码学》课上的一个内容就是“破译”密码。其实我们也不算真正的破译,只是老师选一段话,把每个字母用另外一个字母代替,让我们找出原文。比如这个:

GKVVEHDRR ER GKOEHQ K SKXQD

STOEHQ, ZKXEHQ, ZSTRD-PHEJ AKYESU —

EH KHTJGDX ZEJU. QDTXQD CBXHR.

其实破译这种密码并不困难,单词已经分开了,你只要找规律试就可以了。比如第一行的K,一个单独的字母单词,很容易猜到可能是a或I;还有几个EHQ结尾的单词,也很容易的会想到ing。就这样把已知的几个单词替换回去,并猜出更多的单词。最后,我们能得到这样的原文:

Happiness is having a large

loving, caring, close-knit family —

in another city. George Burns.

经过几次这样的尝试,我发现这种破译对于英文为第一语言的人来说是很简单的,可对于像我这种后来才学英语的人,对于英文单词就没有这么的敏感。比如那天我破译这一段的时候,第一行的SKYQD中,后四个我都猜出来了,于是就想了半天:什么单词是一个字母加上arge结尾的?结果想到最后,直到通过其它途径破解了密码后,才发现原来这个单词就是large啊。可当时我是怎么也想不出来。相信对于英文为母语的人来说,几乎是条件反射般的迅速反应吧。

我从上这门课的第一天,就想写个程序来协助破译。程序也不需要很复杂,用户告诉程序需要的单词的pattern,比如“GKVVEHDRR”,而程序通过搜索单词列表,把符合条件的单词都找出来,这样不用乱枪打鸟,比原先就方便多了。

但程序的基础,就是要有一份常用单词的列表。本来以为这样的东西网上一找一大片,没想到找了半天,得到的都是一些特殊的单词列表,什么简化英语单词列表之类的。很少有我想要的。而这种需求通过词典更不能解决了。

找了半天,发现了这样的一个网页,上面有3000个英文常用单词,看了之后,我觉得不错,但需要把单词整理成一个文件,每行放一个单词,然后再排序之类的。因此把这些单词都抓下来就是首要任务了。

我对Perl的正则比较熟悉,对Python的字符串处理也还行,但因为想练习Ruby,就选择用它来做。觉得Ruby这么大的“家业”,相关的模块应该不少,从网上搜索一番后,找到了Nokogiri这个库,据说是最快的一个HTML/XML Parser。它的用法很简单,看了例子后,我很快就上手了。相比起从网页中用正则挨个判断,用Nokogiri实在是太爽了。

但写程序的时候出现了一个小问题。我不知道怎么获得链接的地址。因为那个单词列表的页面上,有15个列表,点进去才是一个真正的单词表。因此我要通过Nokogiri来获得那些页面的链接。但找遍了Nokogiri的文档,却只看到返回标签内容的方法,丝毫找不到返回链接地址的方法。我不知道是因为我还没有习惯rdoc还是rdoc本来就没有这些详细的报告。最后我从一个中文blog上看到了答案,原来链接的地址被保存在对象的[:href]这里。

其它的基本上就是顺其自然的写下来了,一共不到20行。我把程序上传到了这里。程序运行后就在终端输出单词列表,稍加整理就应该能用了。不过,我用wc测试了一下,发现这个列表里面只有2000多个单词,根本没有达到页面上说的3000的数目。而且作者还把像tree这样的基础单词给删掉了。看来还要再增加啊。

英文blog

七月四日的时候,我大概是在找关于MT的资料,顺便看到了Six Apart里的一些职员竟然也在VOX上有blog。其中的很多人已经有了TypePad上的blog,但他们往往在TypePad上讨论一些正式的话题,而在VOX上面写一些生活化的东西。恰巧我看了Apple4us的一篇文章,知道了MarsEdit,想尝试一下,MarsEdit支持VOX,我于是就在VOX上面开了一个blog。

VOX很久之前就不能在大陆访问了,而且这里记录的是个人的鸡毛蒜皮的事,又是用的英文,因此地址我也懒得写了。我之前其实已经有了一个VOX帐号和blog,在上面只写过一篇的文章。但上次选的二级域名不是很好,而且又懒得自习研究如何修改,于是就干脆用新邮箱重新注册了一个。VOX不错,允许你删除帐号,能让用户选择删除帐号的系统,我的印象都比较好。于是我当天晚上就把旧帐号给删掉了。

因为考虑到用的是英文,因此也就没太考虑GFW的问题。其实如果不考虑封锁,可以选的blog服务有很多,比如blogger、wordpress.com,但这次选VOX,很明显是因为我最近对MT和6A比较痴迷罢了。而且之前flypig也推荐过,再加上他写的对6A老总的采访,我那时就对VOX有很深刻的印象了。

至于这个blog的作用,我是希望能用英文来记录一些日常的生活。这个中文的blog中,我主要写的是我的思想,生活上的琐事我觉得不值得在这里写,因此就写在那个VOX的blog上。那个blog同样遵循王建硕的原则──一天最多写一篇文章。于是在过去的几天中,我都是每天写一篇。文章也就是把当天的生活记一下,除了生活外的想法之类的,基本上不谈。也不用管文章的长短,哪怕只有几句也一样发上去,因此写的也算自在。

之前我用过一两天VOX,因为没有深入,也没什么感受。现在用了半个多月,对于VOX的一些有点缺点也有了不少认识,等有时间可以写一写。

近几天对英语实践的反思

英语应该怎样学,如何实践,通过最近的阅读,我有了新的理解。

依然按照传统的听、说、读、写来把整个英语时间划分成四个方面。我现在的理解是,国内学习英语应当把重心放在“说”和“读”上。正好两方面分别处于输出信息和接受信息的角度上。

先说“说”。主要是基于国内有名的“哑巴英语”的考虑,许多人无法有效的用嘴巴来有效的表达自己。我在加拿大也见过有的人,即使后来通过努力,能够有足够的逻辑来用英语表示思想的时候,他的发音依然令人发指。有的人认为只要能做到有效的沟通,不必在意发音是否标准。这一点我自己不赞同,但找不到反驳的理由,不做评论。

我仍然清除的记得在国内和外教讨论的时候,他怎么也听不懂我说的“nerd”这个词。我给他拼写出来后,他才明白我说的是什么。他说我的发音不标准。因为语系不同,英文里有的发音,中文里完全没有,相反也是同样。这样导致经常双发听对方讲自己的语言感觉很别扭。那天,老外纠正了我半天的发音,反复让我发“nerd”这个词,不下30遍。我在2007年4月份写过文章讲述这件事。而我到这里后,也和老外交流过,每当想到老外有可能对我发音的感觉就像我们感觉老外一样,我就感到脸红。

当然,既然练习“读”,就应该争取把音发标准,这离不开“听”的帮助。但我现在感觉不用花费太大的力气去练习听力,如果“说”的部分过关了,听力应该不成问题。我们决不会听不懂自己说的话,英语也应该是这个道理。从我在加拿大的经历来看,我到了英文环境里进步最大的就是听力。这就是“耳濡目染”的作用。

“读”是我最近的最新感受。“读”一直是我四项中最薄弱的一项。虽然到了加拿大两年,但我仍然不习惯阅读英文文章。每当需要阅读英文的时候,我一定要正襟危坐,全神贯注,否则一不留神思维就跑了。相反中文资料我读的特别多,不仅速度快,理解也不成问题,印象也挺深刻,经常见到比较好的句子,多看两遍就基本上会背了,虽然不一定一字不差,但用在写作里当引用是没有问题的。而我在不能全神贯注的时候,只能做到“读”,但做不到“理解”。但正如李笑来说的:

“阅读理解”本质上是两个过程的叠加:“输入”与“理解”。“输入”有很多种方法,“理解”是需要积累才能获得的能力。要能够理解已输入的信息,才能够真正做到“阅读理解”。

而我的情况是可以“朗读”。过去在课上老师让读课文我从来不怕,但读完了文章,总结一下意思,完全没有头绪。

这学期我有一门专业课名字叫“Professional Practice in Computer Science”。本来我以为内容是编程之类的联系,结果上了课后才知道讲的是关于“Computer Ethics(计算机伦理)”方面的内容。我最近写的一些英文post就是关于“Computer Ethics”方面的思考。这种类似“哲学”方面的课,老师就会给我们布置阅读的作业。第一次作业老师给我们布置了几篇文章,我打印出来后发现有一厘米多厚。结果只有硬着头皮读。

我之前毕竟上过阅读课,之前上写作课写论文的时候也通读过一小本天主教方面的书,专心致志的情况下还是有一定基础的。读的过程中我发现,我是由于平时阅读太少而导致思维迟钝的。通过阅读的量的增加,我的阅读速度已经不知不觉的提升了不少。当然这次的“阅读”是包括了“理解”的。而开始的时候为了克服读完后没有印象的问题,每读一句话就要思考一下,读完一段一定在旁边注明意思。但到后来不用总结每段的段意,文章的意思也能串起来了。

我在阅读中间休息的时候,按照李笑来的思路,对比我中文阅读和英文阅读的差异。仔细回忆了一下我的阅读历史:小学阶段仅限于课文,那时候还不知道什么是小说;从初中开始才真正开启了阅读的大门。那时候的阅读可以用“如饥似渴”来形容,无聊的时候我会一页一页的翻《思想政治》课本,把里面小字写的故事实例都读完。小说之类的就更不用说了。然后不知不觉间,我读书的效率就相当高了。

对比我的英文阅读水平,我觉得我的阅读量才刚到小学水平。通过读一些长文,现在估计能到小学高年级水平了。我目前希望的理想状态是:这次作业结束后,继续保持阅读的习惯,坚持一阵子,争取把阅读能力提升到初中水平。

我在这里倒一直不怕写作,可以说写作课是我最喜欢的课程之一。之前还有偿为同学写过paper,虽然同学挑选的题目对我来说有点偏,是关于维他命D的,但我写完后,同学也过关了(同学的语言学校的毕业paper,要求不高,专业的维他命D的论文我肯定搞不定)。

我觉得写作和阅读有差别,因此不需要花太多时间在训练写作上。阅读算是一项技能,需要特殊的训练;但写作算是说话和逻辑的表达,很难做到专项专练。英语写作方面,只要不怕中文写作,再注意一下英语写作中结构的设定之类的细节,基本上就没有问题了。我个人在小学阶段非常害怕写作文。那时交的作文作业基本上是母亲给我打好的草稿,我再抄到本子上。上了初中,肯能由于阅读量加大的关系,我就不害怕作文了,不仅不像小学一样根本不知道有什么好写,反而经常超出老师的字数要求。我的解释是年纪大了后逻辑思维培养了起来,通过阅读的培养学会了语言表述,作文自然不成问题了。我在新东方听了杜昶旭的写作课后,就能拿到托福写作5/6分了。

而我现在就很后悔当年不清楚情况,为什么到了大学后还把阅读水平练在小学等级上。如果当时能明白,能做到相应的训练,现在该多爽啊。不过我的情况还好一点,在大学时读过一些科技画册,关于电子管的发明历史、动物构造之类的,比其他人的情况能稍微好一点。而且我现在觉得阅读课上分析什么教材上的文章纯属浪费时间,直接找篇general文章,10页以上的给学生读去,读完了用英文写报告的效果应该也比精度文章要好。至于该读什么样的文章,我也有点想法,会在另一篇post中讨论。

Resume Workshop

This afternoon, I attended the second resume workshop class. And this class is the first academic class I attended in Canada. I’m learning in English Language Centre now and I have classes about English writing, reading, listening and speaking everyday. Though they are helpful, they are a little boring. The reason, I think, is language is a kind of most fundational class. You will feel boring when you learning them, especially you have known it not too little before.

Resume workshop class is different. It’s the class teaches me a useful skill will be used in the future. It’s not like to teach language that let you to think all about languages, but to teach you some kind of details. For example, in the resume workshop class, the instructor will tell me the format of a resume, and how to write some specific parts of a resume.

I feel so exciting when attend this kind of class. This REAL class is very useful and will tell me a lot of things that I haven’t heard before. That’s much fun than to attend English class.

Success!

After almost two days time trying, I run Movable Type on my new site finally. This is the first time for me to use Movable Type, so it’s very funny. Though I’ve met some problems, I made it now. The happiness now just can’t be discribed.

I bought a new domain name for this blog. In the first days, especially after I’v changed my English name, I would like to open a new blog to write something in English. My original blog Feng’s Style have been existed some time, and all of the posts on it is written in Chinese. I wouldn’t like to add any English posts on it cause it will be mess. Also I’d like to have a domain name that like my English name, not my original name, so I choose this domain “ferrisliu.com”.

Before I installed Movable Type on my host, I felt afraid a bit. Since I’ve never tried to understand Movable Type, even cgi programs, I thought maybe to install it is very difficult. But after I read the instruction on the offical site of Movable Type, everything came clearly. Actually at the very begining, I installed Movable Type succussfully. But I don’t know how to show the blog page when I browse “ferrisliu.com” not “ferrisliu.com/blog”. That spent my a whole day to solve it.

I have written a post on V2EX to ask about it, the comment on it is very helpful. After thought for a while, I solved it finally. I was so happy that you can browse “ferrisliu.com” to visit my blog.

Movable Type is still quite new for me. I haven’t seen all the pages of it. I think it is a wonderful tool for managing a blog. I hope I will master it just like WordPress.

原来我们的发音也那么不标准

之前一直以为老外说不好中国话,是因为他们的语言中没有汉语中的一些发音,因此导致了他们说不好他们一辈子也没法过的音。而对于自己的英语发音,我倒一直没什么感觉。因为英语中一共26个字母,因标也没多少。精通博大精深的汉语的我们,要发起英文的音来应该没有任何问题吧。

结果今天上听力课,被外教巴顿说我们的发音不对,于是便一个一个地纠正。比如说我说了个nerd,巴顿马上指出这个e音发的不对。结果我费了很大的功夫才通过了。

之后和巴顿聊起来,巴顿说我们之所以不会发某个音,是因为我们的语言中没有相应的发音。但是许多人都没有意识到这一点,因此是一件很悲哀的事情。

难道说我们在语言上也有“沙文主义”?我不敢妄下定论。总之,我们以为自己不错的东西,也有致命的弱点,这不是让我们很难堪的事情吗?