一、读大学,究竟读什么?
大学生和非大学生最主要的区别绝对不在于是否掌握了一门专业技能……一个经过独立思考而坚持错误观点的人比一个不假思索而接受正确观点的人更值得肯定……草木可以在校园年复一年地生长,而我们却注定要很快被另外一群人替代……尽管每次网到鱼的不过是一个网眼,但要想捕到鱼,就必须要编织一张网……
二、人生规划:三岔路口的抉择
不走弯路就是捷径……仕途,商界,学术。在这人生的三岔路口,你将何去何从……与其跟一百个人去竞争五个职位,不如跟一个人去竞争一个职位……学术精神天然的应当与尘嚣和喧哗保持足够的距离……商场不忌讳任何神话。你也完全可能成为下一个传奇……
三、专业无冷热,学校无高低
没有哪个用人单位会认为你代表了你的学校或者你的专业……既然是概率,就存在不止一种可能性……如果是选择学术,冷门专业比热门专业更容易获得成就……跨专业几乎早已成为一种流行一种时尚……大学之间的实力之争到了考研考场和人才市场原来是那样的微不足道……
四、不可一业不专,不可只专一业
千招会,不如一招熟……十个百分之十并不是百分之百,而是零……在这个现实的社会,真正实现个人价值才是最体面最有面子最有尊严的事情……要想知道需要学什么,最好的方式就是留意招聘信息……很多专业因为不具备专长的有效性,所以成为了屠龙之术……为什么不将“买一送一”的促销思维运用到求职应聘的过程中来呢……
五、不逃课的学生不是好学生
什么课都不逃,跟什么课都逃掉没什么两样……读大学,关键是学会思考问题的方法……逃课没有错,但是不要逃错课……英语角绝对不是学英语的地方……为了英语丢了专业,那就舍本逐末了……招聘单位是用人才的地方,而不是培养人才的地方……既要逃课,又要让老师给高分……
六、勤工俭学的辩证法
对于贫困生来说,首先要做的不是挣钱,而是省钱……大部分女生将电脑当成了影碟机,大部分男生将电脑当成了游戏机……在这个处女膜都可以随意伪造的年代,还有什么值得轻易相信……态度决定一切……当学习下降到次要的地位,大学生就只能说是兼职的学生了……
七、做事不如做人,人脉决定成败
学问好不如做事好,做事好不如做人好……会说话,就能减少奋斗三十年……一个人有多少钱并不是指他拥有多少钱的所有权,而是指他拥有多少钱的使用权……一个人赚的钱,12.5%是靠自身的知识,87.5%则来自人脉关系……三十岁以前靠专业赚钱,三十岁以后拿人脉赚钱……你和世界上的任何一个人之间只隔着四个人……
八、互联网:倚天剑与达摩克利斯之剑
花两个小时就写出一篇天衣无缝的优秀毕业论文……在互联网领域创业的技术门槛并不高,关键的是市场眼光和营销能力……轻舞飞扬已经红颜薄命了,而痞子蔡却继续跟别的女孩发生着一次又一次的亲密接触……很多大学生的网友遍布祖国大江南北,可他们却从未主动向周围的人说一声:你好,我们可以聊聊吗…
九、恋爱:花开堪折方须折
爱情是不期而至的,可以期待,但不可以制造……越是寂寞,越要警惕爱情……既然单身是可耻的,那西门庆是不是应该被评为宋朝十大杰出青年……花开堪折方须折,莫让鲜花败残枝……一个有一万块钱的人为你花掉一百元,你只占了他的百分之一;而一个只有十块钱的人为你花掉十块,你就成了他的全部……
十、性:上帝死了,众神在堕落
爱要说,爱要做……我只有在肉体一下一下的撞击中才感到快乐。经过之后,将是更大的寂寞更大的空虚……为何要让别人的虚荣成为对自己的伤害……当她机械地躺在床上张开双腿,她的父母正在憧憬着女儿的未来……一朝春尽红颜老,花落人亡两不知……
十一、考研:痛苦的安乐死
没有比浪费青春更失败的事情了……研究生扩招的速度是30%,也就意味着硕士学历贬值的速度是30%……同样是付出三年的努力,你可以让E1的值增加1,也可以让E2的值增加2甚至增加3……读完硕士或博士并不等于工作能力更强……面对13.54万的成本,你还会毫不犹豫地投资读研究生吗……努力就会有结果,但不一定是好结果……
十二、留学:“海龟”变“海带”
月薪2500元的工作,居然引得三个“海归”硕士争相竞聘……对于某些专业而言,去美国留学和去埃塞俄比亚留学没什么两样……既然全世界的公司都想到中国的市场上来瓜分蛋糕,为什么中国人还要一门心思到国外去留学然后给外国人打工……
十三、非统招:养卑照样处优
她在中国信息产业界创下了几项纪录。她被称为中国的“打工皇后”。而她不过是一名自考大专生……要想把曾经输掉的东西赢回来,就必须把自己比别人少付出的努力补上来……非统招生不但要有一定的实力,而且必须掌握一定的技巧,做到扬长避短出奇制胜……路在脚下。好走,走好……
十四、毕业:十面埋伏的陷阱
母校不把自己当母亲,你又何必把自己当儿女……听辅导班不过是花钱买踏实……人才市场就是一个地雷阵……通过多种方式求职固然没有错,但是千万不要饥不择食……只要用人单位一说要你交钱,你掉头就走便是了……这年头立字尚且不足以为据,更何况一个口头约定……
十五、求职:做人不要太厚道
求职简历必须突出自己的核心竞争力……求职的时候大可不必像严守一那样“有一说一”……一个人说假话并不难,难的是把假话说到底,并且不露一丝破绽……在填写自己的特长时,一定要尽可能详细……一份求职简历只要用一张A4纸做个表格就足够了……面试其实是有规律的,每次面试的时候只要背标准答案就行了……
十六、骑一头能找千里马的驴
美国铁路两条铁轨之间的标准距离是4英尺8.5英寸,为什么呢?因为两匹马臀部之间的宽度是4英尺8.5英寸……垃圾是放错位置的人才……世界上最大的悲剧莫过于有太多的年轻人从来没有发现自己真正想做什么……中小型企业或许能够让你得到更充分的锻炼……从基层做起并不意味着可以从基层的每一个职位做起……要“钱途”,更要前途……
十七、写字楼政治:白领必修课
大公司是做人,小公司是做事……职员能否得到提升,很大程度不在于是否努力,而在于老板对你的赏识程度……公司的事情和秘密永远比你想象的还要复杂和深奥……在适当的时候装糊涂不但是必要的,而且是睿智的……就把你的同事当成一群你可以叫得出名字的陌生人好了……
十八、创业 -做富翁
瘦死的骆驼比马大……撑死胆大的,饿死胆小的……不再是“大鱼吃小鱼”,而是“快鱼吃慢鱼”……对于趋势的把握是一个创业者最重要的能力……高科技行业留给毕业生的空间已经很小……欲速则不达。在创业以前通过给别人打工而积累经验是非常必要的……市场永远比产品更重要……钱不够花,怎么办?第一,看菜吃饭;第二,借鸡生蛋……
posted @
2006-11-04 11:30 xzc 阅读(316) |
评论 (0) |
编辑 收藏
赚钱第一定律:你要做羊,还是做狼?
永远是10%的人赚钱,90%的人赔钱,这是市场的铁律,不论是股市,还是开公司、办企业,都不会改变。
如果人人都赚钱,那么谁赔钱,钱从何处来?
天下人不可能都是富人,也不可能都是穷人!
但富人永远是少数,穷人永远是多数!
这是上帝定的,谁也没办法。
但赚钱总是有办法,就是你去做10%的人,不要去做大多数人。
做少数富人,你需要换思想,转变观念,拥有富人的思维,就是和大多数人不一样的思维。
有人说得好:“换个方向,你就是第一。”因为大多数人都是一个方向,千军万马都一样的思维,一样的行为,是群盲,就象羊群一样。
你要做羊,还是做狼?
数英雄,论成败,天下财富在谁手?10%的人拥有90%的财富,90%的人拥有10%的财富。你要想富,你就得研究富的办法,研究富翁的思想和行为,象富人那样做,立下雄心壮志,做出不凡的业绩,很快你就是富翁!
“富人思来年,穷人思眼前”,这就是赚钱第一定律!
赚钱第二定律:金钱遍地都是,赚钱很容易!
问苍茫大地,谁主财富!为什么他能赚钱,你不能赚钱。追根求源,想赚钱——首先你要对钱有兴趣,对钱有一个正确的认识,不然钱不会找你。钱不是罪恶,她是价值的化身,是业绩的体现,是智慧的回报。
物以类聚,钱以人分。你必须对钱有浓厚的兴趣,感觉赚钱很有意思,很好玩,你喜欢钱,钱才能喜欢你。这决不是拜金主义,而是金钱运行的内在规律,不信你看那些富翁都喜欢钱,都能把钱玩得非常了得,看看比尔盖茨,看看沃伦巴菲特,看看乔治索罗斯。
金钱遍地都是,赚钱很容易。你必须确立这样的观念。如果你觉得赚钱很难,那么赚钱真的很难。那些大富翁没有一个认为赚钱难的,反倒认为花钱太难。你要牢记,赚钱真的很容易,随便动动脑筋就能来钱。这可不是教你吹牛,这是赚大钱,当富翁的思想基础,你不得不信!
股市赚钱难吗?不难,其实股市赚钱就6个字:“低点买,高难卖”。你只要用好这6个字,保你日进斗金,富得流油。华尔街经营之神巴菲特,就是善用这6字真言的世界级大师。说句实话,用活6字真言,你可以不用看K线图,不用盯着大盘,边玩边赚钱,这叫休闲贸易!
眼见他高楼起,气得你心口疼。你仇富吗,千万别。仇富说明你还不富,说明你还有穷人思维,赚钱第一定律怎么讲的,赶快重温。
如今经济全球化车轮势不可挡,市场经济大潮波澜壮阔,中国将飞速发展,风景这边独好,我们是遇到了“千年未遇之变局”,真是生逢良时,你不赚钱,干啥?赚钱玩呗!
正确认识钱,树立正确的金钱观念,这是赚钱的第二定律!
赚钱第三定律:最简单的方法最赚钱!
天下赚钱方法千千万,但最简单的方法最赚钱。
虽说条条大路通罗马,但万法归一,简单的才是最好的。
复杂的方法只能赚小钱,简单的方法才能赚大钱,而且方法越简单越赚大钱。
比如,比尔盖茨只做软件,就做到了世界首富;沃伦巴菲特专做股票,很快做到了亿万富翁;
乔治索罗斯一心搞对冲基金,结果做到金融大鳄;英国女作家罗琳,40多岁才开始写作,而且专写哈里波特,竟然写成了亿万富婆。
具体讲,每个行业都有赚大钱的方法:在商品零售业,沃尔玛始终坚持“天天平价”的理念,想方设法靠最低价取胜,结果做成了世界最大;在股市,沃伦巴菲特一直坚持“如果一只股票我不想持有10年,那我根本就不碰它一下”的原则炒股;在日本战败后,美国品质大师戴明博士应邀到日本给松下、索尼、本田等许多家企业讲课,他只讲了最简单的方法——“每天进步1%”,结果日本这些企业家真照着做了,并取得了神效,可以说日本战后经济的崛起有戴明博士的功劳。你说明他们的方法简单不简单?
炒股赚钱也有简单的方法。现在大多数人炒股都是“不要把所有的鸡蛋放在一个篮子里”,实行“多样化”,但沃伦巴菲特告诉你“不要多样化,要把所有的鸡蛋放在一个篮子里,然后密切关注它。”炒股其实真的就这么简单。
我的炒股原则是“一年操作一两次,低点买、高点卖”,集中资金买3支以内的股票,有时每年只买一支股票天津磁卡(600800),结果每年都赚得钵满盆盈。我从不看K线图,也不盯大盘,只是偶尔看一眼行情,简单判断一下,就万事大吉了。
世界没有免费的午餐,也没有天上掉下来的馅饼。你要研究赚钱,总结自己的简单赚钱方法,然后坚持它,不要轻易改变。现在大多数人没有主心骨,炒股太善变了,今天炒长线,明天炒短线,今天听个消息就买,明天听个消息就卖,结果六心不定,输得干干净净。这个教训要切记!
简单的方法赚大钱,复杂的方法赚小钱,这是赚钱的第三定律。
赚钱第四定律:赚大钱一定要有目标!
年年岁岁花相似,赚钱方法各不同。
但有一点是相同的,就是你要赚钱一定要有目标。
成功的道路是由目标铺成的。没有目标的人是在为有目标的人完成目标的。
有大目标的人赚大钱,有小目标的人赚小钱,没有目标的人永远为衣食发愁。你是哪类人?
没有目标,欲说还休,欲说还休,却道赚钱真忧愁!
要赚钱,你必须有赚钱的野心。野心是什么?野心就是目标,就是理想,就是梦想,就是企图,就是行动的动力!
试看天下财富英雄,都是野心家,比如洛克菲勒、比尔盖茨、孙正义等等。没有财富野心,就没有财富。
有野心不是坏事,有野心才有动力、有办法、有行动。
赚钱的野心要越大越好,这不是教你干坏事,干坏事的野心要越小越好。
从现在开始,你要立即“做梦”,当一个野心家,设定赚钱的大目标:终生目标,10年目标,5年目标,3年目标,以及年度目标。然后制定具体计划,开始果敢的行动。
万事开头难,有目标就不难,创富是从制定目标开始的。天下没有不赚钱的行业,没有不赚钱的方法,只有不赚钱的人。
“人穷烧香,志短算命。”要赚钱,你一定要有目标,一定要有野心,这是赚钱的第四定律。
赚钱第五定律:一定要用脑子赚钱!
天下熙熙皆为名来,天下攘攘皆为利往。在财富时代,你一定要用脑子赚钱。
你见过谁用四肢赚大钱的?一些运动员赚钱不菲,但迈克尔乔丹说:“我不是用四肢打球,而是用脑子打球。”用四肢不用脑子只能是别人的工具,是别人大脑的奴隶,是赚不了大钱的!
用四肢只能赚小钱,用脑子才能赚大钱。
人的想像力太伟大了,爱因斯坦说过:“想象力比知识更重要”,美国通用电器公司前总裁杰克韦尔奇说过:“有想法就是英雄”。人类如果没有想像力就如同猿猴和黑猩猩。
赚钱始于想法,富翁的钱都是“想”出来的!
想当初,比尔盖茨怎么就会做软件,怎么就会搞视窗,因为他想到了,正如他自己说的“我眼光好”。亚洲首富孙正义在美国读书时没钱就发明翻译机,一下卖了一百万美元,后来开办软件银行,他的头脑和眼光也了不得。好孩子集团老板宋郑还是靠卖发明专利起家的,第一项发明卖了4万元,第二项发明别人出价8万元要买,但他不卖,自己投入生产,结果成了世界童车大王。
现在有的人确实靠嘴巴赚了钱,但他说话之前首先必须想好说什么。也有些人企图靠耳朵赚钱,自己不动脑,到处打听消息,特别在股市里,今天听个内幕消息就买,明天听个小道消息就卖,跟风头,随大流,最后被套赔钱,现在大多数股民都这样,不知道自己的脑子是干什么的!
世界上所有富翁都是最会用脑子赚钱的,你就是把他变成穷光蛋,他很快又是富翁,因为他会用脑。洛克菲勒曾放言:“如果把我所有财产都抢走,并将我扔到沙漠上,只要有一支驼队经过,我很快就会富起来。”让我们再来看看脑白金和黄金搭档,史玉柱的东山再起启示我们,只要把脑子用活,失败了还会成功,再赚钱是不成问题的。
我郑重地告诉大家:你要赚钱你就想吧,想好了就行动,保准你有好收成。
莎仕比亚在《哈姆雷特》中讲过:“你就是把我关在胡桃盒子里,我也是无限想像空间的君主。”展开你想像的翅膀吧,赚钱的第五定律是,你一定要用脑子赚钱!
赚钱第六定律:要赚大钱一定要敢于行动!
天下财富遍地流,看你敢求不敢求。金钱多么诱人啊,但要赚大钱一定要敢于行动!
世界没有免费的午餐,也没有天上掉下来的馅饼。
不行动你不可能赚钱,不敢行动你赚不了大钱。敢想还要敢干,不敢冒险只能小打小闹,赚个小钱。
我行我富!试看天下财富英雄都是有胆有识有行动力的,想当年比尔盖茨放弃哈佛大学学业,白手起家创办微软,是何等的胆识和行动力。美国最年轻的亿万富翁迈克戴尔,在大学读书时就组装电脑卖,感到不过瘾便开办电脑公司,是何等另人钦佩。
甲骨文公司老板埃里森不仅放哈佛学业,赚取260亿美金,还回哈佛演讲,鼓动学生退学,被警察拖下讲坛。还有网易丁磊、健力宝张海、实德徐明等等,他们之所以有今天的业绩,就在于他们当初敢于冒险,敢于行动。
你敢富吗?绝大多数人不敢!其实大多数人都没想富,别说敢富。
现在人们谈论财富越来越多,但许多人说得多,做得少。
要知道:“说是做的仆人,做是说的主人”。我们许多经济学家谈财富头头是道,但他们谁富了?中国的股评家评起股来夸夸其谈,但他们谁炒股赚大钱了?如果他们能赚大钱,就不会当股评家了!所以你要炒股,千万不要相信股评家!
德国行动主义哲学家费希特说过:“行动,行动,这是我们最终目的。”要想富,快行动,不要怕,先迈出一小步,然后再迈出一大步。记住:“利润和风险是成正比的”。
赚钱第七定律:想赚大钱一定要学习赚钱!
天下聪明人很多,但为什么绝大多数聪明人都不富?在财智时代,要赚大钱一定要学习赚钱!
你学过赚钱吗?绝大多数人没有,所以绝大多数人还不会赚钱。我们在小学没学过赚钱,在中学没学过赚钱,在大学还是没学过赚钱,就连金融、财经类的大学也学不到真正赚钱的知识,看来我们的教育确实有了大问题!
聪明的穷人们啊,你们的智商很高,但你们的财商太低,你们穷得太可怜了!不过高尔基说过:“自学是没有围墙的大学”,你们可以自学赚钱知识。
人非生而知之,谁天生就会赚钱?财商和智商不同,智商有天生的成份,而财商100%需要后天学习提高。孙正义、李嘉诚、史玉柱等所有大富翁,都不是一生下来就会赚钱,但他们都有两个共同特点:一是有强烈的赚钱企图心,二是有很强的学习力,正是由于他们善于学习赚钱,所以他们超越常人,登上财富巅峰。
聪明不等于智慧,聪明赚不到钱,智慧能赚大钱。真正白手起家的富豪,学历不一定高,但一定很有智慧,他们是最善于学习赚钱的一族,他们都有学习赚钱的不凡历程,他们通过学习摸到了赚钱的规律,掌握了赚钱门道,执掌了赚钱的牛耳,成为财富英雄!
英雄起于草莽,英雄不问出处。真正的赚钱者,都是阅读者。你想当富翁吗?你想跨入财富英雄行列吗?那你就赶快学习赚钱:读赚钱书报、听赚钱讲座、向财富精英学习、向身边高人请教等等。比如,炒股你要学习沃伦巴菲特,尤其学他简单的投资理念。创业你要学习孙正义,他在两年之内读了4000本书(不知道是怎么读的)。还有李嘉诚,他为了创业专门到别的公司打工偷艺。向成功者学,像成功者那样干,增长你的智慧,提高你的财商,总结赚钱的秘笈,很快你就会富。
赚钱的第七定律是,要赚大钱一定要学习赚钱!
赚钱的第八定律:赚大钱一定要选择!
风水轮流转,今天到你家。如今金钱遍地都是,赚钱方法多如牛毛,但要赚大钱一定要选择。
选择就是命运,选择就是财富。不选择你就会迷失,财富就会与你擦肩而过。
你是命运的主宰,你是财富的上帝。在二十多年前,美国一个17岁少年,一头乱发,一身脏衣,戴着一付高度近视眼镜,但他竟选择了编写软件,创办软件公司,正是由于这一选择,才有今天的微软和今天的比尔盖茨!
亚洲首富孙正义19岁开始创业,一年之内制定了40个创业计划,但他只选择其中一个最好的计划——开办软件银行,由此登上了财富的天梯!
在市场多样化加速、越来越细分的时代,只有选择才能成功。沃尔玛只选择做商品零售,可口可乐只卖饮料,肯德基、麦当劳只卖汉堡,日本的松下、索尼、三洋只做电器。
选择的目的就是专一和专注。我国许多知名大企业现在开始走多元化的路子,包括海尔在内,其实多元化之路危机四伏,很有可能要失败,四通、飞龙、轻骑的失败就是例证。史玉柱做保健品很成功,刚一多元化就失败,现在他吸取教训,做保健品重新获得成功。
你要创业,你选择什么?根据多年对世界财富精英的分析,富豪们大多涉猎股票和地产。事实上美国和欧洲60%以上的人投资股票。
炒股也需要选择,例如选择什么投资理念和原则,选择长线还是短线,选择什么股票,是组合投资还是专一投资。
现在许多人热衷炒短线,在股市频繁进出,频繁换股,一年到头忙忙碌碌,很象操盘高手,结果不仅赚不到钱,还深套其中,既辛苦又心酸。
炒股一定要专一,就象对老婆一样。中外股市大赢家很少是短线高手,大多是长线老牛,沃伦巴菲特是其中最著名的。他告诉我们:“如果一只股票我不想持有10年,我就根本不碰它一下”;“不要多样化,要把所有鸡蛋放到一个篮子里,然后密切关注它。”我国一些庄家多年来专做几只股票,有的甚至2、3年内只炒一只股票,结果赢利甚丰。
你要炒股千万别花心,精心选择好股去爱她,她会为你下金蛋!
赚钱的第八定律是,赚大钱一定要选择!
posted @
2006-11-04 11:29 xzc 阅读(420) |
评论 (0) |
编辑 收藏
有狗死于沙漠。好事者经过分析发现,狗的死因与找不到可供便溺的树或者墙有关。人类似乎有些时候做出这种被一泡尿憋死的事情来,所以关于情商管理方面的研究大行其道颇具规模。甚至有人认为,IQ高的人经过努力成了医生、科学家和技术专家,而EQ高的人经过努力成了医生、科学家和技术专家们的管理者。电影里那个大智若愚的家伙一脸严肃地喊:IP、IC、IQ统统给我密码,我想也许世界上真的存在打开一个人智力之门的钥匙,同时也一定有破解人类情商之迷的超级密码。
1、世事洞明皆学问,人情练达即文章
经常读的人知道这是红楼梦里面的一副对联。这应该是对做人处世之道概括得最好的一句话了,世事洞明说的是智商能力,人情练达说的则是情商能力,需二者兼修决不可偏废。
2、我们每个人都守着一扇只能自内开启的改变之门
一个人需要有对于变化的因应能力,而最积极的因应态度则是预知变化并主动寻求改变,倘倘若等到变化来敲你的门时恐怕为时已晚。同时也因为任何改变自内开启,其决心愈坚则其效果愈明显。
3、生气就是拿别人的过错来惩罚自己
情绪失控已经成了我们最危险的职业病,据说我们正在变得越来越容易发脾气,而幸福指数越来越低。聪明的人不一定都念过佛,但往往比我们更能够展现宽容和豁达。不会生气的人一定是笨蛋,不去生气的人才聪明。
4、成功的人不在于摸到了一副好牌,而在于打好一副坏牌
不管是作为自我安慰还是自我激励,这句话都应该能够帮得上忙。英雄不问出处,我们虽然不能决定自己出身在什么样的家庭,但我们可以决定一生中可以达到的高度;我们之所以会有成就感,那是因为我们完成挑战了一个需要跳一跳才够得着的目标。
5、如果要等到所有的灯都变成绿灯才行动,那永远别想有开始
同样是砍一颗树,有人说我哪有时间磨刀呢忙着砍树呢,而另一种人则光磨刀不砍树。这第二种人要么是磨刀主义者,要么完美主义者。有一个开着车子的女人停在路口,眼看红灯变成黄灯又变成绿灯却依然一动不动,无奈的交警走过来问:怎么啦,没有你喜欢的颜色吗?
6、将80%的时间关注在20%的事情的,因为这20%的事情会给你带来80%的效果
合理的运用二八法则可以规划好你的时间,因而可以让生活看起来更有质量,让你的努力更容易接近理想和目标。所以我们至少要学会在所有的目标中找到那些将要影响我们一生的关键的少数,然后有效地进行时间和资源的倾斜和投资。
7、把船泊在港口时是安全的,但那并不是造船的目的
人生的价值又如一尾船的价值。过于担心未来不可知的风险,那么失去的将不只是风景,而是价值实现的机会和可能。期待远航不如现在就启航,如果要飞得高,就该把地平线忘掉,歌里面都已经有了很好的解释。
8、未来成功的典范,不在于你赢过多少人,而在于你帮助过多少人,服务过多少地方
人脉无疑是重要的情商能力之一。上帝给了我们手和脚,我们可以用脚跑过别人甚至伴倒别人,但也可以用手来援助别人。一心想要赢过别人的我们,不如从现在开始换一种赢法,在开放和合作中实现双赢甚至多赢。
9、没有追赶不会奔跑,没有竞争不会进步
草食动物不用为了食物而奔跑,却要为了避免成为别人的食物而跑;动物世界里为了生存而进行的竞争远比人类进行的商业竞争残酷多了,正如那只被猎狗追赶的狐狸对另一只狐狸所说的,我不一定跑得过猎狗,但一定要跑过你。
posted @
2006-11-04 11:29 xzc 阅读(242) |
评论 (0) |
编辑 收藏
作者:薛谷雨
作者简介
薛谷雨,NORDSAN(北京)信息科技开发有限公司高级JAVA研发工程师,正致力于企业级异构数据交换的服务器产品的研发,在J2EE和WEB SERVICE方面有较为丰富的开发经验,您可以通过rainight@126.com与他联系。
前言
代码生成器(code generator,CG),顾名思义就是生成代码的工具。有了它,你就可以从一组简单的设定或者数据库设计中获得几百、几千行代码。如果不采用这项技术的话,开发者就不得不花上几个小时或者几天的时间来手工编写这些代码。另一方面,优秀的开发工具为了提供其独特的功能或者屏蔽一些容易出错的细节,也往往采用代码生成技术为使用者提供一个程序的模板框架,其目的也是为了提高编程的效率。以上观点仅是对代码生成器的一般理解,换句话说,这似乎是一个可有可无的东西,没有它,不过是多费一些人工而已。然而,本文要介绍的这套名为ASM的JAVA工具类的功能非同小可,它可以生成JAVA字节码,也就是class文件。你可以在应用程序中根据情况动态生成各式各样的class,然后就调用,达到一种近乎上帝造物般的神奇。心动不如行动,如果你也想在自己的开发中引入这一超前的编程技术,请看此文。
小巧而神奇的ASM
ASM是一套JAVA字节码生成架构。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。ASM 提供了与 BCEL( http://jakarta.apache.org/bcel )和SERP( http://serp.sourceforge.net/ )相似的功能,只有22K的大小,比起350K的BCEL和150K的SERP来说,是相当小巧的,并且它有更高的执行效率,是BCEL的7倍,SERP的11倍以上。ASM一贯的设计思想就是将其应用于动态生成领域,因此小巧和快捷一直是这个产品的设计和实现的指导思想。
此产品由法国电信公司的研发工程师Eric Bruneton负责。从2002年7月ASM的第一个版本发布至今,此产品已经升级了五次,日臻完美。到目前为止,ASM最新的版本是1.3.5,你可以去 http://asm.objectweb.org/ 下载。
ASM的最终目标是创建一个生成工具,可以被用来执行对任何类的处理操作(不像一些工具,比如Javassit,它只支持预先定义的类操作,然而在许多场合这一功能是有局限性的)。
JAVA的CLASS文件格式
要想驾驭ASM,先要了解一下JAVA的CLASS文件格式。JAVA的CLASS文件通常是树型结构。根节点包含以下元素:
- ConstantPool:符号表;
- FieldInfo:类中的成员变量信息;
- MethodInfo:类中的方法描述;
- Attribute:可选的附加节点。
FieldInfo节点包含成员变量的名称,诸如public,private,static等的标志。ConstantValue属性用来存储静态的不变的成员变量的值。Deprecated和Synthetic被用来标记一个成员变量是不被推荐的或由编译器生成的。
MethodInfo节点包含方法的名称,参数的类型和和它的返回值,方法是公有的,私有的或静态的等标志。MethodInfo包含可选的附加属性,其中最重要的是Code属性,它包含非抽象的方法的代码。Exceptions属性包含方法将抛出的Exception的名称。Deprecated和Synthetic属性的信息同上面的FieldInfo的定义一样。
根节点的可选属性有SourceFile,InnerClasses和Deprecated。SourceFile用来存储被编译成字节码的源代码文件的原始名称;InnerClasses存储内部类的信息。由于这些属性的存在,java 的类格式是可以扩展的,也就是说可以在一个class中附加一些非标准的属性, java虚拟机会忽略这些不可识别的属性,正常的加载这个class。
ConstantPool是一个由数字或字符串常量的索引组成的队列,或由此类的树的其他节点引用的,由其他对象创建的被引用常量的索引组成的队列。这个表的目标是为了减少冗余。例如,FieldInfo节点不包含节点的名称,只包含它在这一表中的索引。同样的,GETFIELD和PUTFIELD不直接包含成员变量的名称,只包含名称的索引。
精通ASM
Asm架构整体都围绕着两个接口,即ClassVisitor 和 CodeVisitor,它们能访问每个类的方法,成员变量,包含在每个方法中的字节码指令。ClassReader用来读取class文件;ClassWriter类用来写生成的Class文件。
为了修改已经存在的class,你必须使用分析class文件的ClassReader,类的修正器和写class文件的ClassWriter。类的修正器就是一个ClassVisitor,它可以委派一部分工作到其他的ClassVisitor,但是为了实现预期的修改步骤,它将改变一些参数的值,或者调用一些其他方法。为了比较容易的实现这种类的修正器,ASM提供了一个ClassAdapter和CodeAdapter,这两个适配器类分别实现了ClassVistor和CodeVistor接口。
HelloWorld,体验造类的神奇
下面是一个应用ASM动态生成字节码的类,并调用其中方法的完整的HelloWorld 程序,程序的功能是动态生成一个Example.class类,并实例化一个Example对象,调用对象的main函数,在屏幕上打印出"Hello world!"
import org.objectweb.asm.*;
import java.lang.reflect.*;
import java.io.FileOutputStream;
public class Helloworld extends ClassLoader implements Constants {
public static void main (final String args[]) throws Exception {
/*
* 此程序将生成一个class,对应的java源代码是:
*
* public class Example {
* public static void main (String[] args) {
* System.out.println("Hello world!");
* }
* }
*
*/
// 创建一个ClassWriter
ClassWriter cw = new ClassWriter(false);
cw.visit(ACC_PUBLIC, "Example", "java/lang/Object", null, null);
// 创建一个 MethodWriter
CodeVisitor mw = cw.visitMethod(ACC_PUBLIC, "", "()V", null);
// 推入 'this' 变量
mw.visitVarInsn(ALOAD, 0);
// 创建父类的构造函数
mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V");
mw.visitInsn(RETURN);
// 这段代码使用最多一个栈元素和一个本地变量
mw.visitMaxs(1, 1);
// 为main方法创建一个MethodWriter
mw = cw.visitMethod(
ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null);
// 使用System类的out成员类
mw.visitFieldInsn(
GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
// pushes the "Hello World!" String constant
mw.visitLdcInsn("Hello world!");
// 调用System.out的'println' 函数
mw.visitMethodInsn(
INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
mw.visitInsn(RETURN);
// 这段代码使用最多两个栈元素和两个本地变量
mw.visitMaxs(2, 2);
// 生成字节码形式的类
byte[] code = cw.toByteArray();
FileOutputStream fos = new FileOutputStream("Example.class");
//写文件
fos.write(code);
//关闭输出流
fos.close();
//实例化刚刚生成的类
Helloworld loader = new Helloworld();
Class exampleClass = loader.defineClass("Example", code, 0, code.length);
// 使用动态生成的类打印 'Helloworld'
Method main = exampleClass.getMethods()[0];
main.invoke(null, new Object[] {null});
}
}
|
posted @
2006-11-04 11:05 xzc 阅读(440) |
评论 (0) |
编辑 收藏
摘要: 虽然对
Spring
不熟悉,又不懂
iBatis
,而且对模式的概念还没有弄清楚,但也硬着头皮去读
Spring
包自带的
Jpetstore
...
阅读全文
posted @
2006-11-02 09:41 xzc 阅读(307) |
评论 (0) |
编辑 收藏
最近由于工作原因在研究、应用Maven,有了一些体会就写成了此文。本文虽然是Maven2的入门文章,但并不涉及Maven的历史、下载与安装,这些内容可以到Maven的官方网站上了解。本文主要是关注Maven中的重要概念,并以一个实例来阐述使用Maven的基本方法。文末有例子代码下载的链接。(2006.10.29最后更新)
1 关键名词
Project:任何您想build的事物,Maven都可以认为它们是工程。这些工程被定义为工程对象模型(POM,Poject Object Model)。一个工程可以依赖其它的工程;一个工程也可以由多个子工程构成。
POM:POM(pom.xml)是Maven的核心文件,它是指示Maven如何工作的元数据文件,类似于Ant中的build.xml文件。POM文件位于每个工程的根目录中。
GroupId:groupId是一个工程的在全局中唯一的标识符,一般地,它就是工程名。groupId有利于使用一个完全的包名,将一个工程从其它有类似名称的工程里区别出来。
Artifact:artifact是工程将要产生或需要使用的文件,它可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId和artifactId组合的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中,否则Maven无法找到(识别)它们。
Dependency:为了能够build或运行,一个典型的Java工程会依赖其它的包。在Maven中,这些被依赖的包就被称为dependency。dependency一般是其它工程的artifact。
Plug-in:Maven是由插件组织的,它的每一个功能都是由插件提供的。插件提供goal(类似于Ant中的target),并根据在POM中找到的元数据去完成工作。主要的Maven插件要是由Java写成的,但它也支持用Beanshell或Ant脚本写成的插件。
Repository:仓库用于存放artifact,它可以是本地仓库,也可以是远程仓库。Maven有一个默认的远程仓库--central,可以从http://www.ibiblio.org/maven2/下载其中的artifact。在Windows平台上,本地仓库的默认地址是User_Home\.m2\repository。
Snapshot:工程中可以(也应该)有一个特殊版本,它的版本号包括SNAPSHOT字样。该版本可以告诉Maven,该工程正处于开发阶段,会经常更新(但还未发布)。当其它工程使用此类型版本的artifact时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版。
2 Maven Build Life Cycle
软件项目一般都有相似的开发过程:准备,编译,测试,打包和部署,Maven将上述过程称为Build Life Cycle。在Maven中,这些生命周期由一系列的短语组成,每个短语对应着一个(或多个)操作;或对应着一个(或多个)goal(类似于Ant中的target)。
如编译源文件的命令mvn compile中的compile是一个生命周期短语。同时该命令也可以等价于mvn compiler:compile,其中的compiler是一个插件,它提供了compile(此compile与mvn compile中的compile意义不同)goal;compiler还可提供另一个goal--testCompile,该goal用于编译junit测试类。
在执行某一个生命周期时,Maven会首先执行该生命周期之前的其它周期。如要执行compile,那么将首先执行validate,generate-source,process-source和generate-resources,最后再执行compile本身。关于Maven中默认的生命周期短语,请见参考资源[6]中的附录B.3。
3 标准目录布局
Maven为工程中的源文件,资源文件,配置文件,生成的输出和文档都制定了一个标准的目录结构。Maven鼓励使用标准目录布局,这样就不需要进行额外的配置,而且有助于各个不同工程之间的联接。当然,Maven也允许定制个性的目录布局,这就需要进行更多的配置。关于Maven的标准目录布局,请见参考资源[6]中的附录B.1。
4 Maven的优点
[1]build逻辑可以被重用。在Ant中可能需要多次重复地写相同的语句,但由于POM的继承性,可以复用其它的POM文件中的语句。这样既可以写出清晰的build语句,又可以构造出层次关系良好的build工程。
[2]不必关注build工作的实现细节。我们只需要使用一些build生命周期短语就可以达到我们的目标,而不必管Maven是如何做到这些的。如,只需要告诉Maven要安装(install),那么它自然就会验证,编译,打包,及安装。
[3]Maven会递归加载工程依赖的artifact所依赖的其它artifact,而不用显示的将这些artifact全部写到dependency中。
[4]如果完全使用Maven的标准目录布局,那么可以极大地减少配置细节。
5 实例
5.1 构想
由于只是阐述Maven的基本使用方法,所以本文将要设计的实例,只是一个简单的Maven demo。该实例包含两个工程:普通应用程序工程(app)和Web应用工程(webapp)。app工程提供一个简单的Java类;webapp工程只包含一个Servlet,并将使用app中的Java类。
该Demo的目标是能够正确地将webapp制成war包,以供部署时使用。要能够正确制作war,自然首先就必须要能够正确的编译源代码,且要将App模块制成jar包。本文创建的工程所在的目录是D:\maven\demo。
5.2 App工程
可以使用Maven的archetype插件来创建新工程,命令如下:
D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app
该工程的groupId是ce.demo.mvn,那么该工程的源文件将放在Java包ce.demo.mvn中。artifactId是app,那么该工程根目录的名称将为app。
当第一次执行该命令时,Maven会从central仓库中下载一些文件。这些文件包含插件archetype,以及它所依赖的其它包。该命令执行完毕后,在目录D:\maven\demo下会出现如下目录布局:
app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- ce
| `-- demo
| `-- mvn
| `-- App.java
`-- test
`-- java
`-- ce
`-- demo
`-- mvn
`-- AppTest.java
因本文暂时不涉及JUnit测试,故请将目录
app\src\test目录删除(不删除也没关系 ^_^)。然后再修改App.java文件,其完全内容如下:
package ce.demo.mvn;
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class App
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getStr(String str)
{
return str;
}
} 其实,如果我们能够清楚地知道Maven的标准目录布局,就可以不使用archetype插件来创建工程原型;如果我们要定制个性的目录布局,那么就更没有必要使用archetype插件了。
5.3 WebApp工程
我们仍然如创建app工程一样使用archetype插件来创建webapp工程,命令如下:
D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp 第一次运行此命令时,也会从central仓库中下载一些与Web应用相关的artifact(如javax.servlet)。此命令与创建app的命令的不同之处是,多设置了一个属性archetypeArtifacttId,该属性的值为maven-archetype-webapp。即告诉Maven,将要创建的工程是一个Web应用工程。创建app工程时没有使用该属性值,是由于archetype默认创建的是应用程序工程。同样的,执行完该命令之后,会出现如下标准目录布局:
webapp
|-- pom.xml
`-- src
`-- main
`-- webapp
|-- index.jsp
|-- WEB-INF
`-- web.xml
根据5.1节的构想,webapp工程将只包含一个Servlet,所以我们不需要index.jsp文件,请将其删除。此时大家可以发现,目前的目录布局中并没有放Servlet,即Java源文件的地方。根据参考资源[6]中的附录B.1,以及app工程中Java源文件的布局,可以知道Servlet(它仍然是一个Java类文件)仍然是放在
webapp\src\main\java目录中,请新建该目录。此处的Servlet是一个简单HelloServlet,其完整代码如下:
package hello;
![](/Images/OutliningIndicators/None.gif)
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
![](/Images/OutliningIndicators/None.gif)
import ce.demo.mvn.App; // 引用app工程中的App类
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class HelloServlet extends HttpServlet
{
private static final long serialVersionUID = -3696470690560528247L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
throws ServletException, IOException
{
App app = new App();
String str = app.getStr("CE Maven Demo");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h1>" + str);
out.print("</body></html>");
}
} 5.4 POM文件 大家可以发现,在前面新建工程时,我们并没有提到各个工程中的pom.xml文件。现在将要讨论这个问题。我们先看看app工程中的POM文件,其完整内容如下:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>ce.demo.mvn</groupId>
<artifactId>app</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>CE Maven Demo -- App</name>
</project> 大家可以发现此我帖出来的内容与实际由archetype插件生成的POM文件的内容有些不同,但基本上是一致的。只是为了使文件中的语句更清晰,此处删除了一些冗余的内容,并修改了该工程的version和name的值,以与此例子的背景来符合。在目前情况下modelVersion值将被固定为4.0.0,这也是Maven2唯一能够识别的model版本。groupId,artifactId的值与创建工程时使用的命令中的相关属性值是一致的。packaging的值由工程的类型决定,如应用程序工程的packaging值为jar,Web应用工程的packaging值为war。上述情况也可以从webapp的POM文件中看出,下面将看看这个pom的完整内容。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>ce.demo.mvn</groupId>
<artifactId>webapp</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>CE Maven Demo -- WebApp</name>
<dependencies>
<dependency>
<groupId>ce.demo.mvn</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project> 比较app与webapp中的POM,除前面已经提过的packaging的差别外,我们还可以发现webapp中的POM多了dependencies项。由于webapp需要用到app工程中的类(见HelloServlet源代码),它还需要javax.servlet包(因为该包并不默认存在于jsdk中)。故,我们必须要将它们声明到依赖关系中。
5.5 执行 上述两个工程创建完毕后,就需要执行一些命令来看看会有什么结果出现。我们首先进入app目录,并执行命令
mvn compile,然后会在该目录下发现新生成的目录target\classes,即编译后的class文件(包括它的包目录)就放在了这里。再执行命令mvn package,在目录target中就会生成app-1.0.jar文件。该文件的全名由如下形式确定:
artifactId-version.packaging。根据第2章的叙述可以知道,执行命令
mvn package时,将首先将产生执行命令
mvn compile之后的结果,故如果要打包,那么只需要执行
mvn package即可。
在app工程中执行完之后,就需要进入webapp工程了。进入webapp目录,此次将只执行
mvn package命令(隐示地执行了compile过程)。此次命令的执行并不成功,会出现如下问题:
D:\maven\demo\webapp>mvn package
……
Downloading: http://repo1.maven.org/maven2/ce/demo/mvn/app/1.0/app-1.0.pom
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error building POM (may not be this project's POM).
Project ID: ce.demo.mvn:app
Reason: Error getting POM for 'ce.demo.mvn:app' from the repository: Error transferring file
ce.demo.mvn:app:pom:1.0
from the specified remote repositories:
central (http://repo1.maven.org/maven2)
……
由粗体内容可知,Maven正试图从central仓库下载app工程的artifact,但central仓库肯定不会有这个artifact,其结果只能是执行失败!由第1章artifact名词的解释可知,被依赖的artifact必须存在于仓库(远程或本地)中,但目前webapp所依赖的app必不存在于仓库中,所以执行只能失败。
解决这个问题有两种方法:[1]将app-1.0.jar安装到仓库中,使它成为一个artifact;[2]构建一个更高层次的工程,使app和webapp成为这个工程的子工程,然后从这个更高层次工程中执行命令。
第一种方法比较简单(见http://www.blogjava.net/jiangshachina/admin/EditPosts.aspx中的第一个主题),此处将详细讨论第2种方法(见5.6节)。
5.6 更高层次工程
我们可以将app和webapp的上一级目录demo作为这两个工程的 一个 更高层次工程,即使用app和webapp成为这个工程的子工程。为了使demo目录成为一个demo工程,只需要在这个目录下添加一个pom.xml文件,该文件内容如下:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>ce.demo</groupId>
<artifactId>mvn-demo</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<name>CE Maven Demo</name>
<modules>
<module>app</module>
<module>webapp</module>
</modules>
</project> 与app和webapp中的POM相比,demo的POM使用了modules项,modules用于声明本工程的子工程,module中的值对应于子工程的artifact名。而且该POM的packaging类型必须为pom。
有了demo工程后,我们只需要在demo目录下执行相关命令就可以了。通过如下命令即可验证:
[1]mvn clean – 消除工程(包括所有子工程)中产生的所有输出。这本文的实例中,实际上是删除target目录。由于之前的操作只有app工程产生了target目录,而webapp并没有,所以将只会删除app工程中的target目录。
[2]mvn package – 将工程制作成相应的包,app工程是作成jar包(app-1.0.jar),webapp工程是作成war包(webapp-1.0.war)。打开webapp-1.0.war包,可以发现app-1.0.jar被放到了WEB-INF的lib目录中。
6 小结
通过以上的叙述与实例,应该可以对Maven有一个粗略的认识了。使用Maven关键是要弄清楚如何写pom.xml文件,就如同使用Ant要会写build.xml文件一样。在POM中可以直接写入Ant的task脚本,也可以调用Ant的build.xml文件(推荐),所以Maven也可以完成Ant的绝大多数工作(但不必安装Ant)。注意:使用Maven就不要再过多的使用Ant脚本。
利用好Maven的继承特性及子工程的关系,可以很好地简化POM文件,并能够构建层次结构良好的工程,有利于工程的维护。
7 参考资源
[1]Maven官方网站. http://maven.apache.org
[2]Maven POM文件参考结构. http://maven.apache.org/ref/current/maven-model/maven.html
[3]Super POM. http://maven.apache.org/guides/introduction/introduction-to-the-pom.html
[4]Maven主要插件的列表. http://maven.apache.org/plugins
[5]Maven基本使用指南. http://maven.apache.org/guides/index.html
[6]Better Build with Maven. http://www.mergere.com/m2book_download.jsp -- 强烈推荐
[7]介绍Maven2. http://www.javaworld.com/javaworld/jw-12-2005 /jw-1205-maven_p.html
[8]揭秘Maven2 POM. http://www.javaworld.com/javaworld/jw-05-2006/jw-0529-maven.html
[9]Maven让事情变得简单. http://www-128.ibm.com/developerworks/cn/java/j-maven
[10]Maven文档集. http://docs.codehaus.org/display/MAVENUSER/Home
[11]有效利用Maven2的站点生成功能. http://www.matrix.org.cn/resource/article/44/44491_Maven2.html
文中例子程序下载:http://www.blogjava.net/files/jiangshachina/maven.rar
posted @
2006-10-29 16:29 xzc 阅读(1247) |
评论 (0) |
编辑 收藏
仅仅凭着熟练的技能和勤恳的工作,就在职场游刃有余,未免有些天真。俗话说得好:会干的不如会说的。你想仅仅凭着熟练的技能和勤恳的工作,就在职场游刃有余、出人头地,未免有些天真了。虽然能力加勤奋很重要,但会说话,却能让你工作起来更轻松,并且可能帮助你加薪、升职。
1、应答上司交代的工作:我立即去办。
冷静、迅速地做出这样的回应,会让上司直观地感觉你是一个工作讲效率、处理问题果断,并且服从领导的好下属。如果你犹豫不决,只会让上司不快,会给上司留下优柔寡断的印象,下次重要的机会可能就轮不到你了。
2、传递坏消息时:我们似乎碰到一些情况……
一笔业务出现麻烦,或市场出现危机,如果你立刻冲到上司的办公室报告这个坏消息,就算不关你的事,也会让上司怀疑你对待危机的能力,弄不好还会惹得上司的责骂,成为出气筒。
正确的方式是你可以从容不迫地说:我们似乎碰到一些情况……千万不要乱了阵脚,要让上司觉得事情并没有到不可收拾的地步,并且感到你会与他并肩作战,解决问题。
3、体现团队精神:XX的主意真不错!
小马的创意或设计得到了上司的欣赏,虽然你心里为自己不成功的设计而难过,甚至有些妒忌,你还是要在上司的听力范围内夸夸小马:小马的主意真不错。在明争暗斗的职场,善于欣赏别人,会让上司认为你本性善良,并富有团队精神,从而给你更多的信任。
4、如果你不知道某件事:让我再认真地想一想,2点前答复您好吗?
上司问了你某个与业务有关的问题,你不知道如何作答,千万不要说“不知道”。而“让我再认真地想一想,2点前答复您好吗?”不仅暂时让你解围,也让上司认为你不轻率行事,而是个三思而后行的人。当然,要记得按时给出答复。
5、请同事帮忙:这个策划没有你真不行啊!
有个策划,你一个人搞不定,得找个比较内行的人帮忙,怎么开口呢?你可以诚恳地说:这个策划没有你真不行啊!同事为了不负自己内行的形象,通常是不会拒绝的。当然,事后要记得感谢人家。
6、拒绝黄段子:这种话好像不适合在办公室讲哦! 男人有时总喜欢说些黄段子,并且不大注意场合。如果有男同事对你开“黄腔”,让你无法忍受,这句话可以让他们识趣地闭嘴。
7、减轻工作量:我知道这件事很重要,我们不妨先排一排手头的工作,按重要性排出先后顺序。
首先,强调你了解这项工作的重要性,然后请求上司指示,将这项工作与其它工作一起排出先后顺序,不露痕迹地让上司知道你的工作量其实很大,如果不是非你不可,有些事就可交给其他人或延期处理。
8、承认过失:是我一时疏忽,不过幸好……
犯错误在所难免,所以勇于承认自己的过失很重要,推卸责任只会使你错上加错。不过,承认过失也有诀窍,就是不要让所有的错误都自己扛,这句话可以转移别人的注意力,淡化你的过失。
9、打破冷场的话题:我很想知道您对这件事的看法……
当你与上司相处时,有时不得不找点话题,以打破冷场。不过,这正是你赢得上司青睐的好机会,最恰当的话题就是谈一些与公司有关、上司很关心又熟悉的话题。当上司滔滔不绝地发表看法时,也会对你这样一个谦虚的听众欣赏有加。
10、面对批评:谢谢你告诉我,我会仔细考虑你的建议的。
面对批评或责难,不管自己有没有不当之处,都不要将不满写在脸上,但要让对方知道,你已接受到他的信息,不卑不亢让你看起来又自信又稳重,更值得敬重。
posted @
2006-10-24 15:39 xzc 阅读(289) |
评论 (0) |
编辑 收藏
牛津管理评论(oxford.icxo.com),为职业经理人提供全方位的管理资讯服务。服务项目涵盖管理文库、管理工具、在线培训、职场测试、人力资源、企业管理、案例分析等,是经理人能力提升的最佳学习平台。职场人际交往28招实用技巧:
1.长相不令人讨厌,如果长得不好,就让自己有才气;如果才气也没有,那就总是微笑。
2.气质是关键。如果时尚学不好,宁愿纯朴。
3.与人握手时,可多握一会儿。真诚是宝。
4.不必什么都用“我”做主语。
5.不要向朋友借钱。
6.不要“逼”客人看你的家庭相册。
7.与人打“的”时,请抢先坐在司机旁。
8.坚持在背后说别人好话,别担心这好话传不到当事人耳朵里。
9.有人在你面前说某人坏话时,你只微笑。
10.自己开小车,不要特地停下来和一个骑自行车的同事打招呼。人家会以为你在炫耀。
11.同事生病时,去探望他。很自然地坐在他病床上,回家再认真洗手。
12.不要把过去的事全让人知道。
13.尊敬不喜欢你的人。
14.对事不对人;或对事无情,对人要有情;或做人第一,做事其次。
15.自我批评总能让人相信,自我表扬则不然。
16.没有什么东西比围观者们更能提高你的保龄球的成绩了。所以,平常不要吝惜你的喝彩声。
17.不要把别人的好,视为理所当然。要知道感恩。
18.榕树上的“八哥”在讲,只讲不听,结果乱成一团。学会聆听。
19.尊重传达室里的师傅及搞卫生的阿姨。
20.说话的时候记得常用“我们”开头。
21.为每一位上台唱歌的人鼓掌。
22.有时要明知故问:你的钻戒很贵吧!有时,即使想问也不能问,比如:你多大了?
23.话多必失,人多的场合少说话。
24.把未出口的“不”改成:“这需要时间”、“我尽力”、“我不确定”、“当我决定后,会给你打电话”……
25.不要期望所有人都喜欢你,那是不可能的,让大多数人喜欢就是成功的表现。
26.当然,自己要喜欢自己。
27.如果你在表演或者是讲演的时候,如果只要有一个人在听也要用心的继续下去,即使没有人喝采也要演,因为这是你成功的道路,是你成功的摇篮,你不要看的人成功,而是要你成功。
28.如果你看到一个贴子还值得一看的话,那么你一定要回复,因为你的回复会给人继续前进的勇气,会给人很大的激励。同时也会让人感激你。
posted @
2006-10-24 15:36 xzc 阅读(251) |
评论 (0) |
编辑 收藏
本文介绍怎样把jBPM组件添加到Web应用程序中。所需要用到的资源,可以在jbpm-starters-kit-3.1.2中找到。
一、首先安装jBPM数据库。jBPM是一个停止状态的组件,需要数据库表持久化保存:1)业务程序定义和业务程序实例及相关的工作流数据。保障工作流引擎的执行。2)异步系统使用数据库表来模拟消息系统的功能。需要把消息到数据库表中,由消息系统的命令执行器异步查询和执行。不像专业的消息系统那样是远程的。它仅仅使用数据库模拟消息系统。
1,打开MySQL的命令执行工具Query Browser。
2,当前选定应用程序的数据库,如wcms。
3,导入脚本文件:mysql.drop.create.sql
4,执行该脚本。会在当前数据库中增加jBPM的数据库表。
二、导入jBPM所需的.jar文件
1,jbpmlib目录中包含了jBPM所需的全部jar包。包括MySQL的jdbc包。
2,把它整个复制到应用程序的lib目录下。
3,应用程序的构建器路径的“库”中,把这些jar都加进来。
这些classpath下的jar包,都会被该Web应用程序的类载入器载入。
三、创建config.files和processes目录,并加入classpath的源代码路径
(一)config.files目录的功能
这个目录存放jBPM的各类配置文件。放在这里(就是classpath顶层)的配置文件会取代jBPM的jar包中各处的配置文件。
这里,由于需要使用mysql,而不是内置的hsql内存数据库。所以我们提供了一个修改过的配置文件:hibernate.cfg.xml。这里提供了Hibernate3的配置。
hibernate.cfg.xml配置文件的部分内容
<hibernate-configuration>
<session-factory>
<!-- jdbc connection properties
原来的HSQL配置被注释掉,使用MySQL数据库的配置
<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="hibernate.connection.url">jdbc:hsqldb:mem:.;sql.enforce_strict_size=true</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/wcms</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
(二)processes目录的功能
这个目录存放process流程定义。如:manageNews\内有3个文件。
在jBPM应用程序导入.par或.xml文件时,使用相对路径(如:withubCMS/processdefinition.xml)来定位业务程序定义资源文件。
怎样把它们放到classpath下,需要根据不同的环境进行不同的处理。
一、一般Java程序
1,创建config.files和processes目录。
2,配置构建器路径,将这2个目录设为到classpath的源代码路径。
这样,运行时,会把它们中的内容复制到classpath目录下。
二、Eclipse下的Web程序
我们使用Eclipse自带的功能发布Web程序。
1,创建config.files和processes目录。
2,配置构建器路径,将这2个目录设为到classpath的源代码路径。
3,配置classpath,也就是“缺省输出文件夹”,为:
内容管理(应用程序根路径名)/webapps/WEB-INF/classes
4,这样,在Eclipse编译时(默认是保存即编译),把这2个文件夹中的内容复制到classpath下。
5,然后,使用Eclipse自带的功能,发布该Web应用程序。
Eclipse会把/webapps/文件夹下的所有内容复制到Web服务器下,并且把webapps改名为该Web应用程序的Eclipse项目名字。
这样,我们的配置,对于classpath来说也是正确的!Web应用程序可以顺利地运行。
三、Ant发布的Web程序
可以和上面一样。把这些classpath的源文件,编译,然后把内部的内容复制到classpath下。
Web项目运行时的classpath是classes和lib。当然也需要把jar包都复制到lib下。
最后,在内容管理\webapps\WEB-INF\jbpm\下放置那2个目录。并把它们设为classpath的源路径。
目标classpath路径是内容管理\webapps\WEB-INF\classes。
四、测试jBPM和数据库
建立test源文件夹。提供一个junit测试类:org.jbpm.test.db.HelloWorldDbTest。
这个类使用字符串定义了一个简单的业务程序,然后在数据库上完整的执行它。
执行该单元测试。在应用程序的数据库中的2个表:
SELECT * FROM jbpm_processdefinition j;
SELECT * FROM jbpm_processinstance j;
应该有数据。
至此,jBPM组件就成功地加入到Web应用程序中了!
附录:HelloWorldDbTest.java源代码
package org.jbpm.test.db;
import java.util.List;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.db.GraphSession;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
public class HelloWorldDbTest extends TestCase {
static JbpmConfiguration jbpmConfiguration = null;
static {
// An example configuration file such as this can be found in
// 'src/config.files'. Typically the configuration information is in the
// resource file 'jbpm.cfg.xml', but here we pass in the configuration
// information as an XML string.
// First we create a JbpmConfiguration statically. One JbpmConfiguration
// can be used for all threads in the system, that is why we can safely
// make it static.
/**
*单例对象。
*JbpmConfiguration能够被系统中所有线程所使用。
*jbpm.cfg.xml这个命名方式和Hibernate配置文件的命名方式一致。
*
*/
jbpmConfiguration = JbpmConfiguration.parseXmlString(
"<jbpm-configuration>" +
// A jbpm-context mechanism separates the jbpm core
// engine from the services that jbpm uses from
// the environment.
/*jbpm-context机制在环境中把jbpm核心引擎和jbpm使用的服务分开。
* 持久化服务是jbpm核心引擎使用的一个服务。
*
* */
" <jbpm-context>" +
" <service name='persistence' " +
" factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" +
" </jbpm-context>" +
// Also all the resource files that are used by jbpm are
// referenced from the jbpm.cfg.xml
/*
*string,配置了所有jbpm使用的资源文件的路径。
* */
" <string name='resource.hibernate.cfg.xml' " +
" value='hibernate.cfg.xml' />" +
" <string name='resource.business.calendar' " +
" value='org/jbpm/calendar/jbpm.business.calendar.properties' />" +
" <string name='resource.default.modules' " +
" value='org/jbpm/graph/def/jbpm.default.modules.properties' />" +
" <string name='resource.converter' " +
" value='org/jbpm/db/hibernate/jbpm.converter.properties' />" +
" <string name='resource.action.types' " +
" value='org/jbpm/graph/action/action.types.xml' />" +
" <string name='resource.node.types' " +
" value='org/jbpm/graph/node/node.types.xml' />" +
" <string name='resource.varmapping' " +
" value='org/jbpm/context/exe/jbpm.varmapping.xml' />" +
"</jbpm-configuration>"
);
}
public void setUp() {
//创建数据库表
//jbpmConfiguration.createSchema();
}
public void tearDown() {
//删除数据库表
//jbpmConfiguration.dropSchema();
}
public void testSimplePersistence() {
// Between the 3 method calls below, all data is passed via the
// database. Here, in this unit test, these 3 methods are executed
// right after each other because we want to test a complete process
// scenario情节. But in reality, these methods represent different
// requests to a server.
// Since we start with a clean, empty in-memory database, we have to
// deploy the process first. In reality, this is done once by the
// process developer.
/**
* 这个方法把业务处理定义通过Hibernate保存到数据库中。
*/
deployProcessDefinition();
// Suppose we want to start a process instance (=process execution)
// when a user submits a form in a web application...
/*假设当一个用户提交一个表单时,我们要开始一个业务处理的实例/执行。
* 这可以在Action中执行处理。
*/
processInstanceIsCreatedWhenUserSubmitsWebappForm();
// Then, later, upon the arrival of an asynchronous message the
// execution must continue.
/*
* 然后,直到异步消息来到,才继续执行业务处理实例的余下的工作流程。
* */
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
}
public void deployProcessDefinition() {
// This test shows a process definition and one execution
// of the process definition. The process definition has
// 3 nodes: an unnamed start-state, a state 's' and an
// end-state named 'end'.
/*
* 这个方法把业务处理定义通过Hibernate保存到数据库中。
*
* */
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition name='hello world'>" +
" <start-state name='start'>" +
" <transition to='s' />" +
" </start-state>" +
" <state name='s'>" +
" <transition to='end' />" +
" </state>" +
" <end-state name='end' />" +
"</process-definition>"
);
// Lookup the pojo persistence context-builder that is configured above
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
// Deploy the process definition in the database
jbpmContext.deployProcessDefinition(processDefinition);
} finally {
// Tear down the pojo persistence context.
// This includes flush the SQL for inserting the process definition
// to the database.
/*
* 关闭jbpm上下文。删除pojo持久化上下文。
* 这包括刷新SQL来真正的把业务处理定义插入到数据库中。
* */
jbpmContext.close();
}
}
public void processInstanceIsCreatedWhenUserSubmitsWebappForm() {
// The code in this method could be inside a struts-action
// or a JSF managed bean.
// Lookup the pojo persistence context-builder that is configured above
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
/*
* 图表会话,是图表定义/业务处理定义 相关的数据库层面的会话。应该也是一个Hibernate会话。
* 可以从JBpm上下文这个数据库----业务处理定义、实例等 得到 业务处理定义会话。
*
* */
GraphSession graphSession = jbpmContext.getGraphSession();
//从数据库中根据业务处理定义的名字得到一个业务处理定义。
ProcessDefinition processDefinition =
graphSession.findLatestProcessDefinition("hello world");
// With the processDefinition that we retrieved from the database, we
// can create an execution of the process definition just like in the
// hello world example (which was without persistence).
/*
* 创建业务处理定义的一个实例。
*
* */
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
Token token = processInstance.getRootToken();
assertEquals("start", token.getNode().getName());
// Let's start the process execution
token.signal();
// Now the process is in the state 's'.
assertEquals("s", token.getNode().getName());
// Now the processInstance is saved in the database. So the
// current state of the execution of the process is stored in the
// database.
/*
* 执行一步工作流程后,使用jbpmContext保存这个业务处理实例进数据库。
* 所以现在就把业务处理实例的执行状态也保存进了数据库。
* 因为,业务处理定义的实例 这个类也是一个Model类,用于管理一个业务处理定义的执行的所有信息,
* 是一个多例模式的Model。
*
* */
jbpmContext.save(processInstance);
// The method below will get the process instance back out
// of the database and resume execution by providing another
// external signal.
} finally {
// Tear down the pojo persistence context.
jbpmContext.close();
}
}
public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived() {
// The code in this method could be the content of a message driven bean.
//这个方法可能在消息驱动Bean这个远程业务代理类中。
// Lookup the pojo persistence context-builder that is configured above
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
GraphSession graphSession = jbpmContext.getGraphSession();
// First, we need to get the process instance back out of the database.
// There are several options to know what process instance we are dealing
// with here. The easiest in this simple test case is just to look for
// the full list of process instances. That should give us only one
// result. So let's look up the process definition.
ProcessDefinition processDefinition =
graphSession.findLatestProcessDefinition("hello world");
// Now, we search for all process instances of this process definition.
/*
* 根据业务处理定义的id得到数据库中所有的业务处理实例。这表明,数据库中应该存在2张表
* 它们是 一对多 的关系。
*
* */
List processInstances =
graphSession.findProcessInstances(processDefinition.getId());
// Because we know that in the context of this unit test, there is
// only one execution. In real life, the processInstanceId can be
// extracted from the content of the message that arrived or from
// the user making a choice.
ProcessInstance processInstance =
(ProcessInstance) processInstances.get(0);
// Now we can continue the execution. Note that the processInstance
// delegates signals to the main path of execution (=the root token).
processInstance.signal();
// After this signal, we know the process execution should have
// arrived in the end-state.
assertTrue(processInstance.hasEnded());
// Now we can update the state of the execution in the database
jbpmContext.save(processInstance);
} finally {
// Tear down the pojo persistence context.
jbpmContext.close();
}
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1346877
posted @
2006-10-24 14:18 xzc 阅读(1000) |
评论 (0) |
编辑 收藏
一,为减小 build.xml 文件的大小,使用XML实体
把属性的设置都放一个
XML
文件中
props.xml
文件
<
property
name
="build.dir"
value
="build"
/>
然后在
build.xml
文件中加入如下
<!
DOCTYPE
project
[
<!ENTITY properties SYSTEM "file:props.xml">
]>
二,将多个目录的源文件编译到一个地方
<
javac
destdir
="build/classes">
<
src
path
="src1"/>
<
src
path
="src2"/>
</
javac
>
三,保存构建时的信息
<
project
default
="init">
<
target
name
="init"></
target
>
<
property
environment
="env"
/>
<
property
name
="env.COMPUTERNAME"
value
="${env.HOSTNAME}"
/>
<
propertyfile
comment
="Build Information"
file
="./buildinfo.properties">
<
entry
key
="build.host"
value
="${env.COMPUTERNAME}"
/>
<
entry
key
="build.user.name"
value
="${user.name}"
/>
<
entry
key
="build.os.name"
value
="${os.name}"
/>
</
propertyfile
>
</
project
>
四,去除属性文件的注释
属性文件:
#
这里是注释,会给过滤掉
build.dir =build
build
文件:
<
copy
file
="props.properties"
todir
="sample">
<
filterchain
>
<
striplinecomments
>
<
comment
value
="#"
/>
</
striplinecomments
>
</
filterchain
>
</
copy
>
五,两个花俏的功能
1.
声音提示
<
project
name
="Sound"
default
="all">
<
property
file
="build.properties"
/>
<
target
name
="init">
<
sound
>
<
success
source
="${sound.dir}/success.wav"
duration
="500"
/>
<
fail
source
="${sound.dir}/fail.wav"
loops
="2"
/>
</
sound
>
</
target
>
<
target
name
="fail"
depends
="init">
<
fail
/>
</
target
>
<
target
name
="success"
depends
="init"
/>
<
target
name
="all"
depends
="success"
/>
</
project
>
2.
进度条提示
<
project
name
="splash"
default
="init">
<
target
name
="init">
<
splash
imageurl
="http://java.chinaitlab.com/UploadFiles_8734/200610/20061021103415601.gif"
showduration
="5000"
/>
<
sleep
seconds
="1"
/>
<
sleep
seconds
="1"
/>
<
sleep
seconds
="1"
/>
<
sleep
seconds
="1"
/>
<
sleep
seconds
="1"
/>
<
sleep
seconds
="1"
/>
</
target
>
</
project
>
posted @
2006-10-23 13:40 xzc 阅读(337) |
评论 (0) |
编辑 收藏