<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>清幽怡人</title>
    <description>宁静致远 宁静悟我</description>
    <link>http://panjun.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>133句告戒自己的话</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/233187" style="color:red;">http://panjun.javaeye.com/blog/233187</a>&nbsp;
          发表时间: 2008年08月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="lh3" id="veryContent" style="overflow: hidden; width: 100%;">
<table class="contentTable" cellspacing="0" border="0" id="blogContentTable" cellpadding="0">
<tbody>
<tr>
<td valign="top" style="word-wrap: break-word;">
<div id="blogContainer" style="font-size: 12px;"><img src="http://imgcache.qq.com/ac/b.gif" id="paperPicArea0" alt="" style="display: none;" />
<div id="paperTitleArea" style="display: none;"><span id="paperTitle" style="display: block; font-weight: bolder; word-break: break-all;"><span style="color: #000e04;">133句告戒自己的话</span></span></div>
<img src="http://imgcache.qq.com/ac/b.gif" id="paperPicArea" alt="" style="display: none;" />1、人之所以痛苦，在于追求错误的东西。　&nbsp;&nbsp;<br />2、与其说是别人让你痛苦，不如说自己的修养不够。　&nbsp;&nbsp;<br />3、如果你不给自己烦恼，别人也永远不可能给你烦恼。因为你自己的内心，你放不下。&nbsp;&nbsp;<br />4、好好的管教你自己，不要管别人。　&nbsp;&nbsp;<br />5、不宽恕众生，不原谅众生，是苦了你自己。　&nbsp;&nbsp;<br />6、别说别人可怜，自己更可怜，自己修行又如何？自己又懂得人生多少？　&nbsp;&nbsp;<br />7、福报不够的人，就会常常听到是非；福报够的人，从来就没听到过是非。　&nbsp;&nbsp;<br />8、你永远要感谢给你逆境的众生。&nbsp;&nbsp;<br />9、你永远要宽恕众生，不论他有多坏，甚至他伤害过你，你一定要放下，才能得到真正的快乐。&nbsp;&nbsp;<br />10、这个世界本来就是痛苦的，没有例外的。　&nbsp;&nbsp;<br />11、当你快乐时，你要想，这快乐不是永恒的。当你痛苦时你要想这痛苦也不是永恒的。&nbsp;&nbsp;<br />12、认识自己，降伏自己，改变自己，才能改变别人。&nbsp;&nbsp;<br />13、不要浪费你的生命，在你一定会后悔的地方上。&nbsp;&nbsp;<br />14、你什么时候放下，什么时候就没有烦恼。&nbsp;&nbsp;<br />15、每一种创伤，都是一种成熟。&nbsp;&nbsp;<br />16、当你知道迷惑时，并不可怜， 当你不知道迷惑时，才是最可怜的。&nbsp;&nbsp;<br />17、狂妄的人有救，自卑的人没有救。&nbsp;&nbsp;<br />18、你不要一直不满人家，你应该一直检讨自己才对。不满人家，是苦了你自己。&nbsp;&nbsp;<br />19、你要包容那些意见跟你不同的人，这样子日子比较好过。你要是一直想改变他，那样子你会很痛苦。要学学怎样忍受他才是。你要学学怎样包容他才是。&nbsp;&nbsp;<br />20、承认自己的伟大，就是认同自己的愚疑。&nbsp;&nbsp;<br />21、一个人如果不能从内心去原谅别人，那他就永远不会心安理得。&nbsp;&nbsp;<br />22、心中装满着自己的看法与想法的人，永远听不见别人的心声。&nbsp;&nbsp;<br />23、毁灭人只要一句话，培植一个人却要千句话，请你多口下留情。&nbsp;&nbsp;<br />24、当你劝告别人时，若不顾及别人的自尊心，那么再好的言语都没有用的。&nbsp;&nbsp;<br />25、不要在你的智慧中夹杂着傲慢。不要使你的谦虚心缺乏智慧。&nbsp;&nbsp;<br />26、根本不必回头去看咒骂你的人是谁？如果有一条疯狗咬你一口，难道你也要趴下去反咬他一口吗？&nbsp;&nbsp;<br />27、忌妒别人，不会给自己增加任何的好处。忌妒别人，也不可能减少别人的成就。&nbsp;&nbsp;<br />28、永远不要浪费你的一分一秒，去想任何你不喜欢的人。&nbsp;&nbsp;<br />29、多少人要离开这个世间时，都会说出同一句话，这世界真是无奈与凄凉啊！&nbsp;&nbsp;<br />30、恋爱不是慈善事业，不能随便施舍的。感情是没有公式，没有原则，没有道理可循的。可是人们至死都还在执著与追求。&nbsp;&nbsp;<br />31、请你用慈悲心和温和的态度，把你的不满与委屈说出来，别人就容易接受。&nbsp;&nbsp;<br />32、创造机会的人是勇者。等待机会的人是愚者。&nbsp;&nbsp;<br />33、能说不能做，不是真智慧。&nbsp;&nbsp;<br />34、多用心去倾听别人怎么说，不要急着表达你自己的看法。&nbsp;&nbsp;<br />35、同样的瓶子，你为什么要装毒药呢？同样的心理，你为什么要充满着烦恼呢？&nbsp;&nbsp;<br />36、得不到的东西，我们会一直以为他是美好的，那是因为你对他了解太少，没有时间与他相处在一起。当有一天，你深入了解后，你会发现原不是你想像中的那么美好。&nbsp;&nbsp;<br />37、这个世间只有圆滑，没有圆满的。&nbsp;&nbsp;<br />38、活着一天，就是有福气，就该珍惜。当我哭泣我没有鞋子穿的时候，我发现有人却没有脚。&nbsp;&nbsp;<br />39、多一分心力去注意别人，就少一分心力反省自己，你懂吗？ 40、欲知世上刀兵劫，但听屠门夜半声。不要光埋怨自己多病，灾祸横生，多看看横死在你刀下的众生又有多少？&nbsp;&nbsp;<br />41、憎恨别人对自己是一种很大的损失。&nbsp;&nbsp;<br />42、每一个人都拥有生命，但并非每个人都懂得生命，乃至于珍惜生命。不了解生命的人，生命对他来说，是一种惩罚。&nbsp;&nbsp;<br />43、自以为拥有财富的人，其实是被财富所拥有。&nbsp;&nbsp;<br />44、情执是苦恼的原因，放下情执，你才能得到自在。&nbsp;&nbsp;<br />45、随缘不是得过且过，因循苟且，而是尽人事听天命。&nbsp;&nbsp;<br />46、不要太肯定自己的看法，这样子比较少后悔。&nbsp;&nbsp;<br />47、当你对自己诚实的时候，世界上没有人能够欺骗得了你。&nbsp;&nbsp;<br />48、用伤害别人的手段来掩饰自己缺点的人，是可耻的。&nbsp;&nbsp; <br />49、内心充满忌妒，心中不坦白，言语不正的人，不能算是一位五官端正的人。<br />50、多讲点笑话，以幽默的态度处事，这样子日子会好过一点。&nbsp;&nbsp; <br />51、活在别人的掌声中，是禁不起考验的人。&nbsp;&nbsp;<br />52、不要刻意去猜测他人的想法，如果你没有智慧与经验的正确判断，通常都会有错误的。&nbsp;&nbsp;<br />53、要了解一个人，只需要看他的出发点与目的地是否相同，就可以知道他是否真心的。&nbsp;&nbsp; <br />54、人生的真理，只是藏在平淡无味之中。&nbsp;&nbsp;<br />55、不洗澡的人，硬擦香水是不会香的。名声与尊贵，是来自于真才实学的。有德自然香。&nbsp;&nbsp; <br />56、与其你去排斥它已成的事实，你不如去接受它。&nbsp;&nbsp;<br />57、逆境是成长必经的过程，能勇于接受逆境的人，生命就会日渐的茁壮。&nbsp;&nbsp; <br />58、你要感谢告诉你缺点的人。&nbsp;&nbsp; <br />59、能为别人设想的人，永远不寂寞。&nbsp;&nbsp; <br />60、如果你能像看别人缺点一样，如此准确般的发现自己的缺点，那么你的生命将会不平凡。&nbsp;&nbsp; <br />61、原谅别人，就是给自己心中留下空间，以便回旋。&nbsp;&nbsp; <br />62、时间总会过去的，让时间流走你的烦恼吧！&nbsp;&nbsp; <br />63、你硬要把单纯的事情看得很严重，那样子你会很痛苦。&nbsp;&nbsp;<br />64、永远扭曲别人善意的人，无药可救。&nbsp;&nbsp;<br />65、人不是坏的，只是习气罢了，每个人都有习气，只是深浅不同罢了。只要他有向善的心，能原谅的就原谅他，不要把他看做是坏人。&nbsp;&nbsp; <br />66、说一句谎话，要编造十句谎话来弥补，何苦呢？ 　　　&nbsp;&nbsp; <br />67、其实爱美的人，只是与自己谈恋爱罢了。&nbsp;&nbsp; <br />68、世界上没有一个永远不被毁谤的人，也没有一个永远被赞叹的人。当你话多的时候，别人要批评你，当你话少的时候，别人要批评你，当你沈默的时候，别人还是要批评你。在这个世界上，没有一个人不被批评的。&nbsp;&nbsp;<br />69、夸奖我们，赞叹我们的，这都不是名师。会讲我们，指示我们的，这才是良师，有了他们我们才会进步。&nbsp;&nbsp; <br />70、你目前所拥有的都将随着你的死亡而成为他人的，那为何不现在就乐施给真正需要的人呢？&nbsp;&nbsp;<br />71、白白的过一天，无所事事，就像犯了窃盗罪一样。&nbsp;&nbsp; <br />72、沈默是毁谤最好的答覆。&nbsp;&nbsp; <br />73、对人恭敬，就是在庄严你自己。&nbsp;&nbsp; <br />74、拥有一颗无私的爱心，便拥有了一切。&nbsp;&nbsp;<br />75、仇恨永远不能化解仇恨，只有宽容才能化解仇恨，这是永恒的至理。&nbsp;&nbsp;<br />76、你接受比抱怨还要好，对于不可改变的事实，你除了接受以外，没有更好的办法了。&nbsp;&nbsp;<br />77、不要因为众生的愚疑，而带来了自己的烦恼。不要因为众生的无知，而痛苦了你自己。&nbsp;&nbsp; <br />78、别人讲我们不好，不用生气、难过。说我们好也不用高兴，这不好中有好，好中有坏，就看你会不会用？&nbsp;&nbsp;<br />79、当你的错误显露时，可不要发脾气，别以为任性或吵闹，可以隐藏或克服你的缺点。&nbsp;&nbsp;<br />80、不要常常觉得自己很不幸，世界上比我们痛苦的人还要多。&nbsp;&nbsp; <br />81、愚痴的人，一直想要别人了解他。有智慧的人，却努力的了解自己。&nbsp;&nbsp;<br />82、来是偶然的，走是必然的。所以你必须，随缘不变，不变随缘。 83、只要面对现实，你才能超越现实。&nbsp;&nbsp; <br />84、良心是每一个人最公正的审判官，你骗得了别人，却永远骗不了你自己的良心。&nbsp;&nbsp;<br />85、不懂得自爱的人，是没有能力去爱别人的。&nbsp;&nbsp; <br />86、做事就是在学做人而已。&nbsp;&nbsp; <br />87、有时候我们要冷静问问自已，我们在追求什么？我们活着为了什么？&nbsp;&nbsp;<br />88、不要因为小小的争执，远离了你至亲的好友，也不要因为小小的怨恨，忘记了别人的大恩。&nbsp;&nbsp; <br />89、勇于接受别人的批评，正好可以调整自己的缺点。&nbsp;&nbsp; <br />90、感谢上天我所拥有的，感谢上天我所没有的。&nbsp;&nbsp;<br />91、说话不要有攻击性，不要有杀伤力，不夸已能，不扬人恶，自然能化敌为友。&nbsp;&nbsp; <br />92、一个常常看别人缺点的人，自己本身就不够好，因为他没有时间检讨他自己。&nbsp;&nbsp; <br />93、是非天天有，不听自然无，是非天天有，不听还是有，是非天天有，看你怎么办？&nbsp;&nbsp;<br />94、如果你真的爱他，那么你必须容忍他部份的缺点。　&nbsp;&nbsp;<br />95、要克服对死亡的恐惧，你必须要接受世上所有的人，都会死去的观念。 96、虽然你讨厌一个人，但却又能发觉他的优点好处，像这样子有修养的人，天下真是太少了。&nbsp;&nbsp;<br />97、诚实的面对你内心的矛盾和污点，不要欺骗你自己。&nbsp;&nbsp; <br />98、因果不曾亏欠过我们什么，所以请不要抱怨。&nbsp;&nbsp; <br />99、我们确实有如是的优点，但也要隐藏几分，这个叫做涵养。&nbsp;&nbsp;<br />100、大多数的人一辈子只做了三件事；自欺、欺人、被人欺。&nbsp;&nbsp; <br />101、太过于欣赏自己的人，不会去欣赏别人的优点。&nbsp;&nbsp;<br />102、心是最大的骗子，别人能骗你一时，而它却会骗你一辈子。&nbsp;&nbsp; <br />103、当你手中抓住一件东西不放时，你只能拥有这件东西，如果你肯放手，你就有机会选择别的。人的心若死执自己的观念，不肯放下，那么他的智慧也只能达到某种程度而已。&nbsp;&nbsp; <br />104、人家怕你，并不是一种福，人家欺你，并不是一种辱。&nbsp;&nbsp;<br />105、不是某人使我烦恼，而是我拿某人的言行来烦恼自己。&nbsp;&nbsp; <br />106、不要刻意去曲解别人的善意，你应当往好的地方想。&nbsp;&nbsp; <br />107、世上的事，不如己意者，那是当然的。&nbsp;&nbsp;<br />108、我的财富并不是因为我拥有很多，而是我要求的很少。&nbsp;&nbsp; <br />109、吃了就一定要拉，人一定要学会随缘放下，否则就会?便秘。&nbsp;&nbsp; <br />110、常以为别人在注意你，或希望别人注意你的人，会生活的比较烦恼。&nbsp;&nbsp; <br />111、我能为你煮东西，但我不能为你吃东西。各人吃饭是各人饱，各人生死是个人了。&nbsp;&nbsp; <br />112、看轻别人很容易，要摆平自己却很困难。&nbsp;&nbsp;<br />113、你只管活你自己的，不必去介意别人的扭曲与是非。&nbsp;&nbsp; <br />114、如果你准备结婚的话，告诉你一句非常重要的哲学名言，你一定要忍耐包容对方的缺点，世界上没有绝对幸福圆满的婚姻，幸福只是来自于无限的容忍与互相尊重。&nbsp;&nbsp;<br />115、如果你能够平平安安的渡过一天，那就是一种福气了。多少人在今天已经见不到明天的太阳，多少人在今天已经成了残废，多少人在今天已经失去了自由，多少人在今天已经家破人亡。&nbsp;&nbsp;<br />116、是非和得失，要到最后的结果，才能评定。&nbsp;&nbsp; <br />117、你不必和因果争吵，因果从来就不会误人。你也不必和命运争吵，命运它是最公平的审判官。&nbsp;&nbsp;<br />118、你有你的生命观，我有我的生命观，我不干涉你。只要我能，我就感化你。如果不能，那我就认命。&nbsp;&nbsp;<br />119、你希望掌握永恒，那你必须控制现在。&nbsp;&nbsp; <br />120、恶口永远不要出自于我们的口中，不管他有多坏，有多恶。你愈骂他，你的心就被污染了，你要想，他就是你的善知识。&nbsp;&nbsp; <br />121、当你明天开始生活的时候，有人跟你争执，你就让他赢，这个赢跟输，都只是文字的观念罢了。当你让对方赢，你并没有损失什么。所谓的赢，他有赢到什么？得到什么？所谓的输，你又输到什么？失去什么？&nbsp;&nbsp; <br />122、我们大部份的生命都浪费在文字语言的捉摸上。&nbsp;&nbsp;<br />123、你不要常常觉得自己很委曲，你应该要想，他对我这样已经很好了，这就是修行的功夫。&nbsp;&nbsp; <br />124、别人可以违背因果，别人可以害我们，打我们，毁谤我们。可是我们不能因此而憎恨别人，为什么？我们一定要保有一颗完整的 本性和一颗清净的心。　　　&nbsp;&nbsp;<br />125、与任何人接触时，要常常问自己，我有什么对他有用？使他得益。如果我不能以个人的道德、学问和修持的力量，来使人受益，就等于欠了一份债。&nbsp;&nbsp;<br />126、如果一个人没有苦难的感受，就不容易对他人给予同情。你要学救苦救难的精神，就得先受苦受难。&nbsp;&nbsp; <br />127、一般人在遇到对方的权势大，财富大，气力大，在无可奈何的情形之下而忍，这算什么忍耐呢？真正的忍是，就算他欺负了你，对不住你，但他什么都不及你，你有足够的力量对付他，而你却能容忍他，认为他的本性和我一样，只是一时糊涂，或在恶劣的环境中受到熏染罢了，你不必与他计较，能在这样的情况及心境之下容忍那才是真正的忍耐。　　　&nbsp;&nbsp;<br />128、如果我们放眼从累生历劫去看，那么一切的众生，谁不曾做过我的父母、兄弟姊妹、亲戚眷属？谁不曾做过我的仇敌冤家？如果说有恩，个个与我有恩；如果说有冤，个个与我有冤。这样子我们还有什么恩怨亲疏之别呢？再就智慧愚笨来说，人人有聪明的时候，也有愚痴的时候，聪明的人可能变愚痴，愚痴的人也可能变聪明。最坏的人，也曾做过许多好事，而且不会永远坏；好人也曾做过许多坏事，将来也不一定会好。如此我们反覆思索，所谓的冤亲、贤愚，这许多差别的概念，自然就会渐渐淡了。这绝对不是混沌，也不是不知好坏，而是要将我们无始以来的偏私差别之见，以一视同仁的平等观念罢了！&nbsp;&nbsp;<br />129、世界原本就不是属于你，因此你用不着抛弃，要抛弃的是一切的执著。万物皆为我所用，但非我所属。&nbsp;&nbsp;<br />130、宁可自己去原谅别人，莫让别人来原谅你。&nbsp;&nbsp; <br />131、当你用烦恼心来面对事物时，你会觉得一切都是业障，世界也会变得丑陋可恨。&nbsp;&nbsp; <br />132、欲为诸佛龙象，先做众生马牛。&nbsp;&nbsp; <br />133、虽然我们不能改变周遭的世界，我们就只好改变自己，用爱心和智慧来面对这一切.&nbsp;</div>
</td>
</tr>
</tbody>
</table>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/233187#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Aug 2008 14:35:38 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/233187</link>
        <guid>http://panjun.javaeye.com/blog/233187</guid>
      </item>
          <item>
        <title>顿悟.... </title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/232095" style="color:red;">http://panjun.javaeye.com/blog/232095</a>&nbsp;
          发表时间: 2008年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>如今的社会.有多少人不是冲着年轻貌美的女孩去的.?</p>
