2008年11月26日星期三

方文山北大演讲:华人是一个没有质感的民族

转摘自独角兽咨询 http://www.unicornblog.cn/user1/unicornblog/14240.html
方文山北大演讲:华人是一个没有质感的民族
独角兽资讯 发表于 2008-2-8 0:54:00
很高兴来到北京大学和各位同学进行这场文化上的交流与经验的分享。我今天所要演讲的题目是:“一个没有质感的民族。”我在这里所指的民族,不是别人,就是我们华人自己。而华人一词的称谓泛指包括内地、台湾、香港、星马、与东南亚一带的传统华侨,以及美加地区的华裔新移民等。

  我想可能很多同学都已注意到,我写了很多所谓“中国风”的歌词作品,譬如《娘子》、《双截棍》、《爷爷泡的茶》、《东风破》,还有最近的《菊花台》、《千里之外》等。其实这些歌词中浓厚的古诗词韵味并不是偶然间产生的,作品是最能够反映一个人的价值观跟性格的。一直以来我就是一个民族意识很重的人,长期性的关注跟民族、传统、与文化相关联的议题。当我这种文化意识跟音乐相结合起来时,就自然而然的孕育出所谓“中国风”的歌词,这是首先跟大家解释为何我会创作出如此倾向的作品。

  现在开始进入我们的主题。我长期以来观察到一个现象,那就是,我认为我们华人并不是一个很有“质感”的民族。所谓的“质感”指的就是一个东西的材质、与它外观上的美学设计,及其整体的精致度。我们会喜欢买一些价钱偏高的名牌包,譬如LV、Gucci等,是因为直觉的就喜欢那些名牌所代表的价值与品味。一般人总是很自然的会去追求名牌衣饰的质感,但却忽略了买此类商品的人,其本身却往往没有什么质感。我对台湾比较熟,所以现主要以我在台湾所观察到的现象举例。像一些在北市闹区逛街的年轻女生,很多时候的穿着并不是很协调:她可能上身套一件优雅的洋装,下半身却穿着嘻哈风的牛仔裤,然后脚上硬生生的一双廉价的夹趾拖鞋。当然此类的造型,某些时候美其名为混搭,问题是,大部份的人都搭配的很没有风格。常常自己的穿着品味的调性并不具备一致性,没有基本的美学素养,但却盲目地去追求名牌,这是精神错乱式的荒谬。大部份的消费者在挑选商品时,都懂得会去追求衣服、皮包、汽车等物品的质感。因为美的东西其价值是有共通性的,没有人不喜欢美的东西。但大家在拼命追求商品外在质感的同时,却常常忽略了自身对穿着打扮很基本的美学素养,变成需借助与依赖这些名牌的材质去衬托自己的行情。

  举例来说,以台湾人对婚嫁与丧礼等此类人生大事的态度来看,台湾人对美的基本尊重,便已严重的不及格。那是个应该要很庄严的场合,但来参加的来宾中通常都一定会有人直接就穿夹趾拖鞋或是汗衫来。不管是尊重已往生的死者,或对婚礼上正沐浴喜悦中的男女双方而言,穿载整齐是合乎礼的一个最起码的要求,但大多数的人却不这么严肃看待。我们再观看时下流行音乐的MTV,或是正在热门档期中的国片,如果你有心观察的话你会发现,明明就是华人的电影、华人的歌手,但只要有婚礼或葬礼出现的场景就一定是西式的,因为大家都觉得西式丧礼比较肃穆,而西式的婚礼的确也比较浪漫。要拍唯美的婚礼就一定上教堂,尽管男女主角并不是基督徒。难道是因为大家都觉得西式的婚丧形式比较有美,比较适合戏剧上的表现吗?台湾很多电影和MV的场景,都喜欢用西式的婚礼和葬礼去呈现。莫非因为华人的婚礼的形式比较吵杂、丧礼的仪式比较低俗?所以比较不适合表现在强调美学构图,与故事张力的戏剧上!?

  现再以城市为例来说明,不禁要问为何大多数华人居住的地区都不是很有质感。城市建筑是国家形象最具体的象征。但在台北市,据我所知,大楼外观的建筑形式与色彩调性从来就没有被规范过。市区街上,每个店面的装潢都很有特色,看的出有某种美学的追求,都可以被独栋独店的欣赏。但你只要把镜头一拉开,一扩大,用较大的视野全方位的去看整条街、整个城市的轮廓,你就会发现根本就杂乱无章,城市基调混乱,房子盖的毫无章法。一个城市的建筑反映了一个民族的质感。有质感的东西是可以深入骨髓的,那是文化底蕴浓稠度的一种展现。当你犹如追星族去追求昂贵的舶来品时,实际上正是以某种自卑的心态去追求你自己认为有价值的东西,一种心理上的反差与补偿心理。而台北就像个浓妆艳抹下的模特儿,急于讨好国际上的眼光,却根本就已模糊了自己原本的面貌,完全没有了自己的风格。

  台湾的一些老旧建筑,比如传统的四合院、日据时期留下的官舍等。这些建筑如果屋瓦毁损了,一般就用很简单很便宜的铁片去搭盖。很少有人会按原先建筑的形式,用原来的建材、风格去修复,这其实就是对传统文化的一种漠视,因为从没有人认为恢复古厝的外观是一件很重要的事,也几乎没人实际这么做。四年前当我初次来北京时,我发现北京很多胡同、四合院都在拆,因为要迎接奥运。那时候我和出版社的人去那些待拆的胡同捡拾门牌,比如刻有“某某胡同”的门牌,我喜欢那种带着旧时记忆象征性的小东西。虽然知道拆掉那些老旧胡同是为了整个城市建设的需要,可我心里还是觉得很可惜。因为“胡同”是北京的城市建筑的象征,也是一种有形的文化资产。当观光客来到上海、香港、台北,北京等华人聚集的城市闹区时,只要不把镜头对准那些具有象征性的地标,你根本就分不清楚你现在位于哪个城市,因为它门所有建筑结构都是西式的,所有的大楼都是玻璃帷幕,或钢骨结构,每个城市的景观都很像。上述那些城市都只有林立的建筑而没有城市文化。胡同是北京的一种象征,外地人来北京看到胡同会感受到一种文化的具体表现。当然,不拆这些胡同也无法大幅度地去建设或改进交通,这也是两难。其实刚开始我老觉得那些旧建筑拆了可惜,但后来发现如果不拆,它整体看起来也是破破旧旧的,散发一种家道中落破败的感觉,一个衰弱的王朝的象征,外观老旧斑驳,也并不是那么吸引人。那到底哪里出了问题呢?是我们传统的建筑形式根本就不适合现代生活的需要吗?

 我小时候看过一些欧洲小镇的风景明信片,当时以为那只是为了拍照印刷好看,而特地去找来很罕见的景致,目的也只是为了让画面更赏心悦目。一直到后来才知道风景明信片里的村庄是真的都有人居住,那不是欧洲版的中影文化城、他们是一整个村庄、一整个城市,甚至整个国家的风景都是如此的美。我以为明信片上美丽的风景只是在取景时回避掉某些角度,只单拍这个景(比如一座古堡、一段城墙),就像美编过的电影海报一样。后来看了一些在欧洲取景的电影,藉由镜头 360度的回转,发现他们是整座村庄、整个城市都是一种统一的色调与建筑风格。台湾的老建筑通常只是得到“点”的保留。所谓的“点”就是一栋独立的建筑物被评为三级古迹,但附近就只有它孤零零的一栋古迹而已,在它旁边很可能是一栋钢筋水泥的玻璃帷幕大楼。古迹旁边的景观视野通常并没有被重视与限建。所以对古迹的保护,很难形成一条线、一个面。当然还有个更重要的原因是,台湾根本也没有年代久远且数量庞大到能够让人连成一条街的古建筑群,更别说能够形成一个像村镇一样面积的古城区,这是做梦都不会发生的事。

 欧洲有很多中世纪的古建筑,它数量庞大到轻易就能连成一条街,以及一个构成一个村庄。欧洲对于城市建筑的外在色调,很重视其一致性,在盖新的建筑时,会考虑到建物本身与周遭环境的配合,譬如建物外观的颜色、风格,不能太突兀。整个城市的规划和外形是一致的。像捷克首都布拉格的城市基本调性,就是红瓦、白墙,整齐的天际线,犹如童话世界一般。而同样都是老建筑,北京胡同的高度却都只有一楼高,就算不拆,外观上也很低矮,不会很新颖。北京胡同的基调就是灰色的,屋顶的瓦与墙上的砖都是同一种色调,一种保守而没有生气的“灰 ”。

 一个民族美学的素养与人的质感是反映在各个方面的。在台湾,有些人就直接在路边摊上狼吞虎咽的吃起东西。你说这是风土人情也罢,说是生活习惯也行,但在路边摊翘起二郎腿来吃东西,而旁边就有人在洗碗筷。其实既不卫生也不美观。但大多数的人都认为无所谓,也不觉得哪里不对劲。问题是,如此一来,街道就像是工寮,整个城市的景观就被破坏了。还有很多民众家里私人的装潢空间都很讲究设计感,布置的很漂亮,但只要一出了门,到了公有地,就不再会去关心周遭环境的景观。那种心态好像只要是公众的利益,大家就默不关心,自私的心态赤裸裸的显露无遗。这现象好像还不只有台北会发生,香港、上海,以及北京等地,居民的心态与状况也没有改善到哪里去。大部分人不会去在意城市整体景观的维护与协调,甚至花一点时间做环保义工都不愿意,但对于私人住宅,花再多钱装潢都毫不心软。  

 其实美学的鉴赏是需要从小到大一点一滴的教育,向下扎根,慢慢培养。这种公民意识的形成是需要花很长的时间去蕴酿,养成一整个民族的素质则更需要几百年,甚至上千年。对我而言,出国旅游是投资报酬率最高的行为,尤其是到历史悠久,人文荟萃的欧洲国家。因为他们整个民族花了几百年、甚至上千年时间建立起来的文明,你可能只需一、二万人民币就能浏览他们细心维护下的城市景观,那其实是很震摄人心的。

  第二次世界大战期间,布拉格的捷克守军为了维护古城的完整,宁愿选择投降,也不忍先人所耗费心力所建立的城市文明成为瓦砾。而几乎在同一时间,远在东方的中国,在抗战时期却做了完全不同的选择。当时湖南长沙聚集了许多战备物资,国民党为避免日军掠夺这些物资,但又不想浪费一兵一卒去守城,折损自己部队的战力。不待日军进攻,竟自行纵火焚烧整座长沙古城,引发中外著名的《文夕大火》。一个屹立数百年古色古香的长沙城就这样瞬间化为灰尘。当政者就为了保存自己的军力,还有所谓的面子,竟可毫不顾及历代祖先辛苦营建的心血。反观捷克的守军,宁愿当代的自己受辱投降,也不愿历代祖先的心血化为乌有。两相对比之下,不禁令人感概万分。完全不同文化背景所熏陶下的民族,对自身文化遗产的态度,及其所下的决定迥然不同, 当然命运也就不一样。

 我们的城市规划主要还是以建设、商业为目的去进行。台湾的老旧建筑汰旧换新的速度很快,现举台湾特有的“眷村”为例。所谓“眷村”就是当初跟国民党部队撤退到台湾去的那些军人与眷属所住的地方,其村落设置的地点遍布台湾各地。但政府从来就不认为那些眷村有保留的价值,因为它实际上也就四、五十年的历史,因为要百年以上的建物才够资格被认定为古迹。但如果现在连这种四、五十年的建物都不设法保留而一律拆毁的话,那到底台湾要怎么累积百年以上的建物呢?“眷村”它代表的是一个族群(外省人)共同的生活记忆。台湾的政府就是如此的不尊重住民的历史记忆,这是一个可以用来衡量为政者到底有没有“文化质感 ”的一个指标。

  有外国人说,台北是一个最没有自己风格与气质的城市。在台湾,任何人长大后回到十几二十年前的家乡,几乎都已找不到儿时的记忆空间,因为改建的速度很快。可能小时候看过的树、走过的桥、和邻居小孩玩耍的树林全部都因为改建而消失,几乎再也找不到共同记忆,因为共同记忆都被拆光了。建筑物本身所代表的历史记忆不被认为是有意义的。你能够想够想象你儿时生活过的地方,游戏过的公园、住过的小巷、吃过的小馆子,这些生活记忆十几二十年后都彻底的消失是个怎样的状况吗?而台湾每天都在重复一样的戏码,拆了又盖,盖了又拆。我想北京现阶段为了迎接奥运,老旧建筑拆得很快。

  在台湾,传统节日时很多人会来参加庙会的活动,比如迎神赛会、舞龙舞狮,但他们的穿著却很奇怪:上面的传统服装可能是唐衫或道袍,下面却是牛仔裤甚至是拖鞋。他没有意识到一个小细节的维护就是对传统的尊重。但这也不是台湾独有的现象,我透过报章杂志、与网络信息的了解,也很少看到内地有哪个城市的居民会集体在那个传统节日穿着传统服装出来一起庆祝。国外比如西班牙、法国、意大利等国家的传统节庆,整个小镇的居民都会不约而同自发性的穿载起传统服装,那画面很令人感动。

 现在大家拼命在讲全球化,但大家有没有想过,出国旅游什么最吸引你?就是那迥然不同的文化差异。去印度,看到印度教的僧侣在冥想;去西班牙,看到他们在斗牛;去南美洲感受桑巴舞;去日本看他们传统的樱花祭,就是那股异国的情调与神秘感在吸引着我们。如果全世界的建筑都盖一模一样,所有的人穿着打扮也都一个样,饮食、庆典、风土民情也不再有各自的特色,那其实已经没有观光的必要了,因为去到哪里都是一样的。所以就我的认知,全球化应该指的是经贸方面的交流,而绝对不应该是文化上的统一。

 台湾很多歌手都喜欢去国外拍MV,比如意大利的罗马、日本的北海道,拍出来都很宏伟、精致与耐看。但我却没有发现过有外国歌手的MV来台湾取景。因为我们的市容不整齐,整个镜头一拉开,这边可能是钢筋水泥的建筑,那边可能是四合院,景观的调性很不一致。我去了好几趟日本,日本人对传统聚落的维持一直很用心保存的良好,去那取景所拍出来的MV也很耐看。最讽刺的就是,比如青岛的租界区、上海的十里洋场了。这些曾被殖民者占据过的地方,都反而留下了为数不少而且很有质感的西式建筑。青岛这城市的天际线、上海外滩上林立的大楼都很漂亮。这不免有些讽刺,怎么那些占领时期所留下的建筑都保存得这么好?甚至已变成这些城市建筑里最美的元素。那我们是否应该感谢曾被占领过呢?否则那里来这么好的建筑艺术。   

 前一阵子我去北京王府井闲逛时看到一个外国教堂,教会对教堂的建筑外观通常都很讲究的,那整个教堂就维持的就很好。因为王府井的整条街都是近代才兴建起的西式办公大楼,看不到任何一栋有传统风格的中式建筑。虽然王府井号称是北京最古老的一条商业街,但我所看到最古老的建筑,却是那座外国教堂。除非有人告诉我这是曾经是清朝的最热闹的商业街,否则我根本就完全看不出来那里曾是所谓的百年老街。台湾状况也是如此,日本占领时期留下了很多漂亮的巴洛克建筑,台湾的一些重要的政府机关都还一直沿用这些建筑。这问题跟上海外滩一样都很反讽,台北市最精致的建筑元素也都是当初的占领者所留下来的。大家有没有想过到底问题出在那呢?莫非中式的古建筑不大气,建筑的格局与形式无法适应现代社会的要求!   

 就我的认知,新加坡可能是一个特外,它是一个由移民的华人所成立的国家,国家本身的历史不长但他们却很重视自己的传统文化,有些旧式的建筑保存得很好,他们认为那是国家的象征,甚至是观光旅游的资源。而且新加坡人大概是所有的华人中最守法的,其国民的法治观念很强,整体而言,素质较高。  

 常常我们旅游到了欧洲国家,你会发现他们都很注重与维护自己传统建筑的外观,当地住民也很重视自己独特的节庆。常在传统节日穿戴起自己国家的民族服装,整条街道、整个村庄的人都盛装出席。这点是自诩为文明古国的我们所不及的。我很少,甚至可说没有见过在什么中秋或端午节等传统节日看见我们华人会整个村庄的人特地穿着传统服饰去庆祝。我今天所谈到的都是一些自己的观察和心得,并非严谨的学术调查,因为我想认真的调查起来或许问题更严重。这些发生在你我身边随时随地都在上演的文化现象,各位同学不妨偶尔静下心来观察,绝对会让你有完全不一样的体悟。我一向很关注这些文化现象,有自己所坚持的价值观。后来我的文字因缘际会的跟杰伦的音乐相结合,所以才创作出那么多“中国风”的歌曲来,并且很荣幸的得到了许多人的肯定与喜爱。

 讲到质感的问题,在这里不得不提到日本这个国家。日本人很奇怪,他对中国人一直有种崇古蔑今的心态。他们极度崇拜古代的中国,像《西游记》、《封神榜》、《三国演义》、《水浒传》等典故,他们都很熟悉,甚至比中国内地的一些少数民族都还要熟悉。他们不仅崇拜而且还继承下了一些中华文化。比如日本的小学生到现在还有书道比赛,国家也很重视书法这项传统,也并不认为这是外国的东西。如果到东京街头,随便找个路人问他们关羽、张飞、孔子、孙悟空等,他们都知道是谁,甚至已经将他们吸收进自己文化里,并且消化成电动玩具、漫画等等。   

 我去过日本,发现他们对美学设计是很讲究的,整个城市里的居民穿着打扮都有很自己的风格,也就是有型。街道很干净,连一个排水沟的盖子都有城市的特有标志。整个街道的招牌、店面,都很素雅。他们很重视产品的包装;也很重视古建筑的维护。美学的观念很发达。如果说拿中国文化跟西方文明来强加比较,或许有人会说因为文化的源头不一样,思维本来就会不一样,因为一开始他们的建筑、绘画、音乐等文化的方向就跟我们不一样。如果你是这样认为的话。那么日本就是最好比较的对象了,一样受儒家学说影响并且在使用汉字的东方人,文化源头的同构型很高。但他们对传统文化却很用心去维系,举凡茶道、剑道、书道、能剧,以及成年礼等,还有相扑。相扑是一个国际运动项目,延续了几千年都不曾中断。我觉得这是很值得我们去观察、比较的。

 一般而言,电影、MV中如有需要出现婚丧的场景,有需要唯美的画面时,通常剧组都会整队拉去教堂拍摄,或是到充满十字架的墓园取景。就算没有受过正统美学的教育和训练,一般我们人的眼睛都还是会凭直觉分辨出好跟不好,美与不美。每当我看到犹太人逃难的纪录片时,我就深感讶异,五、六十年前犹太人逃难时的穿著,甚至在市区被德军集体遣送时的服装都是很整齐,有一定的素质:男性都穿西装大衣,戴帽子;女性则都会拿个小皮夹,或拎个皮包之类的;也没看到任何一个犹太小孩是打赤脚的。此时他们的身份是难民,但其民族整体表现出来的教育水平,则很令人敬佩与感慨。犹太人是一个很优秀的民族,这个民族出了许许多多几乎与其人口数等量的科学家与艺术家,对人类文明的贡献是很大。我个人觉得他们是个质感很高的民族。我以前在想为何关于二次大战跟犹太人相关的电影拍不完呢?原来因为他们之中很多人都是科学家、艺术家,每个人对美学的追求有基本的素养,整个民族文化的有一定层次的水平,所以这里面很多关于心理层面的故事可以发掘用来拍电影。但关于我们被日军侵略迫害的电影,至今我还没有看到一部很好看、拍的有质感的。我常在反思,到底是因为我们的电影工业不强,还是因为种族的心理层面很肤浅,没有东西可以发掘的?如果你个人不要求与累积身为人的质感,最后极可能就会影响到整体文化份量的累积。  

 举个最极端的例子。假设一百年前有颗陨石从外层空间掉到地球,刚好就落在中国的正中央,整个中华民族从此消失了,但旁边的国家都完全没有被波及。那么回过头来看百年后的今天,现阶段世界上各项的科技文明,与现代化的生活水平都还是会维持着,没有丝毫的影响。并没有因为我们消失了,整个人类文明倒退一百年。现代文明会不中断的持续,还是一样会发明手机、DV、电话、网络、飞机和汽车等,所有的物质文明一样都不会缺少。因为一百年前,我们的国家和民族处于十分衰落的境地,对世界的文明进展并没有太大的贡献。简而言之,假设一百年前中华民族彻底绝灭了,我们来看现在的科技文明,也不会缺少了什么东西。还有受过大学教育的人都知道,当你学习晋升到某个阶段时都会直接读英文原文书,尤其是医学、数学、物理、化学等领域。也就是摆明了说,近代的汉字文明有其严重的断层,读到某些高等教育时,汉字就完全无用武之地,再也无法提供学习所需的养份了。  

 教育是提升民族质感一个很关键的因素。如果一个民族不重视现代化的教育,对自己的传统文化又缺少认同感,长期以往,教育的资源分配不均,造成本国人民的素质参疵不齐,你可能人口很多,但并没有等量的优秀。当然在座的各位同学无庸置疑的都很优秀,是金字塔顶层出类拔粹的北大学生,但若跟内地庞大的人口数相比,人数还是少的可怜。反观犹太人,犹太人大概是世界上种族质感最高的民族之一了。犹太人虽然颠沛流离,去很多国家都被歧视,受到很多限制,比如不得从事什么工作等,但在这种环境下,他们反而更努力地去维系与巩固自己的传统文化,对自身民族的文化认同感很强。一个民族一定要对自己文化有很强的认同感,才会塑造出自己的风格,形成自己的美学观,这无形中也带动了国家创意产业的发展。我今天强调的是,如果个人不重视与提升自己的质感,不管是在教育训练、穿着打扮、以及美学设计等各个方面,那么你我这个没有质感的个体,将会像癌症般慢慢的影响它周遭的人事物。最后,影响到一个团体、一个公司、甚至一个城市、一个社会,以及一整个民族。   

 我希望大家先从重视自己本身所谓“华人”的民族气质与质感开始。除了使用与欣赏国际名牌的质感外,同时也要了解那些品牌之所以能够在国际市场屹立不摇的原因,正是因为他们对美学品味的追求从不懈怠。你不能只是为了暴发户式的证明你穿戴得起名牌,但却对自己服装上的褡配品味完全不会,或者根本不协调。名牌在你身上反而呈现出俗艳的质感。例假日时我自己常在台北郊区开车闲逛,眼睛每次总会停留在刚刚惊鸿一瞥路过的日式官舍、闽南式四合院,以及古厝周遭景色调性很一致的风景上。如果你可以在一百年前就展开环绕全球性的自助旅行,那你肯定是很幸福的,因为那时还没有全球化,所有国家的建筑都具备浓厚的本民族特色。譬如你到了越南的河内,看到的就是越式风情;到东京,看到的就是和式建筑;不论去到任何一个国家与民族,他们穿的衣服和城市的建筑都有着很鲜明的本民族特色。这时你看到的是一个完整的,传承自身文化的国家,没有外来的文化杂质,整座城市,不论是传统建筑,人民身上的服饰,其文化的调性都很一致,可以想象那真是一种铺天盖地属于本民族极致美学的画面。

