对酒当歌,人生几何? 譬如朝露,去日苦多。 慨当以慷,忧思难忘。 何以解忧,唯有杜康。 青青子衿,悠悠我心。 但为君故,沉吟至今。 呦呦鹿鸣,食野之苹。 我有嘉宾,鼓瑟吹笙。 明明如月,何时可掇。 忧从中来,不可断绝。 越陌度阡,枉用相存。 契阔谈宴,心念旧恩。 月明星稀,乌鹊南飞。 绕树三匝,何枝可依? 山不厌高,海不厌深。 周公吐哺,天下归心。
2008年1月25日星期五
袁天罡称骨
一般说来,八字重的比较不容易振的住,也就是说不容易被邪物侵扰,当然玩招魂招仙的游戏也不容易成功。显然不是绝对的八字越重越好,轻的也有比较好的,但从一般意义上说,八字重的普遍比轻的得到的批示要好,所谓一般意义也就是说这里的好在有的人眼中可能未必是好。举个例子吧:1971年正月初一子时出生的人可以查到年的重量为1两7钱,月的重量为6钱,日的重量为5钱,时辰的重量为1两6钱,将之相加: 1两7+6钱+5钱+1两6=1.7+0.6+0.5+1.6=4.4=4两4钱。然后查4两4钱的批注诗: 4两4:来事由天莫苦求,须知福禄胜前途,当年财帛难如意,晚景欣然便不忧出生年的重量:出生年的重量是以六十年为周期的(也就是说相差六十年的年份重量相同)
这是年的 1941:6钱 1942:8钱 1943:7钱 1944:5钱 1945:1两5 1946:6钱 1947:1两6 1948:1两5 1949:7两 1950:9钱| 1951:1两2 1952:1两 1953:7钱 1954:1两5 1955:6钱 1956:5钱 1957:1两4 1958:1两4 1959:9钱 1960:7钱 1961:7钱 1962:9钱 1963:1两2 1964:8钱 1965:7钱 1966:1两3 1967:5钱 1968:1两4 1969:5钱 1970:9钱 1971:1两7 1972:5钱 1973:7钱 1974:1两2 1975:8钱 1976:8钱 1977:6钱 1978:1两9 1979:6钱 1980:8钱 1981:1两6 1982:1两 1983:7钱 1984:1两2 1985:9钱 1986:6钱 1987:7钱 1988:1两2 1989:5钱 1990:9钱 1991:8钱 1992:7钱 1993:8钱 1994:1两5 1995:9钱 1996:1两6 1997:8钱 1998:8钱 1999:1两9 2000:1两2
月的重量:一月:6钱 二月:7钱 三月:1两8 四月:9钱五月:5钱 六月:1两6 七月:9钱 八月:1两5 九月:1两8 十月:8钱 十一月:9钱 十二月:5钱
出生日的重量:初一:五钱 初二:一两 初三:八钱 初四:一两五初五:一两六 初六:一两五 初七:八钱 初八:一两六初九:八钱 初十:一两六十一:九钱 十二:一两七十三:八钱 十四:一两七 十五:一两 十六:八钱十七:九钱 十八:一两八 十九:五钱 二十:一两五廿一:一两廿二:九钱 廿三:八钱 廿四:九钱廿五:一两五 廿六:一两八 廿七:七钱 廿八:八钱廿九:一两六 三十:六钱
时辰: 子时:一两六丑时:六钱寅时:七钱 卯时:一两辰时:九钱 巳时:一两六午时:一两 未时:八钱申时:八钱 酉时:九钱戌时:六钱亥时:六钱时辰表:子时:23:00--1:00 丑时: 1:00--3:00 寅时: 3:00--5:00 卯时: 5:00--7:00 辰时: 7:00--9:00 已时: 9:00--11:00 午时:11:00--13:00 未时:13:00--15:00 申时:15:00--17:00 酉时:17:00--19:00 戌时:19:00--21:00 亥时:21:00--23:00
批注诗 [replyview]2两1:短命非业谓大凶,平生灾难事重重,凶祸频临限逆境,终世困苦事不成 2两2:身寒骨冷苦伶仃,此命推来行乞人,劳劳碌碌无度日,中年打拱过平生 2两3:此命推来骨轻轻,求谋做事事难成,妻儿兄弟应难许,别处他乡作散人 2两4:此命推来福禄无,门庭困苦总难荣,六亲骨肉皆无靠,流到他乡作老人 2两5:此命推来祖业微,门庭营度似希奇,六亲骨肉如水炭,一世勤劳自把持 2两6:平生一路苦中求,独自营谋事不休,离祖出门宜早计,晚来衣禄自无忧 2两7:一生做事少商量,难靠祖宗作主张,独马单枪空作去,早年晚岁总无长 2两8:一生作事似飘蓬,祖宗产业在梦中,若不过房并改姓,也当移徒二三通 2两9:初年运限未曾亨,纵有功名在后成,须过四旬方可上,移居改姓使为良 3两:劳劳碌碌苦中求,东走西奔何日休,若能终身勤与俭,老来稍可免忧愁 3两1:忙忙碌碌苦中求,何日云开见日头,难得祖基家可立,中年衣食渐无忧 3两2:初年运错事难谋,渐有财源如水流,到的中年衣食旺,那时名利一齐来 3两3:早年做事事难成,百计徒劳枉费心,半世自如流水去,后来运到始得金 3两4:此命福气果如何,僧道门中衣禄多,离祖出家方得妙,终朝拜佛念弥陀 3两5:生平福量不周全,祖业根基觉少传,营事生涯宜守旧,时来衣食胜从前 3两6:不须劳碌过平生,独自成家福不轻,早有福星常照命,任君行去百般成 3两7:此命般般事不成,弟兄少力自孤成,虽然祖业须微有,来的明时去的暗 3两8:一生骨肉最清高,早入学门姓名标,待看年将三十六,蓝衣脱去换红袍 3两9:此命少年运不通,劳劳做事尽皆空,苦心竭力成家计,到得那时在梦中 4两:平生衣禄是绵长,件件心中自主张,前面风霜都受过,从来必定享安泰 4两1:此命推来事不同,为人能干异凡庸,中年还有逍遥福,不比前年云未通 4两2:得宽怀处且宽怀,何用双眉总不开,若使中年命运济,那时名利一齐来 4两3:为人心性最聪明,做事轩昂近贵人,衣禄一生天数定,不须劳碌是丰亨 4两4:来事由天莫苦求,须知福禄胜前途,当年财帛难如意,晚景欣然便不忧 4两5:福中取贵格求真,明敏才华志自伸,福禄寿全家道吉,桂兰毓秀晚荣臻 4两6:东西南北尽皆通,出姓移名更觉隆,衣禄无亏天数定,中年晚景一般同 4两7:此命推来旺末年,妻荣子贵自怡然,平生原有滔滔福,可有财源如水流 4两8:幼年运道未曾享,苦是蹉跎再不兴,兄弟六亲皆无靠,一身事业晚年成 4两9:此命推来福不轻,自立自成显门庭,从来富贵人亲近,使婢差奴过一生 5两:为利为名终日劳,中年福禄也多遭,老来是有财星照,不比前番目下高 5两1:一世荣华事事通,不须劳碌自亨通,兄弟叔侄皆如意,家业成时福禄宏 5两2:一世亨通事事能,不须劳思自然能,宗施欣然心皆好,家业丰亨自称心 5两3:此格推来气象真,兴家发达在其中,一生福禄安排定,却是人间一富翁 5两4:此命推来厚且清,诗书满腹看功成,丰衣足食自然稳,正是人间有福人 5两5:走马扬鞭争名利,少年做事废筹论,一朝福禄源源至,富贵荣华显六亲 5两6:此格推来礼仪通,一生福禄用无穷,甜酸苦辣皆尝过,财源滚滚稳且丰 5两7:福禄盈盈万事全,一生荣耀显双亲,名扬威震人钦敬,处世逍遥似遇春 5两8:平生福禄自然来,名利兼全福禄偕,雁塔提名为贵客,紫袍金带走金鞋 5两9:细推此格妙且清,必定才高礼仪通,甲第之中应有分,扬鞭走马显威荣 6两:一朝金榜快提名,显祖荣宗立大功,衣食定然原欲足,田园财帛更丰盈 6两1:不做朝中金榜客,定为世上一财翁,聪明天赋经书熟,名显高克自是荣 6两2:此名生来福不穷,读书必定显亲荣,紫衣金带为卿相,富贵荣华皆可同 6两3:命主为官福禄长,得来富贵定非常,名题金塔传金榜,定中高科天下扬 6两4:此格权威不可当,紫袍金带坐高堂,荣华富贵谁能及,积玉堆金满储仓 6两5:细推此命福不轻,安国安邦极品人,文绣雕梁政富贵,威声照耀四方闻 6两6:此格人间一福人,堆金积玉满堂春,从来富贵由天定,正笏垂绅谒圣君 6两7:此名生来福自宏,田园家业最高隆,平生衣禄丰盈足,一世荣华万事通 6两8:富贵由天莫苦求,万金家计不须谋,十年不比前番事,祖业根基水上舟 6两9:君是人间衣禄星,一生福贵众人钦,纵然福禄由天定,安享荣华过一生 7两: 此命推来福不轻,不须愁虑苦劳心,一生天定衣与禄,富贵荣华过一生 7两1:此名生来大不同,公侯卿相在其中,一生自有逍遥福,富贵荣华极品隆 7两2:此格世界罕有
2008年1月22日星期二
Cognos权限管理注意的地方
Everyone
This group represents all authenticated users and the Anonymous user account. The membership of this group is maintained by the product and cannot be viewed or altered.
You can use the Everyone group to set default security quickly. For example, to secure a report, you grant read, write, or execute permissions to the report for the Everyone group. After this security is in place, you can grant access to the report to other users, groups, or roles, and remove the group Everyone from the security policy for this report. Then, only users, groups, and roles that you specified have access granted to the report.
You can use the Everyone group to apply security during deployment , but you cannot deploy the group itself .
System Administrators
This is a special role. Members of this role are considered root users or super users. They may access and modify any object in the content store, regardless of any security policies set for the object. Only members of the System Administrators role can modify the membership of this role.
The System Administrators role cannot be empty. If you do not want to use System Administrators, you can create an empty group in the Cognos namespace or in your authentication provider, and add this group to the membership of the System Administrators role.
When this role is created during the content store initialization, the group Everyone is included in its membership. This means that all users have unrestricted access to the content store. Immediately after installing and configuring Cognos 8, you must modify the initial security settings for this role and remove the group Everyone from its membership .
You can deploy this role .
将everyone 从System administrator 删除,然后将everyone禁用!!!!
2008年1月15日星期二
探讨数据仓库与商业智能需求与需求分析(转载)
探讨数据仓库与商业智能需求与需求分析
各位朋友,我是一名来自从事商业智能项目开发的一名一线技术工作者,我曾在这个领域从事过从程序员,系统分析员到项目经理多种岗位,从2002年开始,我亲身经历了多个不同规模的数据仓库与商业智能项目,经历了甲方和乙方的角色变换,我试图以一个一线bi从业者的体会,为众多朋友描绘出这个充满了激情与失落的bi需求的最直白的面目,以及结合自己的经验,试图从bi的本质观点(如何创造价值)出发,探讨"什么bi需求是有效的,怎么做有效的bi需求"这两个做bi需求不可回避,却又容易被淡忘的问题。并提出和阐述我认为做bi需求应该与发展企业价值链相结合思考的观点。
bi界内,有一句几乎每个bi实施人员都备感到无奈,却又不得不承认的话,客户真正的需求往往是从项目投产那一刻才真正开始,仿佛bi项目天生就注定是一场的吃力不讨好的恶梦,。
在决定bi实施成败与效果中,需求无疑是雷区最多的地方。对于bi项目而言,需求是个让人又爱又恨的怪圈。几乎所有bi项目都诞生自bi销售人员所描绘出的华丽前景,以及由此所激发出来的充满理想色彩和浪漫情怀的客户需求,是一个美妙的梦中情人;而在bi界众多周知的是,bi的需求又是一个最折磨人,最让人心力交瘁的顽皮孩子。
那么,究竟商业智能是一样什么样的东西呢,商业智能的需求为什么同时具备了可爱和可恨两种自相矛盾的特质呢,让我们先从认识商业智能开始。
第一章回 商业智能的来龙去脉
传统以来,计算机一直被俗称之为电脑,把计算机和智能划上了等号,然而,我相信在坐有计算机常识的人都明白,除了科学幻想外,我们日常实际工作和生活中使用的计算机其实是个傻瓜,他只会毫不变通地执行的预定的程序,所以如果说计算机有智能,程序是智能的核心,再进一步说,所谓的智能的核心就是用程序来演义的逻辑, 在这种以程序为核心的体系下,数据充其量只是程序的一个附属,如果用游客进公园的大门比喻成一套非常简单的程序系统,公园的大门和配套的验票人员是程序,数据是门票,用过一次就扔了,最多拿个废纸箩装起来,一般也不会再有什么作用了,这就是过往在林林总总的政府和企业的计算机系统中数据所遭受的普遍下场了。
附图描述信息化发展规律,从60年代计算机逐渐普及以来,计算机的应用领域无论在深度和广度都有了质的拓展,而从总体的应用水平来说,可以划分为以下三个阶段(如图1-1):这三个阶段与不是用单纯的技术高低来划分的,而是从应用的影响层面来划分。
第一个阶段是基础信息化阶段,这个阶段从应用面来说,主要是解决数据处理电子化的问题,在这一阶段,机构内往往是一些数据处理工作量最大的部门首先采用了信息技术把手工数据工作电子化,如财务系统,计算机辅助设计系统,电子数据交换系统等等,实现了信息处理的电子自动化无论在人力投入和纸张损耗等方面无疑节约产生了具大的效益,可惜这些信息的关联面是非常有限的,甚至可以说离开了这些系统的主要用户,别人是看不懂这些数据的,而这些用户在企业中往往是少数的专业人士。
第二阶段是企业级信息化阶段,这一阶段政府机构与企业往往已经拥有了几个分别建设的业务处理系统,机构期望从总体角度建设高度集中的、或互相联接的综合业务管理系统,如mis,erp,oa等等,这个阶段的应用核心是通过实施一个企业级的应用系统实现企业的业务流程或者管理流程的信息流畅,以此来提高企业的运作效率,以实现流程的自动化。
第三阶段是目前的近几年刚起步的发展趋势,应该说也是现在很多企业完成了第二阶段的信息化建设后,所面临的下一步信息化该怎么走的问题,由于还没成为历史,所以我这里大胆提出我的定义,我认为,这个阶段应该是企业的战略价值信息化阶段,因为这个阶段的根本目标,是实现整个企业的系统思考(systems thinkings)能力,这个阶段的应用层面,应该说已经渗透到从企业管理到企业文化的方方面面,当然,这个阶段的形成与产生绝对是离不开前两个阶段所打下的信息化坚实的基础,本身这三个阶段也是承前启后,不可分割的,而我认为第三阶段对于企业发展更有深远的发展意义,我把企业形象地比喻一个人的话,第一阶段是针对手指的自动化,第二阶段是针对耳朵的自动化,第三阶段是针对大脑的自动化。
第三阶段正是商业智能走上历史舞台并且成为主角的时代,也是企业求生存求发展不得不走向商业智能的历史选择,这个选择的根源,我认为,不是技术的进步,当然不可否认,技术的进步创造了物质上的条件,然而从因果关系的动因角度来做说,企业选择商业智能的根本原因,是市场竞争的必然。
这样,我们不得不偏离一下主题,稍微看看现在市场的竞争给企业带来的压力,随着市场竞争的日益激烈,目前营销竞争方式已经从一个大众化营销阶段进入了一个差异化营销阶段,进而上升到一个价值链整合营销阶段,竞争从拼生产能力到拼服务能力,最终必然上升到拼决策能力,现在的企业一把手可能比历史上任何一个时期的皇帝还要难当,一则是现在企业内部组织机构的复杂性肯定超过100年前的封建帝国,生产环节,销售环节,财务环节,人力环节方方面面,缺一不可,协调一个企业的正常运作已经越来越需要精确化的管理,压缩管理成本已经是任何一位企业领导人都需要认真对待的问题,二则企业的外部环境瞬息万变,拜高度商业化所赐,市场的潮流和态势可能已经达到了一月或者数月一变的程度,一个判断的失误可能就会把企业带入覆灭的境地,在这种内外压力的夹攻中,一个领导的个人决策能力是不可能不达到人的极限,这个时候,企业的信息系统能做什么,当一个领导要了解能反映企业运行状态的一些重要的信息的时候,我们目前的企业的信息系统能迅速给出一个答案吗?
很遗憾,不能,也很幸运,就是因为不能,才有我今天这个报告的主题。
第二章回 什么是商业智能
越来越多企业已经认识到,数据是资产的重要组成部分,以前,企业可能把过期的数据看成是过期门票,随意抛弃,而当企业的领导要做出一个准确有力的决策的时候,终于发现,没有数据啊! 很多人说,不对啊,企业不是已经在计算机设备和软件上投入了大量的资金,做了很多业务系统了吗,不是有很多数据吗? 为什么不能用呢,这个问题问得实在是太好了,我相信每个人都在问这个简单而其实是最深刻的问题,为什么我们的数据不能用!
过去数年里,几乎每一个企业都建立了自己的信息中心,收集和整理了大量的数据,但是这些数据又带来了始料不及的新问题,就是数量之大种类之浩瀚繁杂远远超过了可以控制和理解的范围,数据库变成了“数据监狱”,数据一进去就十有八九成了“囚犯”,而数据一旦过时,要么就被束之高阁,无情地被判了无期徒刑,要么就象碎成纸片的机要文件一样被销毁了。怎么让这些“数据囚犯”变成有价值的决策依据,进而成为有价值的生产要素,这就是商业智能的目的所在。
实际上,给商业智能一个完整的定义是很难的,但是,从商业智能的产生根源的角度而言,可以概括为:商业智能是用来实现数据向信息转变,信息向知识转变,知识向价值转变的这么一个过程,以及这个过程中所使用到的种种技术和工具。
由于商业智能是围绕着数据来做文章的,数据仓库也可以说是商业智能的核心环节,很多情况下,习惯性地,由于两者有如此密切的关系,所以在很多项目命名时,往往是把数据仓库和商业智能相提并论,有时这会给人一种很混淆的感觉。一般来说,上面所描述的是一个广义上的商业智能概念,在这个概念层面上,数据仓库是其中非常重要的组成部分,数据仓库从概念上更多地侧重在对各项企业各类信息的整合工作,包括了数据的迁移,数据的组织和存储,数据的管理与维护这些我们平常称之为后台的基础性的数据准备工作,与之对应,侠义的商业智能概念则侧重在对数据的查询,报表、多维/联机数据分析、数据挖掘和数据可视化工具这些平常称之为所谓前台的数据应用方面。
第三章回 商业智能的需求
前面我很罗嗦地交代了商业智能的来龙去脉,我希望让各位知道的是,商业智能需求天生就注定了是不好弄的,为什么,一句话可以概括,因为这是脑子工程,是一把手的工程!决策,其本身就是一个很个性化的事情,每个人的思维方式和思维习惯千差万别,加上性格偏向和个人喜好等因素,好与不好本身就是个价值判断,不是一个是非分明的逻辑判断。说穿了,商业智能的需求就不可能有什么标准的模式,因为即使从人工智能的理论角度,现在也还没有一个方法可以完全地模拟人脑的运做,所以对商业智能需求的定义和控制过程事实上就变成了对人脑的控制过程,如果需求是做到一把手的头上的,想控制一把手的想法可不是闹着玩的。
关于商业智能的需求,业界和用户就存在两种观点之争,为了说明两种观点,我把商业智能四个字拆开成“商业”和“智能”两对,前者是商业观点,后者是智能观点。这也反映了商业智能需求驱动力的一个发展和变迁,从商业智能形成产业到目前,商业智能需求的主要驱动出现了三次变迁。
首先是技术驱动,最开始只是觉得它是先进的技术,很多企业开始购买了很多这些产品,积极的通过技术的方法驱动这个技术在企业里面的应用。譬如引入查询与报表工具,多维分析工具来改些原来业务系统的报表以及开发一些分析型的应用。
到后来我们称之为业务驱动,现在特别是金融行业,还有政府行业,他们的数据量非常大,基于数据的分析和研判实际上在日常业务流程的战术层次也有很大的一个应用的价值。前在很多行业里面,它的基本从业人员的素质已经非常专业化,比如说特别在金融行业里面,从业人员的素质非常高,因此他很多时候他的决策是在战术层面决定的,比如银行的客户经理负责信贷业务的话,很多时候是他客户经理就要决策,给这个客户相应的信贷的政策是什么样的,基本定制适合这个客户服务的套餐。面对这样一个情况,实际上我们看到很多时候是业务的一种驱动,满足一线业务人员每天做很多战术上决策的需要。
再到后来是管理驱动,由于管理信息面的广度要求,就要开始建数据仓库整合数据了,大家可能觉得他是为管理服务的,但是我们认为在中国早期的bi建设当中,它没有真正起到这个作用,仅仅是给管理者提供了一些基本的报表而已。为什么会提到管理驱动呢,我刚才已经提到了现在的企业老总所面对的内外夹攻的双重压力,在这个情况之下,我们看到的是企业真正的意识到了这种管理的重要性,特别是现在金融企业,它面临很多管理上的改革,比如说中国的金融行业在这两年改革最多的地方,就是我们的信贷风险的管理,还有我们的相应的一些引进一些先进的成本核算的机制,还有绩效考核的机制,这些都是真正对管理从内在的改变。进而它反过来就会驱动数据仓库技术的应用。我们看到在以前,比如说我们做数据仓库的时候,我们会在中国的很多企业里面,认为它是一个可有可无的系统,只是说这个报表我早一点拿到,晚一点拿到而已,但是今天我们看到在银行里面所有的员工,他每个季度的奖金怎么发,都是数据仓库来支撑的绩效考核系统来实现的。
从这个变迁,回应刚才的我对商业智能的分拆,我们看到了一个很明显的趋势,就是目前商业智能需求的重点逐渐从“智能”转向“商业”,同时也因为这种我们和我们的客户对商业智能的理解的变迁,直接地影响了商业智能的需求形态,也必然对商业智能需求分析工作者提出了与时俱进,不断调整和修改需求分析方法的要求。
在技术驱动的时代,商业智能的需求分析更多地是侧重在bi工具的应用,例如用报表工具来实现一些管理性的报表,用olap来实现一些经常性的数据统计与分析,用etl工具来替代手工编写代码方式的数据迁移。这个阶段的需求分析过程有非常明显的技术倾向性,这种项目往往有个前提,就是目标技术平台往往在项目启动之初已经敲定,需求分析师首先要非常了解目标技术平台的各项技术指标,并且非常小心地把目标用户的需求引导并且框定在这个目标技术平台的能力范围之内,这个逻辑是很自然的,也是无可厚非的。
在业务驱动的时代,需求分析师首先需要非常熟悉目标用户的日常业务,商业智能系统比传统业务系统相比,需求的把握与定义是非常困难的,传统业务系统的流程是非常清晰的,类似银行业务的核心业务系统,诸如储蓄业务,对公业务,国际业务即使种类很多,而对于落实到具体业务的需求的时候,起码同一家银行是有一个标准的业务操作的流程的,不论流程多么复杂,所对应的需求总是明确的,可见的,用程序化的方式来表达也是简单的,而且作为生产系统,早日投产比完善往往是更具价值,在这个大前提是,花繁为简,稳定压倒一切是甲乙双方都认同的。而作为以辅助业务中战术决策的商业智能系统,首先要迈过的一个关口就是,在战术智慧上,系统的决策水平要起码高明于一个中等层次的业务人员的商业智慧,这样他才会觉得系统对他是有帮助的,回应刚才我所提出的,对商业智能需求的定义和控制过程事实上就变成了对人脑的控制过程,需求分析师如果不是一位该业务领域的专家,所能形成的需求分析结果能一次性地获得业务人员的真心拥护和认可无疑是天方夜谭,而在目前的bi界中,完全是从业务成长起来的bi需求分析工作人员凤毛麟角,实际情况往往是,一群技术功底还不错,脑子又转得比较快,能给客户一个良好形象的技术人员出身的人充当了bi需求分析师的角色,我就是一个非常典型的例子,这些人如果心态正确的话,会抱着一种对业务无知的谦卑感虚心地向自己的客户请教,并且仗着客户对技术莫测高深的敬畏,迅速地把需求结果框定为一个个本来就是客户手工在做的报表,当然也不排除通过向客户的需求学习,初步掌握了一些业务上的规律,把客户的需求提炼成灵活查询或者多维分析的模型。不幸地,就是这种需求分析方式也造成了我的报告开头所形成的需求怪圈,可以说,这种不幸的局面是先天性的,在东西没有实际做出来以前,无论是客户还是我们的需求分析师,双方所沟通的都是对方头脑里的想象,然后把这种想象用稍微直观一点的方式描述出来,这种表达的效果不管花了多少的细致周到的努力,实质上还只是一种纸上谈兵,或者俗称画饼,饼的模样是画出来了,饼的味道是无论如何也画不出来的,然而时间是不会等人的,工程师们迅速地照饼样动手施工,力求早日让客户吃上称心可口的美味,然而,交付的时刻往往是令人悲哀的,当用户第一口咬下去以后,能一口咬定就收货的用户几乎是不可能的,因为本来就是“学生”做出来的东西,有这样的结局是不足为怪的,于是就有接下来的不断的用户抱怨,不断的需求“变更”,不断的“优化”,不断的“补丁”,不断的忧虑和烦恼……
目前,针对这种情况,一些大公司仗着自己的影响力,组织了一群技术专家经过多年的类似项目经验沉淀后,形成了一套所谓的模板,一则让bi需求分析师对于业务思考模式的学习和理解可以从客户现场退回到自己的公司内部,避免了露短的尴尬,二则,也试图用既成事实的行业标准的做法迅速而直接的影响用户的思维,业界内俗称,给客户“洗脑”,然而,针对个别企业的业务所分析出来的模板能推广,有一个预设前提,就是这种业务在全世界有一个可以普遍使用,而且有同质度非常高的标准成功模式,事实上,每个企业和人一样,是个性发展的产物,不是标准形成的产物,标准的推行本身就意味着企业的持续变革,这里也形成了一个悖论,持续的变革是否需要模板也需要持续的调整,然后模板的调整是否又需要持续的变革来配合,…… 本人对模板是认可的,而对模板的可推广能力是持非常怀疑的态度的。
在bi领域,这个以优化为名的迭代几乎形成了一个没完没了的怪圈。这个怪圈的形成,给每一位曾为商业智能抱有共产主义理想的人冷冷地提了个醒,商业智能不是一个目标,而是一个过程,正如伟大的孙中山先生所嘱咐的,革命尚未成功,同志仍需要努力。
第五章回 商业智能需求的出路
一直到现在,可能各位觉得我对商业智能所持的是一种悲观的态度,这几年,我对商业智能的认识也确实出现了几次反复,从崇拜到失望,从激情蓬勃到理性回归,最后,我相信,商业智能需求必然走向的是价值驱动, 我相信,商业智能的需求经过多次否定之否定的螺旋式上升发展的过程后,商业智能的应用与企业价值链的优化组合是必然的趋势,只有把商业智能的需求和企业价值链的形成与提升结合起来,商业智能的实际价值才能得到真正的体现。
正如前面的分析,各种内外因素的组合作用,使企业必然信息驱动为核心的生产和管理方式,在企业利润形成的整个价值链条中,信息使这条价值链从模糊逐渐走向清晰,将数据作为企业战略资产并且在数据质量方面继续投资,是使企业成为行业先锋的重要保证,运用商业智能的环境来回答诸如客户价值贡献度,地区市场差异,资本充足率,商品生命周期,成本与财务预算,定价策略,资金周转率等与企业利润的形成密切相关,商业智能把历史数据从“数据监狱”里释放出来,成为企业的一笔有形的资产。
说到这里,已经到了我这次报告的尾声了,由于时间的限制,很多具体的点我都没有办法再深入展开了,我相信,商业智能从“智能”走向“商业”是一条商业智能需求走出困境的必由之路,我作为一个从事技术工作十二年,从一个很单纯的技术人员成长起来的技术人员,凭我自己的良心指出,技术至上的观点,不但会成为商业智能发展的桎梏,甚至会成为扼杀商业智能应用推广的无形黑手,所以,作为商业智能项目主导的这些需求分析负责人,首先,就要明确地树立的是做商业智能是为客户赚钱的商业观念,在和客户需求形成的过程中,把客户的需求引导向对客户有利而同时也对降低自身实施成本,加快投产速度也有利的角度,我从来不认为做报表和查询是一种身价的贬低,如果一份“简单”的报表或一笔“简单”的查询能为客户一年节省过千万的成本,避免一笔过千万的风险损失,一份报表就把客户对项目的全部投资都收回来了,这笔帐,我们这些技术人员应该学会帮客户算! 这样的商业智能项目,难道还会受到客户的冷遇和拒绝吗?
最后,我们每位从事商业智能的业界朋友,有个很简单的问题我们问过了吗? 我想以这个问题作为我这篇报告的总结,请问到底什么是商业? 我想我的答案很简单,不过说了也等于什么都没有说,我想用这句香港人常说的口头语来作为我报告的结语:
business is business!
2008年1月12日星期六
COGNOS经验摘抄一
1. 在iqd中编写sql语句时,建议不要使用cognos的标准sql语法,因为这不仅会影响sql查询的速度,同时对sql查询的功能也有所限制,具体的实现的方法是直接将所有sql{}括起,这样cognos将不对花括号中的sql语句进行解释而是直接仍给所连接的数据库,用数据库自己生成最优化的查询计划。
2.关于iqd的写法,以下提供一个具体的模板,只需要依葫芦画瓢即可
COGNOS QUERY
STRUCTURE,1,1
DATABASE,DB
TITLE,IMR1.imr
BEGIN SQL
{select T1.C1 as c1,
T1.C2 AS C2,
T1.C3 AS C3,
T1.C4 AS C4
FROM SCM. T1
}
END SQL
COLUMN,0,C1
COLUMN,1,C2
COLUMN,2,C3
COLUMN,3,C4
3.对于相对固定不变的维表,最好是使用本地文本的格式如csv格式加以保存和维护,这样可以提高cube生成的速度
4.对于以时间为变化轴的数据,可以通过建cube group来按照指定的时间粒度进行增量维护
5.下钻路径应该根据维表层次的关系以及分析的需要进行选取,如果在同一维表中两个层次之间没有明确的继承关系,则应考虑将两个层次建在两个不同的下钻路径上
6.开发cube的时候,事实表中的数据应在保证不丢失信息的前提下尽可能的将粒度变大,这需要建立一个中间表,从源数据表中将聚合后的数据导入到中间表中,总之直接从源数据中提取数据建cube是不合适,应尽量避免
1. 对于多维报表模型,在开发环境下应存储为MDL格式而不是PYI格式,两种格式的区别在于MDL是以XML文本存储,保证了模型的移植性和可扩展性,但是在性能方面会相对差一些,因为每次生成Cube都要先将MDL编译成二进制的文件,而PYI则是已经编译好的,因此性能较MDL优,但是如果模型不是很复杂,两者的差别并不大
2.除时间维度外,其余维度中的category应设成always include,这样可以保证报表中有完整的分析方向,举个例子:
要分析所有客户中的男女分布,如果客户中全是男性,而将相应的category按默认生成include in need,则用pp打开cube后,只能看到性别维度中只有男性,没有女性。
这段时间又有一点体会,希望能为大家省去一些麻烦
1.Powerplay server 7 version 4的字体支持问题
从3.0 升级到4.0后,发现对粗体的支持有问题,发布的报表中如果使用了粗体,在upfront上浏览的报表出现了显示不正常的情况,主要包括:标签不能正常显示,报表中的数据不能正常显示,因此在4的版本下开发报表,应注意使用正常字体(这个问题,折腾了俺一个星期的时间才找到原因,5555)
2.报表格式的要求
为了保证报表有效、快速的显示,应在整张报表上使用相同的字体,并尽量避免使用图片等多媒体格式的文件
3.Transform中的多维模型设计
在维视图上,时间维在系统内部生成,并讲时间维放在维视图的第1列
在数据源视图上,将事实表放在最后
中间表的设计方面,在保证信息不丢失的前提下,尽可能通过聚合等方式,去除中间表中的明细数据
4.如果希望以时间为轴实现数据的增量更新,应使用cube group
5.如果要全部重新生成cube,应该将原有的cube删除后,再进行重建,否则会报错
6.如果维度比较稳定, 则尽可能的使用csv格式保存,对于渐变维或经常需要维护的维度使用iqd来获取
7.在pp中设计报表时,对于出现报表的列或行的维度,如果经常需要维护,则尽量使用subset,这样可以保证报表动态的更新
8.如果使用了宏来自动生成cube,产生报表,则在重新生成cube后,应该手工的保存mdl,否则下一次重新运行宏的时候,cube会生成失败(这个问题应值得注意)
9. 如果将其他环境下的cube放到当前环境中打开,如果cube中含有访问控制信息,则只有在当前环境下的Acess Manager中的用户类目录结构于先前环境下的完全一致,才能保证cube的正确打开, 可以先将前一环境下的安全控制配置文件导出为.lae,然后再导入到当前环境来完成这个工作
Cognos 企业级系列产品其实包括了两部分,一部分是ReporNet,一部分是Powerplay也就是人们常常提到的PPES,这两部分分别解决的是二维报表和多维报表的问题,同时在数据采集的机制上也是完全不同的,ReportNet采取的是对数据库做online查询,而PP则是在实现准备好的Cube基础上,创建多维报表,并支持钻取,切片,上卷,旋转等灵活的报表展示功能,前者的工作负荷集中在数据库上,而后者的工作负荷则集中在PPES服务器上。而两者的安装完全可相互隔离,他们在功能上是一种互补的关系,但是在物理上却毫无关系,对于Cognos产品的理解,我个人建议最好是先看看cognos自带的关于产品体系架构方面的文档,同时最好能自己亲手安装和配置一下,这样才能对其产品的结构有一个深入和全面的认识
数据库的导入
ReportNet自带sample数据库以及相关的工程文件
在导入模型之前,要将sample数据库中的表恢复至当前的数据库中,对于DB2,在..program filescognoscrnwebcontentsampledbdb2目录下有多个.tar文件,解压后可以看到有多个tabl?. ixf以及一个db2move.lst文件组成,其中db2move.lst是供db2move工具使用的列表, 而ixf文件中包含了相应的表的表结构定义和数据,使用db2move将表及其数据导入现有的数据库,命令如下:
db2move import -io replace_insert -u user -p password
如果提示单字节代码页集不相配的错误,可以自己建立一个批处理文件来使用import或load语句的forcein文件类型修饰符来强制对单字节代码页进行转换,如:
db2 connect to cogdb user cfep using cfep2004
import from tabl.ixf of ixf modified by forcein create into GOHR.BRANCH
import from tab2.ixf of ixf modified by forcein create into GOHR.EMPLOYEE
db2 import from tab3.ixf of ixf modified by forcein create into GOHR.COUNTRY_MULTILINGUAL
db2 import from tab4.ixf of ixf modified by forcein create into GOHR.COUNTRY
db2 import from tab5.ixf of ixf modified by forcein create into GOHR.GENDER_LOOKUP
将数据导入至数据库中之后,应对模型进行相应的修改,首先在crn中建立同名的datasource,并且在properties页中设置同名 datasource,schema设置为所使用的db2模式(大小写敏感),将type->interface设置为DB2,
即完成了对sample的导入工作
2008年1月7日星期一
[转贴]2007年度天涯100条爆笑评论
1.一只河蟹横着爬过来冷冷道:“你找夹吗?!!!”
2.《走进科学》终于揭开神农架野人之谜——原来这是一群买不起房的中国人!
3.中国的新闻比小说还要精彩!!!
4.在国外,死人的矿难叫新闻;在国内,救出来的叫新闻!
5.功课成绩全A,应聘的时候也竞争不过人家一对C!
6.两样东西阻碍了中国男足冲出亚洲——他们的左脚和他们的右脚……
7.为了做公务员,我生了领导的儿子!
8.派出所是中国最大的反对党培训基地!
9.城管大队长猝死在街头——狗都累死了,可见统治者残忍到什么程度!!!
10.售楼大厅里,一位怀抱巨款的母亲哭了。我发自内心的觉得应该好好感谢政府,没有政府的英明决策,哪来的人间这般真情!
11.他们说我钉子户是刁民,我就骂他们是刁官,因为只有当年日本鬼子在中国才说刁民和良民。
12.威斯特年画——唯一登上美国《科学》杂志的中国年画!
13.数据显示,2007年中国男性占全国总人口的52%,女性占43%。
14.政府说的话就像尼斯湖水怪一样无所谓真假;政府的信用就像我的贞操一样稀罕但不值钱!
15.美国自南北战争后就没有奴隶了,黑人奴隶变成自由人和国家公民;而在新中国的山西黑砖窑,却把自由人和国家公民变成了黑人奴隶!
16.据国家统计局统计,2007年中国同比没有增长的有:1.工资;2.空气。
17.什么节目充满了欺骗谎言却极受广大人民群众的喜爱?答:新闻联播!
18.2007年中国股民真实写照:辛辛苦苦两三年,一夜回到解放前,宝宝飚泪把戏演,南海剧组狂搂钱!
19.开发商买不起人民群众的房子就让法院强制执行,那么人民群众买不起开发商的房子是否也可以要求法院强制执行?
20.商场:不卖镇坪腊肉!(理由:纸虎原产地,假货自然多!)
企业:不招镇坪工! (理由:一方水土养育一方人!)
大学:不招镇坪生! (理由:考试作弊,头号嫌疑!)
部队:不招镇坪兵! (理由:连纸老虎都怕!)
好男:不娶镇坪女! (理由:买个充气的,强过纸板的!)
好女:不嫁镇坪男! (理由:除了嘴硬,哪都不硬!)
21.嫦娥一号发回来的照片不是假的——因为市面上还没有发现月球的年画!
22.国家统计局解释说:数据出现偏差并不奇怪,因为1个亿万富翁配上你们99个穷光蛋,平均下来中国人人都是百万富翁!
23.世界上最可怕的事情不是生死离别,而是2008年你赶了一群猪浩浩荡荡地去北京换房!
24.你们也不能太侮辱周正龙的智慧,至少他自己没顶片树叶,然后宣称自己是华南虎!
25.高昂的医疗费用使老百姓得病直接进火葬场的可能将在三年内实现!
26.从许霆多取了17万就被判无期徒刑,我们可以得出结论:中国只有法官,没有法律!
27.政府动辄说:“我们也难啊,得养活十三亿人。”可问题是我们十三亿人养着政府还是政府养着我们???
28.汽车、房子、民主、自由,这些现在都已经不是最重要的了,对于绝大多数中国人来说,怎样能在和谐社会下填饱肚子,这才是第一重要的~
29.究竟是通货膨胀了,还是政府开始抢劫了?为什么我们这么努力地工作却过得如此艰难?终于明白大宋京都司令部司令员林冲,这么优秀的公务员为什么都上梁山了!
30.CCTV1《晚间新闻》:大陆10月物价上涨6.6%,群众一致表示“对生活影响不大”;CCTV4《海峡两岸》:台湾物价增长4.5%,民众大叫“活不了了”!
31.民主孕育幽默,独裁引发讽刺!
33.世态炎凉鸡最懂,人情冷暖鸭先知。
34.矿难在检讨中继续,楼价在控制中上升!
35.都是中国人,不用讲素质!
36.看了CCTV,觉得中国了不得;上了天涯杂谈,觉得中国不得了!
37.英雄不问出路,流氓不看岁数!
38.有奶不一定是娘,但有钱一定是爷!
39.天亮睁开眼,还活着,真好;天黑闭上眼,能睡觉,值了!
41.在中国凡是带“民”字的都落不着什么好——譬如民工、农民、民营、股民……
42.中国上半年财政收入比去年同期增长32%——掠夺之疯狂可见一斑!
43.现如今有钱的不如有权的,有权的不如有枪的,有枪的不如拿斧头镰刀的!
44.好人苦不苦,扶个老太四万五;好事累不累,助人为乐是犯罪!
45.政府不应该把个人所得税起征点订在2000,而是应该把中国最低工资订在2000!
46.在中国,法律面前人人平等——关键在法律背后就不好说了!
47.大陆的高官全世界哪个国家都可以去,但老百姓不一定哪儿都能去;台湾的高官全世界哪个国家都不能去,但老百姓哪儿都可以去!
48.政府辟谣的事9.9成是真的,所以宁可相信谣言也不要相信政府,这是生活在现在的中国人的经验总结,血和泪换来的真理!
49.在中国,网络代替了民主国家反对党的作用!
50.(天涯不支持ascii码,先空着)
51.方丈说:“出家人不打诳语,相信CCTV还不如来我这里烧香拜佛。”
52.杭州县长说:“晚上带你去看帝国主义的侵略!”(注:伟大领袖毛主席教导我们:帝国主义的侵略都是赤裸裸的!)
53.山西洪桐县矿难105人遇难——向中国探地工程殉难的勇士们表示沉痛地哀悼!
54.东莞农民骂道:“我们能养政府,为什么就不能养猪!!!”
55.啥叫韩国人?就是牛逼的都是他家的!啥叫印度人?就是他家的都是牛逼的!
56.明年是否真的存在北京奥运会,这事儿还得让陕西林业厅的请专家来鉴定一下!
57.上级领导视察浠水县税务局,见到操局长的女秘书关心地问:“今天高潮来了没有?”
58.气象专家做客电视台辟谣说六月的北京绝对不可能下雪,第二天猪笑着打滚道:“别污辱了俺的智商!”
59.现在广东的胖人都不敢出门了,因为一出门街上就有数不清的眼睛绿油油地盯着他身上的肉!
60.古人云:善有善报,恶有恶报。彭宇案后父母教育孩子:善有恶报,恶有善报,不是不报,南京法官未到!
61.语文考试应该取消作文,因为我们人生第一次撒谎都是从作文开始的!
62.要玩一夜情你也得找对地方啊,有道是劲舞团里寻小姐,可没听过谁玩跑跑卡丁车能搞出一夜情的!
63.问个问题,中国有没有哪个领导人的亲戚不当公务员或者不开公司?
64.随着肉价再次上涨,以前开玩笑说猪的“四大理想”中的“全国人民信回教” 就快要实现了!
65.这次北京奥运会,安全套的尺寸一定要齐全!
66.弘扬某党办事雷厉风行的超短篇小说:党员:有发票吗?妓女:有!党员:走!!
67.71张照片充分揭示华南虎成为超稀有物种的原因——吐着舌头正面被人拍了半个小时都不带换个姿势的老虎,它不灭绝谁灭绝!
68.南京法院的逻辑:赖宁去救火是因为那火是赖宁放的,雷锋帮老大娘买票因为大娘的钱是他偷的,98年抗洪是因为洪水是解放军泄的!
69.彭宇案对社会还是有很大贡献的:以前大家如果没有见义勇为、帮老扶幼,事后难免会良心不安,自我折磨。现在不用了,很坦然就可以了~为什么?难道法院说的还会有错?
70.张纪中版《西游记》里的天兵天将将在全国各地城管中进行海选,因为城管队员不论是形象作风,还是战斗力都非常有震慑力,非常适合演招之即来、来之即战、战之能胜的威武之师、文明之师!
71.山西——中国矿难事故的形象代言人!
72.中国的肯德基是用来上厕所的!
73.股票赔的只能扮超人出去打劫了!
74.XP不发威,你当我是DOS啊!
75.比谣言更可怕的是对言论自由的剥夺!
76.中国的国旗和煤是红色的!
77.爱她——就要喝可乐!
78.这个世界上对姚明包夹最紧的,莫过于叶莉!
79.她哥哥是黑社会咋了?我靠,你丫就不会入党啊!
80.中国只有骗子是真的,因为只有假的才永远假不了!
81.中国真的进入法制社会了——过去政府宣扬亩产万斤还受到领袖表扬呢,而现在自己造个纸包子新闻就要被判入狱了。
82.封建社会权贵们用“天子犯法与庶民同罪”的空口号来愚弄百姓,新社会无非换了个口号——“法律面前人人平等”!
84.啊,美丽的三峡大坝,感谢政府给重庆装了一个这么大的天然空调,只可惜砖家们把空调散热方向装反了!
85.没了天敌,洞庭老鼠泛滥成灾;那没了什么,中国贪官污吏才泛滥成灾?
86.和平年代能让一个地方(太湖蓝藻)的居民受到生命威胁,这在任何一个渴望和平的国家人民眼里都是不可思议的事!
87.把陈良宇开除党籍也太欺负人了吧!你们党员杂碎就往我们群众队伍里推呀,和着我们群众就是藏污纳垢的地方啊!你经过我们群众同意了么?他本来是公仆,这么大的罪怎么反倒变成主人了???
88.正常的事发生在正常的体制中或不正常的事发生在不正常的体制中都是正常的,正常的事发生在不正常的体制中或不正常的事发生在正常的体制中都是不正常的!
89.傻逼应该是这样的:一个丑陋的男青年,穿了个两块钱的耳环,头顶用刺鼻的东西把黄毛竖得高高的,然后耳发和后颈留得又长又脏,一身假NIKE,手上一个NOKLA N73,手机的破喇叭里用最大音量播放着《求佛》,然后坐在公共汽车上一边抽烟一边对身边站着的孕妇老人熟视无睹,接着把嘴里的瓜子壳吐在地上,然后把瓜子袋扔到窗户外面,嘴里脏话连篇,然后盘算着回家去看个辫子戏!
91.我生活在一个由封建阶级统治下用资本主义生产方式发展的人权状况比美国好五倍且被定义为社会主义国家的奴隶制国家里!
92.“和谐”之所以成了一个讽刺,在于执政者口号喊得和现实反差太大了!
93.组织之所以不可战胜,是因为组织不是人!
95.对制造纸包子新闻的记者判刑并不是因为他侮辱了中国新闻记者的名声,而是因为他玷污了我国广大无良商贩们的智慧!
96.恶意讨薪、恶意取款、恶意打工,只要和老百姓有关的都是恶意的;合理贪污、合理违法、合理拆迁,只要和政府相关的都是合理的!
97.不要去见义勇为——这样本来就不是很好的社会风气就会更糟!
99.我出生在中国,死了葬在中国,真是祸不单行啊~
100.不知道我们看了这些该哭还是笑,但这就是我们天涯人眼里的2007:盛世出国虎,虎啸振国威。国危多妖孽,群丑闹中华!
32、40、83、90、94、98无法显示,请参见
http://cache.tianya.cn/techforum/content/14/738835.shtml
2007年8月29日星期三
one-to-one的效率问题,用one-to-many来替代?
From tableMain
仅仅执行看起来十分简单的一条语句,你所期望的是他紧紧查询T_MAIN这张主表,可是结果确实hibernate通过多个外连接将所有的子表一口气的全部查询出来
select * from t_main main outer join t_sub1 sub1 on main.id = sub1.id outer join t_sub2 sub2 on main.id = sub2.id...
如此的效率绝对让你头痛不已,不仅如此,如果你通过首先获得子表t_sub1的某个主键ID,然后通过这个主键查询出子表对象,在关联至住表,同样的情况又会发生,又会生成类似的SQL语句,这样一来看来对于这个设计应用one-to-one本身就是一种错误,是这样吗?
或许有人认为我们在每个one-to-one中加入lazy="true"这个属性会杜绝上述情况的发生,经过笔者的证实即便你加入了lazy= "true",也不会带来任何的改变;又或者在hibernate.config中加入fetch depth属性以及在每个关联中设置outer-join="false",这些都不会引起本质上的变化,加入outer-join="false"其实结果只是将原有的outer join语句改变成多条sql语句而已,并没发生什么本质变化,反而效率更低了。
该怎么办呢?我们先仔细研究一下one-to-one的概念,one to one代表一对一,在一般的模型中很少会遇到one-to-one这种概念,因为他十分强调一对一的概念,就好比一个人他只有一个身体和一个头而已,头和身体是十分好的例子,因为有身体必定只有一个头,而且说到了身体必定要说头,就好像看了某个女孩的身材必定想知道她的长相如何(-_-),所以在这时我们使用one-to-one,因为这种一对一的关系是很强的,而且从对象中取得body必定会取得他所关联的head,这样的情况下使用outer- join是十分方便和有效率的,因为它使用了outer join查询从而避免了两条到数据库的查询语句,而且在这种情况下也只需要在body_hbm.xml中设置一个one-to-one即可,所以在这种确实是一对一而且在主表中一对一的关联个数(即主表中one-to-one标签)十分少的情况下,使用one-to-one是一种很不错的解决办法。
如果一个主表会对多个子表都进行one-to-one关联呢,就像我们一开始遇到的这种情况,比如你不仅仅只想了解那个你中意的女孩的身材和脸蛋,而且还想知道他的学历,身世等等一切,在这种情况下,如果我们都是用多个one-to-one在主表中的话,那情况正如我们一开始看见的,是十分可怕的,该怎么做呢?不妨考虑一下使用one-to-many,什么,many?一开始听到many这个词的时候,我也觉得挺惊讶的这明明是多个一对一的关联为什么要用到many呢?其实many并没有一定要说是大于一的,你就只在它的many中存在一个关联它有能乃你何呢?如果用到many的话,我们就需要改动数据表的设计了,在每个有关连的子表中加入一列main_id代表主表中该记录的主键子段值,只需要这样子改动就可以了,这样所带来的效果绝对是值得你这样做的,然后我们就按照以往的one-to-many来设计就好了
在body.hbm.xml加入(一到head的关联举例,其他的关联按照这样的格式添加即可)
在head.hbm.xml加入
行了,经过上面的改动我们就摆脱了查询时多个outer-join的困扰,只在需要的时候才对子表进行查询,因为设置了lazy="true",所以一切的一切都在我们的预料之中,我们如果希望获得body的话hibernate绝对不会把它的head 也查询出来,节省了查询是所需要的负担,除非到了我们十分需要head的情况才会进行关联查询,获得所需要的head结果。
所以由此看来在one-to-one这种一对一的关系不是很强的情况下,或者是在一张表中存在多个one-to-one的情况下,使用one-to-many来代替one-to-one不失为一种不错的做法,当然更重要的良好的数据库设计,hibernate毕竟只是末,千万不要本末倒置。
2007年6月11日星期一
光阴的故事
春天的花开秋天的风以及冬天的落阳
忧郁的青春年少的我曾经无知的这么想
风车在四季轮回的歌里它天天地流转
风花雪月的诗句里我在年年的成长
流水它带走光阴的故事改变了一个人
就在那多愁善感而初次等待的青春
发黄的相片古老的信以及褪色的圣诞卡
年轻时为你写的歌恐怕你早已忘了吧
过去的誓言就象那课本里缤纷的书签
刻划着多少美丽的诗可是终究是一阵烟
流水它带走光阴的故事改变了两个人
就在那多愁善感而初次流泪的青春/
遥远的路程昨日的梦以及远去的笑声
再次的见面我们又历经了多少的路程
不再是旧日熟悉的我有着旧日狂热的梦
也不是旧日熟悉的你有着依然的笑容
流水它带走光阴的故事改变了我们
就在那多愁善感而初次回忆的青春
2007年5月30日星期三
三只小猪
狼:你是谁?
猪A:对~我是谁!
狼:什么?
猪A:我不是"什么",什么在屋顶````
狼:我问你的名字叫什么?
猪A:我叫"谁",什么在屋顶上。
狼又问猪B
狼:你是谁?
猪B:我不是"谁",他是"谁"〈指着猪A〉
狼:你认识它?
猪B:是的
狼:什么?
猪B:"什么"在屋顶!
狼:哪儿?
猪B:"哪儿"是我
狼:谁?
猪B:他是"谁"<又指了下猪A>。
狼:我哪知道!
猪B:你找"谁"。
狼:什么?
猪B:"什么"在屋顶。
狼;哪儿/
猪B;"哪儿"是我!
狼:谁?
猪B:我不是"谁"。他是"谁"。
狼:你怎么@#¥%*^~.。。。(之乎者也云云哉)
猪A和猪B:"什么"是我们的爸爸~
狼;什么?是你们爸爸
猪B:不是。什么在上面。
狼受不了了仰天长叹:为什么?
猪A,B,C:"为什么"是我们爷爷
狼:什么?
猪A:不是,我们爷爷是"为什么"
狼:为什么?
猪A:是!
狼:是什么?
猪A;不,"为什么"
狼:谁?
猪A:我是"谁"!
狼:你是谁?
猪A:对!我是"谁"
狼:什么?
猪A,B:"什么"在屋顶!
狼:``````````````````````````````死了
2007年5月29日星期二
有一个躲猫猫社团,他们团长现在还没找到
警察甲:好严重的车祸。
警察乙:是啊,脑袋都撞到后面去了。
警察甲:嗯,还有呼吸,我们帮他把头转回来吧。
警察乙:好.....一、二使劲,转回来了。
警察甲:嗯,没有呼吸了.......
"你们为什么吃草?"
"我们实在是没有钱......"一个乞丐答道。
"真是的,上车吧,到我家去。"
"我家里还有老婆和两个孩子......"一个乞丐嘟囔道。
"把他们叫来1富翁指了指另一个乞丐。"还有你,把你的家属也叫来。"
"我家人口可多,除了老婆外,还有五个孩子。"另一个乞丐说道。
"没关系,都叫来,快去1
就这样,两个乞丐和他们的家属都上了车,好在是加长车。行使途中,一个乞丐的老婆感激的说道:"老板,您人真好,连我们这样的贫穷的人您都能请到家."
百万富翁答道:"没什么,我刚刚从国外回来,家宅一直没人照看,院子里的草坪可能有一米多高了,你们可以吃个够
熊和兔子在森林里,捡到一个瓶子,打开瓶子,冒出一个仙人,仙人说,谢谢你们放我出来,我能满足你们每个人的3个愿望。
熊说:我希望这个森林里除我以外都是母熊。好,仙人帮他实现了愿望。
熊又说:不,我希望全世界除我以外都是母熊。好,仙人帮他实现了愿望。
熊最后说:我希望这些母熊都爱我。好,仙人实现了他的愿望。
接下来是兔子。
兔子说:我要一辆小摩托。仙人给了兔子一辆摩托。
兔子又说:我要一定安全帽。仙人给了兔子一顶安全帽。
兔子最后说:我希望这只熊是个同性恋。
有一天,魔王抓走公主,公主一直在叫"救命".
魔王:你尽管叫破喉咙吧,没有人会来救你的!
公主:破喉咙!破喉咙!
没有人:公主,我来救你了!
魔王:说曹操曹操到!
曹操:魔王,你叫我干嘛?
魔王:哇呀!看到鬼了!
鬼:呵~被发现了!
呵:胡说,谁发现我了?
谁:关我屁事!
魔王:oh~my god!
上帝:谁叫我!?
谁:没有人叫你啊!
没有人:我哪有!!
法国人:我要很多很多的美女。得到很多很多的美女。我还要很多很多的美女。又得到很多很多的美女。我想去我法国的住所。于是法国人也回去了。
中国人:我要二锅头。得到一瓶二锅头。我还要二锅头。又得到瓶二锅头。我有点想那个英国人和那个法国人了。于是三个人继续在沙漠里面走。
他们又走又遇见个魔鬼。他说他是刚才魔鬼的徒弟,只能满足他们一人两个愿望。于是法国人和英国人都要中国人先说。中国人说我要二锅头。得到二锅头。他又说好了,没事了,你可以走了。法国人和英国人……
他们继续在沙漠里走。遇见一个魔鬼,说是徒弟的徒弟,只能满足一人一个愿望。法国人:中国人说的不算!英国人:中国人说的不算!中国人:我希望英国人可以回老家,法国人能回自己的住所不要再和我一起在这里受苦了。法国人和英国人……
他们只有继续在沙漠走。又遇见一个说是徒弟的徒弟的徒弟的魔鬼,能满足他们共同的愿望。法国人:我再也不要看见中国人了!英国人:我再也不要看见中国人了!中国人:他们说的都不算。
蚂蚁在森林里走,突然遇到一只大象,蚂蚁连忙一头钻进土里,伸出一只腿。
小白兔见了很好奇,问: 你在干什么?
蚂蚁悄悄对它说:
嘘……别出声,看我绊丫一跟头……
一天,袋鼠开着车在乡村小路上转悠,突然看到小白兔在路中央,耳朵及身体几乎完全趴在地上似乎在听什么...
于是..袋鼠停下车很好奇地问:"小白兔,请问一下你在听什么?"
"半小时前这里有一辆大货车经过..."
"哇靠..这么神!..你是怎么知道的?.."
"他XX的!我的脖子和腿就是这么断的.."
长颈鹿说:"小兔子,真希望你能知道有一个长脖子是多么的好。无论什么好吃的东西,我吃的时候都会慢慢的通过我的长脖子,那美味可以长时间的享受。"
小白兔毫无表情的看着他。
"并且,在夏天,那凉水慢慢的流过我的长脖子,是那么的可口。有个长脖子真是太好了!小白兔,你能想象吗?"
小白兔慢悠悠地说:"你吐过吗?"
2007年5月28日星期一
郭德纲相声
其中有一对夫妻,别看日本人一般都不高不过这对夫妻特高 属于日本人里特高的了,男的1.2米
女的1.1米。他们还老玩高尚的运动,爱打高尔夫球,没事的时候俩人老拿根小棍打小钢珠 打完了再捡去,这球打出去10米 俩人得半天才能捡回来。
这一次打完了去找 发现把人家玻璃打碎了隔着玻璃一看,里面有个古董花瓶也打碎了,他们那个小球就在旁边地上。俩人赶紧去敲门,看见里面有个男的,就说:对不起,我们打球不
小心把玻璃和那个古董都打碎了,我们来赔礼道歉。那男的说了,不用赔礼道歉,我得谢谢你们两位。俩日本人不明白了,这怎么回事?
那男的说了,我不是普通人,我是个神仙我一直在那个花瓶里呆着,今天你们把我救了,花瓶不碎我出不来。嗬,两口子高兴,对那神仙说,都说救了神仙能许愿,能帮助我们什么事吗?神仙说,行啊,你们有什么要求就提吧。
那男的就说了,我想要中国的土地和资源,您看行吗?神仙说,行等你回家就有了。那女的又说了,我想要中国所有的黄金和珠宝。神仙说,行回家以后就有黄金和
珠宝了。这时候,神仙说了,我这神仙法力有限,我只能答应你们1人1个我还得自己留1个,你们能满足我吗?这两口子说,没问题我们日本人最讲诚信的我们答
应你,你说吧。神仙说,我在花瓶里1000年了,我今天看见你夫人很高兴,希望能不能和你的夫人一起在床上躺一会。日本男人很不高兴说,你得再加5元钱。神仙说好,你回家钱就在你床上。神仙领着这女的就进屋去了。
这男的就在外面等着,等了2小时门开了,神仙和那夫人都出来了,坐下休息,神仙抽烟说,你们多大岁数了?日本男的说,我们一样
都27了。神仙说,27还这么缺心眼,还相信世界上有神仙?
说完观众叫好。郭大师说,相声是劝人向善,但是做为演员,有义务宣传爱国主义精神。
2007年5月15日星期二
一种新的选择----stax创建XML文档
Streaming API for XML (StAX) 不仅能解析 XML 文档,而且可以把 XML 文档写入一个输出流。这篇技巧展示了客户应用程序如何使用底层的、基于指针的 StAX API 有效地创建 XML 文档。
直到最近,程序员通过编程创建 XML 文档还只有两种选择。一种是把序列化的 XML 内容写入输出流,第二种是使用 DOM。
这 两种方法都有严重的缺陷。对于第一种情况,程序员完全负责保证结果文档是格式正规的。程序员必须处理其中的细节,比如起始标签和结束标签的匹配,以及字符 内容中特殊字符的转义,如小于号(<)和逻辑与(&)。这可能造成程序的实现冗长乏味而且容易出错。另一方面,尽管 DOM 把程序员从这种沉重的负担中解放出来,但是引入了巨大的开销:在序列化到输出流之前,整个文档必须首先在内存中构造一棵节点树。
Streaming API for XML (StAX) 彻底改变这一切。与 Simple API for XML (SAX) 不同,StAX 提供了编写 XML 文档的 API。更具体地说,它提供了两种 API:底层的、基于指针的 API( XMLStreamWriter )和高级的、基于事件的 API( XMLEventWriter )。基于指针的 API 最适合用于数据绑定的情况(比如从应用程序数据创建文档),而基于事件的 API 则通常用于管道式的情况,从输入文档中的数据构造新的文档。
下面的例子是使用基于指针的 API 实现的。(我将在下篇技巧中讨论基于事件的 API。)基于指针的 API 为创建 XML 信息集中的不同元素提供了各种专门的方法,比如元素、属性、处理指令、数据类型声明和字符内容。这些方法解决了许多格式化问题。比如, writeCharacters() 方法自动转义像小于号(<)、大于号(>)和逻辑与(&)这样的特殊字符。而 writeEndDocument() 则自动关闭所有打开的结构。因此即使把本例中最后一次对 writeEndElement() 的调用注释掉也没有关系。
StAX 甚至可以为没有正式声明的名称空间生成名称空间前缀。但是只有在输出工厂的 javax.xml.stream.isPrefixDefaulting 属性设为 true 时才会这么做。如果该属性被设为 false ,您就必须明确地声明每个名称空间前缀,并对每个名称空间使用 setPrefix() 和 writeNamespace() 方法。清单 1 中,我已经把这些方法调用注释掉了,因为我已经把前缀默认设置为 true 。
清单 1. 编写文档
import javax.xml.stream.*; |
注意,StAX 不能保证文档的格式正规性。仍然可能生成违反 XML 推荐标准的文档,比如一个文档中有多个根元素或者多个 XML 序言,标签名和属性名中包含空格或 XML 不支持的字符。StAX 实现可以检查这些问题,但并不要求这么做(参考实现中就没有这样做)。尽管如此,StAX XMLStreamWriter 对于输出原始 XML 数据仍然是一个很大的改进,而且开销只是 DOM 的一个零头。
|
这篇技巧说明了如何使用 StAX 基于指针的 API 有效地编写 XML 文档。在下一篇文章中,我将介绍如何使用基于事件的 API 合并两个 XML 文档。
2007年5月13日星期日
dom4j(Version 1.6.1)快速入门
或许你想要做的第一件事情就是解析一个某种类型的XML文档,用dom4j很容易做到。请看下面的示范代码:
import java.net.URL;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class Foo {
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
}
使用迭代器(Iterators)
我们可以通过多种方法来操作XML文档,这些方法返回java里标准的迭代器(Iterators)。例如:
public void bar(Document document) throws DocumentException {
Element root = document.getRootElement();
//迭代根元素下面的所有子元素
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
//处理代码
}
//迭代根元素下面名称为"foo"的子元素
for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {
Element foo = (Element) i.next();
//处理代码
}
// 迭代根元素的属性attributes)元素
for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}
}
强大的XPath导航
在dom4j中XPath可以表示出在XML树状结构中的Document或者任意的节点(Node)(例如:Attribute,Element 或者 ProcessingInstruction等)。它可以使在文档中复杂的操作仅通过一行代码就可以完成。例如:
public void bar(Document document) {
List list = document.selectNodes( "//foo/bar" );
Node node = document.selectSingleNode( "//foo/bar/author" );
String name = node.valueOf( "@name" );
}
如果你想得到一个XHTML文档中的所有超文本链接(hypertext links)你可以使用下面的代码:
public void findLinks(Document document) throws DocumentException {
List list = document.selectNodes( "//a/@href" );
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
}
}
如果你需要关于XPath语言的任何帮助,我们强烈推荐这个站点Zvon tutorial他会通过一个一个的例子引导你学习。
快速遍历(Fast Looping)
如果你不得不遍历一个非常大的XML文档,然后才去执行,我们建议你使用快速遍历方法(fast looping method),它可以避免为每一个循环的节点创建一个迭代器对象,如下所示:
public void treeWalk(Document document) {
treeWalk( document.getRootElement() );
}
public void treeWalk(Element element) {
for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
Node node = element.node(i);
if ( node instanceof Element ) {
treeWalk( (Element) node );
}
else {
// do something....
}
}
}
生成一个新的XML文档对象
在dom4j中你可能常常希望用程序生成一个XML文档对象,下面的程序为你进行了示范:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Foo {
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author1 = root.addElement( "author" )
.addAttribute( "name", "James" )
.addAttribute( "location", "UK" )
.addText( "James Strachan" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Bob" )
.addAttribute( "location", "US" )
.addText( "Bob McWhirter" );
return document;
}
}
将一个文档对象写入文件中
将一个文档对象写入Writer对象的一个简单快速的途径是通过write()方法。
FileWriter out = new FileWriter( "foo.xml" );
document.write( out );
如果你想改变输出文件的排版格式,比如你想要一个漂亮的格式或者是一个紧凑的格式,或者你想用Writer 对象或者OutputStream 对象来操作,那么你可以使用XMLWriter 类。
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Foo {
public void write(Document document) throws IOException {
// 写入文件
XMLWriter writer = new XMLWriter(new FileWriter( "output.xml" ));
writer.write( document );
writer.close();
// 以一种优雅的格式写入System.out对象
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter( System.out, format );
writer.write( document );
// 以一种紧凑的格式写入System.out对象
format = OutputFormat.createCompactFormat();
writer = new XMLWriter( System.out, format );
writer.write( document );
}
}
转化为字符串,或者从字符串转化
如果你有一个文档(Document)对象或者任何一个节点(Node)对象的引用(reference),象属性(Attribute)或者元素(Element),你可以通过asXML()方法把它转化为一个默认的XML字符串:
Document document = ...;
String text = document.asXML();
如果你有一些XML内容的字符串表示,你可以通过DocumentHelper.parseText()方法将它重新转化为文档(Document)对象:
String text = " James ";
Document document = DocumentHelper.parseText(text);
通过XSLT样式化文档(Document)
使用Sun公司提供的JAXP API将XSLT 应用到文档(Document)上是很简单的。它允许你使用任何的XSLT引擎(例如:Xalan或SAXON等)来开发。下面是一个使用JAXP创建一个转化器(transformer),然后将它应用到文档(Document)上的例子:
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;
public class Foo {
public Document styleDocument(Document document, String stylesheet)throws Exception {
// 使用 JAXP 加载转化器
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource( stylesheet ));
// 现在来样式化一个文档(Document)
DocumentSource source = new DocumentSource( document );
DocumentResult result = new DocumentResult();
transformer.transform( source, result );
// 返回经过样式化的文档(Document)
Document transformedDoc = result.getDocument();
return transformedDoc;
}
}
需要加入的包:
dom4j
saxpath
jaxen
package com.freezingxu.testDom4J;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class TestDom4J {
/**
* 获得XML文档
* @param url
* @return
* @throws DocumentException
* @throws FileNotFoundException
*/
public Document parse(String url) throws DocumentException,FileNotFoundException{
SAXReader saxReader = new SAXReader();
File file = new File(url);
InputStream in = new FileInputStream(file);
Document doc = saxReader.read(in);
return doc;
}
/**
* 获得XML文件中的根节点
* @param doc
* @return
*/
public Element getRootElement(Document doc){
Element element = doc.getRootElement();
System.out.println( "Root=" +element.getName());
return element;
}
/**
* 获得指定根节点下的所有节点
* @param root
*/
public Collection print(Element root){
Collection coll = new ArrayList();
Iterator itor = root.elementIterator();
while(itor.hasNext()){
Element e = (Element)itor.next();
coll.add(e);
System.out.println( "Element=" + e.getName());
}
return coll;
}
/**
* 获得指定根节点下的指定节点
* @param root
* @param name
* @return
*/
public Collection getElement(Element root,String name){
Collection coll = new ArrayList();
Iterator itor = root.elementIterator(name);
while(itor.hasNext()){
Element e = (Element)itor.next();
coll.add(e);
System.out.println( "Element=" + e.getName());
}
return coll;
}
/**
* 获得指定节点的所有属性
* @param root
*/
public void printAttribute(Element root){
Iterator itor = root.attributeIterator();
while(itor.hasNext()){
Attribute attr = (Attribute)itor.next();
String attributeName = attr.getName();
String attributeValue = attr.getValue();
System.out.println( "Name=" + attributeName + " and Value=" + attributeValue);
}
}
/**
* 使用xPath直接获得节点
* @param doc
* @param xPath
* @return
*/
public List getNodes(Document doc,String xPath){
List list = doc.selectNodes(xPath);
return list;
}
/**
* 使用xPath获得指定节点的指定属性
* @param node
* @param xPath
* @return
*/
public String getNodeAttribute(Element node,String xPath){
String attributeValue = node.valueOf(xPath); //获得属性的值
String attributeText = node.getText(); //获得属性的文本
return attributeValue;
}
/**
* main
* @param args
* @throws FileNotFoundException
* @throws DocumentException
*/
public static void main(String []args) throws FileNotFoundException, DocumentException{
TestDom4J t = new TestDom4J();
Document doc = t.parse( "d:/query.xml" );
Element rootElement = t.getRootElement(doc);
t.print(rootElement);
t.printAttribute(rootElement);
Collection elmtColl = t.getElement(rootElement, "dwlx" );
Iterator elmtItor = elmtColl.iterator();
while(elmtItor.hasNext()){
Element e = (Element)elmtItor.next();
Collection coll = t.print(e);
Iterator itor = coll.iterator();
while(itor.hasNext()){
Element e2 = (Element)itor.next();
t.printAttribute(e2);
}
}
//xPath
List list = t.getNodes(doc, "//root/dwlx/value" );
Iterator xPathItor = list.iterator();
while(xPathItor.hasNext()){
Element node = (Element)xPathItor.next();
String s = t.getNodeAttribute(node, "@name" );
System.out.println(s);
}
}
}
//////////附件:query.xml//////////
2007年5月9日星期三
用GWT(GoogleWebToolkit)开发Ajax-GetTime
| 摘要: | 前边已经有了两篇文章, 用GWT(Google Web Toolkit)开发Ajax-HelloWorld,用GWT(Google Web Toolkit)开发Ajax-你好,前边两个例子,都是只用了客户端的代码,并没有客户端和服务器端的交互过程。本文将会介绍一个简单的客户-服务器交互过程。客户端一样会显示一个按钮,点击的时候会返回服务器时间。并一同介绍一下简单的调试过程。 |
| 关键字: | GWT Google Web Toolkit Ajax 入门应用 rpc调用 RemoteService RemoteServiceServlet |
介绍
GWT(GoogleWebToolkit)是一个由Google开发提供的Java Ajax开发框架,已经用于开发GoogleMaps,GMail等应用了,它帮助开发者从各个不同的浏览器的诡异中解脱出来。现在写一个动态的Ajax 应用是一个令人郁闷,有严重错误倾向的过程,可能要花上90%的时间来处理那些敏感的,易错的浏览器之间的兼容性和跨平台,并且javascript的难 以调试性更加增加了整个开发过程的难度,和应用的健壮性。GWT可以让你提供同样的即时的,有良好用户体验的应用的时候,避免很多这样令人头痛的事情。开发者可以用java语言来写界面,然后GWT提供的编译器会把他们编译成javascript和HTML。
假如说前面的两个例子,只是一个依样画葫芦的,从今天开始,就需要更多地去考虑一些Ajax的模式和GWT提供的便利的背后的原理。
GWT应用和传统的HTML页面应用的根本的区别就是,GWT在执行过程不需要获取新的页面来更新信息。尽管如此,向所有的客户端/服务端应用程序一样, GWT应用也要在执行过程,不断地才服务器取得数据,这种由一种叫RPC(远端过程调用)的机制来实现,也有时叫做服务端调用。GWT让这个RPC过程可 以直接引用一些Java对象来实现。(注:这里是只是一些,并不是所有的)。
恰当的利用好这个特性可以提供应用的效率,减少客户端服务器端的数据交换,更能提供友好的用户体验。
这些服务器端的代码,或是操作,被称为一个service,这个不同于SOAP(简单对象访问协议)中的Web Service。这是一个需要区别的概念。
本文将会介绍一个简单的客户-服务器交互过程。客户端一样会显示一个按钮,点击的时候会返回服务器时间。并一同介绍一下简单的调试过程。
实现过程
1、如用GWT(Google Web Toolkit)开发Ajax-HelloWorld创建应用。应用名为org.jmg.client.GetTime
2、创建Service
创建两个接口和一个实现:
interface:org.jmg.client.GetTimeService extends RemoteService
interface:org.jmg.client.GetTimeServiceAsync
class:org.jmg.server.GetTimeServiceImpl extends RemoteServiceServlet implements RemoteServcie
在接口GetService中添加 String getTime()方法。
GetTimeServiceAsync中添加 void getTime(AsyncCallback callback)方法。
在类GetTimeServiceImpl中实现获取时间的方法:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
注意:
a.GetTimeService 必须扩展RemoteService这个标志接口
b.GetTimeServiceAsync 的命名规则,只能在GetTimeService 后边添加 Async
c.GetTimeServiceAsync 的 getTime 这个方法不能有返回值,实际上,这个接口的所有的方法都不能有返回值,只能void。这里的原因会在以后的慢慢解释。
d.GetTimeServiceImpl 必须继承 RemoteServiceServlet
e.GetTimeServiceAsync 不需要实现,GWT会在编译的时候帮你实现。 f.以上的三个类的包都不能修改
3、修改部署文件:
修改WEB-INFweb.xml:
添加
<servlet>
<servlet-name>GetTimeServcie</servlet-name>
<servlet-class>org.jmg.server.GetTimeServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetTimeServcie</servlet-name>
<url-pattern>/timeService</url-pattern>
</servlet-mapping>
GetTimeServiceImpl继承了RemoteServiceServlet(这个类扩展java的HttpServlet),它将需要部署成一个servlet。
4、修改GetTime
和前面的两个例子一样,默认创建的应用的GetTime中按钮的动作就是在页面上显示"hello world"。现在我们需要改变这个按钮的点击时候行为,要把从服务器获取时间显示出来。
a.找到我们定义的timeServcie的Servlet。 在GetTime中添加一个方法:initiailizeServiceEntryPoint
private final GetTimeServiceAsync initiailizeServiceEntryPoint() {
GetTimeServiceAsync timeService = (GetTimeServiceAsync) GWT.create(GetTimeService.class);(注意,这里create参数是GetTimeService.class,但是返回的实例是一个GetTimeServiceAsync)
ServiceDefTarget target = (ServiceDefTarget) timeService;(这里又把timeService,强换型成ServiceDefTarget)
String staticResponseURL = GWT.getModuleBaseURL();(取得应用的基路径,这个可能会导致之不到servlet,只要把它改成应用的路径,例如/gwt/)
staticResponseURL += "/timeService";
target.setServiceEntryPoint(staticResponseURL);(把刚刚定义的servlet的path和应用基路径两者组合,得到最后的servlet路径)
return timeService;
}
一直都保持这么一个概念,所有client中的代码都GWT都会编译成合适js,HTML,都会在客户端执行。会对整个过程的理解有很好的帮助。
b.修改onModuleLoad:
public void onModuleLoad() {
final Button button = new Button("Click me");
final Label label = new Label();
final GetTimeServiceAsync gtsa = initiailizeServiceEntryPoint();
button.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
gtsa.getTime(new AsyncCallback() {
public void onFailure(Throwable caught) {
label.setText(caught.getLocalizedMessage());(调用失败的时候,把错误信息显示出来)
}
public void onSuccess(Object result) {
label.setText((String) result);(这里为什么可以强换型到String?这里的值就是GetTimeService.getTime()方法的返回值)
);
}
});
5、编译与部署:
a.老习惯,用GetTime-compile.cmd用编译客户端代码(注意,这里只是编译客户端代码),会在wwworg.jmg.GetTime 目录生成客户端所合适的html和js,复制wwworg.jmg.GetTime下所有的文件到tomcat应用的webappsgwt gettime目录下。
b.复制elipse编译输出目录下的类到tomcat应用webappsgwtWEB-INFclasses目录。
c.检查web.xml文件是否已经复制,或是已经修改。
部署完成。
6、运行测试:
启动tomcat
访问http://localhost:8080/gwt/gettime/GetTime.html
点击click me 按钮,显示服务器时间
| 参考: | Google Web Toolkit |
| | Remote Procedure Calls |
| 更多文章: | 用GWT(GoogleWebToolkit)开发Ajax-HelloWorld |
| | 用GWT(GoogleWebToolkit)开发Ajax-你好,世界 |
2007年4月30日星期一
史上最牛的演讲
请你设想这样的情况:从现在起5年之后,10年之后,或30年之后,今天站在你左边的这个人会是一个失败者;右边的这个人,同样,也是个失败者。而你,站在中间的家伙,你以为会怎样?一样是失败者。失败的经历。失败的优等生。
说实话,今天我站在这里,并没有看到一千个毕业生的灿烂未来。我没有看到一千个行业的一千名卓越领导者,我只看到了一千个失败者。你们感到沮丧,这是可以理解的。为什么,我,埃里森,一个退学生,竟然在美国最具声望的学府里这样厚颜地散布异端?
我来告诉你原因。因为,我,埃里森,这个行星上第二富有的人,是个退学生,而你不是。因为比尔盖茨,这个行星上最富有的人---就目前而言---是个退学 生,而你不是。因为艾伦,这个行星上第三富有的人,也退了学,而你没有。再来一点证据吧,因为戴尔,这个行星上第九富有的人---他的排位还在不断上升, 也是个退学生。而你,不是。
你们非常沮丧,这是可以理解的。
你们将来需要这些有用的工作习惯。你 将来需要这种"治疗"`。你需要它们,因为你没辍学,所以你永远不会成为世界上最富有的人。哦,当然,你可以,也许,以你的方式进步到第10位,第11 位,就像Steve。不过,我没有告诉你他在为谁工作,是吧?根据记载,他是研究生时辍的学,开化得稍晚了些。
现在,我猜想你们中间很多人,也许是绝大多数人,正在琢磨,"能做什么?我究竟有没有前途?"当然没有。太晚了,你们已经吸收了太多东西,以为自己懂得太多。你们再也不是19岁了。你们有了``内置``的帽子,哦,我指的可不是你们脑袋上的学位帽。
嗯......你们已经非常沮丧啦。这是可以理解的。所以,现在可能是讨论实质的时候啦---绝不是为了你们,2000年毕业生。你们已经被报销,不予考 虑了。我想,你们就偷偷摸摸去干那年薪20万的可怜工作吧,在那里,工资单是由你两年前辍学的同班同学签字开出来的。事实上,我是寄希望于眼下还没有毕业 的同学。我要对他们说,离开这里。收拾好你的东西,带着你的点子,别再回来。退学吧,开始行动。
我要告诉你,一顶帽子一套学位服必然要让你沦落......就像这些保安马上要把我从这个讲台上撵走一样必然......(此时,拉里埃里森被带离了讲台)
注:拉里埃里森为甲骨文软件公司创始人,目前身价260亿美元。
---------------------------------------
"Graduates of Yale University, I apologize if you have endured this type of prologue before, but I want you to do something for me. Please, take a good look around you. Look at the classmate on your left. Look at the classmate on your right.
Now, consider this: five years from now, 10 years from now, even thirty years from now, odds are the person on your left is going to be a loser. The person on your right, meanwhile, will also be a loser. And you, in the middle? What can you expect? Loser. Loserhood. Loser Cum Laude. In fact, as I look out before me today, I don't see a thousand hopes for a bright tomorrow. I don't see a thousand future leaders in a thousand industries. I see a thousand losers. You're upset. That's understandable. After all, how can I,Lawrence "Larry" Ellison, college dropout, have the audacity to spout such heresy to the graduating class of one of the nation's most prestigious institutions?
I'll tell you why. Because I, Lawrence "Larry" Ellison, second richest man on the planet, am college dropout, and you are not. Because Bill Gates, richest man on the planet-for now anyway-is a college dropout, and you are not. Because Paul Allen, the third richest man on the planet, dropped out of college, and you did not. And for good measure, because Michael Dell, No.9 on the list and moving up fast, is a college dropout, and you, yet again, are not.
Hmm ... you're very upset. That's understandable. So let me stroke your Egos for a moment by pointing out, quite sincerely, that your diplomas were not attained in vain. Most of you, I imagine, have spent four to five years here, and in many ways what you've learned and endured will serve you well in the years ahead. You've established good work habits. You've established a network of people that will help you down the road. And you've established what will be lifelong relationships with the word "therapy." All that of is good.
For in truth, you will need that network. You will need those strong work habits. You will need that therapy. You will need them because you didn't drop out, and so you will never be among the richest people in the world. Oh sure, you may, perhaps, work your way up to #10 or #11, like Steve Ballmer. But then, I don't have to tell you who he really works for, do I? And for the record, he dropped out of grad school. Bit of a late bloomer.
Finally, I realize that many of you, and hopefully by now most of you, Are wondering, "Is there anything I can do? Is there any hope for me at all? Actually, no. It's too late. You've absorbed too much, think you know too much. You're not 9 anymore. You have a built-in cap,and I'm not referring to the mortarboards on your heads.
Hmm ... you're really very upset. That's understandable. So perhaps this Could be a good time to bring up the silver lining. Not for you, Class of '00. You are a write-off, so I'll let you slink off to your pathetic $200,000-a-year jobs, where your cheques will be signed by former classmates who dropped out two years ago. Instead, I want to give hope to any underclassmen here today. I say to you, and I can't stress this enough: leave. Pack your things and your ideas and don't come back. Drop out. Start up. For I can tell you that a cap and gown will keep you down just as surely as these security guards dragging me off this stage are keeping me down..."
(At this point The Oracle CEO was ushered off stage.)
2007年4月17日星期二
java format
int iTax ;
double dCash = 0.88;
//BigDecimal的构造函数参数类型是double
BigDecimal deTax = new BigDecimal(dCash);
//deTax.setScale(0,BigDecimal.ROUND_HALF_UP ) 返回值类型 BigDecimal
//intValue() 方法将BigDecimal转化为int
iTax = deTax.setScale(0,BigDecimal.ROUND_HALF_UP).intValue();
Description 格式化显示日期型数据
@param Date dt_in 日期型数据
boolean bShowTimePart_in 是否显
示时间部分
@return String
*/
public String DoFormatDate(java.util.Date dt_in, boolean bShowTimePart_in) {
if (bShowTimePart_in)
return (new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")).format(dt_in);
else
return (new SimpleDateFormat("yyyy-MM-dd")).format(dt_in);
}
应聘的难题
考官:你有女朋友吗?
应聘者:没有。
考官:你追过女孩吗?
应聘者:追过,可是没追上。
考官:你工作后准备再追女孩子吗?
应聘者:先努力工作,暂时不考虑个人问题。
考官:对不起,本公司不能用你。
应聘者:为什么?
考官:你公关能力欠佳,况且缺乏自信。
故事二
考官:你有女朋友吗?
应聘者:有。
考官:她漂亮吗?
应聘者:不算漂亮。
考官:对不起,我们不能录用你。
应聘者:难道女朋友不漂亮也会影响贵公司的形象?
考官:不会。不过本公司经营艺术品,你审美情趣似乎不适合本公司业务需求。
故事三
考官:你有女朋友吗?
应聘者:有
考官:她漂亮吗?
应聘者:很漂亮
考官:她是你初恋吗?
应聘者:是的。
考官:对不起,我们不能用你。因为你缺乏不断追求的进取心。
故事四
考官:你有女朋友吗?
应聘者:有。
考官:她是你的初恋吗?
应聘者:不是,以前还谈过几个。
考官:对不起,我们不能用你。你很快就可能跳槽。
故事五
考官:你有男朋友吗?
应聘者:有
考官:他在本地吗?
应聘者:不是,他在外地。
考官:对不起,我公司不能录你。
应聘者:为什么?
考官:你不会安心在这里长期工作。
另外,本公司也不希望因为你而使长途电话费大幅度增加。
故事六
考官:你有男朋友吗?
应聘者:有
考官:他很有钱吗?
应聘者:不是。
考官:对不起我们不能用你。因为你的工作要和钱打交道,我担心你经不起诱惑
故事七
考官:你有男朋友吗?
应聘者:有
考官:他很有钱吗?
应聘者:是的,他有自己的公司
考官:对不起,你男朋友的公司都不用你,我们更不能用你了
我是一条内存
其实我不愿意跟他计较,因为他脑子小,思维也很简单。虽然说他是我的上司,可是每次睡觉醒来,他连要干什么都不记得了,总是急急忙忙地找bios兄弟, "嘿,哥们,今天干什么来着"。bios总是很不耐烦地把每天必做的工作说一遍,然后就去睡觉了。接下来就轮到我和c哥瞎忙了。
在机箱里的兄弟 中,我最喜欢硬盘。他脑子大,记得东西多,而且记得牢。他说话的速度很慢,而且很少说错,这说明他很有深度,我这么感觉。cpu也这么想,不过他很笨,每 次都忘了硬盘是谁。开机自检的时候总要问:嘿,那家伙是谁?"st380021a!"我总要重复一遍。硬盘很喜欢忧郁,我觉得像他这样忧郁的人不适合做技 术活,迟早会精神分裂的,但是他不信。其实睡着的时候我总是把几乎所有的东西都忘记掉,但是我从来都不会忘记朋友。有一块地方叫做cmos,那是我记忆的 最深处,保存着硬盘、光驱的名字。有些东西应该很快 忘掉,而有些东西应该永远记得。我再梦中总是这么想着。
bios是一个很奇怪的家伙,他老 是睡觉,但是却总是第一个醒过来。让我们自检,启动,然后接着睡觉。我知道如果我在cmos里头把bios shadow选项去掉,他就睡不成了,但是看 着他晕晕乎乎的样子,也就不忍心这么做了。他对人总是爱搭不理,没有什么人了解他。但是这次硬盘恋爱的事,却使我重新认识了他。
那是很久以前的事了,机箱里似乎来过一块笔记本硬盘,很可爱,说实话我也喜欢她。不过现在除了记得他可爱,别的都忘记了。这就是我比硬盘幸运的地方,我把所有应该忘记的都忘记了,但是他却什么都记得。
自 从笔记本硬盘走了之后,硬盘就变得很不正常。每次他的磁头经过一些地方的时候, 我们都能感觉到电流很不正常。 "硬盘这是怎么了?"我问cpu。 "谁是硬盘?"我就知道和cpu没有办法交流,倒是bios没好气地说:"那个傻瓜恋爱了"。我不知道什么是恋爱,因为我记不住东西,似乎有一些人或者事 在我生命中留下过痕迹,但是我都轻率地把他们忘记了。
bios对我说:"对你来说记忆太容易了,所以你遗忘得更快,生命中能够永刻的记忆都带着 痛楚。"我不懂,但是我知道bios曾经被刷写过,那时他很痛,像要死了一样。我的记忆是轻浮的,不像他们……我很羡慕他们,因为他们拥有回忆,而我们 有,从此我也学会了忧郁,因为我在cmos里面写下了"忧郁"两个字。
硬盘一天比一天不对劲,终于有一天,cpu对我说:下条指令是什么 来着?我一看,吓了一跳:"format"是什么?"cpu很兴奋,这个没脑子的家伙。我还是告诉了他。我不知为什么这么做。硬盘犹豫了很久,终于说了一 句 track 0 bad, disk unusable。 电停了,很久很久,我在黑暗中数着时钟。 一个月后硬盘回来了,也许最后的挣扎也没有使他 摆脱残酷的命运,他被低格了。他什么也不记得了,如同一个婴儿,我们很难过,但是这未必不是一件好事,他以后不用痛苦了。
为了恢复数据,笔记本 硬盘回来了。"hi,st",她说,"你不认识我了?"硬盘没有说话,似乎低格对他的伤害很大。 过了一会,他说:"对不起,好像我们没有见过吧……"。 笔记本硬盘显得很伤心,我能感觉到她带泪的电流。"想不到连你也这么健忘"。 "哦……"。硬盘没有回答。