<p>在这个变质的社会.又有多少人是为了单纯的爱.?</p>
<p>在此,我并不否认有一小部分人确实是为了单纯的爱而去爱着对方.</p>
<p>但是.爱的过程中难道不排除发生一系列的关系吗..?</p>
<p>没有性,又能爱的多深呢..</p>
<p>男人.只会说这个社会的女孩多么的堕落.多么的下贱.多么的稀烂.</p>
<p>但是有想过,女孩生来就是这样子吗.</p>
<p>还不因为有一群禽兽般的男人.这一部份人占社会的大部分.</p>
<p>长的稍微好看一点的女人.男人们就开始用下半身思考了.</p>
<p>想尽办法,1套1套的都出来了..如果你不想.那么你就是阳痿.!</p>
<p>其他的不说.先把女孩的身体得到手先..</p>
<p>就像没有到手不是男人.</p>
<p>男人爽完以后.分手时.就开始装自己最受伤的一样.</p>
<p>说一切,我们不适合.我其实很爱你.可是我们性格不和.什么的.来为自己的撤离做出掩饰.</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/232095#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Aug 2008 13:08:36 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/232095</link>
        <guid>http://panjun.javaeye.com/blog/232095</guid>
      </item>
          <item>
        <title>一些比较好的语句</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/228202" style="color:red;">http://panjun.javaeye.com/blog/228202</a>&nbsp;
          发表时间: 2008年08月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="t_msgfont" id="postmessage_51435">&nbsp;&nbsp;&nbsp;&nbsp; 交女朋友就像QQ挂等级，每天两小时，时间长了就可以日了。&nbsp;</div>
