<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>run_xiao</title>
    <description></description>
    <link>http://run-xiao.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>大学时候收到信</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/212103" style="color:red;">http://run-xiao.javaeye.com/blog/212103</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天闲着无聊在家收拾东西，发现上大学时，高中同学写给我的些信。其中有两封是某男同学大一的时候写给我的。此人真是爱学习啊，居然每封信最后都要给我留个“每封一题”。有两个题目是这样：其中一个是一个数学题，貌似多项式因式分解，X的n次方—a的n次方/(X—a)=?，另一个是哲学题目：这个世界上有没有绝对的真理？<img src="/images/smiles/icon_idea.gif"/><img src="/images/smiles/icon_idea.gif"/><img src="/images/smiles/icon_idea.gif"/><img src="/images/smiles/icon_idea.gif"/><img src="/images/smiles/icon_idea.gif"/><img src="/images/smiles/icon_idea.gif"/><img src="/images/smiles/icon_idea.gif"/><img src="/images/smiles/icon_idea.gif"/><img src="/images/smiles/icon_idea.gif"/>差点笑得没吐血。真不知道我以前是怎么回答滴啊？
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/212103#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 20:43:31 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/212103</link>
        <guid>http://run-xiao.javaeye.com/blog/212103</guid>
      </item>
      <item>
        <title>启动RPC</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/210034" style="color:red;">http://run-xiao.javaeye.com/blog/210034</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天刚和prolj兄在google code上开了个项目，取了个很自恋的名字RPC<br />(Run and Prolj's Compiler，不是Remote Procedure Call)。<br /><br />我们打算完成一个支持C99标准的Compiler，说实话感觉心里挺没底的，C99标准文档四五百页的E文，看得有点晕，一些文法和语义的细节看起来挺复杂的，语法树啊符号表啊什么的具体实现也还没想清楚。<br /><br />还好prolj兄比较小强，特别对后端优化算法比较熟悉，鲸书都快被他啃烂了。最让我佩服的prolj兄大学英语没去上几次课，靠啃E版的《编程艺术》，六级就很Easy的Pass掉了。小强果然就是小强啊！
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/210034#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Tue, 01 Jul 2008 09:46:43 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/210034</link>
        <guid>http://run-xiao.javaeye.com/blog/210034</guid>
      </item>
      <item>
        <title>Linux C中也有“ThreadLocal”</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/198163" style="color:red;">http://run-xiao.javaeye.com/blog/198163</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在在看Linux开发的书，接触到了多线程开发这一块，惊奇的发现用C写多线程程序，也有线程<br /><br />内部变量的概念呢，甚至调用的接口和Java中的ThreadLocal非常像。<br /><br />　1.<br />　extern int pthread_key_create ((pthread_key_t *__key, void (*__destr_function) (void *)));<br />  先使用该方法创建一个线程内的Key，且绑定一个函数在线程结束时回收Key对于的空间<br /><br /> 2.<br />  extern int pthread_setspecific __P ((pthread_key_t __key,__const void *__pointer));<br />  将线程数据和一个键绑定在一起<br /><br /> 3.extern void *pthread_getspecific __P ((pthread_key_t __key));<br />  获得线程数据<br /><br /> 4.pthread_key_delete<br />  删除Key及其对应的线程数据<br /><br />看来编程语言都是相通的，果真不假啊<img src="/images/smiles/icon_wink.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/198163#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 11:11:03 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/198163</link>
        <guid>http://run-xiao.javaeye.com/blog/198163</guid>
      </item>
      <item>
        <title>词法分析和语法分析并发的想法</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/193852" style="color:red;">http://run-xiao.javaeye.com/blog/193852</a>&nbsp;
          发表时间: 2008年05月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在看了几个简单的Compiler的源码，发现语法分析的Function都是调用词法分析的过程，一个一个的获得Token，然后构建语法树。<br /><br />今天早上起来上WC，突然脑子里面冒出来一个想法：这不是个典型的生产者-消费者问题么？若是在多线程环境下，起两个线程分别跑词法分析和语法分析的Function，再建个缓冲的Buffer，这样前端分析的效率会不会有所提升呢？<br /><br />欢迎各位拍砖<img src="/images/smiles/icon_biggrin.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/193852#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 17 May 2008 10:32:03 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/193852</link>
        <guid>http://run-xiao.javaeye.com/blog/193852</guid>
      </item>
      <item>
        <title>终于搞定VIM C开发环境</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/192646" style="color:red;">http://run-xiao.javaeye.com/blog/192646</a>&nbsp;
          发表时间: 2008年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          花了两天时间终于把VIM写C的环境搞起来了，功能之强大，绝不逊色于任何一个IDE。终于不用再自己在Vi中跳来跳去。小show一下：<br /><img src="http://www.javaeye.com/upload/picture/pic/14295/4699bf3f-c30c-349f-b3f6-01641b8cb7d9.png?1210668554" /><br />非常感谢CSDN上Easwy的文章：<br />http://blog.csdn.net/easwy/category/234641.aspx
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/192646#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 May 2008 16:54:25 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/192646</link>
        <guid>http://run-xiao.javaeye.com/blog/192646</guid>
      </item>
      <item>
        <title>新工作，新环境</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/191030" style="color:red;">http://run-xiao.javaeye.com/blog/191030</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          新工作做了大半个月了，感想颇多。<br /><br />本来觉得之前的公司管理就不咋的，真应了那句话：没有最烂，只有更烂。<br /><br />总之感觉对现在的工作无所适从，跟Boss和下面的人沟通起来都相当困难。我就纳闷：都是<br /><br />做IT的人，咋思想差距就这么大呢。管理的方式，做事情的方式，沟通方式，都难以适应。<br /><br />哎，不知道怎么回事，最近抱怨总是很多。也许这几个月发生的事情太多了，任何一件事情<br /><br />都会让人不爽很久。希望自己千万不要成个愤青啊，呵呵。<br /><br />看来这份工作也只能是随便混混了，千万不能当真，反正下半年也有自己的打算。有空就看看<br /><br />compiler了。：）
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/191030#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 13:18:03 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/191030</link>
        <guid>http://run-xiao.javaeye.com/blog/191030</guid>
      </item>
      <item>
        <title>[转]教你如何做主管——MTP培训心得</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/183141" style="color:red;">http://run-xiao.javaeye.com/blog/183141</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚看以前的同事Tiger的Blog<br /><br />教你如何做主管——MTP培训心得<br />前段时间，公司有组织中高阶主管及其培养干部进行了为期三天的管理训练培训。三天的课程下来，虽然内容较多，因对老师三天来的课程内容深有感触，故借着整理学习心得的机会，将三天来的培训课程做了一个结构化的整理，与大家来分享。 <br /><br />在上课的过程中，觉得老师讲的内容较多，涉及的面也比较多。刚开始在整理学习心得时，点点滴滴整理了大约十七八条。再反复经过对这整理的十七八条心得，发现其实老师主要就是围绕“如何做主管？”这个话题展开的。整体上可以将这四天培训的主要知识点用下面这个图来表示。 <br /><br /> <img src="http://byfiles.storage.msn.com/y1p1Jh5Mi_Ga8OAA9TqlCjlAGGQMtKTX18HLLt5iAglJOqaGLe3VuBWBdtfE8MxuKmR78z4mRUOZvM?PARTNER=WRITER" /><br /><br />作为一个中阶主管，其基本工作如上图所示，主要是五大项： <br /><br />设定工作目标； <br />工作规划与分配； <br />人力资源发展； <br />激励和人际沟通； <br />授权给部属。<br />下面分别就这五项工作来对老师讲的内容以Q&A的方式做一个陈述。 <br /><br />一、设定工作目标 <br /><br />Q1：如何设定团队与部属目标？ <br /><br />A1：这里老师主要结合围绕企业运行的三个流程来讲的：策略流程、人员流程和营运流程。设定公司和部门的目标是策略流程的主要内容。公司依据其内、外部环境来设定公司的目标、策略。这一过程主要由高阶主管来完成。最终会形成诸如《公司年度事业计划》。 <br /><br />部门目标则是对公司目标和策略的有效分解，最终形成诸如各部门年度KPI。 <br /><br />部属或者说是个人的目标则是对本部门的KPI的有效分解。 <br /><br />这一系列的从公司目标和策略的制定到个人KPI的制定的过程就是前面讲到的策略流程。 <br /><br />同时老师也给我们介绍了一些关于目标设定的读物，它们是： <br /><br />1）《蓝海策略》、《战略地图》、《方针管理》——用于指导公司目标和方针的制定； <br /><br />2）《目标管理》、《关键绩效指标》、《平衡记分卡》——用于指导部门目标/KPI的制定。我们公司就是用平衡记分卡来指导KPI的制定。 <br /><br />3）《变革管理》——用于指导当公司目标和方针发生变化时，团队如何应对。 <br /><br />Q2：如何面对上级主管的临时插单？ <br /><br />A2：在计划之外，上级主管分派新任务总是中阶主管经常面对的事情。那么作为中阶主管需要如何来面对这种情况呢，老师给我们介绍了一些可行的方法： <br /><br />1) 首先，作为主管需要将新课题放在最优先的位置，安排最重要的人，最重要的资源来处理，因为往往只有这些新课题才会创造公司价值； <br /><br />2）其次， 要优化，改善原来计划内的工作，采取诸如删除、合并、简化、OA化、E化等方式来优化旧课题，以提高生产率。 <br /><br />3）另外，对于分派的新课题，作为中阶主管，需要采用有效的方法及时（在上司分配工作2～4小时内）与上司明确新课题的目的：本单位/现在的目的是什么、公司/未来的目的是什么、实现新课题的限制条件有哪些等。 <br /><br />Q3：如何向上级主管行销你的计划？ <br /><br />A3：向上机主管报告计划时，时间不能超过10分钟。为了能够让上级主管快速有效地了解自己的计划，需要在向上司报告前，对自己的计划进行摘要，突显出计划的重点内容。计划摘要的内容包含以下几个部分： <br /><br />1）计划目的：当前目的、最终目的（跟公司的策略连接） <br /><br />2）现状问题 <br /><br />3）创意（构想）——有哪些新的创意，或者是计划的整体思路 <br /><br />4）效果：有形成果、无形成果 <br /><br />5）费用 <br /><br />6）风险评估与应对 <br /><br />Q4：如何改善团队的工作绩效？ <br /><br />A4：通常我们都可以将团队的工作内容分解成三种类型的动作： <br /><br />1）有价值的动作，它指对产品和顾客增值的动作，对于这类动作，我们需要的就是将其标准化，并写成工作分解表/指南/Checklist； <br /><br />2）无价值的动作，它指诸如拿材料、检查等动作。对于这类动作，需要的就是尽量将其合理化； <br /><br />3）浪费的动作。对于这类动作，需要的就是尽量将其消除。 <br /><br />进行这样的持续改善，就能够不断地提升团队的工作绩效。 <br /><br />Q5：如何解决工作中的问题？ <br /><br />A5：在工作中发生的问题，通常有80%～90%都是事实明确的，剩下的10%～20%是事实不明确的。 <br /><br />对于事实明确的问题，解决问题的方式是： <br /><br />1）收集数据——三现主义（现场，现物，现实），并采取紧急措施； <br /><br />2）寻找问题的真正原因：（3WHY 系统图法） <br /><br />a）让所有人知道问题在哪里 <br /><br />b）弄清楚解决问题的目的 <br /><br />c）即使一个不良也要对策 <br /><br />3）采取对策消除真正的原因 <br /><br />对于事实不明确的问题，解决问题的方式是： <br /><br />1）成立QCC（品管圈）或者QIT（品质改进小组） <br /><br />2）利用SPC，QC工具，6σ等工具进行问题分析，找真正原因 <br /><br />3）形成统计报表，用来做预防管理。 <br /><br />Q6：目标设定的SMART原则 <br /><br />A6：SMART指的是Specific、Measurable、Achievable、Relevant、Timely。 <br /><br />Specific是指每项目标的指订，一定是特定的，而不是一个概略性的； <br /><br />Measurable是指可衡量的，每项目标必须要用量化的指标来订定； <br /><br />Achievable是指可达成的，所有的目标一定要是能达得到的； <br /><br />Relevant是指有关的，也就是每项目标都必须与主管的目标相结合； <br /><br />Timely是指时效性，也就是每项目标要在限定的时间内完成。 <br /><br />二、工作规划与分配 <br /><br />Q7：主管的时间如何管理？ <br /><br />A7：工作通常可以分为四种类型：定型性工作、规则性工作、特别性工作、创造性工作。 <br /><br />1）定型工作指个人专长的事情； <br /><br />2）规则性工作指诸如开会、电话、巡视工作现场； <br /><br />3）特别性工作指诸如跟上司讨论计划、协助上司解决问题； <br /><br />4）创造性工作指辅导部属解决问题。 <br /><br />通常前二种工作的绩效比重常只占20%，对于这样的工作，主管需要思考： <br /><br />a）是否可以授权？ <br /><br />b）是否可以代理给别人？ <br /><br />c）是否可以不要做？ <br /><br />对于后两种工作需要多思考如何增加其比重。 <br /><br />Q8：工作如何分配给下属？ <br /><br />A8：1）团队的建立是主管的职责不是部属的责任； <br /><br />2）主管培养接班人一定会造成组织的不平衡，但主管要负责平衡； <br /><br />3）主管在分配工作时，需要根据事情的成熟度，部属的成熟度和组织的成熟度之不同来分派工作。分配工作时需要告诉部属： <br /><br />a）是什么事，谁交代的； <br /><br />b）为什么让他做（个人重要性） <br /><br />c）这件事的价值：对单位，对个人 <br /><br />Q9：主管如何面对命令系统的例外？ <br /><br />A9：一个组织通常都会从品质、成本、弹性、速度和服务等几个方面来提高客户满意度。其中品质和成本是基本因素，弹性、速度和服务是差异化因素。 <br /><br />在追求用差异化因素提高客户满意度的组织里，命令系统的例外是经常会遇到的。 <br /><br />主管在遇到这样的情形时，面对部属需要扮演支援的角色，支援部属时，需要： <br /><br />1）问部属做什么事情，目的在哪里； <br /><br />2）问部属是否需要支援； <br /><br />3）问部属什么时候可以完成； <br /><br />4）帮部属安排事情的轻重缓急； <br /><br />5）责任主管承担。 <br /><br />对于上司，主管需要： <br /><br />1）报告进度； <br /><br />2）重新确认目的； <br /><br />3）跟上级寻求支援； <br /><br />4）对上司笑一笑。 <br /><br />任务完成后，向上司报告时，主管需要： <br /><br />1）跟部属一起报告。由主管报告两头，部属报告专业性的内容。 <br /><br />2）部属报告完毕后，请部属先离开。 <br /><br />三、人力资源发展 <br /><br />Q10：主管如何培育部属？ <br /><br />A10：主管需要与部属一起，以个人KPI为目标，结合个人期待（生涯规划、部属目前具备的条件）和组织期待（担任工作必备条件），来制定部属指导计划表。 <br /><br />并按照部属指导计划表对部属进行培养，并且定期与部属就训练成果进行沟通，寻找差距以改进。 <br /><br />完成KPI是主管的职责，培养接班人/部属是主管的天职。 <br /><br />四、激励与人际沟通 <br /><br />Q11： 如何使部属表现良好的绩效？ <br /><br />A11：要使部属表现出良好的绩效，需要做到以下几点： <br /><br />1）让部属了解自己的职责； <br /><br />2）让部属知道自己的工作目标； <br /><br />3）让部属知道自己的工作对组织的贡献和价值； <br /><br />4）使部属具备从事该项工作的知识技能； <br /><br />5）对绩效好的部属要给以奖励； <br /><br />6）对部属的工作，主管要给以支持，并及时加以回馈和鼓励； <br /><br />7）主管要促进员工有意愿不断改善绩效。 <br /><br />Q12：如何与部属做绩效Review？ <br /><br />A12：在与部属做绩效Review时，主管重点需要思考三个问题： <br /><br />1）这个部属做得如何？ <br /><br />2）他可以改进些什么？ <br /><br />3）我应该做些什么来改善部属的绩效？ <br /><br />在实施绩效Review时，主管需要： <br /><br />1）准备议程（面谈结构化）； <br /><br />2）建立一个不拘泥，不仓促的气氛； <br /><br />3）用称赞来建立双方的信心； <br /><br />4）让部属做自我评量，以降低部属的紧张； <br /><br />5）鼓励部属说话并积极倾听部属说话。 <br /><br />6）讨论部属的工作绩效，焦点放在事实上，不做人身攻击，不牵扯到不相干的争端； <br /><br />7）主管需要保持正向态度，用正向语言做批评； <br /><br />8）主管需要在平日即时指正需改善之处，以避免面谈时突然提出； <br /><br />9）与部属一起商讨可测量的目标以及未来可行的计划。 <br /><br />Q13：部属需求不满时如何处理？ <br /><br />A13：1）先完成需求的分析表格，弄清楚部属的需求、目标、障碍和不满行为是什么； <br /><br />2）排除工作上的障碍。部属不满通常60%～70%是感情、家庭、个人等方面的因素，对于这些方面的因素，主管要做的是： <br /><br />a）公司的规定只能表达一次 <br /><br />b）不能说公私分明 <br /><br />c）倾听对方讲话，讨论对方的话题 <br /><br />d）共通讨论可能的解决方案（请上司裁决） <br /><br />e）适当时请同事在工作上给以协助 <br /><br />Q14：部属做得不好时如何处理？ <br /><br />A14：当部属做得不好时，跟其反馈需要注意： <br /><br />1）尽量不要当下指正（时间，地点） <br /><br />2）方式上 <br /><br />a）不要批评，指责 <br /><br />b）要提出问题，要提供解决方案 <br /><br />c）采用分享的方式 <br /><br />3）态度上 <br /><br />a）协助对方 <br /><br />b）平等的 <br /><br />部属为什么不愿意承担责任，是因为我们常在其他人面前指正部属。 <br /><br />Q15：如何与平行单位沟通？ <br /><br />A15：当单位间有冲突不可调和时，需要从以下几点来考虑和解决： <br /><br />1）公司的目的/顾客的目的是什么？ <br /><br />单位的目的是手段，不能因为手段而忘了目的。 <br /><br />2）提高两个位阶来考虑 <br /><br />3）提出双方意见，求同存异，先执行相同的 <br /><br />4）创造新的解决方法 <br /><br />5）请上司裁决（尽量少用，因为高阶主管不喜欢做内部裁决，原因 <br /><br />a) 因为手心手背都是肉 <br /><br />b) 并不了解过程 <br /><br />c) 会造成更激烈的冲突和派系 <br /><br />组织的冲突是进步的动力 <br /><br />Q16：如何与上司进行沟通？ <br /><br />A16：在与上司沟通时，重要的是做到参与管理： <br /><br />1）不只是提出问题，同时也要提出建议； <br /><br />2）提建议时，需要提二个以上的建议，并加以分析（只提一个建议的主管是陷害上司的人）； <br /><br />3）与上司讨论，并由上司做裁决。 <br /><br />同时需要注意上班是行销。行销的是自己的能力。 <br /><br />最后需要注意的是与上司沟通时的态度：是争取资源与支援，而不是证明对或错。 <br /><br />五、授权给部属 <br /><br />Q17：授权的前提是什么？ <br /><br />A17：授权的前提是工作标准化。只有将工作标准化后，主管才可以授权给部属处理——可控。 <br /><br />工作标准化的方式是拟定工作分解表，或工作指南或Checklist。 <br /><br />Q18：授权失败后如何做？ <br /><br />A18：1）主管要能承担责任； <br /><br />2）与部属一起寻找原因并分析它； <br /><br />3）辅导部属执行纠正措施。 <br /><br />Q19：主管裁决的7-2-1原则 <br /><br />A19：对于市场，顾客与员工的需求，通常通过组织的办法，流程（法）可以满足70%，对于这些部分需要进行标准化，细化到工作分解表，并授权给基层人员直接处理。 <br /><br />对于另外的20%，则需要由主管根据顾客利益和公司利益平衡后从合理的角度进行决定 <br /><br />对于剩下10%中阶主管不能确定的，则由高阶主管进行裁决。高阶主管裁决时多从情的角度决定。 <br /><br />通过对以上内容的学习，让我自感受益非浅，故将其整理出来作为自己未来的一个行动指南。同时将其与大家分享，也希望能够对各位同仁的工作产生积极的影响。 <br /><br />另外，对于以上整理的内容，如果你觉得有任何遗漏的地方，欢迎与我联系，让我们共同完善上面的知识地图，期待与大家的交流！
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/183141#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Wed, 16 Apr 2008 09:38:06 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/183141</link>
        <guid>http://run-xiao.javaeye.com/blog/183141</guid>
      </item>
      <item>
        <title>最近实在郁闷</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/179366" style="color:red;">http://run-xiao.javaeye.com/blog/179366</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近实在郁闷，自己想做的事情一件都没有成功。一眨眼都大学毕业快四年了，感觉还是一事无成，觉得自己也还算挺努力的。生活的压力也越来越大，GF家里人催着JH，可现在两人勉强算个温饱，好的工作机会一个个离我远去，中科院的愿望也难以达成。理想和现实的差距实在令人太痛苦。想起小崔说的句话：以前觉得自己有能力改变很多事情；不改变大环境，总可以改变这个行业；不能改变这个行业总可以改变这个单位；不能改变这个单位总可以改变这个部门；不能改变工作总能改变身边的人啊，最后自己发现什么都改边不了。
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/179366#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Thu, 03 Apr 2008 19:36:49 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/179366</link>
        <guid>http://run-xiao.javaeye.com/blog/179366</guid>
      </item>
      <item>
        <title>想去做Sales</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/159955" style="color:red;">http://run-xiao.javaeye.com/blog/159955</a>&nbsp;
          发表时间: 2008年01月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          做技术也有三四年时间了,感觉专著于技术时间久了,自己视野局限于技术圈子,对软件之外的世界了解甚少,与人打交道的能力也貌似有减退,想转做Sales,各位给点意见
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/159955#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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, 28 Jan 2008 17:01:05 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/159955</link>
        <guid>http://run-xiao.javaeye.com/blog/159955</guid>
      </item>
      <item>
        <title>Swing组件国际化</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/110815" style="color:red;">http://run-xiao.javaeye.com/blog/110815</a>&nbsp;
          发表时间: 2007年08月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div><span style="FONT-SIZE: 9pt">很长一段时间一直在做</span><span style="FONT-SIZE: 9pt">Applet</span><span style="FONT-SIZE: 9pt">开发，前不久客户提出要做界面的国际化。我也有一直思考这个问题，</span><span style="FONT-SIZE: 9pt">Java</span><span style="FONT-SIZE: 9pt">本身对国际化支持很好的，最简单的方式就是在创建每个</span><span style="FONT-SIZE: 9pt">Component</span><span style="FONT-SIZE: 9pt">之前，把文本就国际化然后再塞给这个组件。例如：</span><span style="FONT-SIZE: 9pt">(resources</span><span style="FONT-SIZE: 9pt">是根据</span><span style="FONT-SIZE: 9pt">Locale</span><span style="FONT-SIZE: 9pt">读入的</span><span style="FONT-SIZE: 9pt">ResourceBundle)</span></div>