但现在因为全球化的缘故,所有民族的传统服饰、所有国家的建筑、所有的价值观、所有的美学几乎都被现代化了,也就是所谓的西化,大家都采取同一种标准在看事情。像工厂同一套模具的输出品一样,城市与城市间的建筑,人民与人民间的穿著,格局越来越像,打扮越来越一样。我觉得这真的很可惜,很多不同文化体系的美不见了,很多独特的思维也就会跟着消失了。我们会重视物种的灭绝,假如青蛙、蝴蝶消失了一两个品种,就觉得很可惜。可是对于自己的文化、语言、文字正在快速的消失,我们难道就没有查觉那里不对劲吗?没有任何警觉吗?   

我一直都很喜欢汉字,尤其是传统的繁体字,是因为汉字是现今世界上唯一的表意文字,其它所有的文字都是拼音文字。不论是从拉丁文衍生出的法文、英文、德文,或是中东世界通用的阿拉伯文,或是我们亚洲近邻的韩文、泰文、以及日本的假名等,这些全都是以字母为发音基楚的拼音文字,地球上现还在通用并且流传的活文字里,唯有汉字是唯一一种尚在使用的表意文字,这是一项何等骄傲的事情啊!在现今强调物种多元、文化多元的国际社会,相异于基督教文明与回教传统的东方文化,其地位显得很特别。维护中华文化中独一无二与无可被取代的特性,更显其有意义。最后恳请大家重视今天所讨论的议题,当一个有质感的华人,就从你我间的改变开始……谢谢大家!