<div class="t_msgfont">&nbsp;&nbsp;&nbsp; &nbsp;好男人和好女人都是有的，只是我们遇见的不是我们如意的，但是别灰心，值得我们爱的就在前面等着我们呢。善良的人是很难学坏的，因为我们内心充满了爱，别让烦躁的心情毁了它，它是世界上最宝贵的东西。上天既然赐给了我们善良就一定会让我们幸福的~！加油朋友~！</div>
<div class="t_msgfont">&nbsp;&nbsp;&nbsp;&nbsp; 爱就要爱得精彩,活就活得痛快,每个人都有自己的伤,自己的心事.我也是其中的一个,没有不完美人生,只有不完美的生活,我有自己的路,不管有多难,我都要走下去.</div>
<div class="t_msgfont">&nbsp;&nbsp;&nbsp;&nbsp; 所谓爱情，就是在不断的原谅和执着的等待中，幸福不经意来到身边。</div>
<div class="t_msgfont">&nbsp;&nbsp;&nbsp; &ldquo;爱一个人要懂得道谢也要道歉；爱一个人要懂得宽容、包容不是纵容；爱一个人要懂得互相支持而不是互相支配；爱一个人要随时牵手不要随时分手。&rdquo;</div>
<div class="t_msgfont">&nbsp;&nbsp;&nbsp;&nbsp; </div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/228202#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Aug 2008 08:47:03 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/228202</link>
        <guid>http://panjun.javaeye.com/blog/228202</guid>
      </item>
          <item>
        <title>我不是为了生气去种兰花</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/227985" style="color:red;">http://panjun.javaeye.com/blog/227985</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天在《江苏教育》上看到这样一篇小文章，说的是：<br />&nbsp;&nbsp; 唐代著名禅师慧宗的故事。慧宗禅师酷爱兰花，有一次，他要外出弘法讲经，临行前吩咐弟子们看护好他精心培育的数十盆兰花。 <br />&nbsp;&nbsp; 弟子们深知禅师爱兰，因此非常细心地侍弄兰花。但一天深夜，狂风大作，暴雨如注，弟子们偏偏在这天晚上将兰花遗忘在户外。第二天清晨，弟子们出门看时，只见眼前一片狼藉，破碎的花盆，倒塌的花架，还有被连根拔起的兰花。几天后慧宗禅师返回寺院，众弟子忐忑不安地上前迎候，准备领受师傅的责罚。 <br />&nbsp;&nbsp; 得知原委，慧宗禅师泰然自若，神态平静而祥和，他宽慰弟子们说：&ldquo;当初，我不是为了生气而种兰花的。&rdquo; <br />&nbsp;&nbsp; 弟子们顿觉得大彻大悟&hellip;&hellip;<br />&nbsp;&nbsp; 在物欲横流的今天保持一种宁静，不骄不躁，宠辱不惊是很难的。但是我们回头想，患得患失的过程里，情绪的起落，得意抑或失意，有多少时候是因为生气而&ldquo;种兰花&rdquo;呢？人生中的不如意的事情十有八九，关键的问题是要泰然处之，要静心养性，如果我们能加强自己的修养，达到&ldquo;不以物喜，不以己悲&rdquo;的境界，保持一种&ldquo;享受&rdquo;的心态去迎接生活所给于的痛苦、快乐、忧伤、无奈&hellip;&hellip;那么，一些挫折，一些困难，一些批评对于我们何曾不是一种财富呢？这样人生中是不是会多一些快乐呢？<br />&nbsp;&nbsp; &ldquo;我不是为了生气而种兰花的。&rdquo; 想想生活中有多少人为&ldquo;种兰花&rdquo;而生气，甚至是为了一点小事而付出了沉重的代价。问问我们自己：我们是为了生气而工作吗？ 我们是为了生气而教育学生的吗？我们是为了生气而与人交往吗？我们是为了生气而相爱的吗？ 我们是为了生气而活着的吗？&hellip;&hellip;凡此种种，静心而问，平常的日子里 是不是我们牵挂得太多，我们太在意得失，所以我们的喜怒无常，我们不快乐了呢？<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; 让心更宽些，我们给自己的快乐就会更多些。<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; 因为&ldquo;我不是为了生气而种兰花的&rdquo;。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/227985#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Aug 2008 13:18:26 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/227985</link>
        <guid>http://panjun.javaeye.com/blog/227985</guid>
      </item>
          <item>
        <title>软件开发资深人士的经验总结</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/216799" style="color:red;">http://panjun.javaeye.com/blog/216799</a>&nbsp;
          发表时间: 2008年07月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、分享第一条经验：&ldquo;学历代表过去、能力代表现在、学习力代表未来。&rdquo;其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要：&ldquo;重要的道理明白太晚将抱憾终生！&rdquo;所以放在每一条，让刚刚毕业的朋友们早点看到哈！ <br /><br />2、一定要确定自己的发展方向，并为此目的制定可行的计划。不要说什么，&ldquo;我刚毕业，还不知道将来可能做什么？&rdquo;，&ldquo;跟着感觉走，先做做看&rdquo;。因为，这样的观点会通过你的潜意识去暗示你的行为无所事事、碌碌无为。一直做技术，将来成为专家级人物？向管理方向走，成为职业经理人？先熟悉行业和领域，将来自立门户？还是先在行业里面混混，过几年转行做点别的？这很重要，它将决定你近几年、十年内&ldquo;做什么事情才是在做正确的事情！&rdquo;。 <br /><br />3、软件开发团队中，技术不是万能的，但没有技术是万万不能的！在技术型团队中，技术与人品同等重要，当然长相也比较重要哈，尤其在MM比较多的团队中。在软件项目团队中，技术水平是受人重视和尊重的重要砝码。无论你是做管理、系统分析、设计、编码，还是产品管理、测试、文档、实施、维护，多少你都要有技术基础。算我孤陋寡闻，我还真没有亲眼看到过一个外行带领一个软件开发团队成功地完成过软件开发项目，哪怕就一个，也没有看到。倒是曾经看到过一个&ldquo;高学历的牛人&rdquo;(非技术型)带一堆人做完过一个项目，项目交付的第二天，项目组成员扔下一句&ldquo;再也受不了啦！&rdquo;四分五裂、各奔东西。那个项目的&ldquo;成功度&rdquo;大家可想而知了。 <br /><br />4、详细制定自己软件开发专业知识学习计划，并注意及时修正和调整(软件开发技术变化实在太快)。请牢记：&ldquo;如果一个软件开发人员在1、2年内都没有更新过自己的知识，那么，其实他已经不再属于这个行业了。&rdquo;不要告诉自己没有时间。来自时间管理领域的著名的&ldquo;三八原则&rdquo;告诫我们：另外的那8小时如何使用将决定你的人生成败！本人自毕业以来，平均每天实际学习时间超过2小时。 <br /><br />5、书籍是人类进步的阶梯，对软件开发人员尤其如此。书籍是学习知识的最有效途径，不要过多地指望在工作中能遇到&ldquo;世外高人&rdquo;，并不厌其烦地教你。对于花钱买书，我个人经验是：千万别买国内那帮人出的书！我买的那些家伙出的书，!00%全部后悔了，无一本例外。更气愤的是，这些书在二手市场的地摊上都很难卖掉。&ldquo;拥有书籍并不表示拥有知识；拥有知识并不表示拥有技能；拥有技能并不表示拥有文化；拥有文化并不表示拥有智慧。&rdquo;只有将书本变成的自己智慧，才算是真正拥有了它。 <br /><br />6、不要仅局限于对某项技术的表面使用上，哪怕你只是偶尔用一、二次。&ldquo;对任何事物不究就里&rdquo;是任何行业的工程师所不应该具备的素质。开发Windows应用程序，看看Windows程序的设计、加载、执行原理，分析一下PE文件格式，试试用SDK开发从头开发一个Windows应用程序；用VC＋＋、Delphi、Java、.Net开发应用程序，花时间去研究一下MFC、VCL、J2EE、.Net它们框架设计或者源码；除了会用J2EE、JBoss、Spring、Hibernate等等优秀的开源产品或者框架，抽空看看大师们是如何抽象、分析、设计和实现那些类似问题的通用解决方案的。试着这样做做，你以后的工作将会少遇到一些让你不明就里、一头雾水的问题，因为，很多东西你&ldquo;知其然且知其所以然&rdquo;！ <br /><br />7、在一种语言上编程，但别为其束缚了思想。&ldquo;代码大全&rdquo;中说：&ldquo;深入一门语言编程，不要浮于表面&rdquo;。深入一门语言开发还远远不足，任何编程语言的存在都有其自身的理由，所以也没有哪门语言是&ldquo;包治百病&rdquo;的&ldquo;灵丹妙药&rdquo;。编程语言对开发人员解决具体问题的思路和方式的影响与束缚的例子俯拾皆是。我的经验是：用面对对象工具开发某些关键模块时，为什么不可以借鉴C、C51、汇编的模块化封装方式？用传统的桌面开发工具(目前主要有VC 、Delphi)进行系统体统结构设计时，为什么不可以参考来自Java社区的IoC、AOP设计思想，甚至借鉴像Spring、Hibernate、JBoss等等优秀的开源框架？在进行类似于实时通信、数据采集等功能的设计、实现时，为什么不可以引用来自实时系统、嵌入式系统的优秀的体系框架与模式？为什么一切都必须以个人、团队在当然开发语言上的传统或者经验来解决问题？？？&ldquo;他山之石、可以攻玉&rdquo;。 <br /><br />8、养成总结与反思的习惯，并有意识地提炼日常工作成果，形成自己的个人源码库、解决某类问题的通用系统体系结构、甚至进化为框架。众所周知，对软件开发人员而言，有、无经验的一个显著区别是：无经验者完成任何任务时都从头开始，而有经验者往往通过重组自己的可复用模块、类库来解决问题（其实这个结论不应该被局限在软件开发领域、可以延伸到很多方面）。这并不是说，所有可复用的东西都必须自己实现，别人成熟的通过测试的成果也可以收集、整理、集成到自己的知识库中。但是，最好还是自己实现，这样没有知识产权、版权等问题，关键是自己实现后能真正掌握这个知识点，拥有这个技能。 <br /><br />9、理论与实践并重，内外双修。工程师的内涵是：以工程师的眼光观察、分析事物和世界。一个合格的软件工程师，是真正理解了软件产品的本质及软件产品研发的思想精髓的人（个人观点、欢迎探讨）。掌握软件开发语言、应用语言工具解决工作中的具体问题、完成目标任务是软件工程师的主要工作，但从软件工程师这个角度来看，这只是外在的东西，并非重要的、本质的工作。学习、掌握软件产品开发理论知识、软件开发方法论，并在实践中理解、应用软件产品的分析、设计、实现思想来解决具体的软件产品研发问题，才是真正的软件工程师的工作。站在成熟理论与可靠方法论的高度思考、分析、解决问题，并在具体实践中验证和修正这些思想与方式，最终形成自己的理论体系和实用方法论。 <br /><br />10、心态有多开放，视野就有多开阔。不要抱着自己的技术和成果，等到它们都已经过时变成垃圾了，才拿出来丢人现眼。请及时发布自己的研究成果：开发的产品、有创意的设计或代码，公布出来让大家交流或者使用，你的成果才有进化和升华的机会。想想自己2000年间开发的那些Windows系统工具，5、6年之后的今天，还是那个样子，今天流行的好多Windows系统工具都比自己的晚，但进化得很好，且有那么多用户在使用。并且，不要保守自己的技术和思想，尽可能地与人交流与分享，或者传授给开发团队的成员。&ldquo;与人交换苹果之后，每个人还是只有一个苹果；但交换思想之后，每个人都拥有两种思想&rdquo;，道理大家都懂，但有多少人真正能做到呢？ <br /><br />11、尽量参加开源项目的开发、或者与朋友共同研制一些自己的产品，千万不要因为没有钱赚而不做。网络早已不再只是&ldquo;虚拟世界&rdquo;，网上有很多的开源项目、合作开发项目、外包项目，这都是涉猎工作以外的知识的绝好机会，并且能够结识更广的人缘。不要因为工作是做ERP，就不去学习和了解嵌入式、实时、通信、网络等方面的技术，反过来也是一样。如果当他别人拿着合同找你合作，你却这也不会，那也不熟时，你将后悔莫及。 <br /><br />12、书到用时方恨少，不要将自己的知识面仅仅局限于技术方面。诺贝尔经济学奖得主西蒙教授的研究结果表明： &ldquo;对于一个有一定基础的人来说，他只要真正肯下功夫，在6个月内就可以掌握任何一门学问。&rdquo;教育心理学界为感谢西蒙教授的研究成果，故命名为西蒙学习法。可见，掌握一门陌生的学问远远没有想想的那么高难、深奥。多方吸取、广泛涉猎。极力夯实自己的影响圈、尽量扩大自己的关注圈。财务、经济、税务、管理等等知识，有空花时间看看，韬光养晦、未雨绸缪。 <br /><br />13、本文的总结与反思： <br /><br />A：不要去做技术上的高手，除非你的目标如此。虽然本文是关于提高软件开发知识的建议，做技术的高手是我一向都不赞同的。你可以提高自己的专业知识，但能胜任工作即止。 <br /><br />B：提高软件知识和技术只是问题的表面，本质是要提高自己认识问题、分析问题、解决问题的思想高度。软件专业知识的很多方法和原理，可以很容易地延伸、应用到生活的其它方面。 <br /><br />C：在能胜任工作的基础上，立即去涉猎其它领域的专业知识，丰富自己的知识体系、提高自己的综合素质，尤其是那些目标不在技术方面的朋友。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/216799#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Jul 2008 10:01:12 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/216799</link>
        <guid>http://panjun.javaeye.com/blog/216799</guid>
      </item>
          <item>
        <title>Oracle10g RAC安装手册2</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/216790" style="color:red;">http://panjun.javaeye.com/blog/216790</a>&nbsp;
          发表时间: 2008年07月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>第五部分 安装配置Oracle RAC<br />5.1 配置环境变量<br />5.1.1 编辑.bashrc设置 ORACLE_BASE 和 ORACLE_HOME 等环境变量<br />基本路径：<br />ORACLE_BASE=/u01/app/oracle<br />ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1<br />ORA_CRS_HOME=/u01/crs/oracle/product/10.2.0/crs_1<br />据oracle的安装文档要求，CRS的目录最好不是ORACLE_BASE的子目录，因为安装过程中会改变CRS的父目录的权限，这会影响ORACLE的安装。在按以上要求生成对应目录之前，需检查所在磁盘的空间是否满足安装要求，确定之后生成目录，并将相关环境变量设置在oracle用户的profile中。用oracle帐号编辑 /home/oracle/.bashrc<br />oracle用户的profile文件.bashrc内容:<br /># .bashrc<br /># User specific aliases and functions<br /># Source global definitions<br />if [ -f /etc/bashrc ]; then<br />&nbsp;&nbsp;&nbsp; . /etc/bashrc<br />fi<br />export ORACLE_BASE=/u01/app/oracle<br />export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1<br />export ORA_CRS_HOME=/u01/crs/oracle/product/10.2.0/crs_1<br />export ORACLE_SID=dbrac1<br />export ORACLE_TERM=xterm<br />export LD_ASSUME_KERNEL=2.4.1<br />export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data<br />export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib<br />PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin:$ORA_CRS_HOME/bin:/sbin<br />export PATH<br /><br />然后执行<br />$ source .bash_profile<br />使环境变量生效<br /><br />注意：ORACLE_SID每台机器不一样，如dbrac1的SID为dbrac1，dbrac2的SID为dbrac2，以此类推。<br />对LD_ASSUME_KERNEL环境变量的说明：<br />这个参数实际上是为了避免Linux上的 NPTL (Native POSIX Thread Library) 和Oracle应用不兼容的问题. 设定 LD_ASSUME_KERNEL为2.4.1表示使用旧有的 "Linuxthreads with floating stacks" <br /><br />5.1.2创建CRS安装路径<br />注：With Oracle Database 10g Release 2 (10.2), Cluster Ready Services, or CRS, is now called Oracle Clusterware . 见ORACLE 10.2 安装文档之New Features for Oracle Clusterware and RAC Installation<br />1.CRS安装路径的创建及授权<br />如下所示：<br /># mkdir -p /u01/crs/oracle/product/10.2.0/crs_1<br /># chown -R oracle:oinstall /u01/crs/oracle<br /># chmod -R 775 /u01/crs/oracle<br />2.OCR及voting disk安装路径<br />先解释一下ocr（sdb1）和vote（sdb2）文件的用途，<br />OCR（Oracle Cluster Registry）：它记录了机群配置和机群数据库的基本配置，默认大概需要100M的空间，这里我们给了它1000M的空间；<br />Vote：它是CSS（Cluster Synchronization Services）需要的文件，用来判断机群内各个节点的状态，默认大概也需要100M的空间，这里我们也给了它1000M的空间。<br /># mkdir -p /u02/oracrs/<br /># chown -R oracle:oinstall /u02/oracrs/<br /># chmod -R 775 /u02/oracrs/<br />绑定裸设备：<br />#raw /dev/raw/raw1 /dev/sdb1<br />#raw /dev/raw/raw2 /dev/sdb2<br />然后在/etc/sysconfig/rawdevices文件里加如下内容：<br />/dev/raw/raw1 /dev/sdb1<br />/dev/raw/raw2 /dev/sdb2<br />权限：<br /># chown root:oinstall /dev/raw/raw1<br /># chmod 640 /dev/raw/raw1<br /># chown oracle:dba /dev/raw/raw2<br /># chmod 660 /dev/raw/raw2<br />在/etc/rc.local里加如下内容（如果安装软件时出问题，则把root改为oracle）<br />chown root:oinstall /dev/raw/raw1<br />chmod 640 /dev/raw/raw1<br />chown oracle:dba /dev/raw/raw2<br />chmod 660 /dev/raw/raw2<br />以上操作在所有节点上执行<br />在安装CRS的过程中，安装程序会提示用户输入存放OCR和Vote文件的位置。因此，通常我们会使用以下方法设置文件位置（在所有节点上执行），以oracle用户执行：<br />$ ln -s /dev/raw/raw1 /u02/oracrs/ocr.crs<br />$ ln -s /dev/raw/raw2 /u02/oracrs/vote.crs<br /><br />5.1.3创建oracle安装路径<br /># mkdir -p /u01/app/oracle<br /># chown -R oracle:oinstall /u01/app/oracle<br /># chmod -R 775 /u01/app/oracle<br />5.2安装和卸载CRS<br />5.2.1安装CRS<br />需要注意的问题：<br />1、每一步都要看清楚安装路径是否正确<br />2、分清虚拟地址和专用地址<br />3、脚本要一个节点一个节点的执行，切不可同时执行<br />4、如果安装过程中出现in future。。。之类错误，应为两台主机时间不一致导致，解决方法：<br />1〉用root执行net time &ndash;I TARGETIP命令同步<br />2〉如果net time同步仍然不成功，最好配置一台服务器（节点中的一台为ntp服务器），具体配置方法见后面附录<br /><br />在安装CRS之前，确认显示没有问题：<br /># xhost +<br />解压CRS软件:<br /># cp 10201_clusterware_linux_x86_64.cpio.gz /home/oracle<br /># gzip &ndash;d 10201_clusterware_linux_x86_64.cpio.gz<br /># cpio &ndash;idmv &lt; 10201_clusterware_linux_x86_64.cpio<br /># chown &ndash;R oracle:oinstall /home/oracle<br /><br /># su oracle<br />切换到oracle用户，建立安装目录(该命令需要在各个节点上执行)<br />$ mkdir &ndash;p /u01/app/oracle/oraInventory<br />进入解压路径/home/oracle/cluterware执行（在集群的一个节点上执行）：<br />$ ./runInstall<br /><br />进入图形配置界面：<br />1.Welcome；单击 Next <br />2.Specify Inventory Directory and Credentials &mdash; 默认值应该就是正确的；确保 inventory 目录位于 ORACLE_BASE 目录中（例如： /u01/app/oracle/oraInventory）并且操作系统组是&ldquo;oinstall&rdquo;（确保在 /etc/hosts 中而不仅仅是在 DNS 中配置了您的主机） <br />3.Specify File Locations &mdash; 修改安装路径/u01/app/oracle/product/10.2.0/db_1为/u01/crs/oracle/product/10.2.0/crs_1<br />4.Language Selection &mdash; 确认默认值后继续 <br />5.Cluster Configuration &mdash; 输入集群名（或接受默认的&ldquo;crs&rdquo;）；配置public和private地址时，public地址即为主机名（与hostname命令所示相同即可），注意大小写；private地址即为ip，与/etc/hosts中所列相同，virtual 地址填写/etc/hosts中virtual address对应的主机名<br />6.Private Interconnect Enforcement &mdash; 为每个接口指定接口类型（公共、专用或&ldquo;不使用&rdquo;）<br />7.Oracle Cluster Registry &mdash; 选择外部冗余 在 clusterSpecify OCR Location 中输入ocr disk名：/u02/oracrs/ocr.crs<br />8.Voting Disk &mdash; 输入 voting disk 名： /u02/oracrs/vote.crs<br />9.Summary &mdash;单击 Install，开始安装。在安装到最后的时候又会弹出对话框，提示分别在各节点上以root执行orainstRoot.sh和root.sh。注意不要同时运行这些脚本，等一个脚本结束后再运行另一个。<br />执行最后一个root.sh的时候,可能会报""eth0" is not public.Public interfaces should be used to configure virtual IPs."这样的错误.这时候需要以root用户去执行$ORA_CRS_HOME/bin/vipca。起来图形界面&mdash;&mdash;next&mdash;&mdash;Network Interfaces (只选择用于公共网络的接口，本示例中为eth0，集群中所有主机上的这个接口必须相同，即如果在安装主机上该接口是eth0，则在集群中所有其他主机上都必须是eth0)。&mdash;&mdash;Virtual IPs for cluster nodes 在vipca的提示框中输入/etc/hosts中事先定义的虚拟ip地址，vipca会自动将虚拟ip对应的hostname显示出来。VIP 配置助手创建并启动 VIP、GSD 和 ONS 应用程序资源。配置完毕后，oracle会自动为public网卡绑定虚拟地址。<br />在vipca配置完毕后，最好做一下关于vip地址的用户等效性。如执行<br /># ssh dbrac2-vip <br />提示后，输入yes。<br /><br />CRS 安装结束 <br />从 $ORACLE_BASE/product/10.2.0/crs_1/bin 目录中运行 olsnodes 验证安装已成功；例如： <br />$ cd $ORACLE_BASE/product/10.2.0/crs_1/bin<br />$ olsnodes<br />dbrac1<br />dbrac2<br />Once CRS 已安装并运行；现在可以安装 Oracle RAC 软件的其余部分了。<br /><br />5.2.2卸载CRS<br />如果我们安装CRS出现了问题，就必须要卸载CRS了。而CRS是一个很令人头疼的服务，卸载CRS也是一个非常繁琐的工作。在目前的release1中，如果机群中的一个节点重启（无论什么原因，即使crs服务是正常的），机群中的所有节点都会随之重启。因为CSS服务会定期检查机群中所有节点的服务可用性，当有一个节点出现问题，系统为了保证数据一致性，就会令其他节点重启，重新检查服务，直到所有节点服务都正常。但是就我们现在遇到的情况而言，这种重启后自动回复正常的情况极少（目前还没有自动恢复过），经常会导致loopreboot。因此，在metalink上有很多关于这方面的介绍。这里，作者将实战经验与网上经验相结合，总结如下（目前的方法就是卸载所有oracle服务和CRS，然后重装）。<br />1.阻止循环重启的方法<br />方法一：将CRS服务禁止<br />在机器重启之间的那几秒中检测时间内，执行<br /># /etc/init.d/init.crs disable<br />禁止crs服务，在下一此重启后，系统将停止循环，但是要把握操作时机。<br />方法二：拔掉与共享设备的连线<br />ocr和voting disk文件是存放在共享设备中的，而CSS进程每次都要从这些文件中读取机群的配置信息，因此，在机器重启时断掉与共享设备的连接，机器也将停止循环重启。该方法操作简单，但是由于读取数据不完整，对于接下来的修复可能会带来一些不便。<br />方法三：改写启动脚本<br />将/etc/inittab中的最后三行注释掉，如：<br />#h1:35:respawn:/etc/init.d/init.evmd run &gt;/dev/null 2&gt;&amp;1 &lt;/dev/null<br />#h2:35:respawn:/etc/init.d/init.cssd fatal &gt;/dev/null 2&gt;&amp;1 &lt;/dev/null<br />#h3:35:respawn:/etc/init.d/init.crsd run &gt;/dev/null 2&gt;&amp;1 &lt;/dev/null<br />令机器在下一次重启时，不在启动服务。该方法的操作时机要把握好，否则没等文件修改完毕，机器就又要重启。<br />2.在机群中的所有节点上执行$ORA_CRS_HOME/install/rootdelete.sh；<br />3.在机群中的任意一个节点上执行$ORA_CRS_HOME/install/rootdeinstall.sh；<br />4.用图形界面OUI卸载crs；<br />a)执行./runInstall<br />b)在界面中选择Installed；<br />c)选择home1，一般要先安装CRS，所以CRS的home一般都是home。<br />5.在机群所有节点上执行</p>
