2008年8月31日星期日
看看脑残们吧
看了24号闭幕式,感觉和“春晚”一样,没新意没亮点,希望老谋子这次不再说话了。同事闲聊说,那帮导演90%的精力投入了开幕式,5%留给
了残奥会开幕式,2个闭幕式平分剩下的5%,大家一致赞同。不过伦敦的8分钟表演,却让我想起很多在伦敦生活的往事。可以说这8分钟凝缩了
英国最有代表性的、独特的文化符号。不过好多朋友说除了小贝外,并没有看明白这些老英的表演。那我就大言不惭一下,以我在英国的几年
生活经历,,以及多方查找到的内容,普及下下知识,也能让大家重温伦敦非常好的8分钟表演。(但是小贝那一脚“右旋踢”真的不敢恭维)
。
我会依次贴出我知道的内容,各位知道的也帮我添楼啊。这个表演的寓意还有很多,我自己一个人找,非累死我。
闲言少叙,步入正题,先说说红色巴士,(也就是后来的变形金刚)它可谓伦敦的象征。我在伦敦的时候,坐在双层巴士上穿行在市区,最舒
服的交通工具就是它,特别是露天的。那会坐在漏天的巴士上,看着大街上琳琅满目的美女帅哥,真是一大享受。所以红色巴士成为“伦敦8分
钟”的主角也就不足为奇了。
从那辆伦敦-北京-伦敦的“红巴”,穿越泰特艺术馆、伦敦眼、白金汉宫等著名建筑,缓缓开进了鸟巢,变成演出台。从里面“生出来”了一
个女侠和一个狂弹吉他的老头,他们共同演唱了一首绝世经典的曲子,叫Whole Lotta Love(八一下,那个“女侠”就是“英国超女”利昂娜?
刘易斯,江湖地位就好像在国内火的不行的春春。那首曲子大家自己去当mp3吧,以后我再专门介绍它。)
那个老头,不对,正确的说法应该是:他是英国伟大的乐手;摇滚史上最佳的吉他手;重金属音乐鼻祖之一,音乐史上的传奇,很多摇滚乐迷心中No1的 “LED ZEPPELIN(齐柏林飞船)”乐队,创始人之一——Jimmy Page(杰米•佩奇),说那么长差点没喘上来气。这位大师通过对音乐超强的领悟力,以及极深的音乐造诣,掌控了LED ZEPPELIN作品全部的声线处理和所有的乐段节奏。至今他弹奏双柄电吉他的功力与地位,在摇滚史上仍无人可敌。
他所带领的LED ZEPPELIN全球唱片销量,从1968年到现在,已经超过了3亿张(这是什么概念啊?3亿张!!!)
每当想到摇滚,就让我兴奋和激动。干脆把他和刘易斯在北京AY闭幕式上,共同完成的那首Whole Lotta Love说完再走得了。这首曲子,去百一下或者谷一下,都能搜到,可以排在全球音乐榜前100名的,完美的硬摇滚歌曲。
刚才顺手找到了老爷子年轻时的照片、LED ZEPPELIN的合影,以及Whole Lotta Love的歌词,贴上来跟大家分享,我记得优酷或者土豆,好像有一个现场版的视频,巨精彩。
大意就是介绍了一下闭幕式上伦敦的8分钟表演。
这是后面的回帖:
1 我晕,我们才没有心情也没这个耐心听你说这些我们不懂的东西.
同样的不同的文化,不同的历史,可是为什么我们的文化历史表现出来别人会喜欢,却不见得有很多人喜欢那个伦敦八分钟所表现出来的文化?
说我们不了解别人的历史文化,英国人自己该了解了吧,也没见几个他们"自己人"认同~~~
Notes:你怎么知道别人都喜欢我们的文化,而英国人自己都不喜欢八分钟里的文化。如果是在国内哪个论坛上看来的,那大可不必说了。
2 垃圾的崇洋,不支持中国,还支持洋人.汉奸一个.
Notes:直接进行人身攻击,厉害,多会扣帽子。
3 去你NN的楼猪,闭幕式伦敦8分钟表演鲜为人知的秘密你是怎么知道的?英国人不知道美国人不知道都把他骂的一钱不值,作为一个中国人(可能是吧,因为暂时你崇洋的努力还不够,外国人可能还不能收留你作为走狗)你是怎么猜测出来你主子的的意图的,是添他们的屁股添出来的,还是隔着老远闻味闻出来的,悲哀呀, 在本国被骂的臭不可闻的东西,在你这里竟成了鲜为人知的秘密,还在这里大大方方的放在首位.其实,既然表演就不会有什么秘密,有秘密就不会公开表演,一点登不了大雅之堂的乱七八糟的小丑跳了8分钟,就被一些崇洋成性的奴才们稀释为鲜为人知的秘密,我不知道中国还有多少这样的精子,努力趴在主子的屁股下.一有点异味就会出来进行所谓秘密的解释.这些东西其实用不到你们解释的,其中的寓意自有该解释的人,你发表自己的看法我们并不反对,但你这种替你主子献身的精神作为中国人我们确实感到非常佩服,奴性不改....
Notes:同上
4 英国人自己都在说是垃圾,你这鸟人还在这说什么精华,我呸,在那里混了几年,以为自己是高级人了吗?少在这摇尾巴,真他妈的看不起你!
Notes:看来还是没有流过学最好,否则会以为自己是高级人了。
5楼主是个假洋鬼子!对绝大多数人叫好的闭幕式,他还在这里说的一无是处.而对其"后娘"出的东西却大加赞赏.既然找到主子就不要亲娘了还说中国话干什么?放样屁去吧国人讨厌你这种人!
Notes:到底是谁有奴性?
2008年8月28日星期四
PostgreSql源码学习(1)
最近刚下载了PG的源代码,准备学习一下。希望和大家共享学习的经验。
我编译的平台是fedora linux 9,如果是windows用户则有两种选择,一个是使用gnu版的工具,一个是使用VS,可以自己看看PG的说明。
首先从这里下载PG的源代码。解压缩后出现postgres...的文件夹。从终端进入文件夹后,运行./configure,生成MAKEFILE。这时如果是习惯使用EMACS工具或者VI工具的同志们就可以继续运行MAKE,MAKE INSTALL了。但是由于我们还是希望有个强大的IDE来对工程进行管理,因此我们就此打住。注:我选择eclipse CDT作为IDE,主要是因为对eclipse比较熟悉。
接着,下载eclipse CDT,解压启动后。NEW PROJECT,选择代码目录到刚刚解压的目录,选择PROJECT类型为make file project。然后一直next到finish。这样eclipse就会根据指定的makefile来导入相应的源码并且进行编译。这样就完成了导入工作。
将源代码导入eclipse CDT仅仅是为了方便大家阅读源码,毕竟eclipse提供了很多很好的IDE功能。如果需要调试源代码,则需要继续make install,然后使用gdb进行调试。我还不知道在eclipse下怎么调试pg的源代码,有谁知道请告诉我吧。
你必须找到你所爱的东西
汉语翻译原文
这篇文章真的翻译的很好,忍不住转载一下。
简介
苹果公司CEO史蒂夫·乔布斯05年在斯坦福大学学生毕业典礼上的演讲。这篇演讲已经有人翻译过,结尾的那句“Stay hungry. Stay foolish”也相当深入人心。
之所以翻译它,一个原因当然是对这篇文字的由衷认同和欣赏,另一个主要原因就是对“Stay hungry. Stay foolish.”译法的不同见解。有人将它译为“求知若饥,虚心若愚”。第一次听到这句话的原文及这一译法时,我也是击节叫好,因为这是一种非常有中文文采的译法。然而接下来读完全文,乔布斯强调的是不是“虚心”问题呢?
Stay hungry. Stay foolish.这是乔布斯这篇演讲要传达的两层核心含义:一方面是关于始终保持对自己兴趣爱好的那种“饥饿感”,一方面是关于敢于无视外人的眼光执着寻求自己所爱事物的那种“傻劲”“痴气”。“求知若饥,虚心若愚”,并没能表达出后者,而后者其实是乔布斯所想传达给斯坦福毕业生的那种理想主义精神的核心。
于是有了这篇译文。欢迎批评指正。
你必须找到你所爱的东西——史蒂夫·乔布斯
本文是苹果公司及Pixar动画工厂CEO史蒂夫·乔布斯于2005年6月12日在斯坦福大学学生毕业典礼上发表的演讲。翻译:五福
今天能够在世界上最优秀的高校之一参加各位的毕业典礼,我感到十分荣幸。我本人没能从大学毕业。说句实在话,今天要算我同大学毕业之间距离最近的一次了。现在,我想给诸位讲三个我的人生故事。是的,没什么大道理,只讲三个故事。
第一个故事是关于串起你生命中的点点滴滴。
我在里德学院念了6个月大学后就退学了,但随后我在学校旁听了18个月的课,然后才真正地辍学。那么,我为什么要退学呢?
故事要从我出生前说起。我的亲生母亲是个未婚的大学研究生,她决定把我交给别人收养。她很坚持我的养父母也应该是大学研究生,于是一切就这么安排好了:我出生后由一位律师和他的妻子领养。但是就在我呱呱坠地的一刻,事情起了变化,律师夫妇突然宣布他们想收养的是女孩。我爸和我妈当时正列在收养人候选名单上,于是他俩半夜接到一个电话说:“我们这儿出了个意外,有个男孩,你们要收养吗?”他俩说:“当然要。”后来,我的亲生母亲发现,我妈大学没毕业而我爸甚至高中都没读完。她于是拒绝在最后的收养协议上签字,直到拖了几个月后我爸妈承诺说将来一定送我读大学才算同意。
17年后,我果然上了大学。可是,我天真地选择了一所差不多跟斯坦福一样贵的大学,我那劳工阶层的爸妈攒下的积蓄就成了我的大学学费。念了6个 月后,我看不出这种生活有什么价值。对于我的人生,我不知道应该用它来做什么,我也不知道大学生活怎么能帮我解答这个问题。于是我决定退学,相信这条路一定走得通。这在当时是很恐怖的一件事,但是现在回首看去,这是我作过的最好的决定之一。从退学的那一分钟起,我就可以不上无趣的必修课,而且可以去旁听那些让我感兴趣的课程。
这并不是一种很浪漫的生活。我没有宿舍住,因此要睡在朋友宿舍的地板上。我收集喝空的可乐瓶,每个瓶子换回押金5美分供我买食物充饥。每个星期天晚上,我会走7英里的路穿过波特兰市区去Hare Krishna神庙去吃顿好的(译注:Hare Krishna神庙是印度教修习场所,周日有灵修活动和免费聚餐)。我很喜欢这顿牙祭。很多在这段跟随自己的好奇心和直觉度过的日子里学到的东西,后来都让我获益匪浅。且让我给你们举个例子:
当时里德学院的书法课程大概是美国国内最好的了。校园里的每一幅海报、抽屉上的每一张标签都是用漂亮的字体手写而成的。由于已经退学,用不着去上常规课,我就参加了一门书法课,去学写字。我学习serif字体和san serif字体,学习不同字母组合中间隙空间的变化,学习怎么让好看的字体在应用中变得更好看。书法很美,历史悠久,而且有着精妙的艺术感,为科学所无法企及,我对它入了迷。
这些对于我的生活毫无任何实际的用途,我也从没指望有过。但是,10年后,当我们在设计第一台Macintosh电脑的时候,我学的这些又回到我的脑海里。我们在设计中全面应用了这些知识。Macintosh成为第一台拥有漂亮字体的电脑。假如我当年没有旁听这门课程,Mac就不会有多种不同字体以及字符按比例间隔的字形;而且由于Windows照抄了Mac的设计,也就是说很可能就不会有今天这个样子的个人电脑了。假如不退学,我就不会旁听书法课,今天的个人电脑就不会带有现在的好看的字体。当然了,在学校的时候我不可能预见到这些点滴事件之间的联系。但是,10年之后再看过去,这种联系非常非常清楚。
再说一遍。你没法预知你人生的点点滴滴之间会有怎样的关系;你只能在事后把它们串接起来。因此,你必须相信,这些人生的片段会在你的未来产生联系。你必须相信点什么——你的勇气、命运、生活、因缘,什么都可以。这个办法对我一直都很有效,它造就了我的人生。
我的第二个故事是关于爱与失败的。
我很幸运,在人生很早的时期就找到了我所喜爱的东西。20岁时我和Woz在我爸妈的车库里建立了苹果公司。我们很努力地工作,10年之后苹果电脑由最初车库中的两个人变成一家有4000多员工、价值20亿美元的公司。那个时候我们最棒的产品——Macintosh——刚刚推出一年,而我刚刚30岁。然后我就被解雇了。你怎么可能被你自己创立的公司解雇?呃,是这样的,随着苹果公司的发展壮大,我们请了一个在我看来非常有才能的人来和我一起管理公司。第一年一切都非常顺利。但是后来我们对于未来的看法出现了分歧,最终我们之间起了争论。争执发生之后,我们的董事会站在了他那一边。于是,30岁时我被炒掉了。一次非常惹人注目的解雇。一直以来都是我成年生活核心的东西,忽然不复存在了。那感觉相当可怕。
有几个月的时间,我完全不知道该干什么。我感到自己辜负了前辈企业家的期望——就像接力棒交到我的手里,而我却把它丢掉了。我跟David Packard和Bob Noyce见面,为自己把事情弄得如此糟糕而道歉。我成了一名众所周知的失败者。我甚至想过离开硅谷。然而有一种东西慢慢照亮了我:我依然爱着我所爱的东西。发生在苹果公司的事并没能改变这一点。是的我被赶走了,但是我的爱依然还在。于是我决定重新开始。
我当时并不知道,实际上被苹果解雇是当时发生在我身上的最好的事了。事业成功所伴随的那种沉重不见了,取而代之的是重回起跑线的那种新手的轻盈。对于一切我都不再确信无疑。我获得了解放,进而开始了我一生中最富有创造力的时期。
在接下去的五年中,我建立了一家名叫NeXT的公司,然后又建立了Pixar公司,并与一位奇妙的女士共堕爱河,她后来成为了我的太太。Pixar创作出了世界上第一部电脑动画电影——《玩具总动员》。现在它已经是世界上最成功的动画工作室。再后来,经过一次戏剧性的收购,苹果公司买下了NeXT,我重返苹果。我们在NeXT开发的技术现在成为苹果复兴事业的核心,Laurene跟我也组建了一个美好的家庭。
我很确定,假如苹果没有开除我,所有这一切都不会发生。这是一剂味道糟糕的苦药,但是我想这正是病人所需。有时候,生活会用板砖砸你的头。一定不要失去信仰。我知道,唯一支撑我前进的东西就是:我爱我所做的事。你必须找到你所爱的东西。这句话不仅适用于你的工作也同样适用于你的恋爱。你的工作将构成你生活的大部分,而唯一能让你真正从工作中得到满足的办法就是爱你所做的事。假如你还没有找到它,继续找吧。不要停下脚步。同所有与心灵相关的东西一样,当你找到它时,你会知道的。而且就像那些美好的爱情一样,它会随着岁月的增长而越加醇美。所以,继续找吧,直到你把它找到。不要停下脚步。
我的第三个故事是关于死亡的。
我17岁那年读到过一句话,大意是这样:“假如你把每一天都当成你在人世的最后一天来过,总有一天你会发现自己是对的。”这话给我留下了印象。自那时起,33年来的每个早晨,我都对着镜子自问:“假如今天是我这辈子最后的一天,我还会做我今天要做的这些事吗?”每当连续很多天答案都是“不会”的时候,我就知道有什么东西需要改变了。
记住自己将不久于人世,这是我在作出人生重大选择时的一个最重要的参考工具。因为几乎所有的一切——一切外界对你的期待、一切荣耀、一切对丢脸和失败的恐惧 ——它们在面对死亡的时候都黯然失色,剩下的只有真正重要的东西。在我看来,记住你终将死去是帮助你避开“我可能会失去xxx”思维陷阱的最佳方法。你已经是赤裸裸的了。没有理由不追随自己的心灵去生活。
大约一年前,我被查出患有癌症。早上7点半,我做了一次扫描,结果很清楚地显示出我的胰腺里有一个肿瘤。当时我连胰腺是什么都不知道。大夫们告诉我,差不多可以肯定这是一种无法治愈的癌,我估计还能再活三到六个月。我的医生建议我回家去,把事情都做个了结。这是医生的行话,它意味着料理后事,意味着在接下去的几个月里把你10年内要对孩子们说的话提前说完,意味着为了让你的家人日后好过,把每一件事都作好安排,意味着对这个世界说再见。
一整天我的脑子里只有这个判决。当天晚上,我做了一次组织切片检查:他们把一个内窥镜伸进我的喉咙,穿过我的胃一直进到肠子里,用一枚探针伸进胰脏取得了一些组织细胞。我被麻醉了,但是当时在场的妻子告诉我,医生们把这些细胞放到显微镜下观察之后都惊叫起来,因为他们发现这是一种非常罕见的、通过手术可以治愈的胰腺癌。后来我做了手术,现在已经痊愈了。
迄今为止,这是我距离死亡最近的一次,希望这也是未来几十年里我离死亡最近的一次。经历了这件事,死亡对我而言已经不再只是一个有用而仅限纯粹想象的概念,因此我可以更加确信地跟你们谈起我对死亡的看法:
没有人想要死。就算那些想进天堂的人也不想为此去死。但是死亡是我们共同的终点。从未有人逃离过死亡。而这是合理的,因为死亡乃是生命最好的发明。它是生命的代谢催化剂,去除老朽,迎接新鲜。现在新鲜的是你们,但是用不了太久,某天你们会发现自己已经渐渐变得老朽,将被取代。抱歉说得这么夸张,但是这是真理。
我们的时间是有限的,所以请不要浪费时间去过你不想要的生活。不要被教条所迷惑——它诱使你按照他人的思维定式生活。不要让别人发出的声音遮盖住你自己的心声。最重要的是,要有勇气追随你的心灵和直觉。它们会知道你真正想要做一个什么样的人。其他的一切都是次要的。
当我还很年轻的时候,有一本刊物名叫《环球百科目录》,是我那一代人必读的圣典之一。它是由一个叫Stewart Brand的人在距此不远的Menlo Park出版的,此人以他富于诗意的工作为这份刊物注入了生命。那是在60年代末,个人电脑和桌面出版还远未发明,因此这本刊物完全是由打字机、剪刀和拍立得相机做出来的。它就像平装本的Google,不过是在Google诞生的35年前:一样是那么的理想主义,充满着简洁的工具和了不起的洞见。
Stewart 和他的团队出版了数期《环球百科目录》,随后刊物的生命走到了尽头,他们就出版了最终的一期。那是在70年代中期了,我正是你们这个年纪。在最后一期封底,是一幅清晨乡村公路的照片——假如你搭便车上路探险,就会看到这种景色。在照片下方写着这样的话:“饥以求知,痴而求真。”我一直希望自己能做到这 样。现在,在你们即将毕业的时刻,我用这句话来祝福你们。
饥以求知,痴而求真。
谢谢大家。
2008年8月26日星期二
读取CLOB字段
发现他对两种CLOB读取方法的比较很详细:
// 方法1
int read = 80; // only need the first 80 to show
start = System.currentTimeMillis();
s = lob.getSubString(1, read);
long s1 = System.currentTimeMillis() - start;
// 方法2
start = System.currentTimeMillis();
char[] cbuf = new char[read];
lob.getCharacterStream().read(cbuf);
long s2 = System.currentTimeMillis() - start;
比较的结果是方法一快一些,用时大概是方法二的一半左右。
另外,使用方法一,可以在AJAX里慢慢读数据,一次读取一定长度的字节,然后在页面缓存,这样的话应该可以加速LOB数据的展示。
还有看看BLOB怎么处理更好一些。
设置sql developer不存储数据库连接密码
在sql developer/bin/sqldeveloper.conf文件里:
Dsqldev.savepasswd=false
这样就可以了
sql developer的DB DOC工具
ORACLE TO_CHAR函数格式化数字
select to_char(123456,'999,999,999') from dual
会返回: 123,456
或者
select to_char(123456,'000,000,000') from dual
会返回:000,123,456
如果要去除999格式前面的空格,可以使用:
select to_char(123456,'FM999,999,999') from dual
2008年8月25日星期一
2008年8月23日星期六
ORACLE XML DB 系列(6)
对数据库来说,索引是最重要的数据库对象,对于XML Db也是这样。对于XML 数据来说,普通的索引显然无法胜任,因此ORACLE推出了针对XML的特殊索引。在ORACLE中,我们可以对XML数据建立以下类型的索引:
一 对象索引,这种索引只限于在把XML存储为相互关联的对象时使用。
Eg:CREATE INDEX ipurchaseorder_rejectedby
ON purchaseorder p (p."XMLDATA"."rejection"."rejected_by");
注:这种方法我自己没试过,只是依稀记得在OTN上看到过。
二 基于函数的索引
主要是针对extract和extractvalue两个函数建立基于函数的索引。
Eg:CREATE INDEX ipurchaseorder_rejectedby
ON purchaseorder (extractValue(OBJECT_VALUE, '/PurchaseOrder/Reject/User'));
注意这里的User必须是唯一的叶节点,也就是说它和它的所有父节点都只能出现一次。如果要针对不唯一的叶节点或者枝节点建立索引,可以使用extract函数,并使用以下技巧:
eg: CREATE INDEX ilineitem_upccode
ON purchaseorder
(extract(OBJECT_VALUE,'PurchaseOrder/LineItems/LineItem/Part/@Id').getStringVal());
注:但是这种方法是将所有的节点转化为字符串来处理,因此无法处理日期和数字类型。而且实际上XPATH会被查询重写成table.collumn.node.node.....。实际上还是用了OO的方法来模拟了XML。
三CTXXPATH索引
CTXXPATH其实是一种全文索引,功能只有一个,那就是加速existsnode函数的检索速度。具体语法如下:
CREATE INDEX [schema.]index
ON [schema.]table(XMLType column)
INDEXTYPE IS CTXSYS.ctxxpath [PARAMETERS(paramstring)];
其中:
paramstring = '[storage storage_pref] [memory memsize] [populate | nopopulate]'
eg: CREATE INDEX purchaseorder_clob_xpath ON purchaseorder_clob (OBJECT_VALUE)
INDEXTYPE IS CTXSYS.ctxxpath;
具体的索引参数请查阅ORACLE XML DB Developer's Guide以及 Oracle Text Application Developer's Guide .
注:使用这种索引的时候一定要完全遵循existsnode函数的语法,稍有不慎,ORACLE就会不使用索引,对表做一次全扫描。新建这种索引会在索引所在的用户下,出现4个新表,这四个新表实际上就是索引。
四 全文索引
其实全文索引有四种,CTXXPATH是完全针对XML的索引,而其他三种索引可以用于任何文本的索引,使用方法类似于CTXXPATH索引,只是需要修改索引类型和参数字符串。
Eg:CREATE INDEX purchaseorder_clob_xpath ON purchaseorder_clob (OBJECT_VALUE)
INDEXTYPE IS CTXSYS.CONTEXT;
而具体的查询语句则需要改写成:
SELECT DISTINCT
extractValue(OBJECT_VALUE,
'/PurchaseOrder/ShippingInstructions/address') "Address"
FROM purchaseorder
WHERE
contains(OBJECT_VALUE,
'$(Fortieth) INPATH(PurchaseOrder/ShippingInstructions/address)')
> 0;
需要注意的是,这种索引是一种静态索引,不能实时更新,需要定时运行存储过程来更新,而且这种索引对于汉语的支持并不好,我们在使用的时候发现了好几个功能性的BUG,因此并不建议使用。当然ORACLE 中文词法分析器的问题似乎不少,以后再说这方面的问题。
五 XMLINDEX
XMLINDEX是从ORACLE 10.2版以后出现的,针对XQUERY的索引结构。
Eg:CREATE INDEX purchaseorder_xmlindex ON purchaseorder (OBJECT_VALUE)
INDEXTYPE IS XDB.XMLINDEX;
其实一直没有测试XMLINDEX的效率,只是从文档上看到说11g里的XMLINDEX得到了空前加强,也不知道到底加强到什么程度了。
ORACLE XML DB 系列(5)
顺利地将XML数据存入数据库中之后,我们就可以对XML数据进行增删改查操作了。ORACLE数据库中,可以通过SQL函数或者XQUERY来实现,由于大家对SQL比较熟悉,所以在这里,我主要介绍SQL函数的方法,而XQUERY,是W3C提出的查询语言,对XML支持的相当完善,因此个人觉得XQUERY也是以后XML检索的一个发展方向。
ORACLE提供了很多函数可以供我们操纵XML数据,主要介绍以下几个:
EXTRACT函数用于提取指定XPATH的值,可以提取枝节点也可以提取叶节点,返回值是XMLTYPE类型。第一个参数是存储XML数据的列,第二个参数是XPATH。
Eg:SELECT extract(XMLCOLUMN,'/metadata/resTitle')
FROM example1;
EXTRACTVALUE函数用于提取指定XPATH的值,当然只允许提取唯一的叶节点,返回值是改节点的数据类型,比如resTitle节点是字符型数据,EXTRACTVALUE函数就会以VARCHAR2类型返回当前节点的值,而Date节点是日期型数据,该函数就会以DATE类型返回当前节点的值。
EG:SELECT extractvalue(xmlfiles,'/metadata/resTitle')
FROM xmltest
existsNode函数用于判断给定的条件是否满足,满足返回1,不满足则返回0.
EG:SELECT extractvalue(xmlfiles,'/metadata/resTitle')
FROM xmltest where existsNode(xmlfiles,'/metadata[resTitle ="fff”]) =1;
EG:SELECT extractvalue(xmlfiles,'/metadata/resTitle')
FROM xmltest where existsNode(xmlfiles,'/metadata/resTitle [contains(.,"fff”]) =1;
上条语句出现了CONTAIN函数,这个函数用于判定指定节点是否包含指定的值。
更新XML数据节点:
UPDATEXML函数:
UPDATE example1
SET XMLCOLUMN =updateXML(XMLCOLUMN,'/metadata/resTitle/text()','123456')
WHERE existsNode(XMLCOLUMN,'/metadata[resTitle="fff"]') = 1;
插入子节点操作:
insertChildXML函数,插入的节点必须是能多次出现的:
UPDATE purchaseorder
SET OBJECT_VALUE =
insertChildXML(OBJECT_VALUE,
'/PurchaseOrder/LineItems',
'LineItem',
XMLType('
UnitPrice="22.95"
Quantity="1"/>
WHERE existsNode(OBJECT_VALUE,
'/PurchaseOrder[Reference="AMCEWEN-20021009123336171PDT"]')
= 1;
insertXMLbefore函数,插入的节点必须是能多次出现的:
UPDATE purchaseorder
SET OBJECT_VALUE =
insertXMLbefore(OBJECT_VALUE,
'/PurchaseOrder/LineItems/LineItem[1]',
XMLType('
UnitPrice="69.95"
Quantity="2"/>
WHERE existsNode(OBJECT_VALUE,
'/PurchaseOrder[Reference="AMCEWEN-20021009123336171PDT"]')
= 1;
APPENDCHILDXML函数,插入的节点必须是能多次出现的:
UPDATE purchaseorder
SET OBJECT_VALUE =
appendChildXML(OBJECT_VALUE,
'/PurchaseOrder/Actions/Action[1]',
XMLType('
WHERE existsNode(OBJECT_VALUE,
'/PurchaseOrder[Reference="AMCEWEN-20021009123336171PDT"]')
= 1;
删除节点:
deleteXML函数,不能删除必选节点:
UPDATE purchaseorder
SET OBJECT_VALUE =
deleteXML(OBJECT_VALUE,
'/PurchaseOrder/LineItems/LineItem[@ItemNumber="222"]')
WHERE existsNode(OBJECT_VALUE,
'/PurchaseOrder[Reference="AMCEWEN-20021009123336171PDT"]')
= 1;
2008年8月22日星期五
引自梁文道 计划形像的贫困
虽然有许多历史学家和社会学家为计划经济体系翻案,认为它并不像一般人所说的那么一无是处,甚至还起过不可或缺的历史作用。可是今天,仍然相信并且完全实行计划经济的国家,到底是寥寥可数了。中国也曾是个奉行计划经济的大国,但是过去30年的改革开放难道不就是一个国家逐步退出经济生活,让市场机制代替政府计划的历程吗?除了仔细掌握市场与计划之间的分寸,把握好政府在这个程中的角色和定位之外。我们现在面临的下一个问题是,中国会不会也渐渐放弃「计划形象」的老路,不再硬性地经营政府和国家的形象,也不再为了所谓的「正面」效应而任意难塑舆论环境的生态呢?
什么叫做「计划形象」?什么是「正面」效应?我们看看北京奥运开幕式上的两桩「造假」事件就知道了。
首先是那场先声夺人的巨型足印烟火秀。原来北京奥组委深怕现场效果不如理想,所以预先以计算机动画技术录制了这个场面,然后把它加插在当晚的实况直播里头。虽然开幕式总导演张艺谋在事后的访问中立刻承认此事,但我们还是不能不说,这个手段已经完全改变了大家对「实况直播」四个字的一贯认知。顾名思义,「实况直播」就是实时地把发生在某一地点的事件直接传送给观众。如果主办机构明明知道自己会在这次演出里插进如此一段加工画面,但又不立即以字幕等形式坦白声明,这晚的「实况直播」难道还不是一个骗局吗?
其次则是赢尽全球观众欢心的林妙可被揭发只是那段《歌唱祖国》的幕前替身,真正在演唱的其实是背后的杨沛宜。按照中国媒体的习惯说法,这是不折不扣的「假唱」,不止有违职业操守,甚至还可能触犯了国家为打击「假唱」歪风而专门订立的政令。就算退一万步讲,你也总该还幕后代唱的杨沛宜一个名誉,让全球观众知道是谁在演唱吧。即便是电视电影这些娱乐产业,也总会把替身演员的名字全部列出。如今一场史上最多观众收看的电视大秀怎能公然做出这么不公平的劣行呢?
根据开幕式音乐总监陈其钢的说法,这么做是为了「国家利益」。因为林妙可虽然长得很漂亮,但歌声的音域却不够宽;而杨沛宜的演唱美则美矣,却又坏在正处换牙期,形象不佳。也就是说,无论是一个相貌可爱但歌唱得不好的小女孩,还是一个声比天籁但样子不够动人的小女孩,都不能恰当地满足「国家利益」。这番话传出之后,舆论哗然,大家都不能理解这等小事何以会上升到「国家利益」的高度;更有许多人为杨沛宜抱不平,觉得她清丽可人,丝毫不下于林妙可。
音乐圈的人都晓得贵为现代音乐大师梅湘(Olivier Messiaen)关门弟子的陈钢,实乃当世华人作曲家中的佼佼者,艺术成就甚至要比他的同学谭盾还高。而且他一向爱惜羽毛,从不苟且,是个很有个性的艺术家。这回怎么会做出这等既违反艺术原则又不符国际常规的事呢?其实陈其钢也把答案说出来了,那是因为一名政治局委员表达过意见。后来在接受美联社采访的时候,他更明言自己有责任道出真相,要还杨沛宜一个公道。
故事仍未结束。这个事件曝光之后,不只令外界对美轮美奂的京奥开幕式的印象打了折扣;也让当局非常尴尬。于是两日之后,这条消息就迅速地被内地各大网站删去,变成一则失踪的事故。
这个故事恰巧说明了中国政府「计划形象」工程的盲点。所谓「计划形象」,我指的是一种由官员主动构想出来的抽象的政府和国家形象,然后以各种刚性手段将它套在现实之上的工程。
首先我们要理解「抽象」的活动本来是现代国家能力的证明,一个政府愈是能够借着图表、统计和各种调查去简化复杂庞大的现实,它就愈能完好地治理国家。依据今年故世的社会学大家查尔斯.梯利(Charles Tilly)的说法,在这种现代化的国家里面,统治阶层总是难免要脱出他们身处的社会脉络和其它被统治的群体,依赖那些抽象的活动及其结果去预知社会的走向,发现潜在的隐患,从而制定出种种响应现实与导引发展的决策。问题是当这些抽象活动的依据不是各种可堪检证的科学工具,而抽象的领域也不限于可以量化的事物时,它很容易就会变成一小撮官员离开现实的空想了。政府和国家的形象正是一种最难量化管理的领域,要测知它们的工具也是最不齐备的;偏偏今天中国各级政府官员都以为自己知 道辖地和国家该有什么形象,也都以为自己明白怎么样才能实现心中所想的形象。
说穿了,这就是形象工程。许多地方政府不顾所在县市的实际情况,也不管社会的整体需要,又不屑于使用少数可堪利用的调查工具先去研究人民对自己的看法,就随意耗用公帑大兴土木,以为一两座巨大的政府建筑物就能在人民心目中制造出美好的形象,结果往往适得其反。同样地,京奥开幕式上这一连串事件其实也可看作是一种形象工程的败笔。
一直以来,不少中国官员都以为自己是艺术家,觉得自己官位大了,审美品味也就比别人高了。在经济领域上,他们或许会承认自己不是专家;但是说到政府形象和地标设计这些事,他们却自觉要比任何专家都还内行,总是意见多多指手划脚。有趣的是当你再问他们到底有没有一个整体的视野时,他们却又答不出个所以然来,通常只能报以「正面」二字。
为什么那段烟火足印要假装是实况直播?是为了「正面」。为什么一个小女孩要在众目睽睽之下公然假唱玩双簧?也是为了「正面」。为什么不准媒体再报道这段消息?还是为了「正面」(亦即俗称的「正面报道」)。
假如城市只是一面地图,政府当然可以大胆规划,任意在上面修大道开运河;假如社会只是一张白纸,政府也能够为所欲为,在上头画出自己理想中的「正面形象」。 但是现实社会不是地图也不是白纸,尤其现在的社会,阶层分化,媒体发达,所有人都有不同的渠道去发放和获得各种信息。就和计划经济总是难以掌握全部经济信息一样,计划形象也不可能获知和垄断所有和政府形象有关的信息与反馈。
为了所谓的「正面形象」,你可以安排杨沛宜为林妙可代唱,但是你不能控制 陈其钢要说什么话(陈其钢可能拥有法国国籍),你也不能完全抹除一切传媒的报道,更加不能控制境外的传媒。于是当初的一心求好,反过来又成了外间批评「中 国专门弄虚造假」的另一罪证。早知如此,何必当初?
然而计划形象的主事者就是不能预知一切后果,正如为自己盖「白宫」的地方官也不知道原来这么做会捱骂。与其苦心经营正面形象,然后弄出个破绽重重,实质与表象反差巨大的结局,何不以一个最正常的真实面目坦然示人?为了正面,牺牲正常,别人是看得出来的。形像当然可以规划,也可以设计;但再怎么规划设计也不能脱离正常的现实。你能想象可口可乐的广告公司为它弄出一套恍如顶级法国葡萄酒般的形像包装吗?当然不能,因为可乐就是可乐,无论它的老板再怎么希望自己卖的其实是红酒,那个瓶子里装的还是可乐。更何况可乐又有什么不好呢?它可是全球最赚钱的饮料呀!同样地,难道一个拥有13亿人口的超级大国,正在崛起的经济强权,竟然容忍不了一个7岁女孩再正常不过的换牙吗?
2008年8月21日星期四
vim的E25错误
顺便附一个vim的提示信息翻译,别人翻译的很不错的,想看的话点击这里
官方的解决办法是system settings->add/remove applications,然后勾选vim enhanced。
我自己的解决方法是去VIM的官网下载一个最新的VIM源码包,然后自己重新安装一遍。
安装完后会gvim可以使用了,却出现vim不能语法高亮之类的问题,于是重新把自己的帐户下的.vimrc文件修改了一下。
至此,gvim才算是可以使用了。
东德:金牌大国的崩溃(转)
德意志民主共和国(民主德国,东德)曾经是奥运会历史上一等一的金牌大户,也可以说是中国举国体制的楷模。这个国家面积不到11万平方公里,跟浙江省面积相当,人口在198/9年时约1700万,相当于深圳人口。但这样一个弹丸小国却在奥运会历史上创造了令人瞠目结舌的成绩。
1968年墨西哥奥运会,东德初露峥嵘,获得了9枚金牌,位列金牌榜第5,同届西德获金牌5枚。
1972年慕尼黑奥运会,东德开始发力,获得20枚金牌,紧跟美苏两大国之后,位列第3,同届东道主西德获金牌13枚。
1976年蒙特利尔奥运会,东德大爆发,一口气获得40枚金牌,将美国踩在脚下,紧随老大哥苏联位列金牌榜第2,同届西德仅获金牌10枚。
1980年莫斯科奥运会受到了西方国家的抵制,没有竞争对手的情况下东德达到顶峰,共获47枚金牌,老大哥苏联则获得80枚金牌(感觉跟中国参加亚运会一样),西德没有参加此届奥运会。
1984年洛杉矶奥运会东德及其它东欧社会主义国家随老大哥苏联一起抵制。
1988年汉城奥运会,政治上江河日下的东德依旧获得了37枚金牌,以1枚的优势力压美国,位列金牌榜第2。西德获得11枚金牌。
1992年巴塞罗那奥运会,统一后的德国以东德运动员为主体,获得了33枚金牌,列金牌榜第3位。
在长达二十年时间里,东德曾是与美苏鼎足而立的体育竞技大国,所夺奥运奖牌数量占世界第三位,仅次于美苏。其中最显着的是女子游泳和田径(后中国运动女选手也因禁药而一鸣惊人)。但是,德国统一后这个东德神话破灭:自1996年开始,德国在奥运会上的成绩就一届不如一届了,96年20枚,00年13枚,04年13枚,08年截至目前为9枚。
与其说是德国体育江河日下,倒不如说是德国体育的正常回归。一直以来,西德的体育制度是很健康的,不过分追求奥运会的金牌数,而让国民的身体素质得到自由发展,所以每次奥运会金牌得10枚左右就满足。
反观东德,为了在与西德的对比中显示出所谓的“社会主义优越性”,采用举国体制办体育。所谓“举国体制”,官方的解释是“在国家综合实力还比较弱的情况下,为了短时间内形成突破,从而采取集中全国人力、物力、财力进行攻坚的一种组织制度”。换句话说,“举国体制”就是调动全社会资源来协助操练少数精英运动员,尽最大努力在国际大型竞赛中夺取最多的奖牌奖杯。这种体制有如下几个特点:
第一,国家资源的使用严重颠倒轻重,每年花费巨额国民财富用于培养精英运动员,但轻视国民大众的体育与趣爱好和强身健体的需求。
第二,选拔有运动天分的青少年进行封闭式集训,但目的只是让少数体育尖子去争夺奖牌,结果牺牲了数十万计运动员的青春,甚至给许多运动员造成终身伤害,毁了他们的一生。中国体育报说,80%的运动员退休后因为没有文化,没有一技之长,谋生艰难,其中很多人还因运动过量而落得一身疾病,甚至成为残废。
第三个弊端是,形成了一个明星运动员、教练和体育官僚三位一体的庞大利益集团。金牌给运动员和教练带来巨大名利,给体育官僚带来官运亨通的政绩,由此使举国体制成为体坛腐败的催化剂。
不仅如此。西方禁药丑闻一般是运动员个人行为,但在举国体制下则是一种官方行为。东德政府甚至敢于要求运动员服用兴奋剂。东德当局曾长期系统地让至少一万名运动员服食各类禁药,并对如何有效通过赛事药检进行系统研究和实施。禁药使东德在奥运上大放光芒,但也造成一百多名运动员猝死和无数运动员终身伤残,许多女运动员男性化,失去生育能力。两德统一后,受害运动员把东德体育部长和医学顾问霍普告上法庭,并要求赔偿。
尽管东德曾获得了举世瞩目的金牌战绩,最后也避免不了被西德吞并的下场;尽管获得了100多枚金牌,但最后却如昙花一样地迅速衰败。
但谁都不会否认今天的德国是个体育大国,德国不仅在有世界影响力的体育项目中(足球,篮球,田径,游泳,赛车,网球等)具备不俗的甚至是顶尖实力,而且,更重要的是,德国有着大量民间的体育协会。光在德国体育联合总会中有8万5千多个分会,注册会员达到了2600万人,体育协会的会员占到总人口的32%,经常参加运动的人有1200万人,说德国是一个全民体育的国度一点也不为过。
今天,奥运金牌榜上那虚幻的辉煌已与德国人渐行渐远,但体育已成为德国人日常生活中的一部分。
2008年8月20日星期三
前党和国家领导人华国锋去世
这位同志肯定是没好好学习胡哥的和谐社会理论,要不然怎在此节骨眼上,做出此等危害社会和谐之事。并在此万国来朝之际,有损国家体面,实为千古罪人也。胡哥肯定会学鲁四老爷骂祥林嫂一样,狠狠的骂他晦气。
2008年8月17日星期日
转自牛博网:先帝炼就金丹
“这里面是有故事的,”发布会上的林丹有些不好意思地笑了起来,“2004年,雅典奥运会前,我们在湖南益阳集训,有一天去韶山,参观主席故居。当时很年轻,有点什么都不懂,张宁那些老队员都跑步上山,去主峰买烟酒拜祭主席。我当时很年轻,就没有上去,和其他几个小队员在巴士上打牌。后来,全队拍合照,那个摄影师动作也有点慢,我都被晒得睁不开眼了,当时就随口开了一个玩笑:主席,你热不热?结果我在雅典第一轮就输了。”
林丹称雅典奥运会后,他又去过韶山,诚心诚意的。“今年队里又组织过一次,李导说谁先跑上去谁就最有诚意,我和陈金是第一个跑上去,很有诚意拜了一下。” 至于毛主席徽章,林丹说他是模仿孔令辉的,当时孔令辉在悉尼夺冠时,也别了一个徽章,“接下来,我会继续努力,带好成绩去拜祭主席。”
Notes:林丹个脑残。真惊讶于这帮运动员是怎么长大的,果然是沐浴在党的春风里,生长在红旗下。还有聂卫平,说郎平不爱国,也不知道他是怎么得出这个结论的,又是一个脑残。不知道如果菲尔普斯带着华盛顿的像章来参赛,美国人会如何反映。
原文题目叫先帝打造金丹,我觉得炼就似乎更好一点。
又被党骗了
而那个让我觉得很有创意的大脚印居然是用电脑制作的,晕死。本来像北京这样对称的城市,应该在世界上不多见,穿过北京中轴线的大脚印更是绝好的创意。居然会被弄成这样。
还有我最不喜欢的是,很多人拿着竹简的那段,还有史上最差的奥运主题曲《You and Me》,因为它最烂,所以让我们记住,我们可以不求最好,只求最烂。
嘿嘿,又被党骗了。
2008年8月15日星期五
在FEDORA9上安装ORACLE11g
• GNOME Desktop Environment
• Editors
• Graphical Internet
• Development Libraries
• Development Tools
• Server Configuration Tools
• Administration Tools
• Base
• Fonts
• Legacy Fonts
• Hardware Support
• System Tools
• X Window System
下载ORACLE 11g
去以下地址下载ORACLE11g:
• Oracle Database 11g Release 1 (11.1) Software
解压文件:
unzip linux_11gR1_database.zip
设定Linux内核参数:
以下是ORACLE推荐的最小参数:
kernel.shmall = 2097152
kernel.shmmax = 2147483648 # Smallest of -> (Half the size of the physical memory) or (4GB - 1 byte)
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
fs.file-max = 65536 # 512 * PROCESSES
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=4194304
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=262144
使用以下命令查看当前参数值:
/sbin/sysctl -a | grep
For Fedora 9, the following lines should be appended to the "/etc/sysctl.conf" file.
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=4194304
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=262144
修改当前参数值:
/sbin/sysctl -p
Add the following lines to the /etc/security/limits.conf file:
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
将下列两行添加到 /etc/pam.d/login 文件:
session required /lib/security/pam_limits.so
session required pam_limits.so
启动Firewall administration对话框(System > Administration > Firewall). 单击 "Disable" 按钮, t之后关闭对话框.
编辑文件/etc/selinux/config, 确定 SELINUX flag 的值和下面一样, 然后重启操作系统:
SELINUX=disabled
或者(System > Administration > SELinux Management). 设置 "System Default Enforcing Mode" 为"Disabled", 然后重启系统。
安装软件
从Fedora 9 DVD 安装以下包:
cd /media/cdrom/Packages
rpm -Uvh binutils-2.*
rpm -Uvh elfutils-libelf-0.*
rpm -Uvh glibc-2.*
rpm -Uvh glibc-common-2.*
rpm -Uvh libgcc-4.*
rpm -Uvh libstdc++-4.*
rpm -Uvh make-3.*
rpm -Uvh elfutils-libelf-devel-0.*
rpm -Uvh glibc-devel-2.*
rpm -Uvh gcc-4.*
rpm -Uvh gcc-c++-4.*
rpm -Uvh libstdc++-devel-4.*
rpm -Uvh unixODBC-2.*
cd /
eject
从F9的软件库安装以下组件:
yum install libaio libaio-devel
yum install unixODBC-devel
yum install sysstat
yum install compat-libstdc++
创建新的用户组和用户:
groupadd oinstall
groupadd dba
groupadd oper
groupadd asmadmin
useradd -g oinstall -G dba,oper,asmadmin oracle
passwd oracle
Note:由于不使用ASM,所以我们不会用到"asmadmin" group。
创建ORACLE安装目录:
mkdir -p /u01/app/oracle/product/11.1.0/db_1
chown -R oracle:oinstall /u01
chmod -R 775 /u01
以ROOT用户的身份编辑 /etc/redhat-release 文件, 将 Fedora release 9 (Sulphur) 替换为:
redhat release 5
以ORACLE 用户登录,添加以下内容到 .bash_profile 文件末:
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_HOSTNAME=f9.localdomain; export ORACLE_HOSTNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1; export ORACLE_HOME
ORACLE_SID=DB11G; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
然后从ORACLE账户登出。
安装数据库
在第一步解压所得的database目录下输入以下命令:
./runInstaller
就会出现ORACLE的通用安装界面,以下的步骤就跟在windows上的安装没什么区别了。由于我是在英文状态下安装数据库,所以没有碰见安装界面是乱码的情况,如果有的话,可以参考以前同志们的文章。(其实主要是JAVA的乱码问题)
安装之后
编辑/etc/redhat-release 文件, 回复安装之前的设置:
Fedora release 9 (Sulphur)
编辑/etc/oratab文件, 将每个实例的restart标记设置为 'Y':
DB11G:/u01/app/oracle/product/11.1.0/db_1:Y
请为所有运动员喝彩
中国人一直以为自己的国家是大国。那既然是大国就要有大国心态。看见别人赢了,我们努力赶上就是了,没必要给别人使坏。看见别人球比我们打的好,只能证明自己的球队还没修炼到家,还得去名山大川遍访名师好好修炼,以图下界奥运会的胜利。而在场边的观众情不自禁的嘘其他球队,只能说明我们中国人在内心的极度自卑,羡慕别人的成就,而自己又难以望其项背,于是就只好意淫加嘴淫一下。
奥运会毕竟是所谓的全人类的体育盛会,只要是出色的运动员,我们都应该为其极度成就喝彩。比如今年美国游泳队的菲尔普斯,好像已经连下6块金牌了,我是对其佩服的五体投地,不知其他人如何想法。还是希望我们多一点自信,多一点判断,不要以是我们和不是我们的来判断一件事情的好坏。
请为所有运动员喝彩!
五星红旗迎风飘扬
这次开幕式给我印象最深的可能就是小姑娘独唱的歌唱祖国了。其实,在那种环境下,一个小姑娘用如此清脆的声音唱这首歌,只要是听过的,多多少少都有点感动而且震撼吧。其实话说回来,这首歌不论词曲写的都是不错的。
五星红旗迎风飘扬,胜利歌声多么嘹亮。歌唱我们亲爱的祖国,从此走向繁荣富强。越过高山,越过平原,跨过奔腾的黄河长江。宽广美丽的土地,是我们可爱的家乡。英雄的人民站起来了,我们团结友爱坚强如钢。
不过话又说回来,我只喜欢这一段,下面两段有明显的拍马屁嫌疑。
帮同事调整SQL
2008年8月14日星期四
四个袖珍型Linux
Puppy Linux 也是以Live CD的开式发行,它运行的最低内存要求可以达到32M,并且它的启动速度很快,一般都能在60秒内完成启动。Puppy Linux的目标是打造一个易用的系统,不需要太多技术方面的要求。
Feather Linux 是一个大小为128M的发行版,与DSL一样,它也是基于knoppix(knoppix是基于Debian Linux)定制而成的,它集成了人们日常的常用工具。
DeLi(DeLi Linux 表示 “Desktop Light” Linux)它是一个针对老计算机的发行版,支持从 486 到 Pentium III 或类似的计算机。专注于桌面用途,包括:电子邮件客户端、图形界面的网页浏览器、办公软件(文字处理、电子表格)等等。包括了 Xorg 和开发工具的完全安装不会需要超过750 MB 的硬盘空间。
我更喜欢Puppy Linux,界面很漂亮,从U盘启动,感觉很快。
北京奥运部分外国选手的正式职业
女子花剑个人银牌得主,意大利人特里利尼,34岁,已婚。职业是森林护林员。大学所学的专业是物理教育。
射击女子飞碟多向冠军,澳大利亚人巴罗奇,31岁,职业是“农业保护官员”,大学所学专业是农业科学。
举重女子53公斤级铜牌得主,哥伦比亚人莫斯奎拉,35岁,职业是药剂师。此人30岁才开始训练。
柔道女子负78公斤级冠军,日本人阿武教子,28岁。大学所学专业是法国文学,目前的职业是警察局的警官。
男子跳高亚军,美国人海明威,32岁,已婚,他是某公司的销售主管。此人平时主要的训练方法是打篮球。对了,他确实与美国著名作家海明威有血缘关系,算是海明威的一个远亲。
男子铅球亚军,美国人尼尔森,29岁,目前的职业是财政咨询顾问。在1996年亚特兰大奥运会时,他在奥运村里的一家咖啡店和夜总会里打工。他在整个高中和大学期间所从事的主要运动是橄榄球。
射击女子飞碟双多向冠军,美国人洛德,年龄25岁,大学生,所学专业是“动物和兽医科学”,其最大的理想就是成为一名兽医。
男子单杠铜牌得主,日本人米田功,27岁,上班一族。在业余时间里进行训练。
夺得了四枚游泳金牌的美国人菲尔普斯,年龄19岁,大学生。他每天训练只有两个小时,周一,三,五加倍。如此少的训练并非是他偷懒,而是因为他要上课,游泳训练只能在课余时间里进行。
游泳女子100米蛙泳亚军,澳大利亚人汉森,26岁,其职业居然是“学生/保姆”,所学专业是“市场,通讯和社会学”。
男子50米自由泳冠军,美国人霍尔,今年30岁,平时喜欢弹吉它。他16岁才开始进行训练。这几年他一直在他自己创办的一个小型游泳俱乐部里进行训练。
射击女子50米步枪3x20银牌得主,意大利人图里西尼,35岁。职业是律师。大学所学的专业是法律。
女子200米蛙泳金牌得主,美国人比尔德,年龄23岁。大学所学的专业是“零售及营销科学”。其最大的兴趣爱好是室内装潢设计,她的理想就是成为一名室内设计专家。
女子100米仰泳冠军,美国人考芙琳,年龄22岁,大学生,所学专业是心理学,兴趣爱好除了游泳还有冲浪和做菜。她的日常作息如下:每天清晨开始进行游泳训练,两个小时,然后去上学,下午放学后再训练三小时。
女子七项全能铜牌得主,英国人索瑟顿,28岁。职业是“银行办事人员”。
举重女子75公斤以上级铜牌,波兰人弗洛贝尔,23岁,职业是园丁。
引自赵牧 @ 2008-8-14 欣赏奥运的另一角度:他们的职业
2008年8月11日星期一
String转CLOB
private CLOB getCLOB( String clobData,Connection conn )
throws Exception {
CLOB tempClob = null;
// create a new temporary CLOB
tempClob = CLOB.createTemporary(getNativeConnection(conn) , false,
CLOB.DURATION_SESSION );
tempClob.open( CLOB.MODE_READWRITE );
// Get the output stream to write
Writer tempClobWriter = tempClob.getCharacterOutputStream( );
tempClobWriter.write( clobData );
tempClobWriter.flush( );
tempClobWriter.close( );
tempClob.close( );
// Free CLOB object
throw exp;
//do something
}
return tempClob;
}
如果使用连接池来获得数据库连接,有可能需要将数据库连接进行一下转化,使用以下代码:
private static Connection getNativeConnection(Connection con) throws SQLException {
Connection nativeCon = ((DelegatingConnection) con).getInnermostDelegate();
// Statement''''s Connection but for the Connection handle returned by the pool.
// We''''ll fall back to the MetaData''''s Connection in this case, which is
// a native unwrapped Connection with Commons DBCP 1.1.
}
return con;
}
从ARC SDE说起
众所周知,ARC SDE是ESRI公司世界领先的空间数据中间件产品,但是从06年发布ARC GIS9.2 以来,SDE再单独出售,而是集成在ARC GIS SERVER产品中一起出售。就GEO DATABASE本身来说,其性能不在ORACLE SPATIAL之下,而且支持多种流行的数据库,而SDE正是显示端和服务器数据交互的不可或缺的中间件。为什么会停止单独出售SDE,ESRI葫芦里卖的什么药呢。
其一,随着ORACLE,微软之类的大厂商介入,SDE原本具有的实现GEODB的功能,显得越来越不重要。如果SDE单独出售,不仅在价格上不具有优势,而且性能上也肯定会被ORACLE比下去,甚至可能赶不上一些开源的空间数据库。SDE的定位应该是像它的名字那样,空间数据引擎,就是负责数据传输的通路,而不是自己去实现空间数据存储,SDE的优势应该是支持多种空间数据源,成为最好的空间数据中间件,而中间件本来就因该集成在服务器中。
其二,随着ESRI退出SDE,其在GIS领域的垄断地位进一步加强。有人说,ESRI相对于其他厂商的优势就在于SDE,我觉得这么说一点也不过分。其实GIS说白了就是一个加强了显示,编辑和分析功能的数据库。而数据模型是功能和性能的基础,因此ESRI凭借ARCGIS的强大功能成为GIS名副其实的领跑者。但是随着SDE性能越来越好和WEB GIS 的流行,其他厂商对SDE这一私有数据格式纷纷表示不爽。于是ESRI顺水推舟,将SDE不再单独出售,的了便宜还卖乖。
其三,随着ARC GIS9.2的退出,ESRI还推出了自己的FILE GEO DB,进一步加快向数据存储领域的进军(当然我以为是防守式的进军)。与SDE相比和PERSONAL GEO Db相比,FILE GEO Db不需要其他的数据库作为其宿主;而与SHP和COVERAGE相比,一方面不受DBASE的限制,另一方面性能上也强很多(单表可以存储1TB的数据)。更重要的是,FILE GEODB可以跨WINDOWS和LINUX平台,为ESRI将自己的ARC GIS搬到LINUX上奠定基础。因此,SDE逐渐退出数据存储领域是必然的事情。
最后,前几天看见ESRI对将要发布的ARC GIS9.3的说明,这一版将会支持LINUX。ESRI始终是GIS界风头浪尖的弄潮儿,技术上一点也没落后。不知道国产GIS 什么时候会出LINUX版,不过就我所知,国内GIS厂商都是基于MFC做的,跨平台几乎意味着重写所有代码,由此看来重回C语言平台才是正道。(C语言用来写GIS的内核,而用JAVA SWT来做展示层,这是我对跨平台的一点设想)
我用过的几个开源GIS软件
去年开始接触了一些开源GIS软件,个人觉得这些软件做的挺不错的,想介绍给使用GIS的朋友们。
从空间数据库 说起吧。在空间数据库领域,商业化的产品有ORACLE SPATIAL,以及以前的ARC SDE等等,而开源空间数据库虽然在功能上略有欠缺,但是在性能上毫不逊色。开源的空间数据库主要是postgresql和mysql的空间插件,分别是postGIS和mySpatial。目前由于PG对于面向对象支持的更好一些,所以postGIS在性能上和功能上都比myspatial要强一些。但是两者都有一个最重要的缺陷,就是不直接支持栅格数据。解决方案是将栅格数据存储为BLOB类型,并且对其建立四叉树索引,用以模拟商业数据库对栅格数据的存储。相对来说我更喜欢POSTGIS一些,原因有三:1,MYSQL本身不是在所有情况下免费,而PG在所有情况下都免费;2,POSTGIS性能和功能上都强于myspatial;3,国外已经有很多基于POSTGIS的成功应用,可以降低风险。
接下来轮到桌面软件了。QGIS和GRASS是很好的桌面GIS,当然基于ECLIPSE平台的UDIG也是另外一个选择。QGIS的最大特点在于界面很友好,熟悉ARCGIS的人都能很快的掌握QGIS的操作,另外QGIS对WMS的支持也不错。再者QGIS可以无缝集成POSTGIS,最后QGIS几乎完全照搬了GRASS的分析功能,因此其分析功能也很强大。GRASS本是美国军方开发的GIS,开源后一直受到美国大学老师们的青睐,它可以提供很多ARCGIS能提供的分析功能(当然每一种功能可选的算法没后者多),但是GRASS的界面比较丑陋,很多功能需要手动运行命令,因此不太适合大多数人用。基于eclipse平台的UDIG是桌面GIS的又一个选择,由于它是基于eclipse平台的,运行起来比较慢一点,而且比较耗内存。与前两者相比,它的优势在于操作的简单性,而且支持很多种空间数据源,包括很多商业空间数据库,缺点主要是分析功能比较弱。不过现在UDIG发展很迅速,也建议尝试一下。
开源GIS服务器主要有map server和geo server。Map server有两个版本,完全免费的那个那个版本是由明尼苏达大学开发的,全部是用C语言完成,效率很高可以媲美ARCGIS SERVER,并且支持我所知道的所有GIS数据源,但是相对来说简陋一些,并且没有内置AJAX支持。而map server的企业版本来是auto desk公司的map guide,这个版本功能很强大,而且还有IDE支持,当然IDE也有两个版本(付费的和不付费的),此外auto desk还封装了很多AJAX组建,因此这个版本可以说是真的企业级支持了。而geo server则是另外的选择了,
它是基于JAVA平台做的,安装时需要JDK1.4(高版本的也不行),其功能上和map server的完全免费版类似,但是性能上次之,只是如果对跨平台要求比较高的话,可以考虑使用它。此外,OTN上的文章一直喜欢使用GEO SERVER来发布ORACLE SPATIAL的地理数据,也不知道是为什么。
此外开源GIS客户端技术,也进行的如火如荼,好几个框架都实现了对AJAX的支持,
虽然我没有仔细研究这些框架,但是我觉得进行一般的GIS应用因该没什么问题。据我所知美国NASA就利用POSTGIS来管理他们好几个TB的空间元数据,而英国陆军部好像使用了map server来发布一些他们的地理数据。相比之下,我们国家即使是一个小小的县级市,在做自己门户网站时候,都是使用ARCGIS+ORACLE+WEB LOGIC的超豪华阵容,其实我们完全可以用QGIS+POSTGIS+TOMCAT来实现,这样从软件投入成本来看,我们几乎可以不花一分钱,可以节约多少劳动人民的血汗钱阿。
2008年8月5日星期二
ORACLE XML DB 系列(4)
ORACLE通过内置的XMLTYPE数据类型来存储XML数据。如何正确的设置数据库表中的XMLTYPE字段的存储方式就成了正确使用XML DB的关键。CLOB型存储格式可以避免将XML数据拆散存储,而对象表的存储方式则更有利于我们进行节点级的搜索。
sqlstr:='CREATE TABLE '||mdbid||'_md (MDRID VARCHAR2(10) NOT NULL,
CREATETIME DATE NOT NULL,LASTUPDTIME DATE NOT NULL,MDXML XMLTYPE NOT NULL) XMLTYPE COLUMN MDXML STORE AS OBJECT RELATIONAL XMLSCHEMA "http://xmlns.oracle.com/xdb/schemas/'||rolename||'/'||xsdurl||'" ELEMENT "'||rootElement||'"';
execute immediate sqlstr;
XMLTYPE COLUMN MDXML STORE AS OBJECT RELATIONAL这是用来指定XMLTYPE以对象类型来存储,XMLTYPE COLUMN MDXML STORE AS CLOB是使用CLOB来存储XMLTYPE。在ORACLE11g中我们还可以使用二进制的存储方式来存储XMLTYPE。
如果在建表的SQL语句中指定了XMLSCHEMA,那么数据表中的XMLTYPE就是以基于SCHEMA的方式来存储。上面所展示的sql中 rolename是schema所在的用户,xsdurl是我们在注册schema的时候为它起的id,而rootElement是要我们指定XML的根元素。
到此为止,在数据库中存储XML的前期准备工作都已经就绪,只差将XML数据插入到已经建好的数据表中。向数据表中插入XML数据可以使用以下语句:
insert into tablename values('1',sysdate,sysdate,xmltype(xmlcontent))
我们可以将这条语句中的XMLTYPE理解为构造函数,如果是基于SCHEMA的XMLTYPE,必须使用以下语句:
insert into tablename values('1',sysdate,sysdate,xmltype(xmlcontent,xsdid))
或者使用以下语句:
insert into tablename
values('1',sysdate,sysdate,xmltype(xmlcontent).createSchemaBasedXML(xsdid))
当然还有别的方式可以实现XMLTYPE数据的插入,在这里就不一一详述了。
ORACLE XML DB 系列(3)
要在数据库中使用XML DB,CONNECT,RESOURCE和XDBADMIN角色是必须的,除此之外根据自己应用程序的不同,可能还需要赋予别的权限,比如XML WEB SERVICE角色是在数据中建立WEB SERVICE的必须角色。
在数据库中存储XML数据,绝大多数都是基于SCHEMA的应用,因此如何在数据库中注册SCHEMA就是至关重要的问题了。我们可以通过MS_XMLSCHEMA.registerSchema来注册SCHEMA。
BEGIN
dbms_xmlschema.registerSchema
(
mdstdidin,xsddoc,
true,TRUE,false,false,false
);
其中mdstdidin是schema在数据库中的id。xsddoc是schema的文档内容,可以是VARCHAR也可以是CLOB型的数据。第三个参数表示是否将这篇schema注册为本地的schema,第四个参数表示是否生成对应的对象,第五个和第六参数是表示是否声称javabean和 table。使用上面的代码就是将一篇SCHEMA注册成为当前用户自己所有的SCHEMA并且自动声称对应对象。
注册了SCHEMA之后,接着就查询已经注册的SCHEMA了。我们可以从DBA,ALL,USER_xml_schemas视图中查到相应的 schema的具体内容。其中schema字段以XMLTYPE类型存储了schema的具体内容,我们可以使用select schema.getclob() from
user_xml_schemas来查询。如果不getclob()的话,那么结果集中schema字段会显示sys.xmltype。
ORACLE XML DB 系列(2)
XML DB实际上并不是一个独立的数据库,在企业版,标准般,个人版和快捷版数据库中XML DB都是可选的功能。也就是说安装不安装XDB对数据库的核心功能没什么影响。跟ORACLE SPATIAL,ORACLE TEXT一样,XML DB实际上是建立在数据库之上的应用程序,只是在这里我们用关系模型来模拟了树状模型。因此数据库内核实际上并不知道有XML这样的数据类型存在。
对于XML数据来说,模拟的难点在于它是树状的结构,而RDBMS都是关系型的,一种方案是将XML存储成CLOB数据,而另一种解决方案是使用对象表来解决问题。ORACLE采取的也是这两种解决方案,在建立含有XML的数据表时,我们可以指定该XMLTYPE字段是存储成CLOB还是存储成对象表。使用前者存储的优点在于存储的XML数据的可变性,而后者则在检索速度上更胜一筹。主要原因是使用CLOB方式,XML会被当成大对象来存储,不需要符合特定的格式,但是对象表就不同。在检索速度上,由于以对象表存储的方式可以很容易的建立节点级的索引(实际上就是对象表的索引),因此在按节点检索时,速度会快一些。
还需要在概念上明确的是结构化数据和非结构化数据。结构话数据是指基于XML
SCHEMA 的数据,而非结构化数据则正好相反。在ORACLE中建立数据表的时候,我们可以指定数据表中的XMLTYPE字段是不是基于SCHEMA 的。如果该字段是基于SCHEMA的,那么在数据入库的时候,ORACLE会对XML数据进行语法检查,验证其是否符合指定的SCHEMA。
当然,最重要的概念还是XMLTYPE本身。从字面看,XMLTYPE就是一个ORACLE的内置TYPE,只是这个TYPE是专门为XML数据量身定做的。在SYS帐户下可以看见XMLTYPE的定义,当然还有一大堆我们可以用来操纵XML的函数。
除此之外ORACLE还在数据库里提供了XDB帐户,这个帐户是我们使用的很多函数的所有者,当然,还有W3C的一些标准SCHEMA之类的东西。使用 XDB提供的程序,我们可以在ORACLE数据库中打造一个WEB SERVICE。另外ORACLE还有一个可以基于文件来访问的XML库。
ORACLE XML DB 系列(1)
ORACLE 数据库从9i第二版开始支持本地化的XML DB,但是早在8i版的时候,ORACLE就已经在数据库内提供了对XML的支持。实际上经过10g和11g三个版本的发展,ORACLE XML DB已经相当成熟,几乎在数据库内提供了对XML的完整支持。虽然说从DB2 V9发布以来,IBM一直在打XML牌,但是我个人认为ORACLE的XML DB和DB2 PURE XML DB相比并不逊色。只是因为IBM的DB2在比如数据自动化之类的方面一直不如ORACLE,所以只好打XML牌。但是随着ORACLE 11g的发布,DB2 V9号称的二进制的XML存储格式也出现在ORACLE中,因此完全没有必要因为XML DB的差异把ORACLE换成DB2。
ORACLE9iR2中首次出现了XMLTYPE数据类型,ORACLE数据库就是通过这种数据类型来实现对XML数据的有效存储,与此同时,我们还可以使用很多函数来操纵和查询数据库中的XML数据。
从 10g第二版开始,ORACLE开始支持W3C的XQUERY查询语言。虽然10g在功能上较9i强很多,但是从性能上来说,9i和10g没有太大差别。(我们同时对9iR2,10gR1和R2,三个版本的数据库做过测试)因此完全没必要因为XDB性能上的原因,把9i升级到10g,毕竟升级还是要花很多money的。从11g开始,ORACLE又为XML提供了二进制的存储方式,同时号称比10g快15倍。虽然11g会比10g的XDB快很多,但是从我们做的性能测试来看,10gXDB的性能已经相当不错,从单表两百万条数据中检索10条数据的返回时间可以控制在0.4m以内(不带分页的情况下)。
今天先写到这里,下次继续
书写历史的甲骨文--ORACLE公司传奇(4)
跨上巅峰
"搅浑水"是Ellison的一项绝技。在1995年巴黎举行的欧洲信息技术论坛会议上,Ellison在即兴演讲中介绍了网络计算机(Network Computer,NC)的概念,所谓NC指的是配置简单却能充分利用网络资源的低价电脑,最为重要的是,它不需要操作系统,或者更准确的说,不需要微软的操作系统。Ellison希望借此来抵制微软的强势。很快,ORACLE联合IBM、Sun、 Apple和Netscape在1996年制定了网络计算机的标准,但事实上人们从头到尾没有看到一台真正的NC生产出来。这次的演讲在业界引起了轩然大波,通过这个事件,ORACLE公司吸引了足够多的注意力,同时也让人们看到ORACLE公司对于网络的巨大信心。
1997年6月,ORACLE第八版发布。ORACLE8支持面向对象的开发及新的多媒体应用,这个版本也为支持Internet、网络计算等奠定了基础。同时这一版本开始具有同时处理大量用户和海量数据的特性。这个版本也算可圈可点了。
1998年9月,ORACLE公司正式发布ORACLE 8i。"i"代表Internet,这一版本中添加了大量为支持Internet而设计的特性。这一版本为数据库用户提供了全方位的Java支持。ORACLE 8i成为第一个完全整合了本地Java运行时环境的数据库,用Java就可以编写ORACLE的存储过程。对,Java,只要是能够打击微软的武器, ORACLE都要派上用场。ORACLE8i 添加了SQLJ(一种开放式标准,用于将SQL数据库语句嵌入客户机或服务器Java代码)和ORACLE interMedia(用于管理多媒体内容)以及XML等 特性。同时,ORACLE 8i 极大程度上提高了伸缩性、扩展性和可用性以满足网络应用需要。接下来的几年中,ORACLE陆续发布了8i的几个版本,并逐渐添加了一些面向网络应用的新 特性。面对开源运动的蓬勃发展,ORACLE自然不甘落后,1998年十月ORACLE发布了可用于Linux平台的ORACLE 8 以及ORACLE Application Server 4.0,随后不久,ORACLE又发布了ORACLE 8i for Linux。在 .com大潮中,ORACLE是站在风口浪尖的弄潮儿.
在2001年6月的ORACLE OpenWorld大会中,ORACLE发布了ORACLE 9i。在ORACLE 9i的诸多新特性中,最重要的就是Real Application Clusters(RAC)了。说起ORACLE集群服务器,早在第五版的时候,ORACLE就开始开发ORACLE并行服务器(ORACLE Parallel Server ,OPS),并在以后的版本中逐渐的完善了其功能,不过,严格来说,尽管OPS算得上是个集群环境,但是并没有体现出集群技术应有的优点。在完全吸收了 Rdb(ORACLE在1994年收购了Compaq公司的Rdb数据库,此前Rdb属于DEC公司,DEC公司在VAX上实现了第一个可以商用的Rdb集群数据库)的一些技术优势之后,ORACLE终于推出了真正的应用集群软件。RAC使得多个集群计算机能够共享对某个单一数据库的访问,以获得更高的可伸缩性、可用性和经济性。ORACLE 9i的RAC在TPC-C的基准测试中打破了数项记录,一时间业内瞩目。这个新的数据库还包含集成的商务智能(BI)功能。ORACLE 9i第2版还做出了很多重要的改进,使ORACLE数据库成为一个本地的XML数据库;此外还包括自动管理、Data Guard等高可用方面的特性。
历史还在继续
2003年9月8日,旧金山举办的ORACLE World大会上,Ellison宣布下一代数据库产品为"ORACLE 10g"。ORACLE应用服务器10g(ORACLE Application Server 10g)也将作为甲骨文公司下一代应用基础架构软件集成套件。"g"代表"grid ,网格"。这一版的最大的特性就是加入了网格计算的功能。何谓网格计算?网格计算可以把分布在世界各地的计算机连接在一起,并且将各地的计算机资源通过高 速的互联网组成充分共享的资源集成。通过合理调度,不同的计算环境被综合利用并共享。ORACLE宣称10g可以作为网格计算的基础,矛头直指最大的敌人IBM的"随需应变"!看来,ORACLE公司已经把这一次的"赌注"押在了网格计算的大市场上。但前景如何?让我们拭目以待。
如果说,IBM是IT 产业中的一头巨鲸,那么ORACLE一定就是一条大鲨鱼:咄咄逼人,善于进攻。就在2003年6月初,ORACLE突然宣布51亿美金收购仁科(PeopleSoft),业内再次震动。此举又一次露出ORACLE 一贯善于进攻的本性。要知道,ORACLE在发展过程中很少对企业进行收购的,那么收购仁科目的何在?首先,ORACLE觊觎企业应用软件市场已久,但苦于不能进一步扩大市场分额,尤为重要的是,一旦成功,可以直接对最大的敌人IBM进行打击,还可以阻击SAP等巨头的强势。时至今日,ORACLE依然以不达目的不罢休的态势和仁科缠斗,结果如何,让我们拭目以待。"人生最大的快乐是击败敌人",Ellison一定很喜欢这句话。
后记:2004年12月13日,Oracle 公司宣布签订了以每股26.50美元、总计约 103 亿美元的代价收购 仁科(PeopleSoft) 的最终协议。历时十八个月的争斗终于尘埃落定。
书写历史的甲骨文--ORACLE公司传奇(3)
经受挫折
ORACLE第6版于1988年发布。由于过去的版本在性能上屡受诟病,Miner带领着工程师对数据库核心进行了重新的改写。引入了行级锁(row-level locking)这个重要的特性,也就是说,执行写入的事务处理只锁定受影响的行,而不是整个表。这个版本引入了还算不上完善的PL/SQL(Procedural Language extension to SQL)语言。第6版还引入了联机热备份功能,使数据库能够在使用过程中创建联机的备份,这极大地增强了可用性。同时在这一年,ORACLE开始研发ERP软件。
公司发展看上去比较顺利,不过,噩梦才刚刚开始。
由于过去对软件测试重视的程度不够--那个时候公司规模小,基本上都是客户帮助免费测试的。在第六版刚发布之后,很多迫不及待开始使用的用户就怨声载道。 这是个根本就没有测试好就进行发布的产品(也怪Ellison,大话总要说在前头,只好自尝苦果)。用户开始对ORACLE大肆抨击,ORACLE的一些 对手也开始落井下石,针对ORACLE产品的一些弱点进行攻击。开发人员一面应付愤怒的用户,一面加班加点地对程序进行接连不断的修正,最后,总算得到了 一个比较稳定的版本,暂时平息了用户的愤怒。
但是,实际的问题并不在这里,几年来高速增长的同时也给公司带来了巨大的隐患,1990财年第三季度报表的公布引爆了一切。财务人员发现了1500万美元 的坏帐,并且公司利润距离预期相差甚远。接下来的时间里,大公司病的诸般症状接踵而来,面对股东的指控,股票一落千丈,公司前景暗淡,甚至面临破产。一度 靠贷款来维持自己的奢华生活也不变卖股票的Ellison也快撑不住了。公司下大力气整顿财务(财务主管杰夫·沃克从某种程度上解救了公司)。公司宣布削 减开支,裁退大量销售人员,同时聘用了专门的管理人才。
噩梦延续到ORACLE第七版的推出而结束。这个公司已经空谈了好几年的新版本(一度被讥讽为不过是Ellison的故计重施而已),直到1992年6月 才终于闪亮登场,这一次公司吸取了第六版匆忙上市的教训,听取了用户的多方面的建议,并集中力量对新版本进行了大量而细致的测试。该版本增加了许多新的性 能特性:分布式事务处理功能、 增强的管理功能、用于应用程序开发的新工具以及安全性方法。ORACLE7还包含了一些新功能,如存储过程、触发过程和说明性引用完整性等,并使得数据库 真正的具有可编程能力。还有一点必需要说明的是,这个版本在原有的基于规则的优化器(RBO)之外引入一种新的优化器:基于开销的优化器(Cost-Based Optimizer , CBO)。CBO根据数据库自身对对象的统计来计算语句的执行开销,从而得出具体的语句执行计划。在以后的几个重大版本中,ORACLE的工程师们逐步对这个优化器进行改进,CBO逐渐取代了RBO。
ORACLE 第七版是ORACLE真正出色的产品,取得了巨大的成功。这个版本的出现真是好时机,当时Sybase公司的数据库已经占据了不少份额,ORACLE借助 这一版本的成功,一具击退了咄咄逼人的Sybase。公司的销售人员这次算到了给用户兑现空头许诺的时候。公司经过两三年的治理,终于摆脱了种种麻烦,重 新开始健康发展,销售额也从92年的15亿美元变为四年后的42亿美元。
书写历史的甲骨文--ORACLE公司传奇(2)
发展与壮大
RSI在1979年的夏季发布了可用于DEC公司的PDP-11计算机上的商用ORACLE产品,这个数据库产品整合了比较完整的SQL实 现,其中包括子查询、连接及其他特性。但不得不说,软件不是很稳定,并缺少事务处理这样的重要功能。出于市场策略,公司宣称这是该产品的第二版,但却是实 际上的第一版。之所以被命名为第2版而不是第1版,是因为Ellison认为潜在的客户更愿意购买第2个版本,而不是初始版本。(虽然这样做有些不太诚 实,还是要承认这是个十分高明的技巧。到现在还有一些公司把自己卖给客户的版本叫做1.0 ,学学1979年的ORACLE吧!)多年以后的今天,ORACLE公司声称是他们第一个提供了第一个SQL关系型数据库管理系统。
虽然软件不是很好,但是客户还是有的。美国中央情报局迫不及待的想买一套这样的软件来满足他们的需求。但在咨询了IBM公司之后发现IBM没有可以商用的产品,他们联系了RSI。于是RSI有了第一个客户。在当时,政府和军方的机构往往同时有几种计算机,而那时还没有什么"软件可移植"这样的说法,当然,也几乎没有具有这样的能力的应用软件。也就是说,给PDP-11开发的ORACLE数据库不能用在IBM主机和DEC的VAX上。很快用户就表现出来这样的需求:ORACLE能否同时在不同的操作系统上运行?这给RSI带来了新的挑战(主要是Miner和Scott)。70年代末期和80年代早期的软件一般都设计成在单一操作系统上运行,具有可移植能力的软件很少。
1983年3月,RSI发布了 ORACLE第三版。Miner和Scott历尽艰辛用C语言重新写就这一版本。要知道,C语言当时推出不久,用它来写ORACLE软件也是具有一定的风 险的,但除此之外,别无他法。很快就证明了这样做是多么的正确:C编译器便宜而又有效,还有很好的移植性。从现在起,ORACLE产品有了一个关键的特 性:[可移植性]。ORACLE第3版还推出了SQL语句和事务处理的"原子性"--SQL语句要么全部成功,要么全部失败,事务处理要么全部提交,要么全部回滚。ORACLE第3版还引入了非阻塞查询,使用存储在"Before Image File"中的数据来查询和回滚事务,从而避免了读锁定(read lock)的使用(虽然通过使用表级锁定限制了它的吞吐量)。同样是1983年,IBM发布了姗姗来迟的Database 2(DB2),但只可在MVS上使用。不管怎么说,ORACLE已经占取了先机。
在开发第三版还没有结束的时候,Scott离开了ORACLE。当时用C语言改写ORACLE的压力很大,无休止的软件调试终于让Scott不堪重 负,选择了一走了之。把剩下的重担交给了Miner一个人。在出售了自己的%4的股票之后,Scott 后来创建了Gupta公司(现更名为Centura Software)和PointBase公司(提供百分之百纯Java嵌入式数据库),都是开发和数据库相关的产品。多年后有人问到他的%4的 ORACLE股票的时候,Scott,这个曾经给ORACLE写出第一行代码的技术高手,也只能报以一笑了。如果能坚持下来,那是一笔几亿美金的财富。不 过当时的Scott没有那么多的想法,他只是太累了。
ORACLE最先将其软件移植到DEC VAX计算机上的VMS操作系统上。早在1979年公司就已经雇了一位DEC公司的技术高手Robot Brandt进行VAX上ORACLE的开发。开始的时候资金有限,只能到加州大学伯克利分校去蹭机器进行开发,后来好一些,但机器也是借来的。尽管困难重重,Brandt还是比较成功的完成了移植工作。随着VAX小型机的大量销售乃至供不应求,ORACLE软件也成为VAX上最受欢迎的程序。这一点要归功于Larry对市场的先知先觉。如果说,是IBM引领着ORACLE公司走上数据库的大船,那么DEC公司的VAX就是带着他们扬帆出海了。短短的几年之后,ORACLE数据库被移植到各种主要平台之上。ORACLE产品也一直因为有可移植性这个关键特性而被那些潜在的客户关注。
Oates这个时候因为婚姻趋于破裂而情绪沮丧,已经不能把精力全部放到公司上,不得不离开公司。几年后,他又重返公司,重新为ORACLE做出巨大的贡献,他许下诺言,在公司员工超过1万人的时候会再度离开。1999年,他完成了心愿。现在他正在纵情于音乐,自得其乐。
很长一段时间里,公司研发由Miner独力承担。Miner视金钱如无物,为人低调,和Ellison的锋芒必露形成鲜明的对比。在公司里,大家一致认为 他是老好人,他也深受员工爱戴。Ellison是公司的大脑,Miner则当之无愧的成为公司的心脏。他是个沉默的英雄,正如Steve Jobs背后的Steve Wozniak一样。
1984年10月,ORACLE发布了第4版产品。产品的稳定性总算得到了得到了一定的增强,用Miner的话说,达到了"工业强度"。但是还不够令人满意,用户对产品的抱怨似乎永无休止。这一版增加了读一致性(Read Consistency), 这是数据库的一个关键特性,可以确保用户在查询期间看到一致的数据。也就是说,当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。可以看 到,在ORACLE第四版之前,产品始终是不稳定的,但是ORACLE的这群销售人员,主要是Ellison,他在宣传ORACLE的时候总是要夸大其 词,但他就是有能力把软件卖出去,而且,还卖得很好,不得不承认,这的确有些神奇。让我们看看1984年软件市场的情形,在数据库市场上的霸主是 Asnton-Tale公司,他们的拳头产品是刚推出不久的dBase III(确切的说dBase是PC上的数据库软件霸主),刚刚成为全球第三大的独立软件公司(第一和第二分别是微软、Lotus,ORACLE在当时还排 不上号),这一年,也是苹果公司Macintosh诞生的年度,Steven Jobs用这个拳头产品挑战老大哥IBM。同样在这一年中,ORACLE公司的开发人员刚刚把产品移植到PC上。这是最好的年代,也是最坏的年代。数以千计的小公司在软件领域里争斗不休,新公司如雨后春笋般成立,ORACLE如何才能于不败之地?
在1985年,ORACLE发布了5.0版。有用户说,这个版本算得上是ORACLE数据库的稳定版本。这也是首批可以在Client/Server模式下运行的的RDBMS产品,在技术趋势上,ORACLE数据库始终没有落后。这意味着运行在桌面PC机(客户机)上的商务应用程序能够通过网络访问数据库服务器。1986年发布的5.1版还支持分布式查询,允许通过一次性查询访问存储在多个位置的数据。
那是在1985年,当时曾经的最大的独立软件公司Cullinet(主要销售网状数据库)已经如流星般陨落。ORACLE的主要竞争对手是Ingres数 据库。Ingres在加州大学伯克利分校诞生,主要的设计者是当时鼎鼎大名的Michael Stonebraker教授。可以说Ingres数据库软件是上个世纪80年代技术上最好的数据库,Ingres市场分额的快速增长已经给ORACLE早 成了很大的压力。巧的是,这个时候,IBM公司再一次伸出"上帝之手"。
Ingres使用的是Stonebraker 发明的QUEL(Query Language))的查询技术,这和IBM的SQL大不相同。在某些地方QUEL甚至要优于SQL。IBM当时担心Ingres把QUEL变成标准会对自己不利。经过一番衡量,决定把自己的SQL提交给数据库标准委员会。而Stonebraker教授可不打算把QUEL提交给数据库标准委员会,学院派的他认为这麽做实际上是扼杀了创新精神。鹬蚌相争,渔翁得利。ORACLE看到并抓住了这个绝佳的机会,大肆宣布ORACLE全面与SQL兼容,加上ORACLE当时对Ingres PC上的版本的攻击(弱化对手优势,化解自己弱势是他们最拿手的本领),再加上ORACLE公司销售上的强势,Ingres不断丢城失地,等到后来推出支持SQL的数据库的时候为时已晚。紧跟IBM让ORACLE得以成长、壮大,拥抱标准,拥抱开放,拥抱变化,让ORACLE立于不败之地。
1986年3月12日,ORACLE公司以每股15美元公开上市,当日以20.75美元收盘,公司市值2.7亿美元。3月13日,微软以每股21美元的发 行价上市,以28美元收市,公司市值达到7亿美元。远远超过了ORACLE。成功的光环的微软和盖茨遮盖住了ORACLE和Ellison的光芒,可能这 也是Ellison敌视微软的开始。
书写历史的甲骨文--ORACLE公司传奇(1)
ORACLE公司之起源
很难想象,ORACLE 公司的这一段传奇居然要从 IBM 公司开始。
1970年的6月,IBM 公司的研究员埃德加·考特 (Edgar Frank Codd)在 Communications of ACM 上发表了那篇著名的《大型共享数据库数据的关系模型》(A Relational Model of Data for Large Shared Data Banks)的论文。这是数据库发展史上的一个转折。要知道,当时还是层次模型和网状模型的数据库产品在市场上占主要位置。从这篇论文开始,拉开了关系型数据库软件革命的序幕。
虽然早在1970年就诞生了关系模型理论,但是市场上迟迟不见关系型数据库管理软件的推出。主要原因是很多反对者认为关系型数据库速度太慢,比不上当时的层次式数据库。值得好笑的是 IBM 虽然1973年就启动了System R的项目来研究关系型数据库的实际可行性,也没有及时推出这样的产品,因为当时IBM 的的 IMS (著名的层次型数据库)市场不错,如果推出关系型数据库,牵涉到 IBM 很多人的自身利益。再者,IBM 庞大复杂的官僚机构处在决策上远不那么灵活。
1977年6月,Larry Ellison 与 Bob Miner 和 Ed Oates 在硅谷共同创办了一家名为软件开发实验室(Software Development Laboratories,SDL)的计算机公司(ORACLE公司的前身)。那个时候,32岁的Larry Ellison,这个读了三家大学都没能毕业的辍学生,还只是一个普通的软件工程师。公司创立之初,Miner是总裁,Oates为副总裁,而 Ellison,因为一个合同的事情,还在另一家公司上班。没多久,第一位员工Bruce Scott(用过ORACLE数据库软件的人都知道有个Scott用户的吧?没错,就是这个Scott,至于Scott用户的密码Tiger,那是 Scott养的猫的名字)加盟进来,在Miner和Oates有些厌倦了那种合同式的开发工作后,他们决定开发通用软件,不过们还不知道自己能开发出来什 么样的产品。Oates最先看到了埃德加·考特的那篇著名的论文连同其他几篇相关的文章并推荐Ellison和Miner也阅读一下。Ellison和 Miner预见到数据库软件的巨大潜力(跟着 IBM 走,没错),于是,SDL开始策划构建可商用的关系型数据库管理系统( RDBMS )。很快他们就弄出来一个不太像样的产品,或者具体的说,更像一个Demo。根据 Ellison 和 Miner 他们在前一家公司从事的一个由中央情报局投资的项目代码, 他们把这个产品命名为 ORACLE。因为他们相信,ORACLE(字典里的解释有"神谕, 预言"之意)是一切智慧的源泉。1979年,SDL 更名为关系软件有限公司(Relational Software,Inc.,RSI),毕竟"软件开发实验室"不太像一个大公司的名字。1983年,为了突出公司的核心产品,RSI再次更名为ORACLE。