2008年11月25日星期二

Fedora 10正式放出


feodra10已经正式发布了,打算现在虚拟机上装一个,不打算直接升级到10。这里是fedora的发行注记。

2008年11月24日星期一

Berkeley DB JAVA EDTION

最近打算学习一下BDB JAVA EDTION,从OTN下载源码后,将源代码导入eclipse,然后加入junit,以及从sun的官方网站下载sun的JAVA EE参考实现并导入,就可以测试了,example,src,test三个文件夹里都是代码,example里是一些小例子,test里是针对源代码的测试方法,src里是源码,使用可以参考OTN上的文档,研究源码可以去这个哥哥的博客看看。另外已经有个哥哥翻译了一些BDBJE的文档在这里,万分感谢。

2008年11月19日星期三

How Oracle Store Number internal?

作者:eygle |English Version 【转载时请以超链接形式标明文章出处和作者信息及本声明】
链接:http://www.eygle.com/archives/2005/12/how_oracle_stor.html

Oracle在数据库内部通过相应的算法转换来进行数据存储,本文简单介绍Oracle的Number型数值存储及转换.这个内容是为了回答留言板上的2119号问题.

我们可以通过DUMP函数来转换数字的存储形式,一个简单的输出类似如下格式:

SQL> select dump(1) from dual;