<p><span style="color: #800000;"><em>/bin/rm -f /etc/init.d/init.cssd<br />/bin/rm -f /etc/init.d/init.crs<br />/bin/rm -f /etc/init.d/init.crsd<br />/bin/rm -f /etc/init.d/init.evmd<br />/bin/rm -f /etc/rc2.d/K96init.crs<br />/bin/rm -f /etc/rc2.d/S96init.crs<br />/bin/rm -f /etc/rc3.d/K96init.crs<br />/bin/rm -f /etc/rc3.d/S96init.crs<br />/bin/rm -f /etc/rc5.d/K96init.crs<br />/bin/rm -f /etc/rc5.d/S96init.crs<br />/bin/rm -rf /etc/oracle<br />/bin/rm -f /etc/inittab.crs<br />/bin/rm -f /etc/oratab<br />/bin/rm -f /etc/oraInst.loc<br />/bin/cp /etc/inittab.orig /etc/inittab<br />/bin/rm -rf /var/tmp/.oracle<br />/bin/rm -rf /u01/crs/oracle/product/10.1.0/crs_1</em></span></p>
<p><br />6.清掉共享磁盘上的内容。<br />如果ocr和voting disk所在分区不大，可以直接用下面命令清除：<br /># dd if=/dev/zero of=/dev/sdb1<br /># dd if=/dev/zero of=/dev/sdb2<br />7.如果可以，重启机群内所有节点。<br />8.清理干净后，按照5.2.1的介绍，重新安装CRS。<br /><br />5.3安装 Oracle 数据库软件RAC<br />5.3.1 图形界面配置<br />执行以下命令(在集群的一个节点上)：<br /># cp 10201_database_linux_x86_64.cpio.gz /home/oracle<br /># cd /home/oracle<br /># gzip &ndash;d 10201_database_linux_x86_64.cpio.gz<br /># cpio &ndash;idmv &lt; 10201_database_linux_x86_64.cpio.gz<br /># cd /home/oracle/database<br /># su oracle<br />$ ./runInstall<br /><br />启动图形界面<br />1.Welcome &mdash; 单击 Next <br />2.Specify File Locations &mdash; 确认默认值后继续 <br />3.Specify Hardware Cluster Installation Mode &mdash; 选择 Cluster Installation 并选择集群中的其他节点 <br />4.Select Installation Type &mdash; Enterprise Edition <br />5.选择数据库配置 &mdash; 选择&ldquo;Do not create a starter database&rdquo;。 （我们将在一个单独的步骤中使用数据库配置助手 (DBCA) 来创建数据库。）在安装到最后的时候又会弹出对话框，提示执行root.sh，这时从安装节点开始，每次在一个节点上运行 Oracle主目录中的 root.sh（例如： /u01/app/oracle/product/10.2.0/db_1/root.sh）。 不要同时运行这些脚本。 等一个脚本结束后再启动另一个.<br />6.Configuration Results &mdash; 检查结果并单击 Exit。 在其他节点上依次运行 root.sh。<br />7.安装结束<br />注意：在 安装 到 65%时，有一个错误：<br />信息: 终止从衍生进程输出。<br />信息: ----------------------------------<br />信息: 操作中出现异常错误: make<br />异常错误名: MakefileException<br />异常错误字符串: 调用 makefile '/oracle/product/10.2.0/db_1/rdbms/lib/ins_rdbms.mk' 的目标 'all_no_orcl' 时出错。请参阅 '/oracle/oraInventory/logs/installActions2005-12-29_10-44-31AM.log' 以了解详细信息。<br />异常错误严重级: 1<br /><br />需要binutils-2.15.92.0.2-13.0.0.0.2.x86_64.rpm补丁<br />并用root用户 按以下语法安装：<br /># rpm -Uvh --force binutils-2.15.92.0.2-13.0.0.0.2.x86_64.rpm<br />安装完给补丁后，点重试，oracle顺利的安装完成 <br /><br />5.4 卸载 Oracle 数据库软件RAC<br />如果我们安装RAC出现了问题，就必须要卸载RAC了。<br />1.停止database的一些活动；<br />2.通过oui卸载RAC<br />3.如果想卸载的再干净一点，可以清空db_1下的所有内容。<br />4.由于$ORACLE_BASE/Orainventory记录了所有oracle软件的安装信息，所以一般不建议删除，否则包括CRS等信息也会被删掉。<br /><br /><br /><br /><br /><br /><br />第六部分 创建和删除数据库<br />6.1 创建数据库<br />在以 oracle 用户身份登录时，设置环境并运行 dbca。 <br />$ dbca<br />图形界面起来以后：<br />1.Welcome &mdash; 选择&ldquo;Oracle Real Application Clusters database&rdquo; <br />2.Operations &mdash; 创建数据库 <br />3.Node Selection &mdash; 单击 Select All <br />4.Database Templates &mdash; 选择general<br />5.Database Identification &mdash; 全局数据库名：dbrac.orademo.org；SID: dbrac<br />6.Management Options &mdash; 利用 Enterprise Manager 配置数据库；使用数据库控制进行数据库管理 <br />7.Database Credentials &mdash; 为所有帐户使用相同的口令；输入口令并再次确认 <br />8.Storage Options &mdash; 自动存储管理 (ASM) <br />9.Create ASM Instance &mdash; 设置 SYS 口令并确认；创建初始化参数文件 (IFILE) <br />10.ASM Disk Groups &mdash; Create New&gt;Create Disk Group&gt;Disk Group Name (DATA)；冗余（external）；更改磁盘发现路径（ORCL:* &mdash; 即使磁盘显示为已供应状态，仍然必须输入此项，否则会出错）；选择磁盘；输入故障组名；选择新创建的磁盘组 <br />11.Database File Locations &mdash; 使用 Oracle 管理的文件 <br />12.Recovery Configuration &mdash; 单击 Next <br />13.Database Content &mdash; 示例模式 <br />14.Initialization Parameters &mdash; 内存:把默认的40％改为60％；字符集的设定:要选择ZHSGBK16和UTF8。<br />15.Database Storage &mdash; 单击 Next <br />16.Create Options &mdash; 选择&ldquo;Create Database&rdquo; <br />17.Summary &mdash; 检查总结信息并单击 OK <br />根据经验，需要注意的有几下几点：<br />1.使用ASM管理共享磁盘的方法，将为数据库中的每个节点创建自己的ASM实例。如果系统中已存在ASM实例，可以继续使用，但需要输入ASM的管理密码；<br />2.使用ASM需要创建ASM DiskGroup，如果磁盘组存在，则可以选用现有的组；如果不存在，要创建一个。<br />a)点击&ldquo;create new&rdquo;，输入磁盘组的名称；<br />b)冗余程度。如果你的盘阵本身有raid保护，则可以选择external，这样的空间利用率最大；否则，normal的利用率是一半，因为是两个failure group做镜像；high的利用率是三分之一，因为是三个failure group做镜像；<br />c)磁盘候选。分为&ldquo;show member&rdquo;和&ldquo;show all&rdquo;两种，第一种显示尚未分配的磁盘，第二种显示所有磁盘。有时虽然已经删掉了以前的数据库，但是没有删掉磁盘组，所以磁盘仍会显示为已用，这是就需要show all。切记，一定要修改磁盘路径为ORCL:*，否则即使选中也会被视为无效。如果想选择那些已经被其他组用过的盘，则需要选择force，强制执行。<br />3.创建DB过程中会报错，点击确定即可。随后dbca会自动启动各个节点的instance，但是除了安装节点的正常，其他的都会报错。这是因为创建的ASM DiskGroup的时候，其他节点的ASM实例没有mount磁盘组。因此需要在其他节点上执行一下命令：<br /># srvctl stop asm &ndash;n hostname<br /># srvctl start asm &ndash;n hostname<br /># srvctl start instance &ndash;I instance_name on hostname&ndash;d database_name<br />最后用命令<br /># srvctl status database &ndash;d database_name<br />检查，是否所有节点的instance都已经running。<br /><br />6.2 删除数据库<br />删除数据库最好也用dbca，虽然srvctl也可以。<br />1.运行dbca，选择&rdquo;delete a database&rdquo;。然后就next..，直到finish。<br />2.数据的删除并不影响asm实例，如果想删除与asm有关的内容，可以按如下做法：<br /># export ORACLE_SID=ASM_instance_name<br /># sqlplus / as sysdba<br />SQL&gt; drop diskgroup diskgroup_name including contents;<br />SQL&gt; quit<br />然后在各个节点上执行<br /># srvctl stop asm &ndash;n hostname<br /># srvctl remove asm &ndash;n hostname<br />这样，应该就可以删除的比较干净了。<br /><br /><br />Lsnrctl start<br /><br />6.3 验证数据库安装正确<br />$su oracle<br />$sqlplus /nolog<br />&gt;connect / as sysdba<br />Connected<br />&gt;startup<br />ORA-01081:cannot start already-running ORACLE &ndash;shut it down first ---说明数据库已经运行<br />&gt;connect system/oracle@dbrac1<br />Connected<br />&gt;connect system/oracle@dbrac2<br />Connected<br />两个节点提示connected说明数据库在两个节点上正常运行。 <br />6.4 数据库troubleshooting<br />重起后出现问题：<br />#su - oracle<br />$ srvctl status nodeapps &ndash;n dbrac1<br />VIP is running on node: dbrac1<br />GSD is not running on node: dbrac1<br />Listener is not running on node: dbrac1<br />ONS daemon is not running on node: dbrac1<br /><br />$ srvctl status nodeapps &ndash;n dbrac2<br />VIP is running on node: dbrac2<br />GSD is not running on node: dbrac2<br />Listener is not running on node: dbrac2<br />ONS daemon is not running on node: dbrac2<br /><br />暂时解决办法：<br />在各节点上分别:<br /># /etc/init.d/oracleasm enable<br />#/etc/init.d/oracleasm scandisks<br />然后在主节点上运行：<br />#su - oracle<br />$crs_stop -all<br />$srvctl stop nodeapps -n dbrac1<br />$srvctl stop nodeapps -n dbrac2<br />$srvctl start nodeapps -n dbrac1<br />$srvctl start nodeapps -n dbrac2<br />$crs_start -all<br />$srvctl start database -d dbrac<br /><br />为什么呢&hellip;&hellip;&hellip;.<br /><br />第七部分 附录<br />7.1 CRS进程介绍<br />CRS 维护着两个文件： Oracle Cluster Registry (OCR) 和 Voting Disk。 OCR 和 Voting Disk 必须以原始分区或集群文件系统文件的形式存在于共享磁盘上。 <br />在以前的版本中，Oracle RAC必须借助第三方Cluster软件，但是从Oracle10g开始，我们有了新的选择。CRS就是这样一个替代产品，用以提供RAC环境中的群集服务。<br />CRS是一个单独的产品，在构建RAC环境中，需要单独安装。<br />系统启动以后，CRS会自动启动，启动主要由/etc/init.d中的几个脚本完成:<br />[eygle@raclinux1 init.d]$ ll init*<br />-r-xr-xr-x 1 root root 1951 Jun 27 13:27 init.crs<br />-r-xr-xr-x 1 root root 4735 Jun 27 20:32 init.crsd<br />-r-xr-xr-x 1 root root 35401 Jun 27 13:27 init.cssd<br />-r-xr-xr-x 1 root root 3197 Jun 27 13:27 init.evmd<br /><br />CRS启动的三个主要的后台进程为:<br />[oracle@raclinux1 bin]$ ps -ef|grep d.bin<br />root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3140&nbsp;&nbsp;&nbsp;&nbsp; 1 0 23:13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00:00:00 /u01/app/oracle/product/10.2.0/crs/bin/crsd.bin<br />oracle&nbsp;&nbsp;&nbsp; 3884 3062 0 23:14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00:00:00 /u01/app/oracle/product/10.2.0/crs/bin/evmd.bin<br />oracle&nbsp;&nbsp;&nbsp; 4017 3983 0 23:14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00:00:00 /u01/app/oracle/product/10.2.0/crs/bin/ocssd.bin<br />oracle&nbsp;&nbsp; 21117 13799 0 23:29 pts/1&nbsp;&nbsp; 00:00:00 grep d.bin<br />这几个进程的主要作用如下:<br />CRSD:<br />- Engine for HA operation <br />- Manages 'application resources'<br />- Starts, stops, and fails 'application resources' over<br />- Spawns separate 'actions' to start/stop/check application resources<br />- Maintains configuration profiles in the OCR (Oracle Configuration Repository)<br />- Stores current known state in the OCR.<br />- Runs as root<br />- Is restarted automatically on failure<br /><br />OCSSD:<br />- OCSSD is part of RAC and Single Instance with ASM<br />- Provides access to node membership<br />- Provides group services<br />- Provides basic cluster locking<br />- Integrates with existing vendor clusteware, when present<br />- Can also runs without integration to vendor clustware<br />- Runs as Oracle.<br />- Failure exit causes machine reboot. <br />--- This is a feature to prevent data corruption in event of a split brain.<br />注意，ocssd进程在单实例ASM系统中也可以见到，以下是我的一个单实例ASM系统，ocssd进程同样存在:<br />bash-2.03# ps -ef|grep _+ASM<br />oracle 3264&nbsp;&nbsp;&nbsp;&nbsp; 1 0&nbsp;&nbsp; Aug 25 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:01 asm_lgwr_+ASM<br />&nbsp;&nbsp;&nbsp; root 12669 8167 0 11:58:56 pts/1&nbsp;&nbsp;&nbsp; 0:00 grep _+ASM<br />oracle 3270&nbsp;&nbsp;&nbsp;&nbsp; 1 0&nbsp;&nbsp; Aug 25 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:00 asm_rbal_+ASM<br />oracle 3266&nbsp;&nbsp;&nbsp;&nbsp; 1 0&nbsp;&nbsp; Aug 25 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:05 asm_ckpt_+ASM<br />oracle 3268&nbsp;&nbsp;&nbsp;&nbsp; 1 0&nbsp;&nbsp; Aug 25 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:00 asm_smon_+ASM<br />oracle 3262&nbsp;&nbsp;&nbsp;&nbsp; 1 0&nbsp;&nbsp; Aug 25 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:00 asm_dbw0_+ASM<br />oracle 3258&nbsp;&nbsp;&nbsp;&nbsp; 1 0&nbsp;&nbsp; Aug 25 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:00 asm_pmon_+ASM<br />oracle 3260&nbsp;&nbsp;&nbsp;&nbsp; 1 0&nbsp;&nbsp; Aug 25 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:00 asm_mman_+ASM<br />bash-2.03# ps -ef|grep ocssd<br />&nbsp;&nbsp;&nbsp; root 12672 8167 0 11:59:01 pts/1&nbsp;&nbsp;&nbsp; 0:00 grep ocssd<br />oracle 5374&nbsp;&nbsp;&nbsp;&nbsp; 1 0&nbsp;&nbsp; Apr 07 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:01 /opt/oracle/product/10.2.0/bin/ocssd.bin<br />bash-2.03# <br />ocssd进程非常重要，如果该进程异常中止，会导致系统crash。<br />在某些极端情况下，如果ocssd无法正常启动，会导致操作系统循环重启。这时候需要DBA介入进行一些特殊处理。<br />EVMD:<br />- Generates events when things happen<br />- Spawns a permanent child evmlogger<br />- Evmlogger, on demand, spawns children<br />- Scans callout directory and invokes callouts.<br />- Runs as Oracle.<br />- Restarted automatically on failure<br /><br />我们可以通过CRS工具来查看CRS状态:<br />[oracle@raclinux1 ~]$ cd $ORA_CRS_HOME/bin<br />[oracle@raclinux1 bin]$ pwd<br />/u01/app/oracle/product/10.2.0/crs/bin<br />[oracle@raclinux1 bin]$ ./crs_stat<br />NAME=ora.RACDB.RACDB1.inst<br />TYPE=application<br />TARGET=ONLINE<br />STATE=ONLINE on raclinux1<br /><br />NAME=ora.RACDB.RACDB2.inst<br />TYPE=application<br />TARGET=ONLINE<br />STATE=ONLINE on raclinux1<br /><br />NAME=ora.RACDB.db<br />TYPE=application<br />TARGET=ONLINE<br />STATE=ONLINE on raclinux1<br /><br />NAME=ora.raclinux1.ASM1.asm<br />TYPE=application<br />TARGET=ONLINE<br />STATE=ONLINE on raclinux1<br /><br />NAME=ora.raclinux1.LISTENER2_RACLINUX1.lsnr<br />TYPE=application<br />TARGET=ONLINE<br />STATE=ONLINE on raclinux1<br /><br />NAME=ora.raclinux1.LISTENER_RACLINUX1.lsnr<br />TYPE=application<br />TARGET=ONLINE<br />STATE=ONLINE on raclinux1<br /><br />NAME=ora.raclinux1.gsd<br />TYPE=application<br />TARGET=ONLINE<br />STATE=ONLINE on raclinux1<br /><br />NAME=ora.raclinux1.ons<br />TYPE=application<br />TARGET=ONLINE<br />STATE=ONLINE on raclinux1<br /><br />NAME=ora.raclinux1.vip<br />TYPE=application<br />TARGET=ONLINE<br />STATE=ONLINE on raclinux1</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/216790#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Jul 2008 09:34:54 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/216790</link>
        <guid>http://panjun.javaeye.com/blog/216790</guid>
      </item>
          <item>
        <title>Oracle10g RAC安装手册1</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/216789" style="color:red;">http://panjun.javaeye.com/blog/216789</a>&nbsp;
          发表时间: 2008年07月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>概述<br />本手册在以下环境中试验安装成功：<br />1、曙光s4800服务器(AMD 64位 双网卡)2台，硬盘已做好raid 1<br />2、光纤盘阵、光纤交换机<br />3、服务器安装 redhat as4 update 2，内核版本2.6.9-22.ELsmp<br />本次安装需要的软件：<br />1、10201_database_linux_x86_64.cpio.gz<br />2、10201_clusterware_linux_x86_64.cpio.gz<br />3、oracleasm-support-2.0.3-1.x86_64.rpm<br />4、oracleasmlib-2.0.2-1.x86_64.rpm<br />5、oracleasm-2.6.9-22.ELsmp-2.0.3-1.x86_64.rpm<br />6、binutils-2.15.92.0.2-13.0.0.0.2.x86_64.rpm<br />下载地址：<br />1、2 http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10201linx8664soft.html<br />3、4、5 http://www.oracle.com/technology/software/tech/linux/asmlib/rhel4.html<br />6、 http://oss.oracle.com/projects/compat-oracle/files/RedHat/<br />本手册的根本目标是安装并实现Asm+RAC，安装过程中以安装实际情况为准，并参考网上很多实施方案、OTN网站等大量文档，力争把安装中遇到的问题及解决方法完整的表达出来。<br />本文档由 Oracle10g RAC数据库简介、安装Redhat as4.0、针对Oracle配置redhat、ASM配置共享磁盘、安装配置Oracle RAC、创建和删除数据库六部分组成。<br /><br />！以下部分如果没有特别说明，则要求在每个节点分别执行<br /><br /><br /><br />第一部分 Oracle10g RAC数据库简介<br />oracle10g RAC结构<br />下图显示了 Oracle RAC 10g 配置的主要组件。 集群中的节点通常是单独的服务器（主机）， 本文中，两个节点即是两台s4800服务器。根据集群规模的大小，可以扩展到更多节点。<br /><br />硬件<br />在硬件级别上，RAC 集群中的各节点共享三种功能： <br />1.对共享磁盘存储的访问 <br />2.与专用网络的连接 <br />3.对公共网络的访问。<br />共享磁盘存储<br />Oracle RAC 依赖于一个共享磁盘体系结构。 数据库文件、联机重做日志和数据库的控制文件必须都能为集群中的每个节点所访问。 共享磁盘还存储 Oracle Cluster Registry 和 Voting Disk（稍后讨论）。 配置共享存储有多种方法，包括直接连接磁盘（通常是使用铜缆或光纤的 SCSI）、存储区域网 (SAN) 和网络连接存储 (NAS)。 <br />专用网络<br />每个集群节点通过专用高速网络连接到所有其他节点，这种专用高速网络也称为集群互联或高速互联 (HSI)。 Oracle 的 Cache Fusion 技术使用这种网络将每个主机的物理内存 (RAM) 有效地组合成一个高速缓存。 Oracle Cache Fusion 通过在专用网络上传输某个 Oracle 实例高速缓存中存储的数据允许其他任何实例访问这些数据。 它还通过在集群节点中传输锁定和其他同步信息保持数据完整性和高速缓存一致性。 <br />专用网络通常是用千兆以太网构建的，但是对于高容量的环境，很多厂商提供了专门为 Oracle RAC 设计的低延迟、高带宽的专有解决方案。 Linux 还提供一种将多个物理 NIC 绑定为一个虚拟 NIC 的方法（此处不涉及）来增加带宽和提高可用性。 <br />公共网络<br />为维持高可用性，为每个集群节点分配了一个虚拟 IP 地址 (VIP)。 如果主机发生故障，则可以将故障节点的 IP 地址重新分配给一个可用节点，从而允许应用程序通过相同的 IP 地址继续访问数据库。<br />Oracle 集群就绪服务(CRS)<br />Oracle RAC 10g 引进了 Oracle 集群就绪服务 (CRS) &mdash; 一组用于集群环境的与平台无关的系统服务。 在 RAC 和 Oracle 并行服务器先前版本中，Oracle 依靠厂商提供的集群管理软件来提供这些服务。 虽然 CRS 与厂商供应的集群件协同工作，但 Oracle RAC 10g 所需组件只是 CRS。 实际上，必须在安装 RAC 之前安装 CRS。 <br /><br />Oracle RAC 软件<br />Oracle RAC 10g 软件是 RAC 数据库的核心，每个集群节点上都必须安装。 幸运的是，Oracle Universal Installer (OUI) 可以完成在每个节点上安装 RAC 软件的大部分工作。 您只需在一个节点上安装 RAC &mdash; OUI 会完成其余的工作。 <br />Oracle 自动存储管理 (ASM)<br />ASM 是 Oracle 数据库 10g 中的一个新特性，它以一种与平台无关的方式提供文件系统服务、逻辑容量管理器和软件 RAID。Oracle ASM 可以条带化和镜像磁盘，从而实现了在数据库被加载的情况下添加或移除磁盘以及自动平衡 I/O 以删除&ldquo;热点&rdquo;。它还支持直接和异步的 I/O，并使用 Oracle9i 中引入的 Oracle 数据管理器 API（简化的 I/O 系统调用接口）。 <br />Oracle ASM 不是通用的文件系统，只能用于 Oracle 数据文件、重做日志、控制文件和 RMAN 快速恢复区。ASM 中的文件既可以由数据库自动创建和命名（使用 Oracle 管理文件特性），也可以由 DBA 手动创建和命名。由于操作系统无法访问 ASM 中存储的文件，因此对使用 ASM 文件的数据库执行备份和恢复操作的唯一途径就是使用恢复管理器 (RMAN)。 <br />ASM 作为单独的 Oracle 实例实施，只有它在运行时其他数据库才能访问它。ASM 需要的内存不多： 对大部分系统来说只需 64MB。 在 Oracle RAC 环境中，ASM 实例必须运行在每个集群节点上。<br />第二部分 安装Redhat AS 4.0 （Update2）<br />本文档实例安装在曙光S4800服务器上，双网卡、每个节点通过光纤交换机连接两个盘阵。安装过程中最好把连接节点和盘阵的光纤拔下；或者如果不拔下光纤，安装过程中分区时只选择本机硬盘，不要选择盘阵。<br />假设服务器全新安装redhat，并且服务器为oracle专用。<br />Oracle 10g 经认证可以在不需要更新的情况下运行 Redhat AS 4.0的基本版本。<br />1.使用第一张 CD 启动服务器。 <br />您可能需要更改 BIOS 设置，以允许从 CD 启动。<br />2.启动屏幕上出现时在底部显示 boot:。 <br />选择 Enter，从控制台上执行图形安装。（对于其他安装方法和选项，请参阅 Red Hat 安装指南。）<br />安装程序扫描硬件，短暂显示 Red Hat 闪屏，然后开始显示一系列屏幕提示。<br />3.选择语言 <br />选择简体中文。<br />4.配置键盘 <br />接受默认值。<br />5.欢迎屏幕 <br />单击 下一步。<br />6.配置鼠标 <br />接受默认值。<br />7.安装类型 <br />选择 Custom。<br />8.设置磁盘分区 <br />本文不介绍磁盘分区的详细方法，而是假设您熟悉磁盘分区方法。 <br />（警告：对磁盘进行错误分区是删除硬盘上所有内容的最可靠、最快捷的方法之一。如果不确定如何分区，请先停下来，找人帮帮您，否则您将冒丢失数据的危险！） <br />本文使用默认分区方案（文件系统均为 ext3），须注意如下一点：<br />-交换分区 &mdash; 将此分区大小至少设置为系统 RAM 的两倍，但32位系统不要超过 2GB。如果需要大于 2GB 的交换空间，则创建多个交换分区。<br />9.配置启动加载程序 <br />接受默认值。<br />10.配置网络 <br />此时配置两个网卡，用规划好的两个地址，一个公网地址，一个私有地址。<br />使用静态 IP 地址配置数据库服务器。单击 Edit。<br />出现一个弹出窗口。取消选中 Configure using DHCP 复选框，并输入服务器的 IP 地址和网络掩码。确保选中 Activate on boot，然后单击 OK。 <br />在 Hostname 框中，选择 manually 并输入主机名dbrac1&hellip;&hellip;集群依次类推。 <br />在 Miscellaneous Settings 框中，输入其他网络设置。<br />11.配置防火墙 <br />本次将不配置防火墙。选择 No firewall。 <br />12.其他语言支持 <br />接受默认值。<br />13.选择时区 <br />选择适合您区域的时间设置。将系统时钟设置为 UTC 对服务器而言通常是一个很好的做法。为此，单击 System clock uses UTC。 <br />14.设置 Root 口令 <br />输入 root 的口令，并再次输入以进行确认。<br />15.选择程序包组 <br />最下面选择全选。<br />单击 下一步 继续操作。<br />16.准备安装 <br />单击 下一步。<br />17.安装程序包 <br />软件将被复制到硬盘并被安装。根据提示更改光盘，然后在安装完成时单击 下一步。<br />18.配置图形界面 (X) <br />接受默认值，除非安装程序无法识别您的视频卡。如果您的视频卡无法被识别，则将无法继续操作。<br />19.配置监视器 <br />如果安装程序正确识别了您的监视器，则接受默认值。否则，从列表中选择一个兼容的监视器。<br />20.定制图形配置 <br />接受默认值。<br />21.恭喜 <br />从系统中取出安装介质，然后单击 下一步。<br />22.系统自动重新启动并显示一个新的欢迎屏幕。 <br />单击下一步。<br />23.许可协议 <br />阅读许可协议。如果同意其中的条款，则选择 Yes, I agree to the License Agreement 并单击下一步。 <br />24.日期和时间 <br />设置日期和时间。<br />如果要使用 NTP 服务器（推荐），则选择 Enable Network Time Protocol 并输入 NTP 服务器的名称。 <br />25.用户帐户 <br />此时不要为 oracle 创建帐户。本部分稍后将介绍如何创建 oracle 帐户。<br />26.Red Hat Network <br />如果要立即使用或激活 Red Hat Network 帐户，则接受默认值，单击 Next 并遵循 Red Hat 产品附带的产品激活说明。<br />如果不能连到网络，此时可不必激活，随便填上，检测网络不通，跳过即可<br />27.其他 CD <br />单击下一步。<br />28.完成设置 <br />单击下一步。<br />29.出现一个图形登录屏幕。 <br />30.恭喜！您的 Linux 软件现已安装完毕。<br />验证安装<br />验证内核版本： <br /># uname -r<br />2.6.9-22.ELsmp<br />验证已安装的程序包： <br /># rpm -q make gcc gcc-c++ libaio libaio-devel <br />make-3.80-184.1<br />gcc-3.3.3-43.24<br />gcc-c++-3.3.3-43.24<br />libaio-0.3.98-18.3<br />libaio-devel-0.3.98-18.3<br />注：应显示更高版本<br /><br /><br /><br /><br /><br />第三部分 针对Oracle配置redhat<br />Linux 软件现已安装完毕，现在需要针对 Oracle 对其进行配置。<br />3.1 验证系统要求 <br />要验证系统是否满足 Oracle 10g 数据库的最低要求，以 root 用户身份登录并运行以下命令。 <br />要查看可用 RAM 和交换空间大小，运行以下命令：<br />grep MemTotal /proc/meminfo<br />grep SwapTotal /proc/meminfo<br /><br />例如：<br /># grep MemTotal /proc/meminfo<br />MemTotal:512236 kB<br /># grep SwapTotal /proc/meminfo<br />SwapTotal:1574360 kB<br />所需最小 RAM 为 512MB，而所需最小交换空间为 1GB。对于 RAM 小于或等于 2GB 的系统，交换空间应为 RAM 数量的两倍；对于 RAM 大于 2GB 的系统，交换空间应为 RAM 数量的一到两倍。 <br />Oracle 10g 软件还需要 2.5GB 的可用磁盘空间，而数据库则另需 1.2GB 的可用磁盘空间。/tmp 目录至少需要 400MB 的可用空间。<br />3.2 内核参数<br />1.内核参数<br />在/etc/sysctl.conf中编辑：</p>