<div><span style="COLOR: black">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>JFrame&nbsp;frame&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;JFrame(); &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>frame.setTitle(resources.getString(</span><span class="string">&quot;Title&quot;</span><span>)); &nbsp;&nbsp;</span> </li>
</ol>
</div>
</span></div>
<div><span style="FONT-SIZE: 9pt">这样做实在太不雅，另外也无法在运行时随着</span><span style="FONT-SIZE: 9pt">Locale</span><span style="FONT-SIZE: 9pt">改变而改变界面的语言。</span></div>
<div><span style="FONT-SIZE: 9pt">在网上看到一篇文章</span><span style="FONT-SIZE: 9pt"><a href="http://www.progdoc.de/papers/intSwing/intswing/intswing.html"><span style="FONT-SIZE: 10.5pt; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">http://www.progdoc.de/papers/intSwing/intswing/intswing.html</span></a></span><span style="FONT-SIZE: 9pt">，提到一种很有趣的做法，通过设置每个组件的</span><span style="FONT-SIZE: 9pt">ComponentUI</span><span style="FONT-SIZE: 9pt">，在</span><span style="FONT-SIZE: 9pt">ComponentUI</span><span style="FONT-SIZE: 9pt">渲染该组件之前，把文本国际化。</span></div>
<div><span style="FONT-SIZE: 9pt">先介绍一下</span><span style="FONT-SIZE: 9pt">ComponentUI</span><span style="FONT-SIZE: 9pt">。</span><span style="FONT-SIZE: 9pt">Swing</span><span style="FONT-SIZE: 9pt">组件是基于</span><span style="FONT-SIZE: 9pt">MVC</span><span style="FONT-SIZE: 9pt">模式的，但同经典的</span><span style="FONT-SIZE: 9pt">MVC</span><span style="FONT-SIZE: 9pt">有点不一样，</span><span style="FONT-SIZE: 9pt">Swing</span><span style="FONT-SIZE: 9pt">将</span><span style="FONT-SIZE: 9pt">View</span><span style="FONT-SIZE: 9pt">和</span><span style="FONT-SIZE: 9pt">Controller</span><span style="FONT-SIZE: 9pt">合并到同一个委托对象中：</span><span style="FONT-SIZE: 9pt">ComponentUI</span><span style="FONT-SIZE: 9pt">，该对象都有</span><span style="FONT-SIZE: 9pt">paint()</span><span style="FONT-SIZE: 9pt">方法负责渲染其关联的组件。</span></div>
<div><span style="FONT-SIZE: 9pt">那么怎么知道每个组件用的什么</span><span style="FONT-SIZE: 9pt">ComponentUI</span><span style="FONT-SIZE: 9pt">来画这个组件呢？有一个叫</span><span style="FONT-SIZE: 9pt">UIManager</span><span style="FONT-SIZE: 9pt">的大总管来负责设置整个界面的样式，通过</span><span style="FONT-SIZE: 9pt">setLookAndFeel(LookAndFeel)</span><span style="FONT-SIZE: 9pt">方法设置</span><span style="FONT-SIZE: 9pt">LookAndFeel</span><span style="FONT-SIZE: 9pt">，而</span><span style="FONT-SIZE: 9pt">LookAndFeel</span><span style="FONT-SIZE: 9pt">的实现中即包括对所有组件的</span><span style="FONT-SIZE: 9pt">ComponentUI</span><span style="FONT-SIZE: 9pt">的设置。</span></div>
<div><span style="FONT-SIZE: 9pt">例如：</span><span style="FONT-SIZE: 9pt">Windows</span><span style="FONT-SIZE: 9pt">风格的界面</span></div>
<div><span style="FONT-SIZE: 9pt"><span style="COLOR: black">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;WindowsLookAndFeel&nbsp;</span><span class="keyword">extends</span><span>&nbsp;BasicLookAndFeel{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;initClassDefaults(UIDefaults&nbsp;table){ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">super</span><span>.initClassDefaults(table); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;windowsPackageName&nbsp;=&nbsp;</span><span class="string">&quot;com.sun.java.swing.plaf.windows.&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;uiDefaults&nbsp;=&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;ButtonUI&quot;</span><span>,&nbsp;windowsPackageName&nbsp;+&nbsp;</span><span class="string">&quot;WindowsButtonUI&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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><span class="string">&quot;CheckBoxUI&quot;</span><span>,&nbsp;windowsPackageName&nbsp;+&nbsp;</span><span class="string">&quot;WindowsCheckBoxUI&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&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;</span><span class="string">&quot;CheckBoxMenuItemUI&quot;</span><span>,&nbsp;windowsPackageName&nbsp;+&nbsp;</span><span class="string">&quot;WindowsCheckBoxMenuItemUI&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;</span><span class="string">&quot;LabelUI&quot;</span><span>,&nbsp;windowsPackageName&nbsp;+&nbsp;</span><span class="string">&quot;WindowsLabelUI&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&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;</span><span class="string">&quot;RadioButtonUI&quot;</span><span>,&nbsp;windowsPackageName&nbsp;+&nbsp;</span><span class="string">&quot;WindowsRadioButtonUI&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;&nbsp;</span><span class="string">&quot;RadioButtonMenuItemUI&quot;</span><span>,&nbsp;windowsPackageName&nbsp;+&nbsp;</span><span class="string">&quot;WindowsRadioButtonMenuItemUI&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&hellip;&hellip;&nbsp;&nbsp;</span> </li>
</ol>
</div>
</span></span></div>
<div><span style="FONT-SIZE: 9pt">设置渲染</span><span style="FONT-SIZE: 9pt">Button</span><span style="FONT-SIZE: 9pt">使用</span><span style="FONT-SIZE: 9pt">WindowsButtonUI</span><span style="FONT-SIZE: 9pt">，画</span><span style="FONT-SIZE: 9pt">Label</span><span style="FONT-SIZE: 9pt">使用</span><span style="FONT-SIZE: 9pt">WindowsLabelUI&hellip;..</span><span style="FONT-SIZE: 9pt">等等</span></div>
<div><span style="FONT-SIZE: 9pt">所以我们要定制自己的国际化控件继承</span><span style="FONT-SIZE: 9pt">WindowsLookAndFeel</span><span style="FONT-SIZE: 9pt">，然后重载</span><span style="FONT-SIZE: 9pt">initClassDefaults</span><span style="FONT-SIZE: 9pt">方法，在其中插入自己指定的</span><span style="FONT-SIZE: 9pt">ComponentUI</span><span style="FONT-SIZE: 9pt">：</span></div>
<div><span style="FONT-SIZE: 9pt"><span style="FONT-SIZE: 9pt"><span style="COLOR: black">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MLWindowsLookAndFeel&nbsp;</span><span class="keyword">extends</span><span>&nbsp;WindowsLookAndFeel&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;initClassDefaults(UIDefaults&nbsp;table)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">super</span><span>.initClassDefaults(table); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;classes&nbsp;=&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;</span><span class="string">&quot;LabelUI&quot;</span><span>,&nbsp;mlPackage&nbsp;+&nbsp;</span><span class="string">&quot;MLWindowsLabelUI&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.putDefaults(classes); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</span></span></span></div>
<div><span style="FONT-SIZE: 9pt">这样任何一个</span><span style="FONT-SIZE: 9pt">JLabel</span><span style="FONT-SIZE: 9pt">显示的时候都调用我们自定义的</span><span style="FONT-SIZE: 9pt">MLWindowsLabelUI</span><span style="FONT-SIZE: 9pt">中的</span><span style="FONT-SIZE: 9pt">paint()</span><span style="FONT-SIZE: 9pt">方法</span></div>
<div><span style="FONT-SIZE: 9pt">我们就可以在这个地方做手脚了</span></div>
<div><span style="FONT-SIZE: 9pt"><span style="FONT-SIZE: 9pt"><span style="FONT-SIZE: 9pt"><span style="COLOR: black">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MLWindowsLabelUI&nbsp;</span><span class="keyword">extends</span><span>&nbsp;WindowsLabelUI&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;MLWindowsLabelUI&nbsp;ML_WINDOWSLLABEL_UI&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MLWindowsLabelUI(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp; </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;必须重载该方法，因为UIManager会调用该方法获得其实例，所以不重写会获得其父类的实例 </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;c&nbsp;JComponent </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;ComponentUI </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;ComponentUI&nbsp;createUI(JComponent&nbsp;c)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//因为树上的Cell和下拉框中显示也用了Label控件，但其无需国际化，返回其父类的实例 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(c&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;TreeCellRenderer&nbsp;||c&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;ListCellRenderer){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;WindowsLabelUI(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;ML_WINDOWSLLABEL_UI; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp; </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在格式化Label的文本前，将其国际化，再调用父类的格式文本方法， </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;若在这之后重载其他方法以实现国际化会不正确，因为已格式化的文本可能跟原来不一样 </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;比如过长的文体会用...代替 </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;String&nbsp;layoutCL(JLabel&nbsp;label,FontMetrics&nbsp;fontMetrics,String&nbsp;text,Icon&nbsp;icon,Rectangle&nbsp;viewR,Rectangle&nbsp;iconR,Rectangle&nbsp;textR)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">super</span><span>.layoutCL(label,fontMetrics,MessageUtil.getMessage(text),icon,viewR,iconR,&nbsp;textR); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</span></span></span></span></div>
<div><span style="FONT-SIZE: 9pt">有两个地方需要注意的：首先必须重载父类的</span><span style="FONT-SIZE: 9pt">createUI</span><span style="FONT-SIZE: 9pt">方法，否则当调用该类的</span><span style="FONT-SIZE: 9pt">createUI</span><span style="FONT-SIZE: 9pt">是返回的还是父类的实现，所以不会有任何效果，因为这个我</span><span style="FONT-SIZE: 9pt">Debug</span><span style="FONT-SIZE: 9pt">了好长时间。</span></div>
<div><span style="FONT-SIZE: 9pt"></span></div>
<div><span style="FONT-SIZE: 9pt"></span></div>
<div><span style="FONT-SIZE: 9pt">再就是，我们也并不会真的去重载</span><span style="FONT-SIZE: 9pt">paint()</span><span style="FONT-SIZE: 9pt">方法，因为要画一个控件是个很麻烦的事情，我们只需要找出其画需要的文本的那个方法然后重载，调用其父类对应方法传入已国际化的文本就</span><span style="FONT-SIZE: 9pt">OK</span><span style="FONT-SIZE: 9pt">了。当然要找出合适的方法重载也有点麻烦，需要大概把</span><span style="FONT-SIZE: 9pt">paint()</span><span style="FONT-SIZE: 9pt">执行流程通读一边。对于</span><span style="FONT-SIZE: 9pt">Label,</span><span style="FONT-SIZE: 9pt">我之前是重载</span><span style="FONT-SIZE: 9pt">paintEnabledText()</span><span style="FONT-SIZE: 9pt">，但发现当</span><span style="FONT-SIZE: 9pt">Label</span><span style="FONT-SIZE: 9pt">长度不够时，文本就会变成省略号，结果以这个为</span><span style="FONT-SIZE: 9pt">Key</span><span style="FONT-SIZE: 9pt">去查资源文件肯定不对，所以要找到合适的方法可能需要反复试验。</span></div>
<div><span style="FONT-SIZE: 9pt"></span></div>
<div><span style="FONT-SIZE: 9pt"></span></div>
<div><span style="FONT-SIZE: 9pt">使用直接继承的方式，现在只能局限于</span><span style="FONT-SIZE: 9pt">Windows</span><span style="FONT-SIZE: 9pt">风格的界面，可考虑使用装饰模式，我们的</span><span style="FONT-SIZE: 9pt">LookAndFeel</span><span style="FONT-SIZE: 9pt">直接继承</span><span style="FONT-SIZE: 9pt">BasicLookAndFeel</span><span style="FONT-SIZE: 9pt">，然后构造方法中传入另一个</span><span style="FONT-SIZE: 9pt">LookAndFeel</span><span style="FONT-SIZE: 9pt">的实例，将其他方法的实现都委托给该</span><span style="FONT-SIZE: 9pt">LookAndFeel</span><span style="FONT-SIZE: 9pt">；</span><span style="FONT-SIZE: 9pt">LabelUI</span><span style="FONT-SIZE: 9pt">也使用同样的方式。这样应该就可适用于其他风格的界面了。</span></div>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/110815#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Fri, 10 Aug 2007 11:27:00 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/110815</link>
        <guid>http://run-xiao.javaeye.com/blog/110815</guid>
      </item>
      <item>
        <title>比较对象</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/107040" style="color:red;">http://run-xiao.javaeye.com/blog/107040</a>&nbsp;
          发表时间: 2007年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          之前对Ruby中如何比较对象模棱两可，老想拿Java中的操作去套，发现很多时候行不通，今天花了点时间总算搞得比较清楚了<br /><br />首先看看所有对象的父类Object包含的比较方法：      <br />===:类似于instanceof <br />=~:用于比较正则表达式，这两个都比较简单<br />而另外三个方法变化就比较多<br />==  eql?   equal? 三个方法原本在Object中定义的作用是一样的，都用来判断是否为同一对象，看看Object的C代码(object.c)<br /><pre name="code" class="java">
    rb_define_method(rb_mKernel, "==", rb_obj_equal, 1);
    rb_define_method(rb_mKernel, "equal?", rb_obj_equal, 1);
    rb_define_method(rb_mKernel, "eql?", rb_obj_equal, 1);
</pre><br />定义的三个方法调用了同一个c方法。<br /><br />然而在RDoc中还有这样的解释：<br /><div class="quote_title">引用</div><div class="quote_div"><br />Unlike ==, the equal? method should never be overridden by subclasses: it is used to determine object identity (that is, a.equal?(b) iff a is the same object as b).<br /></div><br />==方法可以子类中重载以提供同该class相符合的意义,而equal?不应该(should never)重载，以保证其本身的比较object_id的意义<br /><br />这就解释了如下代码：<pre name="code" class="ruby">
a = “a”
b = “a”
a == b 			#true
a.eql? b			#true
a.equal? b		#false
</pre><br /><br />查看String的C代码(string.c)<br /><pre name="code" class="java">
    rb_define_method(rb_cString, "==", rb_str_equal, 1);
rb_define_method(rb_cString, "eql?", rb_str_eql, 1);
</pre><br /><br />String有重载 == 和eql?方法，但未重载equal?，另外== 和eql?方法重写规则也不太一样，大概看了下C代码，最终一个调用rb_memcmp方法比较，一个调用memcmp，未仔细研究其差别。不过按Rdoc中所述，eql?应该和==同意，数字类型除外（Numeric），在Has中会调用该方法。<br />一直没搞懂ruby为什么要搞得这么复杂，自定义类时要遵从这些约定?不如Java来的简单明了。<br /><br />另外，Ruby中还有个Comparable Module，它主要是根据&lt;=>的结果(1,0或-1)提供&lt;   &lt;=   ==   >   >=   between?等方法的比较结果(true,false),所以在自定义的类中必须定义&lt;=>方法，否则调用Comparable提供的方法时会报错
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/107040#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jul 2007 17:26:09 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/107040</link>
        <guid>http://run-xiao.javaeye.com/blog/107040</guid>
      </item>
      <item>
        <title>回家养老</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/104126" style="color:red;">http://run-xiao.javaeye.com/blog/104126</a>&nbsp;
          发表时间: 2007年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>昨天到家,发现呆在家里还真的是很好呢:</p>
<p>乡村空气好多了,真是受不了武汉的夏天，热还不说，闷得让人透不过气来，公司写字楼里虽然冷气十足，空气很差，一天下来头晕晕的，公交虽然有空调，但总感觉有种怪怪的味道让人恶心.回家早睡早起，早上起来深吸口气，爽！</p>
<p>老妈做的菜貌似手艺有点退步，中午的鱼汤稍咸了点，老要喝水.不过比楼下的7块的快餐强太多了．</p>
<p>以前上大学还幻想着过点悠闲的田园生活，现在想想也蛮幼稚的，虽然从小在农村长大，除了骑水牛，其他农活基本没干过,</p>
<p>我这把骨头架子，估计整两天就散了.现在还是老实点挣钱，等退休了回来养老吧.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/104126#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 22 Jul 2007 15:45:07 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/104126</link>
        <guid>http://run-xiao.javaeye.com/blog/104126</guid>
      </item>
      <item>
        <title>工作交接</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/104124" style="color:red;">http://run-xiao.javaeye.com/blog/104124</a>&nbsp;
          发表时间: 2007年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>昨天终于仍下那一摊子事情给项目的其他几个哥们,自己安安心的回家了．走的时候该交代的也都交带了，都感觉自己有点婆婆</p>
<p>妈妈的了.这天准备这个案子的前期的一些事情，跟台北的ＩＴ部门谈需求和方按，然后整理，不满意，再改，再谈，再整理.我</p>
<p>就真是纳闷：大家都说的中国话怎么沟通起来就那么困难,客户团队和我们这么开发团队的想法很难达成一致.想想还打算以后做</p>
<p>个Consultant，看来这碗饭还真不适合我吃.然后项目计划也是改了Ｎ多遍,然后又还要跟他们不厌其烦的解释为什么我坚持要用</p>
<p>迭带式的分批交付.最终总算是勉勉强强同意的我的计划．到上个周末已经做完几个功能的设计和开发了，之后按部就班应该问</p>
<p>题不太大．真的是越来越觉得自己不太适合做管理了，净是些磨嘴皮子的事，很是耗精力.突然想起之前看的</p>
<p><agile p="" project=""></agile><agile management="" project=""></agile>Agile Project Management，这些算是妥协性Activity，自身对项目没什么价值，但是如果处理不好会成恶性循环，会耗费</p>
<p>更多精力,反而会影响正常的开发活动.</p>
<p>哎，以后还真不如做个简简单单的程序员好了,跟电脑打交道比跟人轻松啊,也不用抄那么多心,做ＰＭ真的会让人减寿命呢.可惜</p>
<p>就是Developer没PM钱多~~~~~~~~~~~~~~~~~,还得继续顶住</p>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/104124#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Sun, 22 Jul 2007 15:23:01 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/104124</link>
        <guid>http://run-xiao.javaeye.com/blog/104124</guid>
      </item>
      <item>
        <title>Ruby for rails</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/101877" style="color:red;">http://run-xiao.javaeye.com/blog/101877</a>&nbsp;
          发表时间: 2007年07月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>这些天农闲时间在读&lt;&lt;Ruby for Rails&gt;&gt; ,然后用VI写点Ruby代码,这样学习VI和Ruby两不误，hoho。</p>
<p>这本书感觉还真不错，刚看到第6章，之前很多比较模糊的东西，比如Symbol和字串，Module和Class</p>
<p>感觉清楚多了。只是E文读的慢啊，还有一大半，继续啃啃啃啃啃啃！</p>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/101877#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jul 2007 10:22:59 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/101877</link>
        <guid>http://run-xiao.javaeye.com/blog/101877</guid>
      </item>
      <item>
        <title>刚申请离职了</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/101009" style="color:red;">http://run-xiao.javaeye.com/blog/101009</a>&nbsp;
          发表时间: 2007年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>昨天刚和老大谈离职的事情了，谈了一个多小时，最后我执意要走，也就没有说太多了，谈了谈今后的规划和整个行业的状</p>
<p>况。其实这家公司在中国的外包行业内应该还算不错的，虽然规模算不上大，只是自己实在是对做外包没什么兴趣了,没什么</p>
<p>技术含量，整天就是和客户磨嘴皮子。其实下一步自己该如何也还没想清楚，先回家休息一段时间再说。</p>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/101009#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jul 2007 13:02:07 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/101009</link>
        <guid>http://run-xiao.javaeye.com/blog/101009</guid>
      </item>
      <item>
        <title>昨天玩了一下VI</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/100060" style="color:red;">http://run-xiao.javaeye.com/blog/100060</a>&nbsp;
          发表时间: 2007年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>昨天花半天时间玩了一下VI，刚开始的时候看着黑黑的屏幕和稀奇古怪的命令，真是恐怖，这是人玩的东西吗！</p>
<p>慢慢熟悉了感觉功能还真的是很强呢。</p>
<p>VI说道底也就是在三种模式间切换，完成文本编辑的操作。命令模式，插入模式，可视模式。</p>
<p>当你不知道是在什么模式的时候，狂按ESC就肯定进到命令模式了:)</p>
<p>命令模式也主要就做些文件保存退出；光标移动(左右，上下，单词，行，段)；查找替换；删除等操作</p>
<p>在命令模式下，i,a,o 三个命令进入插入模式，才能编辑文件。</p>
<p>命令模式下,v进入可视模式，选择区域后，y是复制，d是剪切，回到命令模式后p就贴上了</p>
<p>除此之外，再就是VIMRC文件内一些乱七八糟的配置，可以配置语法高亮，缩进等，</p>
<p>但还没找到一个完整配置的说明，到底有哪些项可以配？</p>
<p>还有一些功能还没玩出来，比如：如何设置编译器编译当前文本；如何开多个文件切换。</p>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/100060#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Wed, 11 Jul 2007 10:02:35 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/100060</link>
        <guid>http://run-xiao.javaeye.com/blog/100060</guid>
      </item>
      <item>
        <title>GCC笔记(转贴)</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/99822" style="color:red;">http://run-xiao.javaeye.com/blog/99822</a>&nbsp;
          发表时间: 2007年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="tit">GCC笔记 (来源cu）</div>
<div class="date">2007-07-09 07:14</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <div style="MARGIN: 15px">
            <p><strong><font color="#ff0000">The History of GCC</font></strong></p>
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            <p>&nbsp;</p>
            <div style="TEXT-ALIGN: left">1984年，Richard Stallman发起了自由软件运动，GNU (Gnu's Not Unix)项目应运而生，3年后，最初版的GCC横空出世，成为第一款可移植、可优化、支持ANSI C的开源C编译器。<br />
            GCC最初的全名是GNU C Compiler,之后，随着GCC支持的语言越来越多，它的名称变成了GNU Compiler Collection。<br />
            这里介绍的gcc是GCC的前端，C编译器.<br />
            </div>
            <p><br />
            <font color="#ff0000" style="COLOR: rgb(255,1,2)"><strong></strong></font><font color="#0000ff" style="FONT-WEIGHT: bold; COLOR: rgb(255,1,2)">警告信息</font></p>
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            <div style="TEXT-ALIGN: left">&nbsp;&nbsp;&nbsp;&nbsp; -Wall : 显示所有常用的编译警告信息。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -W&nbsp;&nbsp;&nbsp;&nbsp; : 显示更多的常用编译警告，如：变量未使用、一些逻辑错误。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -Wconversion : 警告隐式类型转换。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -Wshadow : 警告影子变量（在代码块中再次声明已声明的变量)<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -Wcast-qual ：警告指针修改了变量的修饰符。如：指针修改const变量。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -Wwrite-strings : 警告修改const字符串。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -Wtraditional : 警告ANSI编译器与传统C编译器有不同的解释。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -Werror : 即使只有警告信息，也不编译。（gcc默认：若只有警告信息，则进行编译，若有错误信息，则不编译）<br />
            </div>
            <p><br />
            <font color="#0000ff" style="COLOR: rgb(255,1,2)"><span style="FONT-WEIGHT: bold">C语言标准</span></font></p>
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            <p><font color="#0000ff"><span style="FONT-WEIGHT: bold"></span></font></p>
            <div style="TEXT-ALIGN: left">你可以在gcc的命令行中通过指定选项来选择相应的C语言标准: 从传统c到最新的GNU扩展C. 默认情况下, gcc使用最新的GNU C扩展.<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp; -ansi : 关闭GNU扩展中与ANSI C相抵触的部分。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -pedantic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 关闭所有的GNU扩展。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -std=c89&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 遵循C89标准<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -std=c99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 遵循C99标准<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -std=traditional : 使用原始C<br />
            注意：后4个选项可以与-ansi结合使用，也可以单独使用。<br />
            <br />
            可在gcc中使用大量GNU C扩展.<br />
            </div>
            <p><font color="#0000ff" style="FONT-WEIGHT: bold; COLOR: rgb(255,1,2)">生成特定格式的文件</font></p>
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            <p>以hello.c为例子，可以设置选项生成hello.i, hello.s, hello.o以及最终的hello文件：<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp; hello.c : 最初的源代码文件；<br />
            &nbsp;&nbsp;&nbsp;&nbsp; hello.i : 经过编译预处理的源代码；<br />
            &nbsp;&nbsp;&nbsp;&nbsp; hello.s : 汇编处理后的汇编代码；<br />
            &nbsp;&nbsp;&nbsp;&nbsp; hello.o : 编译后的目标文件，即含有最终编译出的机器码，但它里面所引用的其他文件中函数的内存位置尚未定义。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; hello / a.out : 最终的可执行文件<br />
            &nbsp;&nbsp;&nbsp;&nbsp; (还有.a(静态库文件), .so(动态库文件), .s(汇编源文件)留待以后讨论)<br />
            </p>
            <p>
            <table align="center" style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid">
                <tbody>
                    <tr>
                        <td>
                        <p>如果你不通过-o指定生成可执行文件名，那么会默认生成a.out. 不指定生成文件名肯能覆盖你上次生成的a.out.<br />
                        </p>
                        <p><span style="FONT-WEIGHT: bold">e.g.</span><br />
                        $ <span style="COLOR: rgb(0,1,255)">gcc hello.c</span><br />
                        在不给gcc传递任何参数的情况下, gcc执行默认的操作: 将源文件编译为目标文件--&gt; 将目标文件连接为可执行文件(名为a.out) --&gt; 删除目标文件.<br />
                        </p>
                        <p>-c生成.o文件时，默认生成与源代码的主干同名的.o文件。比如对应hello.c生成hello.o. 但也可在生成目标文件时指定目标文件名(注意同时要给出.o后缀): $ <span style="COLOR: rgb(0,1,255)">gcc -c -o demo.o demo.c</span><br />
                        </p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp; $ <span style="COLOR: rgb(0,1,255)">gcc -Wall -c hello.c </span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 生成hello.o<br />
            &nbsp;&nbsp;&nbsp;&nbsp; $ <span style="COLOR: rgb(0,1,255)">gcc -Wall -c -save-temps hello.c</span>&nbsp;&nbsp; : 生成hello.i, hello.s, hello.o<br />
            &nbsp;&nbsp;&nbsp;&nbsp; 注意-Wall 选项的使用场合：仅在涉及到编译（即会生成.o文件时，用-Wall）&nbsp;&nbsp;&nbsp;<br />
            </p>
            <p><font color="#0000ff" style="FONT-WEIGHT: bold; COLOR: rgb(255,1,2)">多文件编译、连接</font><br />
            </p>
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            <p>如果原文件分布于多个文件中：file1.c, file2,c<br />
            &nbsp;&nbsp;&nbsp;&nbsp; $ <span style="COLOR: rgb(0,1,255)">gcc -Wall file1.c file2.c -o name</span></p>
            <p>若对其中一个文件作了修改，则可只重新编译该文件,再连接所有文件：<br />
            &nbsp;&nbsp;&nbsp;&nbsp; $ <span style="COLOR: rgb(0,1,255)">gcc -Wall -c file2.c</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; $ <span style="COLOR: rgb(0,1,255)">gcc file1.c file2.o -c name</span></p>
            <p>注意：若编译器在命令行中从左向右顺序读取.o文件，则它们的出现顺序有限制：含有某函数定义的文件必须出现在含有调用该函数的文件之后。好在GCC无此限制。<br />
            </p>
            <p><font color="#ff0000"><strong>编译预处理</strong></font></p>
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            以上述的hello.c为例, 要对它进行编译预备处理, 有两种方法: 在gcc中指定-E选项, 或直接调用cpp.gcc的编译预处理命令程序为cpp，比较新版本的gcc已经将cpp集成了，但仍提供了cpp命令. 可以直接调用cpp命令, 也可以在gcc中指定-E选项指定它只进行编译预处理.<br />
            <br />
            $ <span style="COLOR: rgb(0,1,255)">gcc -E hello.c&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;<span style="COLOR: rgb(0,1,2)">==&nbsp;&nbsp; $</span> cpp hello.c</span><br />
            上述命令马上将预处理结果显示出来. 不利于观看. 可采用-c将预处理结果保存:<br />
            $ <span style="COLOR: rgb(0,1,255)">gcc -E -c hello.i hello.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,1,2)">==&nbsp;&nbsp; $</span> cpp -o hello.i hello.c</span><br />
            注意, -c指定名称要给出&quot;.i&quot;后缀.<br />
            <br />
            另外, gcc针对编译预处理提供了一些选项:<br />
            (1) 除了直接在源代码中用 #define NAME来定义宏外，gcc可在命令行中定义宏：-DNAME(其中NAME为宏名),&nbsp;&nbsp; 也可对宏赋值: -DNAME=value 注意等号两边不能有空格! 由于宏扩展只是一个替换过程，也可以将value换成表达式，但要在两边加上双括号: -DNAME=&quot;statement&quot;<br />
            e.g. $ <font color="#0000ff">gcc -Wall -DVALUE=&quot;2+2&quot; tmp.c -o tmp</font><br />
            如果不显示地赋值，如上例子，只给出：-DVALUE,gcc将使用默认值：1.<br />
            <br />
            (2) 除了用户定义的宏外, 有一些宏是编译器自动定义的，它们以__开头，运行: $ <span style="COLOR: rgb(0,1,255)">cpp -dM /dev/null</span>, 可以看到这些宏. 注意, 其中含有不以__开头的非ANSI宏，它们可以通过-ansi选项被禁止。<br />
            &nbsp;&nbsp;<br />
            <font color="#0000ff"><strong>查看宏扩展<br />
            <br />
            </strong></font>1, 运行 $ <span style="COLOR: rgb(0,1,255)">gcc -E test.c</span> ，gcc对test.c进行编译预处理，并立马显示结果. (不执行编译) 2, 运行 $ <span style="COLOR: rgb(0,1,255)">gcc -c -save-temps test.c</span> ，不光产生test.o，还产生test.i, test.s，前者是编译预处理结果, 后者是汇编结果.<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<br />
            <font color="#0000ff"><strong>利用Emacs查看编译预处理结果<br />
            <br />
            </strong></font>针对含有编译预处理命令的代码，可以利用emacs方便地查看预处理结果，而不需执行编译，更为方便的是，可以只选取一段代码，而非整个文件：<br />
            1，选择想要查看的代码<br />
            2，C-c C-e (M-x c-macro-expand)<br />
            这样，就自动在一个名为&quot;Macroexpansion&quot;的buffer中显示pre-processed结果.<br />
            <br />
            <span style="FONT-WEIGHT: bold; COLOR: rgb(255,1,2)">生成汇编代码</span><br />
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            使用&quot;-S&quot;选项指定gcc生成以&quot;.s&quot;为后缀的汇编代码:<br />
            $ <span style="COLOR: rgb(0,1,255)">gcc -S hello.c</span><br />
            $ <span style="COLOR: rgb(0,1,255)">gcc -S -o hello.s hello.c</span><br style="COLOR: rgb(0,1,255)" />
            <br />
            生成汇编语言的格式取决于目标平台. 另外, 如果是多个.c文件, 那么针对每一个.c文件生成一个.s文件.<br />
            <p><span style="FONT-WEIGHT: bold; COLOR: rgb(0,1,255)"><font color="#ff0000">包含头文件</font> </span>在程序中包含与连接库对应的头文件是很重要的方面，要使用库，就一定要能正确地引用头文件。一般在代码中通过#include引入头文件, 如果头文件位于系统默认的包含路径(/usr/includes), 则只需在#include中给出头文件的名字, 不需指定完整路径.&nbsp;&nbsp; 但若要包含的头文件位于系统默认包含路径之外, 则有其它的工作要做: 可以(在源文件中)同时指定头文件的全路径. 但考虑到可移植性，最好通过-I在调用gcc的编译命令中指定。 </p>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            <p>下面看这个求立方的小程序(阴影语句表示刚开始不存在）:</p>
            <p>
            <table align="center" style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid">
                <tbody>
                    <tr>
                        <td>#include &lt;stdio.h&gt;<br />
                        <span style="COLOR: rgb(199,199,199)">#include &lt;math.h&gt;</span><br />
                        int main(int argc, char *argv[])<br />
                        {<br />
                        &nbsp;&nbsp; double x = pow (2.0, 3.0);<br />
                        &nbsp;&nbsp; printf(&quot;The cube of 2.0 is %f\n&quot;, x);<br />
                        &nbsp;&nbsp; return 0;<br />
                        }</td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p>使用gcc-2.95来编译它(-lm选项在后面的连接选项中有介绍, 这里只讨论头文件的包含问题):<br />
            $<span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"> </span><span style="COLOR: rgb(0,1,255)">gcc-2.95 -Wall pow.c -lm -o pow_2.95</span><br />
            <font color="#494949">pow.c: In function `main':<br />
            pow.c:5: warning: implicit declaration of function `pow'</font></p>
            <p>程序编译成功，但gcc给出警告: pow函数隐式声明。<br />
            $<span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"> </span><span style="COLOR: rgb(0,1,255)">./pow_2.95</span><br />
            <font color="#494949">The cube of 2.0 is 1.000000</font></p>
            <p>明显执行结果是错误的，在源程序中引入头文件(#include &lt;math.h&gt;)，消除了错误。</p>
            <p>
            <table align="center" style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid">
                <tbody>
                    <tr>
                        <td>不要忽略Warning信息！它可能预示着，程序虽然编译成功，但运行结果可能有错。故，起码加上&quot;-Wall&quot;编译选项！并尽量修正Warning警告。<br />
                        </td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p><font color="#9999cc" style="FONT-WEIGHT: bold; COLOR: rgb(0,1,255)">搜索路径</font></p>
            <p>首先要理解 #include&lt;file.h&gt;和#include&quot;file.h&quot;的区别:<br />
            #include&lt;file.h&gt;只在默认的系统包含路径搜索头文件<br />
            #include&quot;file.h&quot;首先在当前目录搜索头文件, 若头文件不位于当前目录, 则到系统默认的包含路径搜索头文件.<br />
            </p>
            <p>UNIX类系统默认的系统路径为：</p>
            <p>头文件，包含路径：　/usr/local/include/&nbsp;&nbsp; or&nbsp;&nbsp; /usr/include/<br />
            库文件，连接路径：　/usr/local/lib/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or&nbsp;&nbsp; /usr/lib/&nbsp;&nbsp;&nbsp;&nbsp;</p>
            <p>对于标准c库(glibc或其它c库)的头文件, 我们可以直接在源文件中使用#include &lt;file.h&gt;来引入头文件. <br />
            </p>
            <p>如果要在源文件中引入自己的头文件, 就需要考虑下面的问题:<br />
            </p>
            <p>1, 如果使用非系统头文件, 头文件和源文件位于同一个目录, 如何引用头文件呢?<br />
            &mdash;&mdash;我们可以简单地在源文件中使用 #include &quot;file.h&quot;, gcc将当前目录的file.h引入到源文件. 如果你很固执, 仍想使用#include &lt;file.h&gt;语句, 可以在调用gcc时添加&quot;-I.&quot;来将当前目录添加到系统包含路径. 细心的朋友可能会想到: 这样对引用其它头文件会不会有影响? 比如, #include&lt;file.h&gt;之后紧接着一个#include&lt;math.h&gt;, 它能正确引入math.h吗? 答案是: 没有影响. 仍然能正确引用math.h. 我的理解是: &quot;-I.&quot;将当前目录作为包含路径的第一选择, 若在当前目录找不到头文件, 则在默认路径搜索头文件. 这实际上和#include&quot;file.h&quot;是一个意思.<br />
            </p>
            <p>2, 对于比较大型的工程, 会有许多用户自定义的头文件, 并且头文件和.c文件会位于不同的目录. 又该如何在.c文件中引用头文件呢?<br />
            &mdash;&mdash; 可以直接在.c文件中利用#include&ldquo;/path/file.h&quot;, 通过指定头文件的路径(可以是绝对路径, 也可以是相对路径)来包含头文件. 但这明显降低了程序的可移植性. 在别的系统环境下编译可能会出现问题. 所以还是利用&quot;-I&quot;选项指定头文件完整的包含路径.<br />
            </p>
            <table align="center" style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid">
                <tbody>
                    <tr>
                        <td>针对头文件比较多的情况, 最好把它们统一放在一个目录中, 比如~/project/include. 这样就不需为不同的头文件指定不同的路径. 如果你嫌每次输入这么多选项太麻烦, 你可以通过设置环境变量来添加路径:<br />
                        $ <font color="#0000ff">C_INCLUDE_PATH=/opt/gdbm-1.8.3/include</font><br />
                        $ <font color="#0000ff">export C_INCLUDE_PATH</font><br />
                        $ <font color="#0000ff">LIBRART_PATH=/opt/gdbm-1.8.3/lib</font><br />
                        $ <font color="#0000ff">export LIBRART_PATH<br />
                        <br />
                        </font>可一次指定多个搜索路径，&quot;:&quot;用于分隔它们，&quot;.&quot;表示当前路径，如：<br />
                        $ <span style="COLOR: rgb(0,1,255)">C_INCLUDE_PATH=.:/opt/gdbm-1.8.3/include:/net/include</span><br />
                        $ <span style="COLOR: rgb(0,1,255)">LIBRARY_PATH=.:/opt/gdbm-1.8.3/lib:/net/lib</span><br />
                        （可以添加多个路径，路径之间用:相隔，.代表当前目录，若.在最前头，也可省略）<br />
                        <br />
                        当然，若想永久地添加这些路径，可以在.bash_profile中添加上述语句.<br />
                        </td>
                    </tr>
                </tbody>
            </table>
            <p>3, 还有一个比较猥琐的办法: 系统默认的包含路径不是/usr/include或/usr/local/include么? 我把自己的头文件拷贝到其中的一个目录, 不就可以了么? 的确可以这样, 如果你只想在你自己的机器上编译运行这个程序的话<img src="http://www.cublog.cn/images/face/004.gif" alt="" />.<br />
            </p>
            前面介绍了三种添加搜索路径的方法，如果这三种方法一起使用，优先级如何呢？<br />
            命令行设置　&gt; 环境变量设置　&gt; 系统默认<br />
            <br />
            <p><font color="#9999cc" style="FONT-WEIGHT: bold; COLOR: rgb(255,1,2)">与外部库连接<br />
            </font></p>
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            前面介绍了如何包含头文件. 而头文件和库是息息相关的, 使用库时, 要在源代码中包含适当的头文件，这样才能声明库中函数的原型(发布库时, 就需要给出相应的头文件). <br />
            <br />
            和包含路径一样, 系统也有默认的连接路径:<br />
            <span style="COLOR: rgb(73,73,73)">头文件，包含路径：　/usr/local/include/&nbsp;&nbsp; or&nbsp;&nbsp; /usr/include/</span><br style="COLOR: rgb(73,73,73)" />
            <span style="COLOR: rgb(73,73,73)">库文件，连接路径：　/usr/local/lib/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or&nbsp;&nbsp; /usr/lib/&nbsp;&nbsp;&nbsp;</span><br />
            <br />
            同样地, 我们想要使用某个库里的函数, 必须将这个库连接到使用那些函数的程序中.<br />
            <br />
            <table align="center" style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid">
                <tbody>
                    <tr>
                        <td>有一个例外: libc.a或libc.so (C标准库,它包含了ANSI C所定义的C函数)是不需要你显式连接的, 所有的C程序在运行时都会自动加载c标准库. <br />
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            除了C标准库之外的库称之为&quot;外部库&quot;, 它可能是别人提供给你的, 也可能是你自己创建的(后面有介绍如何创建库的内容).<br />
            <br />
            外部库有两种：(1)静态连接库lib.a<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)共享连接库lib.so
            <p><span style="COLOR: rgb(0,1,255)">两者的共同点：</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; .a, .so都是.o目标文件的集合，这些目标文件中含有一些函数的定义（机器码），而这些函数将在连接时会被最终的可执行文件用到。</p>
            <p><span style="COLOR: rgb(0,1,255)">两者的区别：</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; 静态库.a&nbsp;&nbsp; : 当程序与静态库连接时，库中目标文件所含的所有将被程序使用的函数的机器码被copy到最终的可执行文件中. 静态库有个缺点: 占用磁盘和内存空间. 静态库会被添加到和它连接的每个程序中, 而且这些程序运行时, 都会被加载到内存中. 无形中又多消耗了更多的内存空间.<br />
            </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp; 共享库.so : 与共享库连接的可执行文件只包含它需要的函数的引用表，而不是所有的函数代码，只有在程序执行时, 那些需要的函数代码才被拷贝到内存中, 这样就使可执行文件比较小, 节省磁盘空间(更进一步，操作系统使用虚拟内存，使得一份共享库驻留在内存中被多个程序使用).共享库还有个优点: 若库本身被更新, 不需要重新编译与它连接的源程序。</p>
            <p><span style="FONT-WEIGHT: bold; COLOR: rgb(0,1,255)">静态库</span></p>
            <p>下面我们来看一个简单的例子，计算2.0的平方根（假设文件名为sqrt.c）：</p>
            <table align="center" style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid">
                <tbody>
                    <tr>
                        <td><font size="2"><span>#include &lt;math.h&gt;</span><br />
                        <span>#include &lt;stdio.h&gt;</span><br />
                        <span>int</span><br />
                        <span>main (void)</span><br />
                        <span>{</span><br />
                        <span>double x = sqrt (2.0);</span><br />
                        <span>printf (&quot;The square root of 2.0 is %f\n&quot;, x);</span><br />
                        <span>return 0;</span><br />
                        <span>}</span></font><br />
                        </td>
                    </tr>
                </tbody>
            </table>
            <p>用gcc将它编译为可执行文件：<br />
            $ <span style="COLOR: rgb(0,1,255)">gcc -Wall sqrt.c -o sqrt</span><br />
            编译成功，没有任何警告或错误信息。执行结果也正确。<br />
            $<span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"> </span><span style="COLOR: rgb(0,1,255)">./sqrt</span><br style="COLOR: rgb(0,1,255); FONT-STYLE: italic" />
            <span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"><span style="COLOR: rgb(0,1,2)">The square root of 2.0 is 1.414214</span></span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<br />
            下面我们来看看刚才使用的gcc版本：<br />
            $ <span style="COLOR: rgb(0,1,255)">gcc --version</span><br />
            &nbsp;&nbsp;<span style="FONT-STYLE: italic">gcc (GCC) 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9)</span></p>
            <p>现在我用2.95版的gcc把sqrt.c再编译一次：<br />
            $<span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"> </span><span style="COLOR: rgb(0,1,255)">gcc-2.95 -Wall sqrt.c -o sqrt_2.95</span><br />
            &nbsp;&nbsp;<span style="FONT-STYLE: italic">/tmp/ccVBJd2H.o: In function `main':</span><br style="FONT-STYLE: italic" />
            <span style="FONT-STYLE: italic">&nbsp;&nbsp; sqrt.c:(.text+0x16): undefined reference to `sqrt'</span><br style="FONT-STYLE: italic" />
            <span style="FONT-STYLE: italic">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; collect2: ld returned 1 exit status</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<br />
            编译器会给出上述错误信息，这是因为sqrt函数不能与外部数学库&quot;libm.a&quot;相连。sqrt函数没有在程序中定义，也不存在于默认C库 &quot;libc.a&quot;中，如果用gcc-2.95，应该显式地选择连接库。上述出错信息中的&quot;/tmp/ccVBJd2H.o&quot;是gcc创造的临时目标文件，用作连接时用。</p>
            <p>使用下列的命令可以成功编译：<br />
            $ <span style="COLOR: rgb(0,1,255)">gcc-2.95 -Wall sqrt.c /usr/lib/libm.a -o sqrt_2.95</span><span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"><br />
            </span><span style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,2)">它告知gcc:在编译sqrt.c时，加入位于/usr/lib中的libm.a库（C数学库）。</span></span></p>
            <table align="center" style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid">
                <tbody>
                    <tr>
                        <td>C库文件默认位于/usr/lib, /usr/local/lib系统目录中； gcc默认地从/usr/local/lib, /usr/lib中搜索库文件。（在我的Ubuntu系统中，C库文件位于/urs/lib中。<br />
                        </td>
                    </tr>
                </tbody>
            </table>
            <p><span style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,2)">这里还要注意连接顺序的问题，比如上述命令，如果我改成：<br />
            </span></span>$<span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"> </span><span style="COLOR: rgb(0,1,255)">gcc-2.95 -Wall /usr/lib/libm.a </span><span style="COLOR: rgb(0,1,255)">sqrt.c </span><span style="COLOR: rgb(0,1,255)">-o sqrt_2.95</span><span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"><br />
            </span><span style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,2)">gcc会给出出错信息：<br />
            </span></span><span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"><span style="COLOR: rgb(0,1,2)">/tmp/cc6b3bIa.o: In function `main':</span><br style="COLOR: rgb(0,1,2)" />
            <span style="COLOR: rgb(0,1,2)">sqrt.c:(.text+0x16): undefined reference to `sqrt'</span><br style="COLOR: rgb(0,1,2)" />
            <span style="COLOR: rgb(0,1,2)">collect2: ld returned 1 exit status</span></span></p>
            <p><span style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,2)">正如读取目标文件的顺序，gcc也在命令行中从左向右读取库文件&mdash;&mdash;任何包含某函数定义的库文件必须位于调用该函数的目标文件之后！</span></span></p>
            <p><span style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,2)">指定库文件的绝对路径比较繁琐，有一种简化方法，相对于上述命令，可以用下面的命令来替代：<br />
            </span></span>$ <span style="COLOR: rgb(0,1,255)">gcc-2.95 -Wall sqrt.c -lm -o sqrt_2.95</span><span style="COLOR: rgb(0,1,255); FONT-STYLE: italic"><br />
            </span><span style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,2)">其中的&quot;-l&quot;表示与库文件连接，&quot;m&quot;代表&quot;libm.a&quot;中的m。一般而言，&quot;-lNAME&quot;选项会使gcc将目标文件与名为&quot;libNAME.a&quot;的库文件相连。（这里假设使用默认目录中的库，对于其他目录中的库文件，参考后面的&ldquo;搜索路径&rdquo;。）</span><br />
            </span></p>
            <p>上面所提到的&quot;libm.a&quot;就是静态库文件，所有静态库文件的扩展名都是.a！<br />
            $ <span style="COLOR: rgb(0,1,255)">whereis libm.a</span><br />
            &nbsp;&nbsp;<span style="FONT-STYLE: italic">libm: /usr/lib/libm.a /usr/lib/libm.so</span></p>
            <p>正如前面所说，默认的库文件位于/usr/lib/或/usr/local/lib/目录中。其中，libm.a是静态库文件，libm.so是后面会介绍的动态共享库文件。</p>
            <p>如果调用的函数都包含在libc.a中（C标准库被包含在/usr/lib/libc.a中，它包含了ANSI C所定义的C函数）。那么没有必要显式指定libc.a：所有的C程序运行时都自动包含了C标准库！（试试 $ gcc-2.95 -Wall hello.c -o hello)。</p>
            <p><span style="FONT-WEIGHT: bold; COLOR: rgb(0,1,255)">共享库</span></p>
            <p>正因为共享库的优点，如果系统中存在.so库，gcc默认使用共享库（在/usr/lib/目录中，库文件以共享和静态两种版本存在）。 </p>
            <p>运行：$ <font color="#0000ff">gcc -Wall -L. hello.c -lNAME -o hello</font><br />
            gcc先检查是否有替代的libNAME.so库可用。&nbsp;&nbsp;&nbsp;&nbsp;</p>
            <p>正如前面所说，共享库以.so为扩展名（so == shared object)。</p>
            <p>那么，如果不想用共享库，而只用静态库呢？可以加上 -static选项<br />
            $ <font color="#0000ff">gcc -Wall -static hello.c -lNAME -o hello</font><br />
            它等价于：<br />
            $ <font color="#0000ff">gcc -Wall hello.c libNAME.a -o hello</font></p>
            <p style="COLOR: rgb(118,118,118)">$ gcc-2.95 -Wall sqrt.c -static -lm -o sqrt_2.95_static<br />
            $ gcc-2.95 -Wall sqrt.c -lm -o sqrt_2.95_default<br />
            $ gcc-2.95 -Wall sqrt.c /usr/lib/libm.a -o sqrt_2.95_a<br />
            $ gcc-2.95 -Wall sqrt.c /usr/lib/libm.so -o sqrt_2.95_so</p>
            <p style="COLOR: rgb(118,118,118)"><span style="COLOR: rgb(118,118,118)">$ ls -l sqrt*</span><br style="COLOR: rgb(118,118,118)" />
            <span style="COLOR: rgb(118,118,118)">-rwxr-xr-x&nbsp;&nbsp; 1 zp zp&nbsp;&nbsp; 21076 2006-04-25 14:52 sqrt_2.95_a</span><br style="COLOR: rgb(118,118,118)" />
            <span style="COLOR: rgb(118,118,118)">-rwxr-xr-x&nbsp;&nbsp; 1 zp zp&nbsp;&nbsp;&nbsp; 7604 2006-04-25 14:52 sqrt_2.95_default</span><br style="COLOR: rgb(118,118,118)" />
            <span style="COLOR: rgb(118,118,118)">-rwxr-xr-x&nbsp;&nbsp; 1 zp zp&nbsp;&nbsp;&nbsp; 7604 2006-04-25 14:52 sqrt_2.95_so</span><br style="COLOR: rgb(118,118,118)" />
            <span style="COLOR: rgb(118,118,118)">-rwxr-xr-x&nbsp;&nbsp; 1 zp zp 487393 2006-04-25 14:52 sqrt_2.95_static</span></p>
            <p>上述用四种方式编译sqrt.c，并比较了可执行文件的大小。奇怪的是，-static -lm 和 /lib/libm.a为什么有区别？有知其原因着，恳请指明，在此谢谢了！ :)</p>
            <p>如果libNAME.a在当前目录，应执行下面的命令：<br />
            $ <font color="#0000ff">gcc -Wall -L. hello.c -lNAME -o hello</font><br />
            -L.表示将当前目录加到连接路径。</p>
            <p><font color="#9999cc" style="COLOR: rgb(0,1,255)"><strong>利用GNU archiver创建库</strong></font></p>
            <p>$ <font color="#0000ff">ar cr libhello.a hello_fn.o by_fn.o</font><br />
            从hello_fn.o和by_fn.o创建libihello.a，其中cr表示：creat &amp; replace<br />
            $ <font color="#0000ff">ar t libhello.a</font><br />
            列出libhello.a中的内容，t == table<br />
            （也可创建libhello.so）</p>
            <p>关于创建库的详细介绍，可参考本blog的<a href="http://www.cublog.cn/u/13991/showart.php?id=104690" target="_blank">GNU binutils笔记</a><br />
            </p>
            <br />
            <font color="#ff0000"><strong>调试</strong></font>
            <p>&nbsp;</p>
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            一般地，可执行文件中是不包含任何对源代码的参考的，而debugger要工作，就要知道目标文件／可执行文件中的机器码对应的源代码的信息（如：哪条语句、函数名、变量名...). debugger工作原理：将函数名、变量名，对它们的引用，将所有这些对象对应的代码行号储存到目标文件或可执行文件的符号表中。
            <p>&nbsp;</p>
            <p>GCC提供-g选项，将调试信息加入到目标文件或可执行文件中。<br />
            $ <font color="#0000ff">gcc -Wall -g hello.c -o hello</font><br />
            <br />
            注意：若发生了段错误，但没有core dump，是由于系统禁止core文件的生成！<br />
            $ <font color="#0000ff">ulimit -c</font>　　，若显示为0，则系统禁止了core dump<br />
            </p>
            <p><span style="FONT-WEIGHT: bold">解决方法</span>:<br />
            $ <font color="#0000ff">ulimit -c unlimited</font>　　（只对当前shell进程有效）<br />
            或在~/.bashrc　的最后加入： ulimit -c unlimited （一劳永逸）<br />
            </p>
            <p><font color="#ff0000"><strong>优化</strong></font> </p>
            <hr style="WIDTH: 100%; HEIGHT: 2px" />
            GCC具有优化代码的功能，代码的优化是一项比较复杂的工作，它可归为：源代码级优化、速度与空间的权衡、执行代码的调度。
            <p>&nbsp;</p>
            <p>GCC提供了下列优化选项：<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -O0&nbsp;&nbsp; : 默认不优化（若要生成调试信息，最好不优化）<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -O1&nbsp;&nbsp; : 简单优化，不进行速度与空间的权衡优化；&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -O2&nbsp;&nbsp; : 进一步的优化，包括了调度。（若要优化，该选项最适合，它是GNU发布软件的默认优化级别；<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -O3&nbsp;&nbsp; : 鸡肋，兴许使程序速度更慢；<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -funroll-loops&nbsp;&nbsp; : 展开循环，会使可执行文件增大，而速度是否增加取决于特定环境；<br />
            &nbsp;&nbsp;&nbsp;&nbsp; -Os&nbsp;&nbsp; : 生成最小执行文件；<br />
            <br />
            一般来说，调试时不优化，一般的优化选项用-O2（gcc允许-g与-O2联用，这也是GNU软件包发布的默认选项），embedded可以考虑-Os。</p>
            <p>注意：此处为O！（非0或小写的o,-o是指定可执行文件名）。<br />
            <br />
            检验优化结果的方法：$ <span style="COLOR: rgb(0,1,255)">time ./prog</span></p>
            <p>time测量指定程序的执行时间，结果由三部分组成： <br />
            &nbsp;&nbsp;&nbsp;&nbsp; real : 进程总的执行时间, 它和系统负载有关(包括了进程调度,切换的时间)<br />
            &nbsp;&nbsp;&nbsp;&nbsp; user: 被测量进程中用户指令的执行时间<br />
            &nbsp;&nbsp;&nbsp;&nbsp; sys&nbsp;&nbsp; : 被测量进程中内核代用户指令执行的时间</p>
            <p>user和sys的和被称为CPU时间.</p>
            <p>注意：对代码的优化可能会引发警告信息，移出警告的办法不是关闭优化，而是调整代码。</p>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/99822#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Tue, 10 Jul 2007 16:25:47 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/99822</link>
        <guid>http://run-xiao.javaeye.com/blog/99822</guid>
      </item>
      <item>
        <title>近期读书计划</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/99720" style="color:red;">http://run-xiao.javaeye.com/blog/99720</a>&nbsp;
          发表时间: 2007年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="4"><strong>《企业应用架构模式》&mdash;&mdash;</strong></font><font size="3">敬仰已久，如雷灌耳，一直无缘，先灭它</font></p>
<p><font size="4"><strong>《<font face="Arial">User Stories Applied - For Agile Software Development</font>》&mdash;&mdash;</strong></font><font size="3">User Story是XP方法论的基础，另外参考比较一下RUP中的Requirement是如何管理的。感觉自己在跟客户谈Requirement 太弱了，都没个明确的思路</font></p>
<p><font size="3"><font size="4"><strong>《<font face="Arial">敏捷建模</font>》&mdash;&mdash;</strong>之前在书店翻了一下，感觉还不错</font></font></p>
<font size="4">
<p><font size="3"><font size="4"><strong>《<font face="Arial"><font face="Arial">Test-Driven Development By Example</font></font>》&mdash;&mdash;</strong>有看过E版，不过没看完，现在一直玩TDD，不过始终有些困惑，希望能解看</font></font></p>
<p><font face="Arial"><font size="3"><font size="4"><strong>《<font face="Arial"><font face="Arial"><font face="Arial">Ruby for rails</font></font></font>》&mdash;&mdash;<font size="3">看了一部分了，感觉挺好，解答了我很多疑惑，对深入了解Ruby和Rails很有帮忙</font></strong></font></font></font></p>
<p><strong><font size="3">MyGod！每天晚上又要少睡一小时了！</font></strong></p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/99720#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Tue, 10 Jul 2007 10:47:40 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/99720</link>
        <guid>http://run-xiao.javaeye.com/blog/99720</guid>
      </item>
      <item>
        <title>Ruby类库的安全性</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/99480" style="color:red;">http://run-xiao.javaeye.com/blog/99480</a>&nbsp;
          发表时间: 2007年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Ruby语法中可以随时再打开一个class，然后重新定义其方法，这样任何人都可以随时再打开一个类并重新定义其方法，甚至</p>
<p>写些不安全的代码。比如我可以重新定义Time的方法</p>
<p>class Time</p>
<p>def&nbsp; now</p>
<p>&nbsp;&nbsp;&nbsp; #在这里写自己的代码覆盖库</p>
<p>end</p>
<p>end</p>
<p>我在now方法里重写自己的任意方法，甚至可以被病毒利用，狂删机器中的文件，那样岂不是很危险？</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/99480#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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, 09 Jul 2007 18:42:13 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/99480</link>
        <guid>http://run-xiao.javaeye.com/blog/99480</guid>
      </item>
      <item>
        <title>RoR快还真不是吹的</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/99462" style="color:red;">http://run-xiao.javaeye.com/blog/99462</a>&nbsp;
          发表时间: 2007年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>之前对Ruby和ROR还都是玩玩，顶多跟着<font face="Arial">Agile_Web_Development_With_Rails抄了遍OnlineShop，最近农闲写了篇介绍</font></p>
<p><font face="Arial">ROR的文章贴在公司的的内刊上，想想自己还没怎么实战过，不能瞎忽悠人呢。</font></p>
<p>把之前刚进公司做Java培训的一个简单联系人管理系统用ROR重新玩了一把，系统很简单，包括：登陆，联系人查询，新增，</p>
<p>修改，删除，分配组；组的新增，删除，和修改及查询，分配联系人。居然<font size="4"><strong>三天</strong></font>内全部搞定，包括Unit Test,Function Test和</p>
<p>部分Integration Test！ 想当年玩Java，也刚入门，花了2-3周才搞定。</p>
<p>看来都说RoR快，还真不是吹的：）</p>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/99462#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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, 09 Jul 2007 17:13:20 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/99462</link>
        <guid>http://run-xiao.javaeye.com/blog/99462</guid>
      </item>
      <item>
        <title>实践Pair Programming</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/97843" style="color:red;">http://run-xiao.javaeye.com/blog/97843</a>&nbsp;
          发表时间: 2007年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>前段时间在Team内小试了一下Pair Programming,小记一下感受。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当我周会上决定近段时间的新功能两人结对开发时，大家一片欢呼，热烈欢迎，可现实状况&mdash;&mdash;我们4个人都没有PP过的</p>
<p>经验，也都道听途说而已。为了先试试效果，决定先由我和另一个技术稍强，性格外向的组队。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和他一起Programming的过程还是比较愉快。与其说是Pair Programming，不如说是Pair Talking。我们两个人讨论的时</p>
<p>间要比Coding 所花的时间多。比如需求理解不一致经常会争论；对设计经常会脑子灵光一现，产生好的Idea，然后就停下来讨</p>
<p>论可行性；程序不同的写法的差异和后果也会讨论一番；一些不好的编码习惯也会随时有人纠正；我也会把自己的很多开发的</p>
<p>经验告诉他。我发现平时我都没太多话的，这段时间都快成话唠了：）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和他Pair的过程，我估计工期比一个人单独做略短一点，所以总工时 &lt; 一个人做的工作 * 2，大约1.6倍左右。为什么会小</p>
<p>于2？因为两个人每小时都是有效工作时间，没人偷懒：）。但代码质量绝对有信心，最后User验收该功能也没有Bug。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 之后我安排他和一个比较内向的女生Pair，女生技术和经验上都差一点。发现效果比我们Pair时大打折扣。开始我发现女生</p>
<p>基本什么上都听他的，几乎没有提出自己的任何建议。后来我要求男生把Pair时的主控权大多时候交给女生，大多时间由女生</p>
<p>来掌控电脑，他负责Review她的工作，发现问题及时指正。这样让女生在做的过程中体现她的思路，了解她的思路后两人才能</p>
<p>更好的交流。最终产品质量也还不错，User验收只发现很少Bug。这个女生自己也说从他身上学了不少东西</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pair Programming一段时间之后，还是可以看到很明显的效果。Team内大家的交流比以前多了，以前很少有人主动讨论</p>
<p>新技术。我一直想在Team内做单元测试也基本实现了，大家对Junit的思想和基本用法也都通过&ldquo;一传十，十传百&rdquo;比较熟悉</p>
<p>了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最终感觉，&nbsp;Pair Programming实施和个人性格关系很大，和外向的人Pair是件愉快的事情，和外向的人Pair确是比较沉闷。</p>
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/97843#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Jul 2007 17:54:23 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/97843</link>
        <guid>http://run-xiao.javaeye.com/blog/97843</guid>
      </item>
      <item>
        <title>Java往Excel写入海量数据</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/78448" style="color:red;">http://run-xiao.javaeye.com/blog/78448</a>&nbsp;
          发表时间: 2007年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近需要往Excel写入海量数据，大约10W笔左右(超过6万会新建一个sheet再写)<br /><br />开始使用POI的包，写1W笔左右就out of memory了<br /><br />后来换用jxl，写1.8w笔左右报out of memory<br />(我机器配置Pentium(R)D 3GHZ,双核,内存1G)<br /><br />考虑到分批次写是否会好一些,每次先把数据写到一个临时文件，然后关闭流<br /><br />再将临时文件读入后再往里写，可是发现这样还是不行<br /><br />用jprofiler看了看内存使用状况，发现其实数据本身占空间并不是很大，而是每<br /><br />一个cell会产生很多相关的对象(不管是POI还是jxl,jxl资源释放会快一些),<br /><br />这些对象比数据本身占的空间要大得多，更郁闷的是即便是读入一个Excel文件，<br /><br />也会为有值得cell自动产生这些对象<br /><br />所以分批次写也行不通，因为中间产生的临时文件读入进来也可能耗光内存<br /><br />现在能想到的解决方案：1.加内存,客户不乐意<br /><br />2.替换成csv格式的文本，客户说这样产生文件数量太多也不乐意<br /><br />不知各位还有什么高见？<br /><br />谢谢
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/78448#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Thu, 10 May 2007 11:03:55 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/78448</link>
        <guid>http://run-xiao.javaeye.com/blog/78448</guid>
      </item>
      <item>
        <title>怎样才算一个好的项目经理</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/64647" style="color:red;">http://run-xiao.javaeye.com/blog/64647</a>&nbsp;
          发表时间: 2007年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          怎样才能算是个优秀的PM？大家发表一下自己的看法。<br />我先来<br />（１）很强的软件开发能力：包括技术和一些方法论，让客户和Ｂｏｓｓ相信你的专业，让手下的员工信服<br /><br />（２）熟悉业务领域知识：能用客户的语言与其沟通，否则很难挖掘出客户的真正需求<br /><br />（３）能很好和各方面沟通，处理好人际关系：处理好与Ｂｏｓｓ的关系，能支持你工作中的一些想法体会你的难处；处理好和Ｃｕｓｔｏｍｅｒ的关系，让他少找你＂麻烦＂；处理好和手下的员工的关系，让其相信你并能全力工作<br /><br />（４）一些管理的知识和技能：比如预算和成本控制，识别和控制风险，进度的掌握和控制<br /><br />（５）平衡各方面的利益：要能让Ｂｏｓｓ赚到钱，最终产品能实现客户的商业价值，手下的员工有所成长并能获得对应报酬<br /><br />（６）承受压力：承受客户的抱怨和质疑，老板的训斥，员工的怀疑和消极怠工<br />My God！这还是人吗？神啊！
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/64647#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Thu, 22 Mar 2007 13:14:37 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/64647</link>
        <guid>http://run-xiao.javaeye.com/blog/64647</guid>
      </item>
      <item>
        <title>Selenium使用的实际问题</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/60371" style="color:red;">http://run-xiao.javaeye.com/blog/60371</a>&nbsp;
          发表时间: 2007年03月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近做一个小的项目，初步试用了一下Selenium，感觉确实很爽，但实际操作起来有些问题<br />请各位了解的帮忙解答：<br />1.在Selenium中跑Html格式的TestCase要先把程序起来，然后选择html再Run，感觉很麻烦呢，<br />而且假若跑测试前要做也初始化的工作，就没不能自动化了，所以能否在cmd中调用制定参数自己Run，<br />试了一下好些不行呢（前提是本人较懒<img src="/images/smiles/icon_wink.gif"/>，不想写测试程序用Selenium）<br />2.一个比较现实的状况，假如有一个维护的功能包括增删改查，以前手工测试，当然是先测新增，<br />然后才有数据来再测后面。就是说功能间有关联的时候，想要自动化测试如何来做？要么整体考虑<br />，同手工测试一样？要么测试每个功能时都有初始化和清理的动作来准备环境？哪种方法会好一些呢？<br />个人感觉第2种会比较好，但这样一来又要多写不少代码，麻烦啊<img src="/images/smiles/icon_biggrin.gif"/><br />大家给点意见
          <br/>
          <span style="color:red;">
            <a href="http://run-xiao.javaeye.com/blog/60371#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 Mar 2007 16:36:25 +0800</pubDate>
        <link>http://run-xiao.javaeye.com/blog/60371</link>
        <guid>http://run-xiao.javaeye.com/blog/60371</guid>
      </item>
      <item>
        <title>JUnit测试的粒度问题</title>
        <author>run_xiao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://run-xiao.javaeye.com">run_xiao</a>&nbsp;
          链接：<a href="http://run-xiao.javaeye.com/blog/59553" style="color:red;">http://run-xiao.javaeye.com/blog/59553</a>&nbsp;
          发表时间: 2007年03月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于JUnit测试和TDD实践中有如下的疑问，请各位解惑：<br />JUnit测试的粒度如何把握？<br />简单的说是针对public的方法写测试就OK了呢？还是说要具体针对public方法中执行逻辑的每个步骤来写测试方法？<br />先说一下为什么会有这种困惑：<br />业务逻辑比较简单时，当然只针对Public方法的业务流程来设计案例，并只对public方法写test方法就好。<br />但最近做一个保险的项目，计算超复杂