DUMP(1)
------------------
Typ=2 Len=2: 193,2

DUMP函数的输出格式类似:

类型 <[长度]>,符号/指数位 [数字1,数字2,数字3,......,数字20]

各位的含义如下:

1.类型: Number型,Type=2 (类型代码可以从Oracle的文档上查到)

2.长度:指存储的字节数

3.符号/指数位

在存储上,Oracle对正数和负数分别进行存储转换:

正数:加1存储(为了避免Null)
负数:被101减,如果总长度小于21个字节,最后加一个102(是为了排序的需要)

指数位换算:

正数:指数=符号/指数位 - 193 (最高位为1是代表正数)
负数:指数=62 - 第一字节

4.从<数字1>开始是有效的数据位

从<数字1>开始是最高有效位,所存储的数值计算方法为:

将下面计算的结果加起来:

每个<数字位>乘以100^(指数-N) (N是有效位数的顺序位,第一个有效位的N=0)

5. 举例说明

SQL> select dump(123456.789) from dual;

DUMP(123456.789)
-------------------------------
Typ=2 Len=6: 195,13,35,57,79,91

<指数>: 195 - 193 = 2
<数字1> 13 - 1 = 12 *100^(2-0) 120000
<数字2> 35 - 1 = 34 *100^(2-1) 3400
<数字3> 57 - 1 = 56 *100^(2-2) 56
<数字4> 79 - 1 = 78 *100^(2-3) .78
<数字5> 91 - 1 = 90 *100^(2-4) .009
  123456.789

SQL> select dump(-123456.789) from dual;

DUMP(-123456.789)
----------------------------------
Typ=2 Len=7: 60,89,67,45,23,11,102

<指数> 62 - 60 = 2(最高位是0,代表为负数)
<数字1> 101 - 89 = 12 *100^(2-0) 120000
<数字2> 101 - 67 = 34 *100^(2-1) 3400
<数字3> 101 - 45 = 56 *100^(2-2) 56
<数字4> 101 - 23 = 78 *100^(2-3) .78
<数字5> 101 - 11 = 90 *100^(2-4) .009
  123456.789(-)

现在再考虑一下为什么在最后加102是为了排序的需要,-123456.789在数据库中实际存储为

60,89,67,45,23,11

而-123456.78901在数据库中实际存储为

60,89,67,45,23,11,91

可见,如果不在最后加上102,在排序时会出现-123456.789<-123456.78901的情况。

ORACLE里的char,varchar2,nchar,nvarchar2讨论

转自ITPUB,原文请看这里。

这篇文章对这几种数据类型的讨论非常清楚,另外还推荐看看TOM的大作,ORACLE9i&10g编程艺术--深入数据库体系结构,一书的关于数据类型的那一章。

今天上午和杨老大讨论了一下char,varchar2,nchar,nvarchar2几种字符类型,发现有几种类型不大容易
分的清除,于是做了一下试验,希望能够对大家有所帮助。(高手请跳过)
如果你也搞不太清楚这几种类型,下面的东东可能对你有所帮助。
首先介绍一下环境,字符集是ZHS16GBK,国家字符集是Al16UTF16
第一步:建一张表:
SQL> create table typetest(cha char(10),varcha varchar2(10),ncha nchar(10),nvarcha
nvarchar2(10));
表已创建。
第二步:插入一行:
SQL> insert into typetest values('a','a','a','a');
已创建 1 行。
SQL> commit;
提交完成。
然后用DUMP查看一下库中的实际存储的内容:
SQL> select dump(cha),dump(varcha),dump(ncha),dump(nvarcha) from typetest;
DUMP(CHA)
--------------------------------------------------------------------------------
DUMP(VARCHA)
--------------------------------------------------------------------------------
DUMP(NCHA)
--------------------------------------------------------------------------------
DUMP(NVARCHA)
--------------------------------------------------------------------------------
Typ=96 Len=10: 97,32,32,32,32,32,32,32,32,32
Typ=1 Len=1: 97
Typ=96 Len=20: 0,97,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32
Typ=1 Len=2: 0,97
发现了什么?没发现什么?滚一边去
这样我们得出了结论1:
char nchar 类型是按照定义的长度存储数据的,如果数据不够,后面补空格
varchar nvarchar2 是变长数据类型,实际长度随着存放的数据量改变
进一步思考,可以得出以下结论,用char就是空间换时间,用varchar2就是时间换空间,因为char占用较多
的空间,但是因为规则,处理起来会比较快,varchar2比较节省空间,但是处理起来比较慢,而且如果频
繁的做UPDATE还会产生行转移,会造成数据库性能下降。(什么叫行转移?你真的想知道?有空的时候来
找我,我慢慢将给你听)
接着做试验:

SQL> insert into typetest values('我','我','我','我');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select dump(cha),dump(varcha),dump(ncha),dump(nvarcha) from typetest;
DUMP(CHA)
--------------------------------------------------------------------------------
DUMP(VARCHA)
--------------------------------------------------------------------------------
DUMP(NCHA)
--------------------------------------------------------------------------------
DUMP(NVARCHA)
--------------------------------------------------------------------------------
Typ=96 Len=10: 206,210,32,32,32,32,32,32,32,32
Typ=1 Len=2: 206,210
Typ=96 Len=20: 98,17,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32
Typ=1 Len=2: 98,17
可以看到char和varhcar是用的GBK编码的,nchar和nvarchar2是用的utf16,国家字符集进行编码的
继续向下看
SQL> insert into typetest values('我我我我我','我我我我我','我我我我我','我我我我我');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select dump(cha),dump(varcha),dump(ncha),dump(nvarcha) from typetest;


DUMP(CHA)
--------------------------------------------------------------------------------
DUMP(VARCHA)
--------------------------------------------------------------------------------
DUMP(NCHA)
--------------------------------------------------------------------------------
DUMP(NVARCHA)
--------------------------------------------------------------------------------
Typ=96 Len=10: 206,210,206,210,206,210,206,210,206,210
Typ=1 Len=10: 206,210,206,210,206,210,206,210,206,210
Typ=96 Len=20: 98,17,98,17,98,17,98,17,98,17,0,32,0,32,0,32,0,32,0,32
Typ=1 Len=10: 98,17,98,17,98,17,98,17,98,17

SQL> insert into typetest values('我我我我我我','我我我我我','我我我我我','我我我我我');
insert into typetest values('我我我我我我','我我我我我','我我我我我','我我我我我')
*
第 1 行出现错误:
ORA-12899: 列 "COMM"."TYPETEST"."CHA" 的值太大 (实际值: 12, 最大值: 10)