<p><em><span style="color: #800000;">kernel.shmall = 2097152<br />kernel.shmmax = 2147483648<br />kernel.shmmni = 4096<br />kernel.sem = 250 32000 100 128<br />fs.file-max = 65536<br />net.ipv4.ip_local_port_range = 1024 65000<br />net.core.rmem_default = 262144<br />net.core.rmem_max = 262144<br />net.core.wmem_default = 262144<br />net.core.wmem_max = 262144</span></em><br /><br />然后用执行/sbin/sysctl &ndash;p<br /><br />2.hangcheck-timer设置<br />RAC节点间通过CSS来判断通信状态，因此需要设定定时器来触发判断。该定时器就是linux内核自带的hangcheck-timer。<br />具体操作：<br />在/etc/rc.local中加入（数值以具体情况而定，以下是默认值）<br />modprobe hangcheck-timer hangcheck_tick=30 hangcheck_margin=180<br />表示，每隔30秒检查一下节点状态，如果180秒内仍没有反应，则重启该节点。这也就是说，检查的间隔最长为30＋180秒，如果超过这个时间，则系统重启。<br />Tip：如果系统尚不稳定，可将数值设置的大一些，这样可以有充分的时间来修复系统，否则系统会进入循环重启状态。<br />3.3 添加oracle用户和组<br /># /usr/sbin/groupadd oinstall<br /># /usr/sbin/groupadd dba<br /># /usr/sbin/useradd -m -g oinstall -G dba oracle<br /># id oracle<br />uid=1000(oracle) gid=1000(oinstall) groups=1000(oinstall),6(disk),1001(dba)<br /><br />设置 oracle 帐户的口令： <br /># passwd oracle<br />Changing password for user oracle.<br />New password:<br />Retype new password:<br />passwd:all authentication tokens updated successfully.<br /><br />设置oracle的shell限制：<br />在/etc/security/limits.conf文件中加入：<br /><em><span style="color: #800000;">oracle soft nproc 2047<br />oracle hard nproc 16384<br />oracle soft nofile 1024<br />oracle hard nofile 65536</span></em></p>
<p><br />3.4 网络设置<br />注：此处使用的公共地址为规划好后的地址，不能为临时地址（除非试验安装）<br />RAC要求机群内的每个节点至少有两块网卡，一个设置为公用（公网），对外提供服务；一个设置为私用（专用），提供节点内的告诉传输。此外还需要为公用网卡配置一个虚拟地址，oracle需要借此为用户提供透明的高可用服务。具体介绍如下：<br />专用网络<br />每个集群节点通过专用高速网络连接到所有其他节点，这种专用高速网络也称为集群互联或高速互联 (HSI)。 Oracle 的 Cache Fusion 技术使用这种网络将每个主机的物理内存 (RAM) 有效地组合成一个高速缓存。 Oracle Cache Fusion 通过在专用网络上传输某个 Oracle 实例高速缓存中存储的数据允许其他任何实例访问这些数据。 它还通过在集群节点中传输锁定和其他同步信息保持数据完整性和高速缓存一致性。 <br />专用网络通常是用千兆以太网构建的，但是对于高容量的环境，很多厂商提供了专门为 Oracle RAC 设计的低延迟、高带宽的专有解决方案。 Linux 还提供一种将多个物理 NIC 绑定为一个虚拟 NIC 的方法（此处不涉及）来增加带宽和提高可用性。 <br />公共网络<br />为维持高可用性，为每个集群节点分配了一个虚拟 IP 地址 (VIP)。 如果主机发生故障，则可以将故障节点的 IP 地址重新分配给一个可用节点，从而允许应用程序通过相同的 IP 地址继续访问数据库。 <br />修改/etc/hosts加入下面内容，:</p>
<p><br /><span style="color: #800000;"><em>127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost.localdomain&nbsp;&nbsp; localhost<br /># public address<br />10.45.170.17&nbsp;&nbsp;&nbsp;&nbsp; dbrac1<br />10.45.170.18&nbsp;&nbsp;&nbsp; dbrac2<br /># private address<br />172.168.0.17&nbsp;&nbsp; dbrac1-eth0<br />172.168.0.18&nbsp;&nbsp; dbrac2-eth0<br /># virtual address<br />10.45.170.117&nbsp;&nbsp;&nbsp; dbrac1-vip<br />10.45.170.118&nbsp;&nbsp;&nbsp; dbrac2-vip</em></span></p>
<p><br />虚拟地址可以随便起一个（保证同一个网段），在安装RAC的时候，vipca会自动将虚拟地址绑定在公共网卡上的。<br /><br /><br />3.5 为用户等效性设置SSH<br />在安装 Oracle RAC 10g 期间，OUI 需要把文件复制到集群中的其他主机上并在其上执行程序。 为了允许 OUI 完成此任务，必须配置 SSH 以启用用户等效性。 用 SSH 建立用户等效性就提供了一种在集群中其他主机上复制文件和执行程序时不需要口令提示的安全方式。 <br />第一步是生成 SSH 的公共密钥和专用密钥。 SSH 协议有两个版本；版本 1 使用 RSA，版本 2 使用 DSA，因此我们将创建这两种类型的密钥，以确保 SSH 能够使用任一版本。 ssh-keygen 程序将根据传递给它的参数生成任一类型的公共密钥和专用密钥。 <br />当您运行 ssh-keygen 时，将提示您输入一个用于保存密钥的位置。 当提示时只需按 Enter 接受默认值。 随后将提示您输入一个口令短语。 输入您能记住的口令，然后再次输入该口令进行确认。 当您完成以下步骤后，在 ~/.ssh 目录中将会有四个文件： id_rsa、id_rsa.pub、id_dsa 和 id_dsa.pub。 id_rsa 和 id_dsa 文件是您的专用密钥，千万不要告诉任何人。 id_rsa.pub 和 id_dsa.pub 文件是您的公共密钥，必须将其复制到集群中其他每个主机上。<br />在每个主机上，以 oracle 用户身份登录：<br />$ mkdir ~/.ssh<br />$ chmod 755 ~/.ssh<br />$ /usr/bin/ssh-keygen -t rsa<br />Generating public/private rsa key pair.<br />Enter file in which to save the key (/home/oracle/.ssh/id_rsa): <br />Enter passphrase (empty for no passphrase): <br />Enter same passphrase again:<br />Your identification has been saved in /home/oracle/.ssh/id_rsa.<br />Your public key has been saved in /home/oracle/.ssh/id_rsa.pub.<br />The key fingerprint is:<br />4b:df:76:77:72:ba:31:cd:c4:e2:0c:e6:ef:30:fc:37 oracle@ds1.orademo.org<br />注意：本例中此处一路按回车选择默认<br />$ /usr/bin/ssh-keygen -t dsa<br />Generating public/private dsa key pair.<br />Enter file in which to save the key (/home/oracle/.ssh/id_dsa):<br />Enter passphrase (empty for no passphrase):<br />Enter same passphrase again:<br />Your identification has been saved in /home/oracle/.ssh/id_dsa.<br />Your public key has been saved in /home/oracle/.ssh/id_dsa.pub.<br />The key fingerprint is:<br />af:37:ca:69:3c:a0:08:97:cb:9c:0b:b0:20:70:e3:4a oracle@ds1.orademo.org<br />注意：本例中此处一路按回车选择默认<br /><br />现在，必须将每个主机上的公共密钥文件 id_rsa.pub 和 id_dsa.pub 的内容复制到其他每个主机的 ~/.ssh/authorized_keys 文件中。 使用 ssh 将每个文件的内容复制到 ~/.ssh/authorized_keys 文件。 请注意，当您使用 ssh 第一次访问远程主机时，其 RSA 密钥将是未知的，从而将提示您确认是否希望连接该主机。 SSH 将记录该远程主机的 RSA 密钥，并在以后连接该主机时不再做出相关提示。 <br />只需在第一个主机上，以 oracle 用户身份登录（复制本地帐户的密钥，以便连接本地主机的 ssh 能够起作用）：<br /><br />（如果您要剪切和粘贴这些命令，则分别运行它们。 SSH 每次会提示输入 oracle 的口令，如果同时粘贴这些命令，则第一个命令在提示输入口令之前刷新输入缓冲区，从而导致其他命令将会丢失。） <br />$ cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys<br />$ cat ~/.ssh/id_dsa.pub &gt;&gt; ~/.ssh/authorized_keys<br />$ ssh oracle@dbrac2 cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys<br />The authenticity of host 'dbrac2 (10.49.9.100)' can't be established.<br />RSA key fingerprint is d1:23:a7:df:c5:fc:4e:10:d2:83:60:49:25:e8:eb:11.<br />Are you sure you want to continue connecting (yes/no)? yes<br />Warning: Permanently added 'dbrac2,10.49.9.100' (RSA) to the list of known hosts.<br />oracle@dbrac2's password: <br />$ ssh oracle@dbrac2 cat ~/.ssh/id_dsa.pub &gt;&gt; ~/.ssh/authorized_keys<br />oracle@dbrac2's password:<br />$ chmod 644 ~/.ssh/authorized_keys<br />要对第二个主机做同样的处理。请注意，这次有的SSH不会提示您输入oracle的口令。这是因为第一个主机(dbrac1)现在知道了第二个主机的公共密钥，而SSH现在使用的是一种不同的认证协议。 <br /><br />建立用户等效性 <br />如果一切均设置正确，则您现在就可以使用 ssh 在其他集群主机上不必输入口令而登录、执行程序和复制文件了。 通过在远程集群主机上运行诸如 date 等简单命令来验证用户等效性： <br />$ ssh dbrac2 date<br />Sun Jun 27 19:07:19 CDT 2004<br />测试每个方向上所有服务器的连通性是非常重要的。这样会确保当 OUI 在 CRS 和数据库软件安装期间试图复制文件时不会出现类似以下的消息。 该消息只有在远程节点上第一次执行操作时才会出现，因此通过测试连通性，您不仅确保了远程操作的正常运行，还完成了初始的安全密钥交换。 <br />The authenticity of host 'dbrac2 (10.49.9.100)' can't be established.<br />RSA key fingerprint is 8f:a3:19:76:ca:4f:71:85:42:c2:7a:da:eb:53:76:85.<br />Are you sure you want to continue connecting (yes/no)? yes<br />注意: 以上步骤执行完以后，需要执行和本机建立等效性，否则安装CRS时也会出错，在每个节点上分别执行：<br />$ ssh hostname<br />(此处hostname分别为dbrac1、dbrac2)<br /><br /><br /><br /><br /><br /><br />第四部分 ASM配置共享磁盘<br />配置共享磁盘的方法有三种：<br />1. Oracle 集群文件系统 (OCFS)<br />2. 自动存储管理器 (ASM)<br />3. 原始设备<br />从可扩展性和可管理性方面考虑，我们使用的是用ASM Library Driver配置ASM的共享磁盘。其他两种配置共享磁盘的方法将在最后面的附录部分介绍。<br /><br /><br /><br /><br />4.1安装ASM软件<br />从http://www.oracle.com/technology/software/tech/linux/asmlib/rhel4.html找到要下载的三个RPM 软件包，注意，一定要与内核版本和系统平台相符。<br />用root权限执行：<br /># rpm -Uvh oracleasm-support-version.arch.rpm \<br />oracleasm-kernel-version.arch.rpm \<br />oracleasmlib-version.arch.rpm<br />在我们系统中，为：<br />#rpm &ndash;Uvh oracleasm-support-2.0.3-1.x86_64.rpm \<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; oracleasm-2.6.9-22.ELsmp-2.0.3-1.x86_64.rpm \<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; oracleasmlib-2.0.2-1.x86_64.rpm<br />1.Preparing... #################################### [100%]<br />2:oracleasm-support&nbsp;&nbsp; ############################## [ 33%]<br />3:oracleasm-2.6.9-22.ELsmp ########################## [ 66%]<br />Linking module oracleasm.o into the module path [ OK ]<br />3:oracleasmlib #################################### [100%]<br /><br />对ASM进行配置：<br /># /etc/init.d/oracleasm configure<br />Configuring the Oracle ASM library driver.<br />这将配置 Oracle ASM 库驱动程序的启动时属性。以下问题将确定在启动时是否加载驱动程序以及它将拥有的权限。当前值将显示在方括号（&ldquo;[]&rdquo;）中。按 &lt;ENTER&gt; 而不键入回应将保留该当前值。按 Ctrl-C 将终止。 <br />Default user to own the driver interface []:oracle<br />Default group to own the driver interface []:dba<br />Start Oracle ASM library driver on boot (y/n) [n]:y<br />Fix permissions of Oracle ASM disks on boot (y/n) [y]:y<br />Writing Oracle ASM library driver configuration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; done<br />Creating /dev/oracleasm mount point&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; done<br />Loading module "oracleasm"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; done<br />Mounting ASMlib driver filesystem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; done<br />Scanning system for ASM disks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; done<br />AMS的命令如下所示：</p>
<p><a href="mailto:oracle@DBRAC1"><em><span style="color: #800000;">oracle@DBRAC1</span></em></a><em><span style="color: #800000;">:~&gt; /etc/init.d/oracleasm<br />Usage: /etc/init.d/oracleasm<br />{start|stop|restart|enable|disable|configure|createdisk|deletedisk|querydisk|listdisks|scandisks|status}</span></em></p>
<p><br />现在，如下所示启用 ASMLib 驱动程序。 <br /># /etc/init.d/oracleasm enable<br />Writing Oracle ASM library driver configuration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [ OK ]<br />Scanning system for ASM disks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [ OK ]<br />ASM的安装和配置是要在集群中的每个节点上执行的<br /><br /><br />4.2用ASM Library Driver配置ASM的共享磁盘<br />注意：4.2.1和4.2.2部分只需在一个节点上完成<br />4.2.1磁盘分区（fdisk）<br />按本次存储的分法，提供了一个15TB的RAID光纤盘阵并只划了一个卷给数据库用（当然以后空间不够可以再加），对操作系统来说就是认到一个设备。本次安装中它认成/dev/sdb，进行fdisk操作，<br />划3个分区，sdb1和sdb2都为1个G,剩下空间全部给sdb3。<br />sdb1和sdb2是用来做Oracle Cluster Registry (OCR) 和 Voting Disk。<br />sdb3是给ASM用的<br />（下面例子中数值可能不同，命令是相同的）<br />#fdisk /dev/sdb<br />Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel<br />Building a new DOS disklabel.Changes will remain in memory only,<br />until you decide to write them.After that, of course, the previous<br />content won't be recoverable.<br /><br />The number of cylinders for this disk is set to 4427.<br />There is nothing wrong with that, but this is larger than 1024,<br />and could in certain setups cause problems with:<br />1) software that runs at boot time (e.g., old versions of LILO)<br />2) booting and partitioning software from other OSs<br />(e.g., DOS FDISK, OS/2 FDISK)<br /><br />Command (m for help):p<br />Disk /dev/sdb:255 heads, 63 sectors, 4427 cylinders<br />Units = cylinders of 16065 * 512 bytes<br /><br />Device Boot&nbsp;&nbsp;&nbsp; Start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End&nbsp;&nbsp;&nbsp; Blocks&nbsp;&nbsp; Id System<br /><br />Command (m for help):n<br />Command action<br />e&nbsp;&nbsp; extended<br />p&nbsp;&nbsp; primary partition (1-4)<br />p<br />Partition number (1-4): 1<br />First cylinder (1-4427, default 1):1<br />Using default value 1<br />Last cylinder or +size or +sizeM or +sizeK (1-4427, default 4427):1000<br />Using value 1000<br /><br />Command (m for help):n<br />Command action<br />e&nbsp;&nbsp; extended<br />p&nbsp;&nbsp; primary partition (1-4)<br />p<br />Partition number (1-4): 2<br />First cylinder (1-4427, default 1001):1001<br />Using value 1001<br />Last cylinder or +size or +sizeM or +sizeK (1-4427, default 4427):2000<br />Using value 2000<br /><br />Command (m for help):n<br />Command action<br />e&nbsp;&nbsp; extended<br />p&nbsp;&nbsp; primary partition (1-4)<br />p<br />Partition number (1-4): 3<br />First cylinder (1-4427, default 1001):3001<br />Using value 3001<br />Last cylinder or +size or +sizeM or +sizeK (1-4427, default 4427):4427<br />Using default value 4427<br /><br />Command (m for help):w<br />The partition table has been altered!<br /><br />Calling ioctl() to re-read partition table.<br /><br />WARNING:If you have created or modified any DOS 6.x<br />partitions, please see the fdisk manual page for additional<br />information.<br />Syncing disks.<br /><br />4.2.2创建ASM磁盘<br />通过以 root 用户身份运行以下命令来标记由 ASMLib 使用的磁盘。 仅从一个集群主机节点上执行此操作。提示： 以大写字母输入 DISK_NAME。当前版本中有一个错误，即如果使用小写字母，ASM 实例将无法识别磁盘。<br /># /etc/init.d/oracleasm createdisk VOL1 /dev/sdb3<br />Marking disk "/dev/sdb" as an ASM disk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ OK ]<br />&hellip;&hellip;<br />TIP：根据我们的安装经验，创建ASM disk时只能绑定一个分区（/dev/sdb3），而不能是一个设备（/dev/sdb）<br />以下示例演示了如何列出标记为由 ASMLib 使用的所有磁盘。<br /># /etc/init.d/oracleasm listdisks<br />VOL1<br />&hellip;&hellip;<br />4.2.2在各个节点重新扫描ASM磁盘<br />一定在集群的其他节点上，以 root 用户身份运行以下命令，扫描所配置的ASMLib磁盘： <br /># /etc/init.d/oracleasm scandisks<br />这样其他节点上的ASM Disk才有效。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/216789#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Jul 2008 09:33:34 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/216789</link>
        <guid>http://panjun.javaeye.com/blog/216789</guid>
      </item>
          <item>
        <title>JAVA操作Excel,读取Excel模板动态写入数据并生成Excel</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/211821" style="color:red;">http://panjun.javaeye.com/blog/211821</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 现在来看看如何读取Excel模板然后把动态数据写入到模板以生成特定格式的Excel。 <br />同样的思路，先来考虑下会涉及到那些对象，和上篇文章读取相比这里涉及到一个写入的步骤，所以JXL必然会提供一个对象来支持写入，这就是WritableWorkbook。那么如何得到到这个类的实例，查看APIDoc发现Workbook类提供了几个 静态的createWorkbook方法返回WritableWorkbook实例，可以看到众多createWorkbook方法主要分为两类：一个参数和两个参数。简单分析可以得知前者仅仅是用来直接生成Excel文件，后者先读取模板再向模板写入数据然后生成Excel。（还有一个三参数方法加上一个用来设置workbook的参数） 现在按照上篇文章中所讲述的流程来看看读取模板并写入需要那些步骤。 </p>
