| David's profileprowyh's spaceBlogLists | Help |
|
January 22 有这样一个日本女子有一位日本女子,以抱病之身,从1999年开始就自办网站,用非常流利的中文向中国读者介绍日本文化,她的网站是http://miya.or.tv,她去年在大陆出了两本书:《物语日本》、《江户日本》(广西师范大学出版社2006年8月第1版),她的名字叫茂吕美耶。
特别推荐《江户日本》。十七世纪,德川家康在江户(今东京)开设幕府,开始了两百多年的江户时代。当时的江户,聚集着几百万新兴的中产庶民,产生全国一半的税收,是日本消费力最高的地区,但在政治并没有什么地位。两百年里几百万江户庶民并没有密谋发动政治革命,而是远离政治是非,以他们的享乐主义和消费主义发动了一场历时百年的“生活革命”,创造出至今在全世界独领风骚的日本生活美学。日本人的生活中从此有了“禅道”、“茶道”、“花道”、“香道”、“色道”、“极道”(黑道)、“众道”(同性恋)……《江户日本》娓娓而谈当时的美食、园艺、浮世绘、和服、相扑、情色……相对日本,中国虽然有千年不绝的政治道统,却没有百代不易的生活道统。中国人的生活里缺少规矩、缺少礼仪、缺少传说、缺少传统、缺少美学,缺少一个江户时代。
以上的文字是今天收到的《季风书讯》的编后小记,最后一句话有点偏激,但相对于日本的“禅道”、“茶道”、“花道”,我们不应感到汗颜么……
网上找了一下,发现茂吕美耶在新浪上有博客:http://blog.sina.com.cn/m/moromiya。上面有自我介绍的一段文字,为了省去翻检之劳,转录在此:
Miya:本名是茂吕美耶(Moro Miya),所以Miya并不是笔名或是艺名。
日本埼玉县人,在台湾高雄出生,直至国中毕业之前,一直是个土生土长的高雄姑娘。母亲是台湾人。
有不少人说,我的恋父情结相当严重。我不否认。
记得小学时,附近有一家面摊,老板娘时常骂我们是「杂种囝仔」。某天,我跟弟弟买了鞭炮,一个个丢进面摊,听着鞭炮声霹雳啪啦响,姐弟俩乐死了。面摊老板娘告到我家,凑巧我父亲在家,于是,姐弟俩不但挨了一顿骂,还被罚站。弟弟更是挨了我父亲一个巴掌。直到第二天,弟弟脸上的巴掌痕仍未消。可见当时我父亲是真的动怒了。
那是他生前唯一一次打骂孩子,也是我这生中唯一一次见到我父亲动怒的光景。
可是,当时我虽然也被罚站,却没有挨骂,也没有挨巴掌。事后,我母亲责备我父亲,说他偏心,只惩罚男孩,不惩罚女孩。我父亲只是淡淡地回说:「女孩,生来是要宠的,不能骂,更不能打。」
…………
“女孩,生来是要宠的,不能骂,更不能打。”原来日本还有这样的男人!这让我稍稍有所释怀:日本不光有《菊与刀》中为天皇而战死沙场的“武士”……
Moro Miya做的事情是很有意义的,一定买本《江户日本》来看看……
January 19 归去来兮辞曾经向朋友发出美美的邀请
如一艘小小的白帆
向北方漂送
蓝天,碧海
彩石镶嵌的环岛路
涛声中鼓浪屿的万种风情
可明天,不,今天
我将跨过白云
向美丽告别
朋友,你会怪我么
还没开始,就已结束
环岛路上已写满我的歉然
再见了
曾经的荒蛮
我将回到魂牵梦绕的烟雨江南
January 16 JavaScript学习笔记(之三)已经很久没有抬头看看天了,偶一抬头,发现天上彩云飘飘:Unobtrusive scripting,Prototype-based languages,Mixin,Closures……
Unobtrusive scripting已经在笔记之一里做了描述,此处不赘。Mixin和Closures以后再慢慢道来,下面来看看何谓Prototype-based languages?
我们被教导了多年的OO,脑子里塞满了class, object, inheritance, polymorphism, encapsulation, abstract, virtual,等等,等等。现在看来,这些都已经是classic OO language的特征了,此种语言可以被概括为Class-based language。除此之外,还有一种模式的OO language,称为Prototype-based language。
说也奇怪,老外总是有创造新语言的强烈冲动(相比之下,由于我们对语言本质没有深入的研究,所以难有创见!大家都忙着挣钱呢……^_^)。稍微搜索一下,发现N多的Prototype-based languages,典型者除JavaScript之外,有Self,NewtonScript,Io,等等。其中:
Self:
Self is an object-oriented language for exploratory programming based on a small number of simple and concrete ideas: prototypes, slots, and behavior. Prototypes combine inheritance and instantiation to provide a framework that is simpler and more flexible than most object-oriented languages. Slots unite variables and procedures into a single construct. This permits the inheritance hierarchy to take over the function of lexical scoping in conventional languages. Finally, because Self does not distinguish state from behavior, it narrows the gaps between ordinary objects, procedures, and closures. Self's simplicity and expressiveness offer new insights into object-oriented computation.
NewtonScript:
NewtonScript, developed for the Apple Newton PDA platform, is a prototype-based programming language. Rather than two levels of abstraction, class and object, there is just one, the object. Major design goals of the language were small memory consumption of the created programs and the ability to easily program graphical user interfaces. Both are well met by prototype-based languages. A third design goal, good learnability, was attained by an easy syntax.
Io:
Io is a small, prototype-based programming language. The ideas in Io are mostly inspired by Smalltalk (all values are objects), Self (prototype-based), NewtonScript (differential inheritance), Act1 (actors and futures for concurrency), LISP (code is a runtime inspectable/modifiable tree) and Lua (small, embeddable).
看来各有千秋,而且Io似乎有点集大成的味道——集各语言特点于一身。
这些语言此处暂且按下不表,继续我们的话题——prototype-based languages。
Prototype的字典解释:first or original example of sth that has been or will be copied or developed; model or preliminary version。中文可以解释为:原型,雏形,模型,蓝本。
Prototype-based languages are object oriented langauges where a new object instance is "cloned" from existing live object(a prototype) instead of being constructed by a class. This makes the language simpler by requiring one less data type and solving the infinite regress problem of classes (if you use a class to create an object, what do you use to create a class?). It is also ideal for systems such as GUIs where the pattern of creating one object by copying and modifying another is already handled by the language itself.
基于原型的语言是面向对象语言,其中新的对象实例是从已存在的活动对象(即原型)“克隆”而得,而不是从类构造得来的。这使得基于原型的语言更简单,因为少了一种数据类型,而且也解决了类的无穷回溯问题(如果用类来创建对象,那用什么来创建类呢?)。这种语言特别适合于像GUI这样的系统,因为通过拷贝及修改另一个对象而创建一个新对象的模式已经由语言本身处理了。
定义总是让人头大,下面我们Learn by Example:
考虑雇员与管理者这样的两级系统,一般来说,管理者属于雇员,但雇员却不一定属于管理者。借用经典OO的术语,如果将雇员定义为基类或超类(base class or superclass)的话,那管理者就是雇员的导出类或子类(derived class or subclass),那么如何在JavaScript中定义这种层次关系呢?
// 基类的构造函数
function Employee(name, dept)
{
this.name = name;
this.dept = dept;
}
// 子类的构造函数
function Manager(name, dept)
{
Employee.call(this, name, dept); // 基类的实例化
this.isManager = true;
}
Manager.prototype = new Employee(); // 此语句建立关系:Manager is a subclass of Employee
var empA = new Employee("David", "Development");
var mgrB = new Manager("Bill", "Development");
alert(empA.name); // 显示David
alert(empA.isManager); // 显示undefined,因为empA没有isManager属性
alert(mgrB.name); // 显示Bill,name为mgrB的继承属性
alert(mgrB.isManager); // 显示true,mgrB有isManager属性,且其值为true
Employee和Manager即实现了OOPL的典型特征:继承(inheritance)。这种继承关系是通过prototype对象实现的(Manager.prototype = new Employee();),故称为基于prototype的继承(prototype-based inheritance),而经典OOPL的继承是通过class实现的,称为class-based inheritance。 January 14 朋友,你好吗?一杯水会感动路人,一滴水会感动小草,一片云会感动天空,一份爱会感动世界……
朋友,你好吗?
希望这一声问候能带给你一丝被牵挂的感动!
呵呵,好像太……小资了点。无论如何,我还是欣赏易中天在《解读于丹》节目中对孔老夫子的解读:让世界充满爱!虽然不容易,但《过客》中的路人对小女孩的一杯水充满的感激,说明并非不可能……
P.S.
本文源于对一个朋友短信问候的“杳无音信”的莫明。后来自己试过才知道,是因为在号码前面加了12593的缘故,对方收不到。唉,厦门移动的系统也是obtrusive啊……系统要做到unobtrusive,看来比孔老夫子的“让世界充满爱”还难! JavaScript学习笔记(之二)JavaScript——世界上误解最深的程序设计语言
译注:本文译自Douglas Crockford的《JavaScript:The World's Most Misunderstood Programming Language》,是难得一见的好文!
JavaScript(也被成为Mocha,LiveScript,JScript,ECMAScript)是世界上最流行(most popular)的程序设计语言之一。基本上每台PC都至少有一个JavaScript解释器在运行,这要归功于JavaScript是Web的脚本语言。
除了其流行之外,很少有人知道JavaScript还是一种非常优美的、动态的、面向对象的、通用的程序设计语言。这怎么会成为一个秘密?这种语言为什么会被如此误解?
名字
Java-前缀使人认为JavaScript多少与Java有关系,是Java的子集或缩减功能后的版本。似乎这个名字是有意用来制造混淆,且从混淆产生误解。实际上,JavaScript并不是Java的解释版本,Java是Java,JavaScript是一种不同的语言。 JavaScript在语法上类似于Java,就像Java类似于C一样。JavaScript是Java的子集并不比Java是C的子集多什么东西。JavaScript比Java能更好地应用于Java(当时称为Oak)原初的设计目的。
JavaScript并不是在Sun Microsystems公司开发的,而是在Netscape。当初叫LiveScript,如果叫这个名字,就不会产生如此多的误解。
-Script后缀会使人认为不是一种实际的(real)程序设计语言,会认为脚本语言在功能上比程序设计语言差很多。但这实际上是特化问题(a matter of specialization,可能是指JavaScript只是专注于某些领域或在某些方面有特长——译注),与C相比,JavaScript在性能和表达能力及活力(dynamism)上取得了一种平衡。
穿着C的衣服的Lisp
JavaScript类似于C的语法,包括花括号({})以及重量级的(clunky)for语句,使其看起来与通常的过程语言没什么不同。实际上这是误导,因为与C或Java比起来,JavaScript与函数式语言如Lisp或Scheme具有更多的共同点。JavaScript用数组代替了列表(lists),用对象代替了属性列表(property lists),函数是第一级别的(first class),而且JavaScript具有closures(closures与lambda表达式有关,将在以后展开来谈——译注),用不着平衡所有那些括号就可以得到lambda表达式(You get lambdas without having to balance all those parens.——译注:虽然翻出来了,但意思还是不太明白,是指与Lisp相比吗?Lisp确实要balance all those parens)。
擅长角色(Typecasting)
JavaScript是被设计来运行于Netscape Navigator浏览器中的,它的成功使其成为所有浏览器的标准配置,这倒成了JavaScript所擅长的角色。实际上JavaScript是程序设计语言中的George Reeves(美国演员,饰演电视系列剧《超人历险记》中的超人——译注),它能很好地适用于一大类的非Web应用程序。 目标游移(Moving Target)
JavaScript初始的几个版本功能非常弱,缺少异常处理,内函数(inner functions),以及继承。目前它已经是一个完全的面向对象的程序设计语言。但对于该语言的很多意见都集中于其不成熟的形式。 ECMA委员会(JavaScript语言的管理者)正在开发各种扩展,但这些扩展会更加恶化其最大的问题:它已经有太多的版本了。版本太多不可避免会产生混淆。
设计错误
没有一种程序语言是完善的。JavaScript同样有设计错误,如重载+操作符,通过强制类型转换,使其用于加法和字符串连接,以及容易产生错误的with语句。保留字策略限制太严,分号插入(semicolon insertion),与直接量的正则表达式记法一样,是一个巨大的错误。这些错误已经导致了各种各样的程序设计错误。语言的设计作为一个整体已经使人产生怀疑。幸好,这些问题可以通过一个很好的lint程序得到缓解。
语言的设计在整体上还是很合理的,奇怪的是,ECMA委员会似乎对改正这些问题并没有兴趣,或许他们对制造新的问题兴趣更大。
极坏的实现
JavaScript的几个早期实现充满了缺陷(quite buggy),这对语言影响很坏,而且这些实现又嵌入在可怕的缺陷多多的Web浏览器里。
坏的书籍
几乎所有关于JavaScript的书都很糟糕,有错误,低劣的例子,并倡导一些不好的实践。语言的重要特性经常被低劣地解释,或整个忽略掉了。我看了很多JavaScript的书,只推荐一本:David Flanagan的《JavaScript: The Definitive Guide (5th Edition)》。
不够标准的标准
ECMA出版JavaScript语言的官方规范,可这个规范的质量却极为低劣。难读难懂(难怪我读不懂,现在看来是可以原谅的:)——译注)!这是产生上述坏书问题的一个原因,因为作者无法用标准文档改进他们对语言的理解。ECMA和TC39委员会应该很尴尬。
业余爱好者
许多写JavaScript程序的人都不是程序员,他们对如何写好的程序缺乏训练。JavaScript具有很强的表达能力,他们怎么写都可以做点有用的事情,这造成了JavaScript只适用于业余爱好者,而不适合专业程序员的形象。事实当然不是。
面向对象
JavaScript是面向对象的吗?它有包含数据的对象以及处理数据的方法,对象可以包含其它的对象。它没有类,但有构造函数,能起到类的作用,如作为类变量和类方法的容器。没有面向类的继承(class-oriented inheritance),但有面向原型的继承(prototype-oriented inheritance)。
构建对象系统的两种主要方式,一是通过继承(is-a),一是通过聚集(has-a),JavaScript两种方式都有,其动态特性使其在聚集方面更优秀。
一些人会争辩,说JavaScript并非真正面向对象,因为不能提供信息隐藏,也就是说,对象没有私有变量和私有方法,所有成员都是公共的。但JavaScript的对象可以有私有变量和私有方法,当然,很少人理解,因为JavaScript是世界上误解最深的语言。
一些人会争辩,说JavaScript并非真正面向对象,因为不提供继承。但JavaScript不仅提供经典的继承,也提供其它的代码重用模式。 January 13 MSN,when do you Live?微软将MSN变成Live,原本指望能够真正"live"起来,可还是很微软……
1、台海地震使得MSN变成了MS No!可为什么Google一直好用呢?
2、如果说地震是天灾,是不可抗力的话,MSN有些令人啼笑皆非的事情就匪夷所思了:
1)添加评论时,作者栏显示“(没有名字)”,而且更不可理解的是还有的显示“(没有名称)”!?
2)提交评论时,系统显示“由于服务器故障,提交没有成功,请再次提交”(大意),可如果再次提交,就会发现前一次的提交已经成功,从而导致重复提交!
3)发表的评论不能修改。这不仅仅是MSN如此,几乎所有的blog系统,评论都不能修改!这是否有点obtrusive呢?现在键盘敲字不像在纸上写字(哎,都快不会写了),不经意间就会打错,为什么不给人改正的机会呢?犯错误并不可怕,可怕的是没有机会改正错误!
3、MSN Spaces没有提供备份工具,万一哪一天这个space crashed,那……?
MSN,提供的已不仅仅是工具,而是一种生活方式,你什么时候才能Live起来呢? January 12 JavaScript学习笔记(之一)曾跟朋友们笑谈:写程序这么多年,现在最看不懂的程序是JavaScript!
JavaScript何方神圣?非也,just an interpreted scripting language!如此“卑微”,何言“看不懂”?
其实,看不懂的并不是JavaScript程序,而是lambda表达式!JavaScript虽然“卑微”,却有着“高贵”的理论背景——lambda演算,这是一个需要深入研究的领域,此处按下不表。
最近读了很多关于JavaScript的资料,有一个词频频出现:Unobtrusive Scripting。查字典,obtrude = force (oneself, one's opinions, ideas, etc) upon sb/sth, esp when unwanted. 所以,Unobtrusive可以解释为“不强加于人的,优雅的,温和的,君子的”。那么,为什么现在会强调Unobtrusive Scripting呢?
这与长期以来的“不良习惯”有关系:
1、由于DHTML的影响,Scripters已经习惯于“粗暴”地对待HTML Elements。
例:
function setBkColor(o, color)
{
o.style.backgroundColor = color;
}
从Unobtrusive的观点来看,这不是一个好的方式,因为假如对象o不存在,就会导致JavaScript出错。Unobtrusive的方式应该是:
function setBkColor(o, color)
{
if (o) o.style.backgroundColor = color;
}
而且DHTML已经是一种过时的(outdated)技术,应该使用DOM Scripting。
2、由于IE的强势影响,Scripters没有考虑浏览器的兼容性。
例:
function setBkColor(color)
{
document.all.o.style.backgroundColor = color;
}
document.all是一个IE所支持的属性,其它浏览器并不支持,所以在其它浏览器中就会出错。而且通过document.all和document.layer来判断浏览器类型也已经过时了,Unobtrusive的方式应该是:
function setBkColor(color)
{
var o = document.getElementById('elementId');
if (o) o.style.backgroundColor = color;
}
3、由于JavaScript的“卑微”,使得Scripters很“随意”地将大量JavaScript代码散落在HTML页面中(尤其是heavily-scripted页面)。Unobtrusive强调将HTML代码、CSS代码、JavaScript代码分离:
HTML代码——什么内容(content)
CSS代码——如何显示出来(display)
JavaScript代码——呈现什么样的行为(behavior)
呵呵,这三者好象有点MVC的味道!
4、内容的可访问性(Web Content Accessibility)
HTML Elements的行为表示为鼠标/键盘事件,但很少有Scripters会考虑用户没有鼠标的情况。W3C发布了一个Web Content Accessibility Guidelines,建议使用不依赖于设备的事件处理程序,如果必须使用依赖于设备的处理程序的话,尽量提供冗余的输入机制,如同时支持鼠标和键盘("onmousedown"与"onkeydown","onmouseup“与"onkeyup","onclick"与"onkeypress"等)。
由以上的简单介绍可以看出,Unobtrusive Scripting确实是一种“不强加于人的,优雅的,温和的,君子的”程序开发方式。 |
|
|