SQL> insert into typetest values('我我我我我','我我我我我','我我我我我我我我我我','我我我我
我我我我我我');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select dump(cha),dump(varcha),dump(ncha),dump(nvarcha) from typetest;

DUMP(CHA)
--------------------------------------------------------------------------------
DUMP(VARCHA)
--------------------------------------------------------------------------------
DUMP(NCHA)
--------------------------------------------------------------------------------
DUMP(NVARCHA)
--------------------------------------------------------------------------------
Typ=96 Len=10: 206,210,206,210,206,210,206,210,206,210
Typ=1 Len=10: 206,210,206,210,206,210,206,210,206,210
Typ=96 Len=20: 98,17,98,17,98,17,98,17,98,17,98,17,98,17,98,17,98,17,98,17
Typ=1 Len=20: 98,17,98,17,98,17,98,17,98,17,98,17,98,17,98,17,98,17,98,17
OK,看出结论没,char和varchar是通过数据实际占用的比特数计算长度的,nchar和nvarchar是实际能够存
放的字数为计算长度的,如果是al16utf16,那它可以存放10个汉字,那么实际占用的比特数就是20。
(可以想一想如果用UTF8做为国家字符集会产生什么样的结果)
最后讲一下,测字符串长度
你能告诉我length('我我我我我')的值是多少吗?lengthb('我我我我我')呢?lengthc('我我我我我')呢

给大家看一下结果,看看你猜的对不对
SQL> select * from typetest;
CHA VARCHA NCHA NVARCHA
---------- ---------- -------------------- --------------------
a a a a
我 我 我 我
我我我我我 我我我我我 我我我我我 我我我我我
我我我我我 我我我我我 我我我我我我我我我我 我我我我我我我我我我

SQL> select length(cha),length(varcha),length(ncha),length(nvarcha) from typetest;
LENGTH(CHA) LENGTH(VARCHA) LENGTH(NCHA) LENGTH(NVARCHA)
----------- -------------- ------------ ---------------
10 1 10 1
9 1 10 1
5 5 10 5
5 5 10 10
SQL> select lengthb(cha),length(varcha),length(ncha),length(nvarcha) from typetest;
LENGTHB(CHA) LENGTH(VARCHA) LENGTH(NCHA) LENGTH(NVARCHA)
------------ -------------- ------------ ---------------
10 1 10 1
10 1 10 1
10 5 10 5
10 5 10 10

SQL> select lengthc(cha),lengthc(varcha),lengthc(ncha),lengthc(nvarcha) from typetest;
LENGTHC(CHA) LENGTHC(VARCHA) LENGTHC(NCHA) LENGTHC(NVARCHA)
------------ --------------- ------------- ----------------
10 1 10 1
9 1 10 1
5 5 10 5
5 5 10 10
有问题欢迎和我讨论!

ORACLE数据库中的字符集和国家字符集

今天同事的项目碰见了乱码问题,查了基本情况以后,我认为他们没有弄清楚数据库字符集和国家语言字符集的区别。查资料后,叙述如下:
原文:
Character Set Types
The CREATE DATABASE statement has the CHARACTER SET clause and the
additional optional clause NATIONAL CHARACTER SET to declare the character set
to be used as the database character set and the national character set. Neither
character set can be changed after creating the database. If no NATIONAL
CHARACTER SET clause is present, the national character set defaults to the
database character set.
Because the database character set is used to identify and to hold SQL and PL/SQL
source code, it must have either EBCDIC or 7-bit ASCII as a subset, whichever is
native to the platform. Therefore, it is not possible to use a fixed-width, multibyte
character set as the database character set, only as the national character set.
The data types NCHAR, NVARCHAR2, and NCLOB are provided to declare columns
as variants of the basic types CHAR, VARCHAR2, and CLOB, to note that they are
stored using the national character set and not the database character set.
To declare a fixed-length character item that uses the national character set, use the
data type specification NCHAR [(size)].
To declare a variable-length character item that uses the national character set, use
the data type specification NVARCHAR2 (size).
To declare a character large object (CLOB) item containing fixed-width, multibyte
characters that uses the national character set, use the data type specification
NCLOB (size).
译文:
字符集类型

CREATE DATABASE语句中有CHARACTER SET从句和附加的NATIONAL CHARACTER SET从句用来定义
数据库的字符集和国家字符集。这两个字符集在数据库创建之后都无法修改。如果不指明NATIONAL
CHARACTER SET从句,则国家字符集缺省取数据库字符集。
因为数据库字符集用于标识并装载SQL和PL/SQL源代码,所以数据库字符集必须将EBCDIC或7位ASCII
作为子集。因此,固定宽度,多字节字符集不可能作为数据库字符集,而只能作为国家字符集。数据类型
NCHAR,NVARCHAR2和NCLOB是基本数据类型CHAR,VARCHAR2和BLOB的变体,来指明它们用国家字符集而
不是数据库字符集存储数据。

NCHAR用于使用国家字符集定义固定长度的字符项。
NVARCHAR2用于使用国家字符集定义变长度的字符项。
NCLOB用于使用国家字符集定义字符大对象,来保存固定宽度,多字节字符。

数据库字符集存储变宽度字符,国家字符集存储固定宽度和变宽度多字节字符。

2008年11月18日星期二

ORACLE列转行

今天同事问我怎么进行列转行(ORACLE)里面,他需要对求和所得的一行6列数据,转换成6行一列数据。举例如下:
select 11 num1,15 num2 from dual
得到的结果应该是:
num1 |num2
11 15
需要转成:
num |name
11 num1
15 num2

写出来的SQL如下(其他的数据库也可以套用这个):
select decode(rownum,1,num1,num2) num,decode(rownum,1,'num1','num2') name from
(select 11 num1,15 num2 from dual connect by level<=2)
如果列的数目再多一些的话只需吧level增大,多加decode判断即可。当然出于便于阅读的原因我还是建议将decode换成case。

我的户口之旅

转载

我出生在河南一个平原村庄,那一年天有异象,老人说是“天塌地陷闹耗子,因为毛(猫)没了”。

父亲是民办老师,在村子里教书,每月五块钱工资,77年上师范转正,成了吃国粮的干部,拿到了几十块。我,我妈妈,都是农村户口,沾了这个光,又有了弟弟和妹妹,父亲说,要是在城市咱们就少了两个劳力。我是长子,出生后不久就分到了地,一亩二分五。妈妈常教育我,好好上学,考上小中专,就不用在家打泥腿子了。父亲的师范属于小中专,那是通往吃国粮的门槛。
刚上小学时,有城市里的小学到村边油田慰问演出,我们全村倾巢出动,看那些城市里的孩子。他们抹着红脸蛋,拿着大红花,穿着花衣裳。不知什么样的爸爸妈妈,把孩子养得这么漂亮,我们流着鼻涕,看这些来自远道而来的天使。
小学四年级的时候,父亲当了乡中心小学的校长,我跟着到了乡里,五年级,父亲又去了市里一个小学当老师,我又跟着到了市里。那是我从来没见过的大城市,有几万人,一个年级就有四个班。我的户口不合格,但因为是教师子弟,上学就没有耽误。见到同学们恍然大悟,原来小时候看的天使就是他们。也交了几个朋友,放学之后,同学会带我去游戏厅,或者台球。我们花的钱从哪里来呢?原来是同学用偷家里的粮票换的,跑到卖馒头的作坊,把粮票换成钞票,河南粮票便宜,全国粮票贵些。那时候整个城市买粮食油都用粮票,我家只有父亲一人有粮票,我实在无票可偷。
随后,妈妈弟弟妹妹都搬到市里,而且转成了城市户口,吃商品粮了。他们有了一个大红户口本,每个人的名字写在上面,但唯独漏了我一个。父亲对我解释说, “办户口得花钱,你学习还可以,考上大学就转成城市户口,这样咱就能省两个。如果你考不上大学,村里还有你一亩二分五的地呢。”父亲这个激励办法给我带来很大的危机感,全家都是城市人,就我是农村人,如果考不上大学,他们都吃国粮,我得自己回村子种地,这让我忧心忡忡,人生的贵贱在此一举了。四叔跟我一样大,在村子里已经辍学,14岁就跟爷爷奶奶种地兼卖油条了。从此,那一亩二分地成了我的一块心病,那是多大的一块地啊,我一天才能锄二分地。
上高中比较顺利,然后准备考大学,高三的时候,一个同学突然转学了,他在班里排四十多名,属于根本没戏的差生。后来听说,他转到了北京去考大学,弄了个北京户口,分数线比河南低好几百分,他考上了北京工业大学。那是我第一次知道北京户口,知道北京户口很牛。
我去郑州大学报道,户口也转到学校,身份证上的地址写着,郑州市大学路某某号。老师说,你们现在的身份是干部了。在我小时候的印象里,干部就是中山装,四个兜。我们是干部,国家包分配,从此衣食无忧了。但悲惨的是,我们是第一届并轨生,学费高了,布包分配了,有农村来的同学痛不欲生,当初怎么不报师范啊,那个还包分配,现在一毕业就要失业了。上大学是1995年,有城市户口也早没粮票可拿了,我对户口没有了概念,反倒生出了优越感,我村子里的地还瞒着没退,我跟同学一样都是城市人,可是我还有地啊。
毕业去河南日报,有省人事厅的编制,户口也随即转到郑州市纬一路一号,金水河派出所,成了郑州市市民。而且,到现在户口还在那里。一旦户口在那儿,如果没有下一个接收单位,我的户口会在河南日报躺一辈子,尽管它对我早已没了意义,但我理论上还是单位里的人。
这两年,听说郑州放开了户口,只要在郑州买房子,或者亲戚朋友是郑州人,都可以领到郑州户口。政策一出,人们疯了,然后,政策被紧急叫停。这说明户口依然神圣,在广大农村人眼中。郑州的朋友说,并不是郑州市政府大发慈悲,而是他们有一个直辖市之梦,需要人口大量扩张,膨胀成一个特大型城市,就有底气申请搞个直辖市了。
到北京之后,一直在私营单位,或在国营报社打黑工,所以,我和我的户口两地分居了。户口在河南日报,档案寄存在河南省人才交流中心,在北京结了婚,老婆上研究生,户口在大学,我们在老家医院生了孩子。于是你知道,我的孩子办出生会有多复杂,结婚证、准生证、出生证,开单位介绍信成了不可能的任务,最后的结果是,我的介绍信全驴头不对马嘴,只有孩子是真的。
我2000年到的北京,住在北京而没有北京户口,这叫北漂,叫暂住在北京,要办暂住证的,凡是没暂住证上街,警察查到了马上流放到昌平挖沙子,然后遣返回原籍。具体经办此事的是收容遣送站,在里面会挨打,还要家属交钱领人。有人把收容遣送站改名叫国营绑架公司。大学生孙志刚在广州没有暂住证,在送往收容遣送站的过程中被打死了。那两年,我走在北京的街上,不敢向警察瞄上一眼,但由于我肥头大耳,从来也没遭到警察盘问。反倒领了任务,去采访收容遣送制度。后来全国废除了收容遣送制度,但北京一直在搞。我一直坚信,北京真的很牛。
媳妇毕业了,分到国有机构,有了北京户口,成了北京市民,把女儿户口也带过来,她是我这个暂住人口的保护伞。媳妇如果失业,北京市会有低保,我如果失业,只能去大街乞讨,现在连乞讨也不让了,北京有关部门呼吁过,不要施舍给乞丐。好在女儿可以上学,如果不挑肥拣瘦,可以在片内上小学,如果在别的片上,可叫三到十万的赞助费。一位同事也有个女儿,单位帮忙上了一个小学,交了三万。但他一直在极度郁闷中,小学是上了,但小升初不考试,仍然需要北京户口,到时他的女儿就要回河北保定老家上初中,而且考试也要在河北。但她的爸爸妈妈都在北京,而且要在北京暂住一辈子了。

媳妇说,等她有了中级职称,就可以把配偶办过来。我是她的配偶,托她的福,若干年之后会成为北京人,成为首善之区天子脚下皇城根的人,那时我也是有保障的人了,老了也有人管了。一个农村高粱地里出来的孩子,先后成了村里的人、市里的人、省里的人,现在终于成了“中央”的人了。这是不是很幸运呢?但是我知道,像我这样的,只是极少数的幸运儿,绝大多数的同胞们还都是泥腿子,泥腿子洗脚上岸,到城市讨生活,但最终还是泥腿子。城市里的我父亲,看病花了二十万,村子里的我二叔,同样的病花了两万就回家了。并不是父亲多有钱,只是因为父亲在城市工作,二叔在农村工作,谁说在农村种地就不是工作呢?

2008年11月17日星期一

Oracle SQL Developer Data Modeling


今天上OTN,发现SQL DEV正在做数据建模工具,马上我们就可以使用ORACLE的免费数据建模工具了。这个工具现在还是一个单独的产品,但是以后会集成到SQL DEV中。

小说业务与技术

昨天来了个韩国人,给同事培训业务。他说在韩国懂业务的人比懂技术的人挣的钱多很多。这话本身是很不严谨的,业务和技术并不矛盾。做技术的可以分为四种人,懂业务又懂技术的,懂业务而不怎么懂技术的,懂技术但业务比较生疏的,业务技术都不行的,当然我觉得他的意思是既懂技术又懂业务的人比只懂技术的人挣的钱多。

其实这是个说了很多年的话题。通常来说搞业务为主的人觉得业务重要,搞技术为主的人认为技术重要。我是搞技术的,理所当然的认为技术更重要一些。

离开了技术,业务是无从实现的。我实在无法想象一个技术不怎么样的人,却凭自己熟悉业务就能开发或者整合出一套系统(好多做SAP的人就是这样,连后台ORACLE的实例调优都不懂,却敢号称自己的系统最优)。对大部分企业来说/个人也是这样,很多需求是很难归纳成同一的实现来处理,尤其是在中国。在这种情况下,我们很难套用ERP这样的成型业务软件来解决问题,这也是为什么ERP项目失败的比成功的多的原因。因此业务很明白而技术不行的人,其实是很难在软件方面立足的。

对程序员来说,一旦跳槽,公司的业务就可能完全不通,但是技术总是那几样。因此,技术是永恒的东西,而业务却不是。再者,像他们讲的那么麻烦的业务,在实现上脑力劳动不多而体力劳动多。程序员在大部分情况下不愿意做那么多体力活。因此很多程序员并不喜欢花很大力气在业务上。

由此想到公司所谓的愿景--2010年进入企业级服务的top 10。觉得这个所谓的愿景挺可笑的。就拿所谓的SAP ERP咨询业务来说吧(公司想做业务型的公司)。可能在韩国能够做成(依靠他们在韩国的地位),但是这个模式在其他国家是不可复制的。比如在中国,SAP ERP软件只有大型企业才用的起,而这种大型企业是根本不会把实施SAP ERP的工作交给公司来做的(他们可以直接找SAP或者ORACLE)。而小公司呢,则根本用不起SAP ERP。自己的看法是公司一辈子也成不了所谓的TOP 10,因为他们既没有牛逼的技术,也没有创新的业务。如果说他们能想出很好的方式来服务广大的中小型企业,那么这个所谓的愿景才有可能实现。Technolog should not be treated so lightly.

2008年11月16日星期日

PostgreSql源码学习(6)

PG源码之parser(3)

以下是几个小例子(有自己写的,有查资料得到的):
select ename from emp e
树的顶端节点是 SelectStmt 节点,没有查询条件,所以没有别的节点。

select ename from emp where empno>2000

树的顶端节点是 SelectStmt 节点,由于有范围查询条件,使用SQL 查询的 where 子句构建的操作符树,这个操作符树附加到了 SelectStmt 节点的字段 qual 上。为在查询里出现的常量(2000)条款创建一个 Const 节点(makeintconst),存放常量值。

select e.ename, d.dname
from EMP e, dept d
where e.empno > 2000 and e.deptno = d.deptno;


树的顶端节点是 SelectStmt 节点。对每个在 SQL 查询的 from子句里出现的元素创建一个 RangeVar 节点,存放 alias(别名)的名称和一个指向一个存放关系名称的 RelExpr 节点的指针。所有 RangeVar 节点都收集到一个列表里,然后附加到 SelectStmt 节点的 fromClause 字段上。

对于 SQL 查询里面的 select列表 里出现的每个元素都创建一个 ResTarget 节点,存放一个指向 Attr 节点的指针。Attr 节点存放元素的关系名称和一个指向存放着字段名称的 Value 节点的指针。所有 ResTarget 节点都收集到一个列表里,然后链接到 SelectStmt 节点的 targetList 字段里。

SQL 查询的 where 子句构建的操作符树,这个操作符树附加到了 SelectStmt 节点的字段 qual 上。操作符树的顶端节点是一个代表 AND 操作的 A_Expr 节点。这个节点有两个后继节点, lexpr 和 rexpr 分别指向两个子树。附加到 lexpr 的子树代表条件 empno > 2000 而附加到 rexpr 的子树代表e.deptno = d.deptno。为每个字段创建一个 Attr 节点,存放关系名和一个指向存放着字段名的 Value 节点的指针。为在查询里出现的常量条款创建一个 Const 节点,存放常量值。

PostgreSql源码学习(5)

PG源码之parser(2)

上文大概描述了pgsql处理查询的第一步,下面我将分析parser部分的原代码,(src/backend/parser里的源代码),可能需要写的东西要比较多一点。
1 scan.l
这个文件包含了几个头文件,其中postgres.h主要是一些在后台进程中经常用到的常量以及自定义变量(这个以后再说);gramparse.h用于避免使用bison做语法分析时的缺省模式(bison使用行列号来标示单词);keywords.h主要是跟关键字相关的内容(要区分开非关键字0,列名关键字1,类型/函数名关键字2,保留关键字3,ScanKeyword结构体就是用于区分关键字的,实际上是一个关键字符号表);scanup.h是与扫描相关的代码(还没弄的太懂);pg_wchar则引入对多字节字符的支持(比如汉语)。
以下是对一些成员变量的解释:
fprintf用于打印出错误。
backslash_quote好像是用于处理跟GNU工具相关的内容。(但是我不明白具体是做什么的)
literalbuf用于在满足多个规则时聚合相应的字面量。
使用startlit重置buffer,使用addlit来添加字符。buffer用palloc来分配,随着每次解析循环重新开始和刷新buffer。
接下来的这部分主要是处理各种情况,比如双引号,单引号(字符串中的),美元符号等等。
从331(8.3.1版本中)行开始就是对各种情况的处理。
从764行开始是几个函数,lexer_errposition用于确定错误的单词位置,yyerror用于报错,scanner_init在实际的解析开始之间做用于分配内存,scanner_finish用于释放内存,addlit来添加字符,addlitchar用于给传入的字符串的长度加1,litbufdup用于对缓冲区重写,unescape_single_char用于检测escape表达式中的特殊字符(like语句的正则表达式部分),check_string_escape_warning和check_escape_warning与escape语句表达式的错误相关(具体是处理什么我没太看明白。)。

2 gram.y
第81行的指针变量parsetree实际上就是gram的返回结果,这个变量在parser.c中定义,这样就可以返回一个解析好的语法树。从151到358行是声明针对各种情况的解析函数。从369行到453行是SQL关键字。从465行到503行是操作符的优先级定义。从514开始到9433行是各种语法定义,包括create/alter/drop role,create/alter/drop user,create/alter/drop group,create schema等等。
makeColumnRef函数的作用不明,欢迎高手指教。
makeTypeCast函数用于SQL数据类型转换。
make...Const这几个函数似乎是用于生成常量节点。
makeOverlaps生成函数调用节点。
check_qualified_name和check_func_name函数的作用不是很清楚。
extractArgTypes函数用于在给定一系列函数参数名的情况下,提取参数的类型。(好像是这样子,不是很确定)
findLeftmostSelect是获取最左端的select语句。
insertSelectOptions是用于处理如下语句:insert into tablename select * from another_tablename。
makeSetOp的作用也不是很明白,似乎是和SET语句的选项有关系。
SystemFuncName用于返回系统函数名(pg_catalog里定义)。SystemTypeName用于返回系统type名。
parser_init用于初始化。
doNegate和doNegateFloat用于处理负数的情况。
makeXmlExpr是用于处理XML表达式和XML函数。

2008年11月14日星期五

如果你是狼——中国房地产的寓言

作者不详

猪通过勤劳致富有5元钱存在老鼠开的钱庄里。猪打算拿这5元钱建一个小窝,大概要花2元卖地,花3元搭窝。
王八是搞工程的,他想在猪身上挣更多的钱,于是找来当投资顾问的狐狸想办法。
狐狸说:这好办。于是找来管地盘的狼,开钱庄的老鼠一起来商议。
结果王八从老鼠那里借来200元,用100元买了狼的地,花了3元把猪窝盖好,花了50元给了狐狸咨询服务费。
猪没有地,只好求王八把窝卖给它,王八要价500元。
老猪说只有5元买不起,这时候狐狸说服猪去向老鼠借钱;
老鼠答应借500给猪,前提是要他连本带利还600元,可以分10年还清,并且产权证拿来抵押。结果成交。
猪到最后花了600元买来了猪窝,比地价加建设成本高了11倍,猪努力了十年去挣钱还贷。
在这场交易里面,狼,老鼠,狐狸还有王八都挣了钱。以后他们就如法炮制,迫使更多的猪去贷款买房子了。
这时候,驴看到有机可乘,到老鼠那里贷了好多好多的款,把王八盖的房子都买下来,然后以更高的价格卖给了猪。猪的还贷期就越来越长,吃的越来越差,小猪崽子也不敢生了。
由于猪的数目越来越少,狼觉得这样下去自己没有猪肉吃了,非饿死不可,于是开始调控,不让老鼠再借钱了。但是王八还没有停止盖房,把自己挣的钱和贷的钱全投入生产了。驴手上的猪窝囤积的很多,卖不动了被套牢了。结果,老鼠,王八,还有驴都挣了好多的猪窝。钱到最后集中到狼手上。
如今,谁都等着狼把钱拿出来救命。聪明的你,如果你是狼,你会拿钱救哪个?

2008年11月9日星期日

鼓励未来的程序员

转自CSDN,原文请看这里

今天我在BBC新闻网站上看到了这篇有趣的文章,是关于英国游戏产业的,英国是如何一直在发展他们能力范围之上的游戏产业。这个问题总是被推向那些伴随着BBC Micro,ZX-81等的计算机长大的那一代人身上。那时候的计算机通常会有一个内置的BASIC解释器,你需要使用它来运行磁带或磁盘程序。

幸亏这些本地居民和便宜的计算机,英国多年来在游戏市场都占据强有力的地位。程序员通过进入杂志的列表开始了解编程,进而一步一步开始写自己的游戏代码。那时候的机器明显是比现在的机器要难用,但却是文档齐全,更具有编程文化——如果你想要使用,你至少需要学习少数命令。

现在,与今年的这篇文章比较一下,这篇文章就显得很压抑。很少人在学习编程,学校在全神贯注地教学生如何使用Word和Excel。难怪很多人都不愿意考虑去试一试OpenOffice!(好像老外也教小孩使用office。)

我现在将近30岁,在9或10岁的时候拥有了我的第一个计算机(Amstrad CPC 6128)。所以我认为我是处于伴随着第一代计算机长大的那一代人的末梢儿。像很多其他人一样,我按照电话本大小的手册书里的指南去编写程序,建立一个地址本应用程序,花费几个小时键入程序,同时调试来自杂志的游戏。

90年代被认为是计算机产业的一个糟糕时期,尽管计算机网络是出现于这个时代。Commodore沉没,Apple也只是死里逃生,在短短几年之内,Windows开始占据桌面统治地位,其它的几乎都消失了。

Windows毋庸置疑在使计算机更易使用方面做出了杰出贡献(其实我不喜欢承认这件事情,我是一个Linux用户),同时还提供了写信,制作电子表格,到后来的网络冲浪等一些了不起的功能。一定程度上来说,它使计算机变成了一个黑匣子,使人们对学习编码不感兴趣。(很正确。)

同时,游戏控制台开始占据更大的游戏市场。一些流派(如RTS即时战略),已经在家庭计算机上占有了很强的地位,而且现在仍然如此。平台游戏如Mario和Sonic游戏渐渐退去舞台。所以,像过去那种为了玩游戏买计算机,然后开始编程的情况已经很少见了。

现在,如果你买一台Windows PC,没有任何方式会鼓励你用它编程序。没有任何种类的指导,也没有BASIC解释器(或者任何其它解释器)。现在的PC杂志似乎没有做任何鼓励人们学习编程的事情,我觉得这有一些悲哀。(我刚开始学BASIC的时候,需要从软盘安装BASIC的开发环境。)

拥有一台Windows计算机,在我看来,你实际上应该从它开始对编程产生兴趣,应该知道你对它感兴趣,你可以使用它作为一个编程平台。我的意思是,它并不会鼓励你学习特定的编程语言。据我所知,微软的操作系统到目前为止还不包括任何编程工具。

让人感到受挫的是,他们其实已经有了近乎完美的编程工具,以Visual Studio Express Edition的形式。我希望人们能学习一种开源语言而不是依靠Windows,但我更希望看见人们能首先被鼓励编程。为什么微软的Windows操作系统不能包含至少一种Visual Studio Express Edition IDE(我预期他们大概主张Visual Basic,尽管那不是我的首选),以及一个用户手册(打印或pdf版本)?他们可以在桌面上放置一个链接“开始学习编程!”,让人们在好奇心的驱使下自然而然地去学习。如果人们不喜欢,他们可以删除它,那不是很好。事实上,现在你不得不到微软的网站上去寻找它。他们应该鼓励人们去学习他们的软件,并为之开发更好的应用。(VS的免费版本功能很强大,在做windows系统下的桌面应用的时候很好用。)

我认为在很多方面,Apple做的更好。通过在OS X的每一个拷贝中包含Xcode IDE,伴随计算机同时提供了一个有力的编程工具。而且,OS X本质上来说是Unix的一种形式,很适合编程用。但是,事实上,Xcode不是预安装的,意味着它不是默认安装的,使得使用性变小,人们可能会出于好奇心而安装它。同时,尽管XCode确实装载了文档,但却没有包含任何“初学者向导”,看起来像是只为那些已经成为程序员的人提供的。他们应该明确地做更多能鼓励人们开始编程的事情。所以,我再一次感觉到像Windows,OS X都是很少的努力来鼓励人们开始学习编程。(没用过MAC 不清楚。)

另外一个Apple和微软的共同点是,他们过于强调IDE而不是文本编辑器。我曾经短暂地试过使用Visual Studio Express Edition,也试过Xcode,我同意这种观点,就是IDE是你开始编程的最后一个选择。学习一个全新且复杂的应用程序,同时学习编程,对大多数人来说都有些困难,但任何人都会使用基本的文本编辑器。甚至是更复杂的,如Vim(我个人喜欢的)也远比使用大多数IDE容易得多。毫无疑问IDE提供了大量特征供用户体验,但当某人开始他编程第一步时,却是极其不应该选择的。(windows平台的程序员很多人连编辑器和解释器都分不清楚,这实际上是IDE的功劳。我自己喜欢VIM和EMACS这两个编辑器,各有各得好处。IDE在JAVA EE开发的时候很有用,可以避免自己手动配置那些麻烦的参数。)

有一件事情让我喜欢Linux超过OS X和Windows。目前,在某些流行套件如Ubuntu中,你实际上不需要为日常作业而使用终端,现在有一个很强的文化在做这件事情,你可以使用它来解决问题。我认为部分原因是由于主要支持来源于论坛,对某个人来说,很容易就可以给你粘贴一个命令,粘贴到终端,然后告诉你“点击这里,然后这里,然后这里……”。同时,bash shell比Windows的配对产品更有力。总的来说,可能会存在一个学习曲线,使用bash通常是完成一项任务的最快、最方便的方法。从使用 bash,通过编辑文本文件改变设置,然后到编写shell脚本或是学习使用Perl或Python编程并不是很困难的事情。很多套件包含语言的同时也会包含大量文档。同时,Linux中使用的语言几乎是一成不变的,可以使用一个简单的文本编辑器而不是强迫你去学习使用某个IDE,我感觉这让他们更容易理解。(linux下的编译器和编辑器是分开的。很多人可以几十年的使用VIM做编辑器,使用GCC来编译程序,使用FLEX和BISON做语法分析。每一个工具只完成一项工作,这样程序员就不用老更换工具。而且linux下的编程语言主要是C语言,好像这么多年来几乎没变过。)

但是,我还是感觉甚至是Linux也可以做跟多鼓励人们学习编程的事情。我不得不想做的最后一件事情是,当人们不想学习编程的时候强制他们去学习。但我认为我们不应该采取更多的措施去鼓励新程序员。可能只是手头/home目录下的一个pdf文件,叫做“学习编程”的就足够了。

最近,我开始学习Python。很快地我就开始喜欢学习它了。它可能比BASIC更强大,但我发现它正如入门容易那样简单。过去我曾学过Perl和 Java,发现学习一个新语言或多或少会有点困难,但Python让我感到很惊讶。所以一个新计算机应该包含一种理想的语言。OS X和大部分Linux套件已经包含了Python。我找不到任何微软的产品不包含它的理由。只需要添加一到两个pdf指南,放在那里。如果处于某种理由他们不想使用Python,我们当然还可以为初学者提供其他好的语言。

还有其他可以让人们对编程产生兴趣的方法吗?我们应该推动哪种语言?我们是否应该鼓励他们使用IDE,或者使用像Vim这样的文本编辑器?欢迎给出你的答案!(要推动的语言我觉得C和JAVA,PATHON,对初级程序员应该推广VIM/EMACS,如果使用IDE的话推荐使用eclipse。有了这些工具我们就能学习编程了,连操作系统和数据库都可以用这些工具做出来。)

2008年11月6日星期四

英国怎么对待伦敦奥运

作者:胡平

北京奥运闭幕,下一届奥运会将于4年之后在英国伦敦举行。有些人认为,北京奥运盛况空前,东道主赢得金牌第一。这两项成就,未来的伦敦奥运都很难达到。那么,英国人自己是怎么对待这个问题的呢?

英国首相布朗已经宣布:奥运的钱是要花的,但不可能像北京那样花。注意:并不是英国穷,花不起那么多钱。英国是高度发达的民主国家,英国的人口有6, 000万,还不到中国的5%,但国民生产总值却相当于中国的83%,也就是说,英国的人均GDP是中国的18倍以上。问题是,作为民主国家,英国人民不会愿意为一场运动会而大肆挥霍,劳民伤财。英国政府给伦敦奥运会的预算有93亿英镑,折合172亿美元,远远低于北京奥运的430亿美元。但就是这172亿美元,还是有不少英国人觉得太多了,他们认为,纳税人的钱花在奥运会上还不如花在改进医疗服务、交通或其它基础设施建设上。在这里,花多少钱取决于纳税人的意愿,如何花这笔钱也要体现纳税人的意愿。

伦敦市长信誓旦旦,说保证不会浪费纳税人的一分钱,布朗首相说:"我们的钱要做个特别的计划,以推动全英国的体育教育,要在所有学校让每个学童至少精通一种运动……我们必须放弃奖牌就是一切的看法,我们的目的是要让所有英国人都热爱运动。"别以为这是吃不着葡萄就说葡萄酸,得不到奖牌就说奖牌不重要。其实,英国也是奖牌大国。它在这次北京奥运奖牌榜上位居第4,共获得47枚奖牌,几乎是中国奖牌数的一半,而它的人口还不到中国的5%。这就是说,英国的人均奖牌数几乎是中国的10倍。可见这和酸葡萄情绪无关。可见英国是真的重视全民体育。

据《泰晤士报》报导,为了迎接2012年伦敦奥运,英国政府计划会拨款1.3亿英镑,开放全国1,600个公共游泳池,让16岁以下青少年和60岁以上老人共2000万人免费游泳。这个计划明年4月开始推行。单单是这项让全国的老年人和青少年免费游泳的计划,就足以让我们中国人羡慕不已。这才叫执政为民。道理很简单,有主权在民,才会有真正的执政为民。中国的人口是英国的20倍,按比例,中国应该开放32,000个公共游泳池(美国的公共游泳池有360, 000个)。问问全中国的人民:他们是愿意有32,000个公共游泳池开放给青少年和老年人免费游泳呢,还是愿意办一场历史上最奢华的奥运会,靠举国之力去赢得金牌第一?我敢说,绝大多数中国人一定会选择前者,选择后者的可能是那一小撮权贵和他们的帮闲。

为了办奥运,英国也要兴建体育场馆。他们的计划是,把大部分场馆建设在伦敦最穷的东区。这样会给伦敦东区人民带来更多的机会和更美的环境,有利于改变伦敦的地区贫富差别。奥运会后,奥林匹克公园将被改造成一个欧洲最大的公园。部分比赛场地在赛后也将改为住宅,提供给低收入家庭居住。此外,伦敦奥运主办者还想出了前所未有的计划来降低成本。据英国《卫报》报导,伦敦奥运主办者正在和举办2016年奥运的热门城市芝加哥商讨,计划在伦敦奥运之后拆卸大部分主要场馆,然后运送到芝加哥重新使用。伦敦奥运主办者说,寻找机会收回部分公共财富是应该的。

那些至今还陶醉于北京奥运的辉煌成功的人应该清醒了。看一看规划中的伦敦奥运吧,这才是真正的奥林匹克精神。北京奥运违背了奥运精神,伦敦奥运将拨乱反正。

记得当年,我第一次读到奥地利经济学家哈耶克的名著《通向奴役的道路》,其中有段文字令我过目不忘。哈耶克引用英国大诗人米尔顿的一段话,说:英国人,不要忘了,是你们最先教会各民族如何生活。他这里指的是自由主义。英国是自由主义的故乡。事实上,现代社会的三大支柱:议会民主,市场经济,科学技术,都发源于英国。用不着多说,要想想洛克、亚当。斯密、牛顿和瓦特这几个名字就够了。在奥运会旗从北京传到伦敦之际,我不由得又想起了哈耶克的那段引语。