<p>&nbsp;</p>
<p>第一步：选择模板文件：&nbsp;</p>
<p>Workbook wb = Workbook.getWorkbook(new File(realpath)); </p>
<p>&nbsp;</p>
<p>第二步：通过模板得到一个可写的Workbook： <br />WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb); <br />第一个参数是一个输出流对象，比如可以 <br />ByteArrayOutputStream targetFile = new ByteArrayOutputStream(); <br />这样定义这个输出流对象。第二个参数代表了要读取的模板。</p>
<p>第三步：选择模板中名称为StateResult的Sheet： <br />WritableSheet wws = wwb.getSheet("StateResult"); <br />如果需要也可以创建Sheet <br />WritableSheet wws = wwb.createSheet("Sheet名称",i);</p>
<p>第四步：选择单元格，写入动态值，根据单元格的不同类型转换成相应类型的单元格： <br />Label A1 = (Label)wws.getWritableCell(0,0); <br />A1.setString("单元格内容") <br />或 <br />Number A2 = (Number)wws.getWritableCell(0,1);//Number是jxl.write.Number <br />A2.setValue(3.3); <br />也可以创建新的单元格并且加入到Sheet中 <br />Label C1 = new Label(2,0,"单元格内容"); <br />wws.addCell(C1); <br />或 <br />Number C1 = new Number(2,0,3.3); <br />wws.addCell(C1);</p>
<p>在生成Excel报表的时候还会遇到一种需求就是数据的格式问题，我们可能希望数值型单元格以某种格式显示，而字符串型单元格以另 <br /><br />一种格式显示。这些可以通过WritableFont、NumberFormat、WritableCellFormat等实现,下例给单元格A1、A2添加了不同的格式。</p>
<p>&nbsp;</p>
<p>java 代码 <br />WritableFont font= new WritableFont(WritableFont.createFont("宋体"),10,WritableFont.NO_BOLD); <br />NumberFormat format = new NumberFormat("###,##0.00"); //NumberFormat是jxl.write.NumberFormat <br />WritableCellFormat cellFormat1 = new WritableCellFormat(font,format); <br />WritableCellFormat cellFormat2 = new WritableCellFormat(font); <br />cellFormat1.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border <br />cellFormat2.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border <br />A2.setCellFormat(cellFormat1); <br />A1.setCellFormat(cellFormat2); <br />还有不要忘记关闭WritableWorkbook和Workbook以释放资源： <br />wwb.close(); <br />wb.close(); <br /><br />最后就可以你需要的方式从输出流targetFile中取得Excel，比如直接生成文件存本地，输出到客户端浏览器等。 <br /><br />如果还有其他需求，按照这种思路，再参照APIDoc相信可以很容易的解决。 <br /><br />至此，Java操作Excel之理解JXL就写完了。下一篇会介绍如何用Jakarta POI操作Excel。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/211821#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 10:24:15 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/211821</link>
        <guid>http://panjun.javaeye.com/blog/211821</guid>
      </item>
          <item>
        <title>配置AWSTATS用于分析Tomcat的访问日志</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/209656" style="color:red;">http://panjun.javaeye.com/blog/209656</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="t_msgfont" id="message5434518">配置AWSTATS用于分析Tomcat的访问日志<br />网站访问分析<br />然后修改Tomcat的配置文件，<br /><br />默认情况下Tomcat并不记录访问日志文件(access log)： Catalina/conf/server.conf；将文件中这一段的注释去掉，然后将pattern的值改为combined ，这个模式下记录的日志比较详细。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;!--<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;Valve className="org.apache.catalina.valves.AccessLogValve"<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;directory="logs"&nbsp;&nbsp;prefix="localhost_access_log." suffix=".txt"<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;pattern="combined" resolveHosts="false"/&gt;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;--&gt;<br /><br />重新启动一下Tomcat；<br /><br /><br />下载安装AWSTATS；<br /><br />&nbsp; &nbsp;&nbsp; &nbsp; 从<a href="http://www.awstats.org/" target="_blank">www.awstats.org</a> 下载最新的安装包，使用stable版的，最新为6.5；<br /><br />如果是使用RPM包进行安装，安装完成后AWSTATS 的主目录在/usr/local/awstats下；如果是解tar.gz的包，需要将awstats-6.5 文件夹的所有内容移动到/usr/local/awstats目录下。<br /><br /><br /><br />运行配置工具./tools/awstats_configure.pl；根据提示输入apache 的配置文件的位置，配置工具会在apache的配置文件中增加一些awstats需要的配置项目。同时会创建一个网站配置文件，用于对指定的网站进行日志分析，例如命名为 demo；配置文件放置的默认位置为/etc/awstats/目录，文件名为awstats.demo.conf ；<br /><br /><br /><br />修改/et/awstats/awstats.demo.conf 文件，主要的修改部分有下列几处：<br /><br />DirData="/usr/local/awstats/data"<br /><br />#这个放到AWSTATS的目录下，默认是/var/awstats/lib ，有权限的问题不太好处理；这个文件夹中的数据是对日志分析之后统计结果；<br /><br />LogFile="/usr/share/tomcat_release_1/logs/localhost_access_log.%YYYY-24-%MM-24-%DD-24.txt "<br /><br />#这个是要分析的日志文件的位置和文件名；Tomcat记录的日志文件是以每天为单位进行分割，格式为大致为 localhost_access_log.2006-07-05.txt；因为是第二天分析第一天的访问数据，可以这样来配置LogFile参数： LogFile= "/usr/share/tomcat_release_1/logs/ localhost_access_log.%YYYY-24-%MM-24-%DD-24.txt" 其中%YYYY表示格式控制为四位年数，-24 表示是当前时间的24小时前；这样在早上1点进行分析的时候就会分析前一天的数据。<br /><br />将日志分析工具运行的命令配置为每天早上1点或其它服务器不忙的时间，每天运行一次用于对昨天日志的分析；配置使用 crond进行调度；可以参考使用crontab &ndash;e命令增加下面的调度命令：0 1 * * * /usr/local/awstats/tools/awstats_updateall.pl now<br /><br /><br />访问<br />然后可以通过<a href="http://servername/awstats/awstats.pl?config=demo" target="_blank">http://servername/awstats/awstats.pl?config=demo</a> 进行访问；</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/209656#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 11:20:42 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/209656</link>
        <guid>http://panjun.javaeye.com/blog/209656</guid>
      </item>
          <item>
        <title>ajax中实现提示框</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/208380" style="color:red;">http://panjun.javaeye.com/blog/208380</a>&nbsp;
          发表时间: 2008年06月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div id="article">
<p><span style="font-family: Times New Roman;">Color=#cccccc cellSpacing=0 cellPadding=1 width="80%" align=center bgColor=#ffffff border=1 heihgt=""&gt;&nbsp;&nbsp;&nbsp; <br />tooTip.html:</span></p>
<p><span style="font-family: Times New Roman;">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;</span></p>
<p><span style="font-family: Times New Roman;">&lt;html&gt;<br />&nbsp; &lt;head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;Ajax Tooltip&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var xmlHttp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dataDiv;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dataTable;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dataTableBody;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var offsetEl;</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function createXMLHttpRequest() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (window.ActiveXObject) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (window.XMLHttpRequest) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlHttp = new XMLHttpRequest();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function initVars() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataTableBody = document.getElementById("courseDataBody");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataTable = document.getElementById("courseData");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataDiv = document.getElementById("popup");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function getCourseData(element) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initVars();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createXMLHttpRequest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offsetEl = element;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var url = "ToolTipServlet?key=" + escape(element.id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlHttp.open("GET", url, true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlHttp.onreadystatechange = callback;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlHttp.send(null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function callback() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xmlHttp.readyState == 4) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xmlHttp.status == 200) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setData(xmlHttp.responseXML);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function setData(courseData) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clearData();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setOffsets();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var length = courseData.getElementsByTagName("length")[0].firstChild.data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var par = courseData.getElementsByTagName("par")[0].firstChild.data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var row, row2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var parData = "Par: " + par<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var lengthData = "Length: " + length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row = createRow(parData);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row2 = createRow(lengthData);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataTableBody.appendChild(row);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataTableBody.appendChild(row2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function createRow(data) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var row, cell, txtNode;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row = document.createElement("tr");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell = document.createElement("td");</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.setAttribute("bgcolor", "#FFFAFA");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.setAttribute("border", "0");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtNode = document.createTextNode(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.appendChild(txtNode);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row.appendChild(cell);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return row;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function setOffsets() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var end = offsetEl.offsetWidth;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var top = calculateOffsetTop(offsetEl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataDiv.style.border = "black 1px solid";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataDiv.style.left = end + 15 + "px";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataDiv.style.top = top + "px";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function calculateOffsetTop(field) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return calculateOffset(field, "offsetTop");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function calculateOffset(field, attr) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var offset = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(field) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset += field[attr]; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; field = field.offsetParent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return offset;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function clearData() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ind = dataTableBody.childNodes.length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = ind - 1; i &gt;= 0 ; i--) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataTableBody.removeChild(dataTableBody.childNodes[i]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataDiv.style.border = "none";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br />&nbsp; &lt;/head&gt;<br />&nbsp; &lt;body&gt;<br />&nbsp;&nbsp;&nbsp; &lt;h1&gt;Ajax Tooltip Example&lt;/h1&gt;<br />&nbsp;&nbsp;&nbsp; &lt;h3&gt;Golf Courses&lt;/h3&gt;<br />&nbsp;&nbsp;&nbsp; &lt;table id="courses" bgcolor="#FFFAFA" border="1" cellspacing="0" cellpadding="2"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tbody&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td id="1" onmouseover="getCourseData(this);" onmouseout="clearData();"&gt;Augusta National&lt;/td&gt;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td id="2" onmouseover="getCourseData(this);" onmouseout="clearData();"&gt;Pinehurst No. 2&lt;/td&gt;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td id="3" onmouseover="getCourseData(this);" onmouseout="clearData();"&gt;St. Andrews Links&lt;/td&gt;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td id="4" onmouseover="getCourseData(this);" onmouseout="clearData();"&gt;Baltusrol Golf Club&lt;/td&gt;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tbody&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />&nbsp;&nbsp;&nbsp; &lt;div style="position:absolute;" id="popup"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table id="courseData" bgcolor="#FFFAFA" border="0" cellspacing="2" cellpadding="2"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tbody id="courseDataBody"&gt;&lt;/tbody&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/div&gt;</span></p>
<p><span style="font-family: Times New Roman;">&nbsp; &lt;/body&gt;<br />&lt;/html&gt;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Times New Roman;">ToolTipServlet.java:</span></p>
<p><span style="font-family: Times New Roman;">/*<br />&nbsp;* ToolTipServlet.java<br />&nbsp;*<br />&nbsp;* Created on June 30, 2005, 8:29 PM<br />&nbsp;*/</span></p>
<p><span style="font-family: Times New Roman;">package ajaxbook.chap4;</span></p>
<p><span style="font-family: Times New Roman;">import java.io.*;<br />import java.util.HashMap;<br />import java.util.Map;</span></p>
<p><span style="font-family: Times New Roman;">import javax.servlet.*;<br />import javax.servlet.http.*;</span></p>
<p><span style="font-family: Times New Roman;">/**<br />&nbsp;*<br />&nbsp;* @author nate<br />&nbsp;* @version<br />&nbsp;*/<br />public class ToolTipServlet extends HttpServlet {<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private Map courses = new HashMap();</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp; public void init(ServletConfig config) throws ServletException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CourseData augusta = new CourseData(72, 7290);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CourseData pinehurst = new CourseData(70, 7214);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CourseData standrews = new CourseData(72, 6566);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CourseData baltusrol = new CourseData(70, 7392);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; courses.put(new Integer(1), augusta);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; courses.put(new Integer(2), pinehurst);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; courses.put(new Integer(3), standrews);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; courses.put(new Integer(4), baltusrol);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /** Handles the HTTP &lt;code&gt;GET&lt;/code&gt; method.<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param request servlet request<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param response servlet response<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; protected void doGet(HttpServletRequest request, HttpServletResponse response)<br />&nbsp;&nbsp;&nbsp; throws ServletException, IOException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer key = Integer.valueOf(request.getParameter("key"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CourseData data = (CourseData) courses.get(key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter out = response.getWriter();</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("text/xml");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setHeader("Cache-Control", "no-cache");</span></p>
<p><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;response&gt;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;par&gt;" + data.getPar() + "&lt;/par&gt;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;length&gt;" + data.getLength() + "&lt;/length&gt;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;/response&gt;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /** Handles the HTTP &lt;code&gt;POST&lt;/code&gt; method.<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param request servlet request<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param response servlet response<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; protected void doPost(HttpServletRequest request, HttpServletResponse response)<br />&nbsp;&nbsp;&nbsp; throws ServletException, IOException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doGet(request, response);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /** Returns a short description of the servlet.<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getServletInfo() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Short description";<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private class CourseData {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int par;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public CourseData(int par, int length) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.par = par;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.length = length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getPar() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.par;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getLength() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</span></p>
<p><span style="font-family: Times New Roman;"><br />&nbsp;</span></p>
<span style="font-family: Times New Roman;">
<p><br />注释：提示框的位置是计算距离顶部的距离</p>
<p>&nbsp;&nbsp;&nbsp; eg:</p>
<p>&nbsp;&nbsp;&nbsp; 假设 obj 为某个 HTML 控件。</p>
<p>&nbsp;&nbsp;&nbsp; obj.offsetTop 指 obj 距离上方或上层控件的位置，整型，单位像素。</p>
<p>&nbsp;&nbsp;&nbsp; obj.offsetLeft 指 obj 距离左方或上层控件的位置，整型，单位像素。</p>
<p>&nbsp;&nbsp;&nbsp; obj.offsetWidth 指 obj 控件自身的宽度，整型，单位像素。</p>
<font face="Times New Roman">
<p>&nbsp;&nbsp;&nbsp; obj.offsetHeight 指 obj 控件自身的高度，整型，单位像素。</p>
</font></span>
<p>&nbsp;</p>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://panjun.javaeye.com/blog/208380#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Jun 2008 22:11:08 +0800</pubDate>
        <link>http://panjun.javaeye.com/blog/208380</link>
        <guid>http://panjun.javaeye.com/blog/208380</guid>
      </item>
          <item>
        <title>提高Java水平的十大技术</title>
        <author>panjun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://panjun.javaeye.com">panjun</a>&nbsp;
                    链接：<a href="http://panjun.javaeye.com/blog/208379" style="color:red;">http://panjun.javaeye.com/blog/208379</a>&nbsp;
          发表时间: 2008年06月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: Times New Roman;">本文列出了当今计算机软件开发和应用领域最重要十种关键技术排名，如果你想保证你现在以及未来的几年不失业，那么你最好跟上这些技术的发展。虽然你不必对这十种技术样样精通，但至少应该对它们非常熟悉。 </span></p>
<p><span style="font-family: Times New Roman;">　　一、XML</span></p>
<p><span style="font-family: Times New Roman;">　　在十种技术中，最重要的一种技术我想应该非XML莫属。这里不仅仅指XML规范本身，还包括一系列有关的基于XML的语言：主要有XHTML，XSLT，XSL，DTDs，XML Schema(XSD)，XPath，XQuery和SOAP.如果你现在还对XML一无所知，那么赶快狂补吧。XML是包含类似于HTML标签的一个文本文件，在这个文件中定义了一个树型结构来描述它所保存的数据。</span></p>
<p><span style="font-family: Times New Roman;">　　XML最大的优点是你既可以在这个文本文件中存储结构化数据，也可以在其中存储非结构化数据&mdash;&mdash;也就是说，它能包含和描述"粗糙的"文档数据，就象它描述"规则的"表格数据一样。</span></p>
<p><span style="font-family: Times New Roman;">　　XHTML是目前编写HTML的首选方法;因为XHTML本身就是格式良好的XML，与通常畸形的HTML文档相比， XHTML格式文档更容易处理。</span></p>
<p><span style="font-family: Times New Roman;">　　XSLT和XSL是对XML文档进行转换的语言。它们可以将XML文档转换成各种格式，比如另一个文本文件、PDF文件、HTML文件、逗号分割的文件，或者转换成其它的XML文档。</span></p>
<p><span style="font-family: Times New Roman;">　　DTDs 和XML Schema用来描述XML文件所包含的数据内容的类型，使你不用编写定制的代码就能对XML文档的内容进行"有效性"检查，使内容强行遵守给出的规则。</span></p>
<p><span style="font-family: Times New Roman;">　　XPath 和 XQuery是查询语言，用它们可以从XML文档中吸取单个的数据项或者数据项列表。XQuery的功能特别强大，因为它对XPath查询进行了扩展。实际上，XQuery和XML的关系就像SQL之于关系数据库一样。</span></p>
<p><span style="font-family: Times New Roman;">　　SOAP是Web services间进行通讯的标准协议。你不必知道SOAP协议的所有细节，但是你应该熟悉其常用规则及其工作原理，这样你才能使用它。</span></p>
<p><span style="font-family: Times New Roman;">　　二、Web Services</span></p>
<p><span style="font-family: Times New Roman;">　　Web服务是XML流行后的直接产物。因为X