<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/styles/rss.css" type="text/css"?>
<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns="http://my.netscape.com/rdf/simple/0.9/"
>

 <channel>
  <title>16hot 的博客</title>
  <link>http://16hot.blog.isyi.com</link>
  <description>16hot 一心想要建设一个公共平台给所有有需要的朋友使用。
但是，在这里留给自己一块空间，抒发自己的心情。</description>
 </channel>
    <item>
   <title>《PHP5权威编程》勘误</title>
   <description>&lt;p&gt;466页，安装xdebug。原文&amp;ldquo;就像APD一样，你可以运行pear install xdebug 从PECL安装Xdebug。&amp;rdquo;&lt;/p&gt;&lt;p&gt;这里的pear有误，应当是pecl。&lt;/p&gt;&lt;p&gt;正确方法： pecl install xdebug。&lt;br /&gt;&lt;/p&gt;</description>
   <link>http://16hot.blog.isyi.com/post/1/930</link>
      <pubDate>Mon, 10 Nov 2008 01:29:00 +1600</pubDate>   
  </item>
    <item>
   <title>定价的7大错误</title>
   <description>&lt;p&gt;　　文/Brad Sugars&lt;/p&gt;&lt;p&gt;　　任何公司面临的最大挑战之一就是定价。&lt;/p&gt;&lt;p&gt;　　这规律不仅适用于创业企业，也适用于成熟企业，尤其在那些利润率低、竞争激烈的行业。多数定价问题的共同核心是风险：价格设定太高的风险&amp;mdash;&amp;mdash;可能会失去潜在的客户；价格设定太低的风险&amp;mdash;&amp;mdash;利润减少了。&lt;/p&gt;&lt;p&gt;　　这种&amp;ldquo;定价矛盾&amp;rdquo;驱使多数企业家采取折扣策略。然而，多数情况下的风险可以通过获取更多的信息来消除。通常，你了解得越多，可能承受的风险就越少。从这个角度上说，定价的实质就是尽可能多地获得信息：你所在的市场、客户以及决定利润的企业内部数据。&lt;/p&gt;&lt;p&gt;　　生意上没有秘密，只有你还不知道的信息。说到定价问题，以下是在创业阶段避免犯错的7种方法。如果你能避免这些错误，就不仅能在竞争中领先，还能超越多数其他企业。&lt;/p&gt;&lt;p&gt;　　1.价格太低，总在减价：对有些公司来说，这并不是错误，这完全是战略，但并不是非常好的战略。价格总是走低可能会获得较高的营业收入，但也可能会损失你的利润底线，这关系到企业的生存问题。你需要平衡利润和价格的关系。&lt;/p&gt;&lt;p&gt;　　2.所有产品保持同样的毛利率：没有规则说所有的产品都需要同样的毛利率。事实上，周转慢的项目需要更高的毛利率。如果销量很大那么还可以用低些的毛利率。即使是这样，你还是应该寻找既能增加销量又能提高毛利率的方式。&lt;/p&gt;&lt;p&gt;　　3.不理解毛利与加价率的差别：毛利率总是基于销售价格。而加价率总是基于进货成本。我曾有一个客户不理解其中的差别，以100%的加价率报出了一系列产品的价格，然后又减掉50%达成销售。最终的结果？实际上这家商店基本上是以成本价销售。别犯同样的错误。&lt;/p&gt;&lt;p&gt;　　4.总是遗漏某些成本因素：为了正确地定价，需要识别每一项成本。即使是微不足道的项目，像信用卡处理费，通常也会增加每笔交易1%～2%的成本。其它的项目，像送货或运输成本，也能在不知不觉中增加成本。出售商品的成本对你的生存底线有着重大影响。&lt;/p&gt;&lt;p&gt;　　5.与竞争者采取类似策略：不要跟风竞争，多做点功课，发现你真正能为顾客提供的价值。然后根据这种价值给商品定价。这样做你就处于非常有利的位置，能抵御竞争保持价格。只要你有了自己的充足&amp;ldquo;理由&amp;rdquo;，你的报价就值这个价。&lt;/p&gt;&lt;p&gt;　　6.基于销售价格及利润百分比设定销售佣金：对于使用基于佣金制度的销售队伍的公司来说，这和毛利率/加价率之间的区别是类似的。采用何种基数来计算佣金将直接影响公司的利润。利润是惟一重要的数字。从营业收入中支付佣金意味着你将公司的部分利益让给了销售人员。&lt;/p&gt;&lt;p&gt;　 　7.打折没有增加价值，只是减少了利润价值：打折10%，通常可能需要多销售50%的产品才能保持利润底线。在打折的游戏中成本也会增加，所以这样做的 公司差不多是将自己驱逐出商场。不要在交易中削减要价，你应该问自己是否有增加产品或服务价值的方法。这种&amp;ldquo;附加值&amp;rdquo;意味着你能&amp;ldquo;放弃&amp;rdquo;一些不能产生利润 的东西。正确实施后，它也能改善客户体验。好体验是获得回头客的关键，利润也会随之增加。&lt;/p&gt;&lt;p&gt;　　熟练处理所谓的&amp;ldquo;定价矛盾&amp;rdquo;，你就会对所在的领域得心应手。一旦你处理得好，你就会对自己产品和服务的价值有信心，而竞争对手则往往会急于放弃价格底线。&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （译/梁晓平）&lt;/p&gt;</description>
   <link>http://16hot.blog.isyi.com/post/1/929</link>
      <pubDate>Fri, 17 Oct 2008 01:52:07 +1600</pubDate>   
  </item>
    <item>
   <title>李一男2003年在港湾给开发人员培训时的语录</title>
   <description>&lt;font size=&quot;3&quot;&gt;【1】好好规划自己的路，不要跟着感觉走！根据个人的理想决策安排，绝大部分人并不指望成为什么院士或教授，而是希望活得 滋润一些，爽一些。那么，就需要慎重安排自己的轨迹。从哪个行业入手，逐渐对该行业深入了解，不要频繁跳槽，特别是不要为了一点工资而转移阵地，从长远 看，这点钱根本不算什么，当你对一个行业有那么几年的体会，以后钱根本不是问题。频繁地动荡不是上策，最后你对哪个行业都没有摸透，永远是新手！&lt;br /&gt;&lt;br /&gt;【2】可以做技术，切不可沉湎于技术。千万不可一门心思钻研技术！给自己很大压力，如果你的心思全部放在这上面，那么注定你将成为孔乙己一类的人物！适可而止为之，因为技术只不过是你今后前途的支柱之一，而且还不是最大的支柱，除非你只愿意到老还是个工程师！&lt;br /&gt;&amp;nbsp;&lt;br /&gt;【3】 不要去做技术高手，只去做综合素质高手！在企业里混，我们时常瞧不起某人，说他&amp;ldquo;什么都不懂，凭啥拿那么多钱，凭啥升官！&amp;rdquo;这是普遍的典型的工程师的迂腐 之言。8051很牛吗？人家能上去必然有他的本事，而且是你没有的本事。你想想，老板搞经营那么多年，难道见识不如你这个新兵？人家或许善于管理，善于领 会老板意图，善于部门协调等等。因此务必培养自己多方面的能力，包括管理，亲和力，察言观色能力，攻关能力等，要成为综合素质的高手，则前途无量，否则只 能躲在角落看示波器！技术以外的技能才是更重要的本事！！从古到今，美国日本，一律如此！&lt;br /&gt;&lt;br /&gt;【4】多交社会三教九流的朋友！不要只和工程师 交往，认为有共同语言，其实更重要的是和其他类人物交往，如果你希望有朝一日当老板或高层管理，那么你整日面对的就是这些人。了解他们的经历，思维习惯， 爱好，学习他们处理问题的模式，了解社会各个角落的现象和问题，这是以后发展的巨大的本钱，没有这些以后就会笨手笨脚，跌跌撞撞，遇到重重困难，交不少学 费，成功的概率大大降低！&lt;br /&gt;&lt;br /&gt;【5】知识涉猎不一定专，但一定要广！多看看其他方面的书，金融，财会，进出口，税务，法律等等，为以后做一些积累，以后的用处会更大！会少交许多学费！！&lt;br /&gt;&lt;br /&gt;【6】 抓住时机向技术管理或市场销售方面的转变！要想有前途就不能一直搞开发，适当时候要转变为管理或销售，前途会更大，以前搞技术也没有白搞，以后还用得着。 搞管理可以培养自己的领导能力，搞销售可以培养自己的市场概念和思维，同时为自己以后发展积累庞大的人 脉！应该说这才是前途的真正支柱。。?&lt;br /&gt;&lt;br /&gt;【7】 逐渐克服自己的心里弱点和性格缺陷！多疑，敏感，天真（贬义，并不可爱），犹豫不决，胆怯，多虑，脸皮太薄，心不够黑，教条式思维。。。这些工程师普遍存 在的性格弱点必须改变！很难吗？只在床上想一想当然不可能，去帮朋友守一个月地摊，包准有效果，去实践，而不要只想！不克服这些缺点，一切不可能，甚至连 项目经理都当不好--尽管你可能技术不错！&lt;br /&gt;&lt;br /&gt;【8】工作的同时要为以后做准备！建立自己的工作环境！及早为自己配置一个工作环境，装备电 脑，示波器（可以买个二手的），仿真器，编程器等，业余可以接点活，一方面接触市场，培养市场感觉，同时也积累资金，更重要的是准备自己的产品，咱搞技术 的没有钱，只有技术，技术的代表不是学历和证书，而是产品，拿出象样的产品，就可技术转让或与人合作搞企业！先把东西准备好，等待机会，否则，有了机会也 抓不住！&lt;br /&gt;&lt;br /&gt;【9】要学会善于推销自己！不仅要能干，还要能说，能写，善于利用一切机会推销自己，树立自己的品牌形象，很必要！要创造条件让 别人了解自己，不然老板怎么知道你能干？外面的投资人怎么相信你？提早把自己推销出去，机会自然会来找你！搞个个人主页是个好注意！！特别是培养自己在行 业的名气，有了名气，高薪机会自不在话下，更重要的是有合作的机会...&lt;/font&gt;</description>
   <link>http://16hot.blog.isyi.com/post/1/928</link>
      <pubDate>Thu, 09 Oct 2008 16:24:02 +1600</pubDate>   
  </item>
    <item>
   <title>docbook经验记录</title>
   <description>&lt;div class=&quot;blog_content&quot;&gt;     &lt;div class=&quot;postbody&quot;&gt; &lt;p&gt;今天学到一点&lt;span class=&quot;hilite1&quot;&gt;docbook&lt;/span&gt;经验：&lt;/p&gt; &lt;p&gt;（1）一个比较全面的&lt;span class=&quot;hilite1&quot;&gt;docbook&lt;/span&gt;样式指引： &lt;span class=&quot;hilite1&quot;&gt;DocBook&lt;/span&gt; XSL: The Complete Guide &lt;a href=&quot;http://www.sagehill.net/docbookxsl/index.html&quot;&gt;http://www.sagehill.net/&lt;span class=&quot;hilite1&quot;&gt;docbook&lt;/span&gt;xsl/index.html&lt;/a&gt;   &lt;/p&gt; &lt;p&gt;（2）如果&lt;span class=&quot;hilite3&quot;&gt;图片&lt;/span&gt;过大，超出&lt;span class=&quot;hilite2&quot;&gt;PDF&lt;/span&gt;右边界，有时候可以简单地设置&lt;span class=&quot;hilite3&quot;&gt;图片&lt;/span&gt;居中让&lt;span class=&quot;hilite3&quot;&gt;图片&lt;/span&gt;显示全: &lt;/p&gt; &lt;p&gt;&amp;lt;imagedata fileref=&amp;quot;images/status/cs_status.png&amp;quot; align=&amp;quot;center&amp;quot; /&amp;gt;&lt;/p&gt; &lt;p&gt;或者更好的办法：&lt;/p&gt; &lt;p class=&quot;MsoPlainText&quot;&gt;&lt;xml&gt;   &lt;w&gt;    &lt;w&gt;Normal&lt;/w&gt;    &lt;w&gt;0&lt;/w&gt;    &lt;w&gt;    &lt;w&gt;    &lt;w&gt;    &lt;w&gt;7.8 磅&lt;/w&gt;    &lt;w&gt;0&lt;/w&gt;    &lt;w&gt;2&lt;/w&gt;    &lt;w&gt;    &lt;w&gt;false&lt;/w&gt;    &lt;w&gt;false&lt;/w&gt;    &lt;w&gt;false&lt;/w&gt;    &lt;w&gt;    &lt;w&gt;EN-US&lt;/w&gt;    &lt;w&gt;ZH-CN&lt;/w&gt;    &lt;w&gt;X-NONE&lt;/w&gt;    &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;     &lt;w&gt;    &lt;/w&gt;    &lt;w&gt;    &lt;m&gt;     &lt;m&gt;     &lt;m&gt;     &lt;m&gt;     &lt;m&gt;     &lt;m&gt;     &lt;m&gt;     &lt;m&gt;     &lt;m&gt;     &lt;m&gt;     &lt;m&gt;     &lt;m&gt;    &lt;/m&gt;&lt;/w&gt;  &lt;/xml&gt;&lt;xml&gt;   &lt;w deflockedstate=&quot;false&quot; defunhidewhenused=&quot;true&quot; defsemihidden=&quot;true&quot; defqformat=&quot;false&quot; defpriority=&quot;99&quot; latentstylecount=&quot;267&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;0&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Normal&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;9&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;heading 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;9&quot; qformat=&quot;true&quot; name=&quot;heading 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;9&quot; qformat=&quot;true&quot; name=&quot;heading 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;9&quot; qformat=&quot;true&quot; name=&quot;heading 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;9&quot; qformat=&quot;true&quot; name=&quot;heading 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;9&quot; qformat=&quot;true&quot; name=&quot;heading 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;9&quot; qformat=&quot;true&quot; name=&quot;heading 7&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;9&quot; qformat=&quot;true&quot; name=&quot;heading 8&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;9&quot; qformat=&quot;true&quot; name=&quot;heading 9&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; name=&quot;toc 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; name=&quot;toc 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; name=&quot;toc 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; name=&quot;toc 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; name=&quot;toc 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; name=&quot;toc 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; name=&quot;toc 7&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; name=&quot;toc 8&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; name=&quot;toc 9&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;35&quot; qformat=&quot;true&quot; name=&quot;caption&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;10&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Title&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;1&quot; name=&quot;Default Paragraph Font&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;11&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Subtitle&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;22&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Strong&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;20&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Emphasis&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;59&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Table Grid&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Placeholder Text&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;1&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;No Spacing&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;60&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Shading&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;61&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light List&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;62&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Grid&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;63&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;64&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;65&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;66&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;67&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;68&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;69&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;70&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Dark List&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;71&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Shading&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;72&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful List&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;73&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Grid&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;60&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Shading Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;61&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light List Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;62&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Grid Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;63&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 1 Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;64&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 2 Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;65&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 1 Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Revision&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;34&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;List Paragraph&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;29&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Quote&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;30&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Intense Quote&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;66&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 2 Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;67&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 1 Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;68&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 2 Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;69&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 3 Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;70&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Dark List Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;71&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Shading Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;72&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful List Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;73&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Grid Accent 1&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;60&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Shading Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;61&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light List Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;62&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Grid Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;63&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 1 Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;64&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 2 Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;65&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 1 Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;66&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 2 Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;67&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 1 Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;68&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 2 Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;69&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 3 Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;70&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Dark List Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;71&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Shading Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;72&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful List Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;73&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Grid Accent 2&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;60&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Shading Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;61&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light List Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;62&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Grid Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;63&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 1 Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;64&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 2 Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;65&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 1 Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;66&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 2 Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;67&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 1 Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;68&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 2 Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;69&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 3 Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;70&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Dark List Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;71&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Shading Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;72&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful List Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;73&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Grid Accent 3&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;60&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Shading Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;61&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light List Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;62&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Grid Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;63&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 1 Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;64&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 2 Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;65&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 1 Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;66&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 2 Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;67&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 1 Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;68&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 2 Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;69&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 3 Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;70&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Dark List Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;71&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Shading Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;72&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful List Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;73&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Grid Accent 4&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;60&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Shading Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;61&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light List Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;62&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Grid Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;63&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 1 Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;64&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 2 Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;65&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 1 Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;66&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 2 Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;67&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 1 Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;68&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 2 Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;69&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 3 Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;70&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Dark List Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;71&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Shading Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;72&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful List Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;73&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Grid Accent 5&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;60&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Shading Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;61&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light List Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;62&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Light Grid Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;63&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 1 Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;64&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Shading 2 Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;65&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 1 Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;66&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium List 2 Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;67&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 1 Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;68&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 2 Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;69&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Medium Grid 3 Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;70&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Dark List Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;71&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Shading Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;72&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful List Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;73&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; name=&quot;Colorful Grid Accent 6&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;19&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Subtle Emphasis&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;21&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Intense Emphasis&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;31&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Subtle Reference&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;32&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Intense Reference&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;33&quot; semihidden=&quot;false&quot; unhidewhenused=&quot;false&quot; qformat=&quot;true&quot; name=&quot;Book Title&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;37&quot; name=&quot;Bibliography&quot;/&quot;&quot;&gt;    &lt;w locked=&quot;false&quot; priority=&quot;39&quot; qformat=&quot;true&quot; name=&quot;TOC Heading&quot;/&quot;&quot;&gt;   &lt;/w&gt;  &lt;/xml&gt;&lt;span style=&quot;font-family: 宋体&quot;&gt;对任何会超过&lt;/span&gt; &lt;span&gt;&lt;span class=&quot;hilite2&quot;&gt;PDF&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;font-family: 宋体&quot;&gt;宽度的&lt;span class=&quot;hilite3&quot;&gt;图片&lt;/span&gt;都可以这样把&lt;span class=&quot;hilite3&quot;&gt;图片&lt;/span&gt;限制在宽度内&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoPlainText&quot;&gt;&lt;span&gt;&amp;lt;imagedata fileref=&amp;quot;images/api_jbpm.png&amp;quot; align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot; scalefit=&amp;quot;1&amp;quot; /&amp;gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;（3）自定义表格宽度：  colwidth=&amp;quot;1*&amp;quot;表示此column为标准长度1倍，colwidth=&amp;quot;4*&amp;quot;表示此column为标准列长度的4倍：&lt;/p&gt; &lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;div class=&quot;tools&quot;&gt;Xml代码&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;ol class=&quot;dp-xml&quot; start=&quot;1&quot;&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;状态变化表&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;tgroup&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;cols&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;3&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;colspec&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;colnum&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;colname&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;col1&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;colwidth&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;4*&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;colspec&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;colnum&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;colname&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;col2&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;colwidth&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;6*&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;colspec&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;colnum&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;3&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;colname&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;col3&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;colwidth&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;1*&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;thead&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre class=&quot;xml&quot; style=&quot;display: none&quot;&gt;&amp;lt;title&amp;gt;状态变化表&amp;lt;/title&amp;gt; &amp;lt;table&amp;gt;  &amp;lt;tgroup cols=&amp;quot;3&amp;quot;&amp;gt;   &amp;lt;colspec colnum=&amp;quot;1&amp;quot; colname=&amp;quot;col1&amp;quot; colwidth=&amp;quot;4*&amp;quot; /&amp;gt;   &amp;lt;colspec colnum=&amp;quot;2&amp;quot; colname=&amp;quot;col2&amp;quot; colwidth=&amp;quot;6*&amp;quot; /&amp;gt;   &amp;lt;colspec colnum=&amp;quot;3&amp;quot; colname=&amp;quot;col3&amp;quot; colwidth=&amp;quot;1*&amp;quot; /&amp;gt;       &amp;lt;thead&amp;gt;    &amp;lt;row&amp;gt;&lt;/pre&gt; &amp;nbsp; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;/div&gt;   &lt;/div&gt;</description>
   <link>http://16hot.blog.isyi.com/post/1/927</link>
      <pubDate>Mon, 29 Sep 2008 17:00:06 +1600</pubDate>   
  </item>
    <item>
   <title>docbook使用教程</title>
   <description>使用Docbook发布文档，需要安装以下的工具：&lt;br /&gt;  *DocBook DTD&lt;br /&gt;  *DocBook XSL 样式单&lt;br /&gt;  *XSLT处理程序&lt;br /&gt;  *XSL-FO处理程序&lt;br /&gt;&lt;br /&gt;下面详细介绍各个工具的安装。&lt;br /&gt;&lt;br /&gt;1.安装DocBook DTD&lt;br /&gt;&lt;br /&gt;Docbook DTD可以到OASIS的网站上下载（&lt;a href=&quot;http://www.oasis-open.org/docbook/xml/&quot; target=&quot;_blank&quot; title=&quot;http://www.oasis-open.org/docbook/xml/&quot;&gt;http://www.oasis-open.org/docbook/xml/&lt;/a&gt;），在这里你可以找到zip格式的压缩包。目前的最新版本是4.2。&lt;br /&gt;&lt;br /&gt;事实上可以不下载Docbook DTD。如果你的文档DTD声明这样写：&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE book PUBLIC &amp;quot;-//OASIS//DTD DocBook XML V4.2//EN&amp;quot; &amp;quot;&lt;a href=&quot;http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd&quot; target=&quot;_blank&quot; title=&quot;http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd&quot;&gt;http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd&amp;quot;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;根 据这样的定义，大部分XML处理器能够从网络上获取DTD。这样做的好处是编辑的Docbook文档移植性好，可以在没有安装Docbook DTD的机器上使用。不过由于Docbook DTD比较庞大，通过网络获取DTD会影响处理速度，在低速网络或者网络比较糟糕的情况下，影响尤为显著。&lt;br /&gt;&lt;br /&gt;如果选择使用本地DTD，文档的DTD引用应该这样写：&lt;br /&gt;&lt;br /&gt;Linux:&lt;br /&gt;&amp;lt;!DOCTYPE book SYSTEM &amp;quot;/usr/share/docbook-4.2/docbookx.dtd&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;Windows:&lt;br /&gt;&amp;lt;!DOCTYPE book SYSTEM &amp;quot;&lt;a href=&quot;/C:/xml/docbook42/docbookx.dtd&quot; target=&quot;_blank&quot; title=&quot;/C:/xml/docbook42/docbookx.dtd&quot;&gt;file:///C:/xml/docbook42/docbookx.dtd&amp;quot;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Docbook提供了一种方式，让用户可以使用相同的DTD声明，但可以在使用网络获取DTD和使用本地DTD之间切换，同时拥有两者的优势。这就是catalog文件的作用。典型的catalog的声明如下：&lt;br /&gt;&lt;br /&gt;&amp;lt;catalog xmlns=&amp;quot;urn:oasis:names:tc:entity:xmlns:xml:catalog&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;group id=&amp;quot;DocbookDTD&amp;quot; prefer=&amp;quot;public&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;system&lt;br /&gt;      systemId=&amp;quot;&lt;a href=&quot;http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd&quot; target=&quot;_blank&quot; title=&quot;http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd&quot;&gt;http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd&amp;quot;&lt;/a&gt;&lt;br /&gt;      uri=&amp;quot;&lt;a href=&quot;/usr/share/xml/docbook42/docbookx.dtd&quot; target=&quot;_blank&quot; title=&quot;/usr/share/xml/docbook42/docbookx.dtd&quot;&gt;file:///usr/share/xml/docbook42/docbookx.dtd&amp;quot;/&amp;gt;&lt;/a&gt;&lt;br /&gt;&amp;lt;/group&amp;gt;&lt;br /&gt;&amp;lt;/catalog&amp;gt;&lt;br /&gt;&lt;br /&gt;这个声明把网络DTD映射到本地DTD。如果使用支持Catalog的XSLT Processor，它首先会查找本地文件，如果本地文件不存在，再查找网络。&lt;br /&gt;&lt;br /&gt;2.安装Docbook XSL样式单&lt;br /&gt;&lt;br /&gt;在&lt;a href=&quot;http://docbook.sourceforge.net/&quot; target=&quot;_blank&quot; title=&quot;http://docbook.sourceforge.net&quot;&gt;http://docbook.sourceforge.net&lt;/a&gt;上可以下载到Docbook XSL样式单，目前最新的版本是1.67.2。&lt;br /&gt;&lt;br /&gt;解压之后，有几个比较主要的目录：&lt;br /&gt;*common   - 包含的是公用的模块，诸如语言之类的文件都在这里。&lt;br /&gt;*extensions - 针对特定的XSLT Processor编写的扩展代码。&lt;br /&gt;*fo         - 生成XSL-FO文件所需的XSL样式单。&lt;br /&gt;*html       - 生成HTML文件所需的XSL样式单。&lt;br /&gt;*images     - 生成文档时所需要的图片。&lt;br /&gt;*doc       - 有关XSL样式单的文档，同样是Docbook文档。&lt;br /&gt;&lt;br /&gt;其他还有像htmlhelp之类的目录，但不是生成HTML或XSL-FO所必须的。&lt;br /&gt;&lt;br /&gt;3.安装XSLT Processor&lt;br /&gt;&lt;br /&gt;目前有许多免费的XSLT Processor，最常用的是&lt;br /&gt;*Saxon   - 使用Java实现，&lt;a href=&quot;http://saxon.sourceforge.net/&quot; target=&quot;_blank&quot; title=&quot;http://saxon.sourceforge.net/&quot;&gt;http://saxon.sourceforge.net/&lt;/a&gt;。&lt;br /&gt;*Xalan   - 有Java和C++版本，&lt;a href=&quot;http://xml.apache.org/xalan-j/index.html&quot; target=&quot;_blank&quot; title=&quot;http://xml.apache.org/xalan-j/index.html&quot;&gt;http://xml.apache.org/xalan-j/index.html&lt;/a&gt;。&lt;br /&gt;*xsltproc - 使用C实现，是最快的处理程序，&lt;a href=&quot;http://xmlsoft.org/XSLT/&quot; target=&quot;_blank&quot; title=&quot;http://xmlsoft.org/XSLT/&quot;&gt;http://xmlsoft.org/XSLT/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;因为Saxon和Xalan都有Java版本，所以按照一般的Java程序的安装方式安装即可。下面介绍xsltproc的安装，因为它速度快，是我比较喜欢的处理程序。&lt;br /&gt;&lt;br /&gt;如果你使用windows平台，那么你有两个方法可选：&lt;br /&gt;&lt;br /&gt;*第一，直接下载为windows平台预编译的版本，可以在&lt;br /&gt;&lt;a href=&quot;ftp://ftp.zlatkovic.com/libxml/&quot; target=&quot;_blank&quot; title=&quot;ftp://ftp.zlatkovic.com/libxml/&quot;&gt;ftp://ftp.zlatkovic.com/libxml/&lt;/a&gt;&lt;br /&gt;上找到。你需要下载libxml, libxslt, 和iconv，它们都是zip格式，解压之后，在环境变量PATH中添加xsltproc.exe和.dll文件的路径。&lt;br /&gt;&lt;br /&gt;如果你不想编辑环境变量，一个简单的办法是把下面这些文件复制到C:WindowsSystem32：&lt;br /&gt;libxslt.dll&lt;br /&gt;libxml2.dll&lt;br /&gt;libexslt.dll&lt;br /&gt;iconv.dll&lt;br /&gt;xsltproc.exe&lt;br /&gt;&lt;br /&gt;这样在命令行就可以直接找到这些文件了。完成之后，运行&lt;br /&gt;xsltproc -version&lt;br /&gt;打印出版本号则表明完成安装。&lt;br /&gt;&lt;br /&gt;*第二，在Cygwin下安装，这是我选择使用的方式。Cygwin是一个在Windows下模拟Linux Shell的应用程序。如果你喜欢以Linux命令的方式来使用xsltproc，可以到&lt;br /&gt;&lt;a href=&quot;http://www.cygwin.com/&quot; target=&quot;_blank&quot; title=&quot;http://www.cygwin.com/&quot;&gt;http://www.cygwin.com/&lt;/a&gt;&lt;br /&gt;下载Cygwin安装程序。Cygwin的是通过网络安装的，首先你从它提供的包列表中选择libxslt，然后安装程序会根据依赖关系自动选择libxml2，确定之后，安装程序下载并安装xsltproc。完成安装之后，你就可以运行&lt;br /&gt;xsltproc -version&lt;br /&gt;来检查是否安装成功。&lt;br /&gt;&lt;br /&gt;*第三，如果使用Linux，很有可能系统已经安装了xsltproc。运行&lt;br /&gt;xsltproc -version&lt;br /&gt;检查一下是否已经安装。如果运行命令失败，或者版本太老，那么访问下面两个URL获取最新的RPM包：&lt;br /&gt;&lt;a href=&quot;http://rpmfind.net/linux/rpm2html/search.php?query=libxml2&quot; target=&quot;_blank&quot; title=&quot;http://rpmfind.net/linux/rpm2html/search.php?query=libxml2&quot;&gt;http://rpmfind.net/linux/rpm2html/search.php?query=libxml2&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://rpmfind.net/linux/rpm2html/search.php?query=libxslt&quot; target=&quot;_blank&quot; title=&quot;http://rpmfind.net/linux/rpm2html/search.php?query=libxslt&quot;&gt;http://rpmfind.net/linux/rpm2html/search.php?query=libxslt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;然后切换到root权限，安装新的包：&lt;br /&gt;rpm -Uv libxml2-2.6.17-2.i386.rpm&lt;br /&gt;rpm -Uv libxslt-1.1.12-4.i386.rpm&lt;br /&gt;&lt;br /&gt;完成之后，就可以运行&lt;br /&gt;xsltproc -version&lt;br /&gt;检查安装是否完成。&lt;br /&gt;&lt;br /&gt;安装之后，就可以使用xsltproc来生成HTML或者XSL-FO文件。&lt;br /&gt;&lt;br /&gt;譬如，下面是根据Docbook文档生成HTML的例子：&lt;br /&gt;xsltproc --output myfile.html docbook-xsl/html/docbook.xsl myfile.xml&lt;br /&gt;&lt;br /&gt;或者根据docbook文档生成XSL-FO文档的例子：&lt;br /&gt;xsltproc --output myfile.fo docbook-xsl/fo/docbook.xsl myfile.xml&lt;br /&gt;&lt;br /&gt;在&lt;a href=&quot;http://xmlsoft.org/XSLT/xsltproc2.html&quot; target=&quot;_blank&quot; title=&quot;http://xmlsoft.org/XSLT/xsltproc2.html&quot;&gt;http://xmlsoft.org/XSLT/xsltproc2.html&lt;/a&gt;上列出了所有xsltproc的命令行参数，或者直接运行&lt;br /&gt;xsltproc也会打印出参数列表。&lt;br /&gt;&lt;br /&gt;如果你只要发布HTML文档，那么到此为止。如果你还想发布PDF或是PS文档，那么需要安装XSL-FO处理程序。&lt;br /&gt;&lt;br /&gt;4. 安装XSL-FO处理程序&lt;br /&gt;&lt;br /&gt;XSL-FO处理程序根据XSLT处理程序生成的XSL-FO文件生成PDF或者PS文件。目前可供选择的XSL-FO处理程序远不如XSLT处理程序那么多，这是因为：&lt;br /&gt;  a. XSL-FO标准比XSLT标准的制订晚两年；&lt;br /&gt;  b.XSL-FO标准及其庞大而复杂，该标准的作者也发现其实现上的难度，从而将该标准分为基本、扩展和完整三个级别。&lt;br /&gt;&lt;br /&gt;现在可用的免费的XSL-FO处理程序有：&lt;br /&gt;&lt;br /&gt;  *FOP - 来自Apache XML项目（&lt;a href=&quot;http://xml.apache.org/fop/&quot; target=&quot;_blank&quot; title=&quot;http://xml.apache.org/fop/&quot;&gt;http://xml.apache.org/fop/&lt;/a&gt;）。目前最新的版本是0.20.5，还在开发当中，还有很多特性不支持，不过已经可以满足一般的使用。&lt;br /&gt; &lt;br /&gt;  *PassiveTeX - 来自Sebastian Rahtz (&lt;a href=&quot;http://www.tei-c.org.uk/Software/passivetex/&quot; target=&quot;_blank&quot; title=&quot;http://www.tei-c.org.uk/Software/passivetex/&quot;&gt;http://www.tei-c.org.uk/Software/passivetex/&lt;/a&gt;)一款基于TeX的XSL-FO处理程序。同样也在开发中，较FOP要复杂的多。&lt;br /&gt;&lt;br /&gt;另外有一些商业产品可供选择，可能生成的文档质量要比开源代码好，譬如：&lt;br /&gt;&lt;br /&gt;  *XEP(&lt;a href=&quot;http://www.renderx.com/&quot; target=&quot;_blank&quot; title=&quot;http://www.renderx.com&quot;&gt;http://www.renderx.com&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;  *XSL Formatter(&lt;a href=&quot;http://www.antennahouse.com/&quot; target=&quot;_blank&quot; title=&quot;http://www.antennahouse.com&quot;&gt;http://www.antennahouse.com&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;下面介绍如何安装FOP。&lt;br /&gt;&lt;br /&gt;4.1.首先需要安装JDK，这个不必多说。&lt;br /&gt;&lt;br /&gt;4.2. 到&lt;a href=&quot;http://www.apache.org/dyn/closer.cgi/xml/fop/&quot; target=&quot;_blank&quot; title=&quot;http://www.apache.org/dyn/closer.cgi/xml/fop/&quot;&gt;http://www.apache.org/dyn/closer.cgi/xml/fop/&lt;/a&gt;下载FOP，可以选择tar或者zip压缩包。下载之后解压到本地。&lt;br /&gt;&lt;br /&gt;4.3. 下载图形代码库。FOP自己不支持PNG之类的图片，如果在你的文档里会涉及到图片，那么需要下载额外的代码库。可以选择JAI（&lt;a href=&quot;http://java.sun.com/products/java-media/jai/current.html&quot; target=&quot;_blank&quot; title=&quot;http://java.sun.com/products/java-media/jai/current.html&quot;&gt;http://java.sun.com/products/java-media/jai/current.html&lt;/a&gt;），或者Jimi（&lt;a href=&quot;http://java.sun.com/products/jimi/&quot; target=&quot;_blank&quot; title=&quot;http://java.sun.com/products/jimi/&quot;&gt;http://java.sun.com/products/jimi/&lt;/a&gt;）。0.20.5之前的版本只能使用Jimi。下载之后，将jai_core.jar和jai_codec.jar（JAI)，或者JimiProClasses.jar（Jimi）复制到FOP安装目录的lib目录下，然后在fop.bat（Windows平台）中添加&lt;br /&gt;&lt;br /&gt;set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%jai_core.jar&lt;br /&gt;set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%jai_codec.jar&lt;br /&gt;或是&lt;br /&gt;set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%JimiProClasses.zip&lt;br /&gt;&lt;br /&gt;如果使用fop.sh（Linux平台），会自动搜索。&lt;br /&gt;&lt;br /&gt;4.4. 添加扩展代码。如果Docbook XSL样式单有针对FOP的扩展代码（目前没有），像上面一样把它们添加到FOP安装目录下lib目录。&lt;br /&gt;&lt;br /&gt;现在就可以使用FOP来生成PDF文档了。FOP提供两个脚本fop.bat（Windows平台）和fop.sh（Unix和Linux平台）以方便使用。生成PDF的命令行如下：&lt;br /&gt;  Linux或Unix：&lt;br /&gt;  fop.sh -xsl /docbook-xsl/fo/docbook.xsl -xml myfile.xml -pdf myfile.pdf&lt;br /&gt; &lt;br /&gt;  Windows：&lt;br /&gt;  fop.bat -xsl /docbook-xsl/fo/docbook.xsl -xml myfile.xml -pdf myfile.pdf&lt;br /&gt;&lt;br /&gt;在处理过程中，可能会提示某些属性不支持或尚未实现，不用理会这些提示，因为FOP仍处于开发中，这并不影响生成PDF文档。&lt;br /&gt;&lt;br /&gt;到此，一个Docbook发布系统配置完成，并可以用来发布文档了。你完全可以在Linux上编写任务，通过该系统自动发布技术文档。</description>
   <link>http://16hot.blog.isyi.com/post/1/926</link>
      <pubDate>Mon, 29 Sep 2008 16:14:17 +1600</pubDate>   
  </item>
    <item>
   <title>qemu on freebsd</title>
   <description>http://wiki.freebsd.org/qemu</description>
   <link>http://16hot.blog.isyi.com/post/1/925</link>
      <pubDate>Tue, 23 Sep 2008 18:32:36 +1600</pubDate>   
  </item>
    <item>
   <title>实用的 SSH 通道例子</title>
   <description>&lt;div class=&quot;SECT4&quot;&gt; &lt;p&gt;在freebsd手册里看到的一个例子，摘录出来，以便以后查找使用。&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;AEN21007&quot; id=&quot;AEN21007&quot;&gt;&lt;/a&gt;14.11.8.1.1 加强 POP3 服务的安全&lt;/p&gt;  &lt;p&gt;　　工作时， 有一个允许外来连接的 SSH 服务器。 同一个办公网络中有一个邮件服务器提供 POP3 服务。 这个网络， 或从您家到办公室的网络可能不， 或不完全可信。 基于这样的原因， 您需要以安全的方式来查看邮件。 解决方法是创建一个到办公室 SSH 服务器的连接， 并通过这个连接来访问 POP3 服务：&lt;/p&gt;  &lt;pre class=&quot;SCREEN&quot;&gt;&lt;samp class=&quot;PROMPT&quot;&gt;%&lt;/samp&gt; &lt;kbd class=&quot;USERINPUT&quot;&gt;ssh -2 -N -f -L &lt;tt class=&quot;REPLACEABLE&quot;&gt;&lt;em&gt;2110:mail.example.com:110 user@ssh-server.example.com&lt;/em&gt;&lt;/tt&gt;&lt;/kbd&gt;&lt;br /&gt;user@ssh-server.example.com&amp;#39;s password: &lt;kbd class=&quot;USERINPUT&quot;&gt;******&lt;/kbd&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;　　当这个通道连上时， 您可以把 POP3 请求发到 &lt;tt class=&quot;HOSTID&quot;&gt;localhost&lt;/tt&gt; 端口 2110。 这个连接将通过通道安全地转发到 &lt;tt class=&quot;HOSTID&quot;&gt;mail.example.com&lt;/tt&gt;。&lt;/p&gt; &lt;/div&gt;  &lt;div class=&quot;SECT4&quot;&gt; &lt;h4 class=&quot;SECT4&quot;&gt;&lt;a name=&quot;AEN21018&quot; id=&quot;AEN21018&quot;&gt;&lt;/a&gt;14.11.8.1.2 绕过严厉的防火墙&lt;/h4&gt;  &lt;p&gt;　　一些大脑长包的网络管理员会使用一些极端的防火墙策略， 不仅过滤进入的连接， 而且也过滤连出的连接。 一些时候您可能只能连接远程机器 22 端口，以及 80 端口用来进行 SSH 和网页浏览。&lt;/p&gt;  &lt;p&gt;　　您可能希望访问一些其它的 (也许与工作无关的) 服务， 例如提供音乐的 Ogg Vorbis 流媒体服务器。 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐， 则您将无法访问它。&lt;/p&gt;  &lt;p&gt;　　解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH 服务器， 并通过它提供的通道连接到 Ogg Vorbis 服务器上。&lt;/p&gt;  &lt;pre class=&quot;SCREEN&quot;&gt;&lt;samp class=&quot;PROMPT&quot;&gt;%&lt;/samp&gt; &lt;kbd class=&quot;USERINPUT&quot;&gt;ssh -2 -N -f -L &lt;tt class=&quot;REPLACEABLE&quot;&gt;&lt;em&gt;8888:music.example.com:8000 user@unfirewalled-system.example.org&lt;/em&gt;&lt;/tt&gt;&lt;/kbd&gt;&lt;br /&gt;user@unfirewalled-system.example.org&amp;#39;s password: &lt;kbd class=&quot;USERINPUT&quot;&gt;*******&lt;/kbd&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;　　现在您可以把客户程序指定到 &lt;tt class=&quot;HOSTID&quot;&gt;localhost&lt;/tt&gt; 的 8888 端口， 它将把请求转发给 &lt;tt class=&quot;HOSTID&quot;&gt;music.example.com&lt;/tt&gt; 的 8000 端口， 从而绕过防火墙。&lt;/p&gt; &lt;/div&gt;</description>
   <link>http://16hot.blog.isyi.com/post/1/924</link>
      <pubDate>Mon, 22 Sep 2008 16:49:04 +1600</pubDate>   
  </item>
    <item>
   <title>使用diff, patch和quilt制作补丁(2)</title>
   <description>&lt;h2&gt;&lt;font size=&quot;3&quot;&gt;2 quilt&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们自己的项目可以用cvs或svn管理全部代码。但有时我们要使用其他开发者维护的项目。我们需要修改一些文件， 但又不能直接向版本管理工具提交代码。自己用版本管理工具重建整个项目是不合适的，因为大多数代码都是别人维护的，例如Linux内核。我们只是想管理好 自己的补丁。这时可以使用quilt。&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;2.1 基本概念&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;a href=&quot;http://savannah.nongnu.org/projects/quilt/&quot;&gt;&lt;font size=&quot;3&quot;&gt;quilt&lt;/font&gt;&lt;/a&gt;&lt;font size=&quot;3&quot;&gt;是一个帮助我们管理补丁的程序。quilt的命令格式类似于cvs：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;quilt 子命令 [参数] &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;0.46版的quilt有29个子命令。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;掌握quilt的关键是了解使用quilt的流程。使用quilt时，我们会在一个完整的源代码树里工作。只要我们 在源代码树里使用了quilt命令，quilt就会在源代码树的根目录建立两个特殊目录：patches和.pc。quilt在patches目录保存它 管理的所有补丁。quilt用.pc目录保存自己的内部工作状态，用户不需要了解这个目录。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patches/series文件记录了quilt当前管理的补丁。补丁按照加入的顺序排列，早加入的补丁在前。quilt用堆栈的概念管理补丁的应用。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;img src=&quot;http://www.fmddlmyy.cn/images/quilt-stack.png&quot; border=&quot;0&quot; width=&quot;683&quot; height=&quot;353&quot; /&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们在应用补丁A前，必须先应用所有早于补丁A的补丁。所以，patches/series中的补丁总是从上向下应 用。例如：上图中，补丁1到补丁5是已经应用的补丁。我们可以将已应用的补丁想象成一个向下生长的堆栈，栈顶就是已应用的最新补丁。应用补丁就是将补丁入 栈，撤销补丁就是将补丁出栈。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们在源代码树中作任何修改前，必须用&amp;quot;quilt add&amp;quot;命令将要修改的文件与一个补丁联系起来。在完成修改后，用&amp;quot;quilt refresh&amp;quot;命令将修改保存到已联系的补丁。下面我们通过一篇流程攻略来认识一下quilt的命令。&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;2.2 导入补丁&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们把 old-prj.tar.bz2 想象成Linux内核，我们把它解压后，进入代码树的根目录：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ mkdir qtest; cd qtest; tar xvjf ../old-prj.tar.bz2; mv old-prj prj; cd prj &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;在修改代码前，我们通常要先打上官方补丁。在quilt中，可以用import命令导入补丁：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt import ../../prj.diff &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Importing patch ../../prj.diff (stored as prj.diff)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;执行improt命令后， prj 目录会多出一个叫 patches 的子目录：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ find patches/ -type f&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patches/prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patches/series&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;quilt在这个目录存放所有补丁和前面介绍的series文件。quilt的大多数命令都可以在代码树的任意子目录运行，不一定要从根目录运行。我们可以用applied命令查询当前已应用的补丁。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt applied &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;No patches applied&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;目前还没有应用任何补丁。unapplied命令查询当前还没有应用的补丁，top命令查询栈顶补丁，即已应用的最新补丁：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt unapplied&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt top&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;No patches applied&lt;/font&gt; &lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们可以使用push命令应用补丁，例如：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt push -a&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Applying patch prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/drv/drv1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/sys/sys1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/sys/sys1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/usr/usr1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/usr/usr1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Now at patch prj.diff &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;push的&amp;quot;-a&amp;quot;参数表示应用所有补丁。在使用push命令后，prj 目录会多了一个叫.pc的隐含子目录。quilt用这个目录保存内部状态，用户不需要了解这个目录。应用补丁后，我们再使用applied、unapplied和top命令查看：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt applied&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt unapplied&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File series fully applied, ends at patch prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt top&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;prj.diff&lt;/font&gt; &lt;/p&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;2.3 修改文件&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们必须将对源代码树所作的任何改动都和一个补丁联系起来。add命令将文件的当前状态与补丁联系起来。add命令的格式为：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;quilt add [-P 补丁名] 文件名 &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;如果未指定补丁名，文件就与栈顶补丁联系起来。目前，我们的栈顶补丁是官方补丁。我们不想修改这个补丁，可以用new命令新建一个补丁：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt new drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Patch drv_p1.diff is now on top&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt top&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt applied&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt unapplied&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File series fully applied, ends at patch drv_p1.diff&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;然后用add命令向栈顶补丁添加一个准备修改的文件：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ cd src/drv; quilt add drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/drv/drv2.h added to patch drv_p1.diff&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;add命令为指定补丁保存了指定文件的当前快照，当我们执行refresh命令时，quilt就会检查文件 的变化，将差异保存到指定补丁中。使用&amp;quot;quilt diff -z [-P 补丁名] [文件名]&amp;quot;可以查看指定补丁指定文件的当前改动。省略-P参数表示查看当前补丁的改动，省略文件名表示查看所有改动。我们修改drv2.h后，执行 diff命令：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt diff -z&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Index: prj/src/drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;===================================================================&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;--- prj.orig/src/drv/drv2.h 2008-03-02 13:37:34.000000000 +0800&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+++ prj/src/drv/drv2.h 2008-03-02 13:38:53.000000000 +0800&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;@@ -1,7 +1,7 @@&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;-#ifndef APP1_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;-#define APP1_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+#ifndef DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+#define DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;-#include &amp;quot;def1.h&amp;quot;+#include &amp;quot;def2.h&amp;quot;  #endif&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;只要文件已经与我们希望保存改动的补丁联系过了，我们就可以多次修改文件。使用&amp;quot;quilt files [补丁名]&amp;quot;命令可以查看与指定补丁关联的文件。使用&amp;quot;quilt files -val&amp;quot;可以查看所有补丁联系的所有文件。&amp;quot;-v&amp;quot;参数表示更友好的显示，&amp;quot;-a&amp;quot;参数表示显示所有补丁，&amp;quot;-l&amp;quot;参数显示补丁名。例如：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt files&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;src/drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt files -val&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;[prj.diff] src/drv/drv1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;[prj.diff] src/sys/sys1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;[prj.diff] src/sys/sys1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;[prj.diff] src/usr/usr1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;[prj.diff] src/usr/usr1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;[drv_p1.diff] src/drv/drv2.h&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;quilt refresh [补丁名]&amp;quot;刷新补丁，即将指定补丁的文件变化保存到补丁。省略文件名表示刷新栈顶补丁。我们refresh后，查看补丁文件：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt refresh&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Refreshed patch drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ cat ../../patches/drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Index: prj/src/drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;===================================================================&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;--- prj.orig/src/drv/drv2.h 2008-03-02 12:42:21.000000000 +0800&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+++ prj/src/drv/drv2.h 2008-03-02 12:46:25.000000000 +0800&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;@@ -1,7 +1,7 @@&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;-#ifndef APP1_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;-#define APP1_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+#ifndef DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+#define DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;-#include &amp;quot;def1.h&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+#include &amp;quot;def2.h&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;#endif&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;quilt diff -z&amp;quot;命令不会显示已经保存的差异。&amp;quot;quilt diff&amp;quot;显示所有的差异，不管是否保存过。&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;2.4 再做几个补丁&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;在增加文件前,我们要先将准备增加的文件与补丁联系起来。我们新建一个补丁，然后新增两个文件src/applet/applet1.h和src/applet/applet1.c。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ cd ..; quilt new more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Patch more_p1.diff is now on top&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt add applet/applet.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/applet/applet.c added to patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt add applet/applet.1&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/applet/applet.1 added to patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;看看我们增加的文件：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt files&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;src/applet/applet.1&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;src/applet/applet.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;哎呀，文件名写错了。我们可以用&amp;quot;remove&amp;quot;命令从补丁中删除关联文件：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt remove applet/applet.1&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;rm: remove write-protected regular empty file `.pc/more_p1.diff/src/applet/applet.1&amp;#39;? y&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/applet/applet.1 removed from patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt remove applet/applet.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;rm: remove write-protected regular empty file `.pc/more_p1.diff/src/applet/applet.c&amp;#39;? y&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/applet/applet.c removed from patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt files&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt add applet/applet1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/applet/applet1.h added to patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt add applet/applet1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/applet/applet1.c added to patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt files&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;src/applet/applet1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;src/applet/applet1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;好了，现在可以创建新文件：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ mkdir applet&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ echo -e &amp;quot;#ifndef APPLET1_Hn#define APPLET1_Hn#include &amp;quot;def1.h&amp;quot;n#endif&amp;quot;&amp;gt;applet/applet1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ echo -e &amp;quot;#include &amp;quot;applet1.h&amp;quot;&amp;quot;&amp;gt;applet/applet1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt refresh more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Refreshed patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;刷新补丁后，我们再修改文件drv2.h。修改前一定要先将文件与准备保存改动的补丁联系起来：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt add drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/drv/drv2.h added to patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ vi drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt diff -z drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Index: prj/src/drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;===================================================================&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;--- prj.orig/src/drv/drv2.h 2008-03-02 14:19:35.000000000 +0800&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+++ prj/src/drv/drv2.h 2008-03-02 14:31:28.000000000 +0800&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;@@ -1,7 +1,7 @@&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;#ifndef DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;#define DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;-#include &amp;quot;def2.h&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+#include &amp;quot;def1.h&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;#endif&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们再新建一个补丁，然后删除两个文件。删除文件前也要先为文件建立关联：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt new more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Patch more_p2.diff is now on top&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt add app/*&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/app/app1.c added to patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/app/app1.h added to patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/app/app2.c added to patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/app/app2.h added to patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ rm -rf app&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt refresh&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Refreshed patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们再修改applet/applet1.h：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt edit applet/applet1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;File src/applet/applet1.h added to patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt refresh&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Refreshed patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;quilt edit&amp;quot;在调用&amp;quot;quilt add&amp;quot;后自动启动编辑器。用refresh命令刷新补丁。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;对了，前面为more_p1.diff修改drv2.h后还没有刷新呢。我们查看修改并刷新：&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt diff -z -P more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Index: prj/src/drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;===================================================================&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;--- prj.orig/src/drv/drv2.h 2008-03-02 14:19:35.000000000 +0800&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+++ prj/src/drv/drv2.h 2008-03-02 14:31:28.000000000 +0800&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;@@ -1,7 +1,7 @@&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;#ifndef DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;#define DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;-#include &amp;quot;def2.h&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;+#include &amp;quot;def1.h&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;#endif&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Warning: more recent patches modify files in patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt refresh more_p1.diff &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;More recent patches modify files in patch more_p1.diff. Enforce refresh with -f.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt refresh -f more_p1.diff &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Refreshed patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;quilt会抱怨更新的补丁修改了补丁more_p1.diff的文件。这是在说more_p2.diff修改了applet1.h。我们知道这和我们要刷新的drv2.h没关系，所以可以用-f参数强制刷新。&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;2.5 管理补丁&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;series命令可以查看series文件中的补丁：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt series&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;more_p2.diff&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;quilt patches 文件名&amp;quot;显示修改了指定文件的所有补丁，例如：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt patches drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;more_p1.diff&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;quilt annotate 文件名&amp;quot;显示指定文件的修改情况，它会指出哪个补丁修改了哪一行。例如：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt annotate drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;1 #ifndef DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;1 #define DRV2_H&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;2 #include &amp;quot;def1.h&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;font size=&quot;3&quot;&gt; &lt;p&gt;  #endif  &lt;/p&gt; &lt;p&gt;1 drv_p1.diff&lt;/p&gt; &lt;p&gt;2 more_p1.diff&lt;/p&gt; &lt;/font&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们可以使用push和pop命令应用补丁或撤销补丁，例如：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt pop -a&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Removing patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/app/app1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/app/app2.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/app/app2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/app/app1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/applet/applet1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Removing patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Removing src/applet/applet1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Removing src/applet/applet1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Removing patch drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/drv/drv2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Removing patch prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/sys/sys1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/sys/sys1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Restoring src/drv/drv1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Removing src/usr/usr1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Removing src/usr/usr1.h&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;No patches applied&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt top&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;No patches applied&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt next&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt previous&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;No patches applied&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;quilt pop -a&amp;quot;撤销所有补丁。top命令显示栈顶命令，即当前应用的最新的补丁。next命令显示下一个可以应用的补丁。previous显示上一条应用过的补丁。&amp;quot;push 补丁A&amp;quot;将从上到下依次应用所有早于补丁A的补丁，最后应用补丁A。例如：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt push more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Applying patch prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/drv/drv1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/sys/sys1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/sys/sys1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/usr/usr1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/usr/usr1.h&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Applying patch drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/drv/drv2.h&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Applying patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/applet/applet1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/applet/applet1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/drv/drv2.h&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Now at patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt top&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt next&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt previous&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;drv_p1.diff&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;quilt push -a&amp;quot;应用所有补丁：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt push -a&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Applying patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/app/app1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/app/app1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/app/app2.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/app/app2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/applet/applet1.h&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Now at patch more_p2.diff&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;quilt graph -all&amp;quot;可以为栈顶补丁的依赖关系生成dot文件。Graphviz的dot可以根据dot文件产生图片，例如：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt graph --all &amp;gt; ../../more_p2.dot&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ cd ../..; dot -Tpng more_p2.dot -o more_p2.png &lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;img src=&quot;http://www.fmddlmyy.cn/images/more_p2.png&quot; border=&quot;0&quot; width=&quot;146&quot; height=&quot;266&quot; /&gt;&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;2.6 发布补丁&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;只要将patches目录打包发布就可以了。例如：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ cd prj; tar cvjf prj-0.1-patches.tar.bz2 patches; mv prj-0.1-patches.tar.bz2 ../.. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;用户先下载、解压补丁包对应的源代码树：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ cd ../..; mkdir user; cd user; tar xvjf ../old-prj.tar.bz2; mv old-prj/ prj &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;然后下载、解压补丁：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ cd ../..; tar xvjf prj-0.1-patches.tar.bz2; cd user/prj &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;最后把补丁目录链接到源代码树的patches目录，然后应用所有补丁：&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ ln -sfn ../../patches/ patches&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;$ quilt push -a&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Applying patch prj.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/drv/drv1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/sys/sys1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/sys/sys1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/usr/usr1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/usr/usr1.h  Applying patch drv_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/drv/drv2.h&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Applying patch more_p1.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/applet/applet1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/applet/applet1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/drv/drv2.h&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Applying patch more_p2.diff&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/app/app1.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/app/app1.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/app/app2.c&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/app/app2.h&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patching file src/applet/applet1.h&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Now at patch more_p2.diff &lt;/font&gt; &lt;/p&gt;&lt;h2&gt;&lt;font size=&quot;3&quot;&gt;３ 结束语&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;在上面的流程攻略中，我们演示了19个quilt命令：add, annotate, applied, diff, edit, files, graph, import, new, next, patches, pop, previous, push, refresh, remove, series, top, unapplied。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;本次Linux之旅到此结束，欢迎您再次参加Linux之旅，一起探索浩瀚的Linux世界。&lt;/font&gt;&lt;/p&gt;</description>
   <link>http://16hot.blog.isyi.com/post/1/923</link>
      <pubDate>Fri, 19 Sep 2008 03:00:50 +1600</pubDate>   
  </item>
    <item>
   <title>使用diff, patch和quilt制作补丁(1)</title>
   <description>&lt;p&gt;&lt;font size=&quot;3&quot;&gt;diff和patch是在Linux环境为源代码制作和应用补丁的标准工具。diff可以比较文件或目录的差异，并 将差异记录到补丁文件。patch可以将补丁文件应用到源代码上。quilt也是一个制作和应用补丁的工具，它适合于管理较多补丁。quilt有自己的特 有的工作方式。本文通过简单的例子介绍这三个常用的工具。&lt;/font&gt;&lt;/p&gt; &lt;h2&gt;&lt;font size=&quot;3&quot;&gt;0 示例工程&lt;/font&gt;&lt;/h2&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们先准备一个用来做实验的工程，它包含若干子目录和文件。可以用find命令列出文件清单：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ find old-prj/ -type f&lt;br /&gt;old-prj/inc/def1.h&lt;br /&gt;old-prj/inc/def2.h&lt;br /&gt;old-prj/src/sys/sys1.c&lt;br /&gt;old-prj/src/sys/sys1.h&lt;br /&gt;old-prj/src/app/app1.c&lt;br /&gt;old-prj/src/app/app2.c&lt;br /&gt;old-prj/src/app/app2.h&lt;br /&gt;old-prj/src/app/app1.h&lt;br /&gt;old-prj/src/drv/drv1.h&lt;br /&gt;old-prj/src/drv/drv2.c&lt;br /&gt;old-prj/src/drv/drv1.c&lt;br /&gt;old-prj/src/drv/drv2.h&lt;br /&gt;old-prj/build/Makefile&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;find命令的&amp;quot;-type f&amp;quot;参数选择普通文件，可以省略掉目录。希望自己操作的读者可以下载这个&lt;/font&gt;&lt;a href=&quot;http://www.fmddlmyy.cn/samples/old-prj.zip&quot;&gt;&lt;font size=&quot;3&quot;&gt;示例工程&lt;/font&gt;&lt;/a&gt;&lt;font size=&quot;3&quot;&gt;。&lt;/font&gt;&lt;/p&gt; &lt;h2&gt;&lt;font size=&quot;3&quot;&gt;1 diff和patch&lt;/font&gt;&lt;/h2&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;1.1 比较一个文件&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;将old-prj.tar.bz2放到我们的工作目录，然后建立一个子目录，进入后解压示例工程：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ mkdir test1; cd test1; tar xvjf ../old-prj.tar.bz2&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;用分号分隔多个命令可以节省篇幅。将old-prj复制到new-prj：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ cp -a old-prj/ new-prj&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;让我们编辑一个文件。src/drv/drv1.h的内容本来是：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$&amp;nbsp;cat&amp;nbsp;-n&amp;nbsp;old-prj/src/drv/drv1.h&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;#ifndef&amp;nbsp;DRV1_H&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;#define&amp;nbsp;DRV1_H&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;#include&amp;nbsp;&amp;quot;def1.h&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;typedef&amp;nbsp;struct&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;p1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;p2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;p3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;}&amp;nbsp;App1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&amp;nbsp;&amp;nbsp;void&amp;nbsp;do_app1(void);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&amp;nbsp;&amp;nbsp;#endif&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;cat命令的&amp;quot;-n&amp;quot;参数可以增加行号。我们用vi将它修改成：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$&amp;nbsp;cat&amp;nbsp;-n&amp;nbsp;new-prj/src/drv/drv1.h&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;#ifndef&amp;nbsp;DRV1_H&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;#define&amp;nbsp;DRV1_H&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;#include&amp;nbsp;&amp;quot;def1.h&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;typedef&amp;nbsp;struct&amp;nbsp;{&lt;br /&gt;&lt;/font&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;a;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;b;&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&amp;nbsp;&amp;nbsp;}&amp;nbsp;App1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&amp;nbsp;&amp;nbsp;void&amp;nbsp;do_app1(void);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&amp;nbsp;&amp;nbsp;#endif&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;现在可以用diff命令比较文件了：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$&amp;nbsp;diff&amp;nbsp;-u&amp;nbsp;old-prj/src/drv/drv1.h&amp;nbsp;new-prj/src/drv/drv1.h&lt;br /&gt;---&amp;nbsp;old-prj/src/drv/drv1.h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2008-03-01&amp;nbsp;12:59:46.000000000&amp;nbsp;+0800&lt;br /&gt;+++&amp;nbsp;new-prj/src/drv/drv1.h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2008-03-01&amp;nbsp;13:07:14.000000000&amp;nbsp;+0800&lt;br /&gt;@@&amp;nbsp;-4,9&amp;nbsp;+4,8&amp;nbsp;@@&lt;br /&gt;&amp;nbsp;#include&amp;nbsp;&amp;quot;def1.h&amp;quot;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;typedef&amp;nbsp;struct&amp;nbsp;{&lt;br /&gt;-&amp;nbsp;&amp;nbsp;int&amp;nbsp;p1;&lt;br /&gt;-&amp;nbsp;&amp;nbsp;int&amp;nbsp;p2;&lt;br /&gt;-&amp;nbsp;&amp;nbsp;int&amp;nbsp;p3;&lt;br /&gt;+&amp;nbsp;&amp;nbsp;int&amp;nbsp;a;&lt;br /&gt;+&amp;nbsp;&amp;nbsp;int&amp;nbsp;b;&lt;br /&gt;&amp;nbsp;}&amp;nbsp;App1;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;void&amp;nbsp;do_app1(void);&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;diff程序按行比较文本文件。比较文件的diff命令格式是：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$&amp;nbsp;diff&amp;nbsp;-u&amp;nbsp;旧文件&amp;nbsp;新文件&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;-u&amp;quot;参数指定diff命令使用 unified 格式，这是一种最常用的格式，我们来看看它的含义。&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;1.2 diff的 unified 格式&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;以&amp;quot;---&amp;quot;开头的行是旧文件信息，以&amp;quot;+++&amp;quot;开头的行是新文件信息：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;---&amp;nbsp;old-prj/src/drv/drv1.h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2008-03-01&amp;nbsp;12:59:46.000000000&amp;nbsp;+0800&lt;br /&gt;+++&amp;nbsp;new-prj/src/drv/drv1.h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2008-03-01&amp;nbsp;13:07:14.000000000&amp;nbsp;+0800&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;unified 格式默认在变化部分的前后各显示三行上下文。在上例中，旧文件的7、8、9行被替换成新文件的7、8行。旧文件的变化部分是7-9行，前后多显示3行，因 此显示4-12行。新文件的变化部分是7-8行，前后多显示3行，因此显示4-11行。以&amp;quot;@@&amp;quot;包围的行指示补丁的范围：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;@@&amp;nbsp;-4,9&amp;nbsp;+4,8&amp;nbsp;@@&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;#39;-4,9&amp;#39;中，&amp;#39;-&amp;#39;表示旧文件，&amp;#39;4,9&amp;#39;表示从第4行开始，显示9行，即显示4-12行。&amp;#39;+4,8&amp;#39; 中，&amp;#39;+&amp;#39;表示新文件，&amp;#39;4,8&amp;#39;表示从第4行开始，显示8行，即显示4-11行。&amp;quot;@@&amp;quot;行之后是上下文和变化的文本，其中&amp;#39;-&amp;#39;开头的行是旧文件特有 的，&amp;#39;+&amp;#39;开头的行是新文件特有的，其它行是两个文件都有的，即补丁的上下文。例如：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp;#include&amp;nbsp;&amp;quot;def1.h&amp;quot;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;typedef&amp;nbsp;struct&amp;nbsp;{&lt;br /&gt;-&amp;nbsp;&amp;nbsp;int&amp;nbsp;p1;&lt;br /&gt;-&amp;nbsp;&amp;nbsp;int&amp;nbsp;p2;&lt;br /&gt;-&amp;nbsp;&amp;nbsp;int&amp;nbsp;p3;&lt;br /&gt;+&amp;nbsp;&amp;nbsp;int&amp;nbsp;a;&lt;br /&gt;+&amp;nbsp;&amp;nbsp;int&amp;nbsp;b;&lt;br /&gt;&amp;nbsp;}&amp;nbsp;App1;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;void&amp;nbsp;do_app1(void);&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;1.3 制作和应用补丁&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;所谓制作补丁就是diff的输出重定向到一个文件，这个文件就是补丁文件。例如：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ diff -u old-prj/src/drv/drv1.h new-prj/src/drv/drv1.h&amp;gt;../drv1.diff&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们将old-prj解压到另一个目录，准备应用这个补丁：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ cd ..; mkdir test2; cd test2; tar xvjf ../old-prj.tar.bz2; mv old-prj myprj; cd myprj&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;在真实场景中,test2目录通常是在用户2的电脑上。用户2可能不使用 old-prj 作为第一级目录的名字。例如：用户1的第一级目录名是 linux-2.6.23.14, 用户2的第一级目录名是linux。所以我们将 old-prj 改为 myprj 以模拟这种情况。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们在 myprj 目录使用patch命令应用补丁：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ patch -p1 &amp;lt; ../../drv1.diff &lt;br /&gt;patching file src/drv/drv1.h&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;patch命令行中为什么没有出现要打补丁的文件？这是因为patch命令可以使用补丁文件中的文件信息：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;---&amp;nbsp;old-prj/src/drv/drv1.h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2008-03-01&amp;nbsp;12:59:46.000000000&amp;nbsp;+0800&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;-pn&amp;quot;参数（上例中n=1）中的n表示要从补丁文件的文件路径中去掉几层目录，可以理解为去掉几个&amp;#39;/&amp;#39;。例 如：p1表示去掉一层目录，&amp;quot;old-prj/src/drv/drv1.h&amp;quot;去掉一层就成为&amp;quot;src/drv/drv1.h&amp;quot;。patch命令在 myprj 目录找到&amp;quot;src/drv/drv1.h&amp;quot;后应用补丁。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们通常都在代码树的上一层目录制作补丁，在代码树的根目录应用补丁。因此，最常用的patch命令格式是：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ patch -p1 &amp;lt; 补丁文件 &lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;1.4 比较目录&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们回到test1目录，再对 new_prj 做一些改动。这次我们删除掉src/sys目录及其中的文件。再建立src/usr目录，并在该目录增加两个文件usr1.h和usr1.c。&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ cd ../../test1; rm -rf new-prj/src/sys; mkdir new-prj/src/usr&lt;br /&gt;$ echo -e &amp;quot;#ifndef USR1_Hn#define USR1_Hn#include &amp;quot;def1.h&amp;quot;n#endif&amp;quot;&amp;gt;new-prj/src/usr/usr1.h&lt;br /&gt;$ echo -e &amp;quot;#include &amp;quot;usr1.h&amp;quot;&amp;quot;&amp;gt;new-prj/src/usr/usr1.c&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;echo命令的&amp;quot;-e&amp;quot;参数打开对转义符的支持，bash默认是不支持转义符的。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;现在我们比较目录并制作补丁：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ diff -Nur old-prj/ new-prj/ &amp;gt; ../prj.diff&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;读者可以cat这个补丁文件的内容。根据前面的介绍，读者应该能看懂补丁文件了吧。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;比较目录的常用命令是：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ diff -Nur 旧目录 新目录 &amp;gt; 补丁文件&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;或&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ diff -Naur 旧目录 新目录 &amp;gt; 补丁文件&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;-u&amp;quot;参数前面已经介绍过了。&amp;quot;-N&amp;quot;参数将不存在的文件当作空文件。如果没有这个参数，补丁就不会包含孤儿文件（即另一方没有的文件）。&amp;quot;-r&amp;quot;参数表示比较子目录。&amp;quot;-a&amp;quot;参数表示将所有文件当作文本文件。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;我们再准备一个目录来应用补丁：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ cd ..; mkdir test3; cd test3; tar xvjf ../old-prj.tar.bz2; mv old-prj myprj; cd myprj&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;在源代码树的根目录应用补丁：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ patch -p1 &amp;lt; ../../prj.diff &lt;br /&gt;patching file src/drv/drv1.h&lt;br /&gt;patching file src/sys/sys1.c&lt;br /&gt;patching file src/sys/sys1.h&lt;br /&gt;patching file src/usr/usr1.c&lt;br /&gt;patching file src/usr/usr1.h&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;好了，读者可以用&amp;quot;diff -Nur&amp;quot;比较一下&amp;quot;test1/new_prj&amp;quot;和&amp;quot;test3/myprj&amp;quot;，没有输出就表示完全相同。&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;$ cd ../..; diff -Nur test1/new-prj test3/myprj&lt;br /&gt;&lt;/font&gt;&lt;/code&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;1.5 很多的补丁...&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;一个大项目可能有不同开发者提供很多补丁。这些补丁可能还存在依赖关系，例如补丁B必须打在补丁A上。我们当然可以凭着程序员的&amp;ldquo;心细如发&amp;rdquo;去管理好这些补丁，不过有一个叫quilt的工具可以使我们轻松一些。当然，即使有工具的帮助，细心和认真也是必需的。&lt;/font&gt;&lt;font size=&quot;3&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font size=&quot;3&quot;&gt;附录 &lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;为了简单起见，前面只介绍了一个&amp;quot;diff -Nur 老目录 新目录&amp;quot;的用法。有时候，新目录里只放了修改过的文件。这时可以不使用-N参数以忽略孤儿文件，即&amp;quot;diff -ur 老目录 新目录&amp;quot;。diff会输出孤儿文件的提示，我们可以删除或保留这些提示，它们对patch没有影响。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;使用diff时可以用--exclude排除文件和目录，例如：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;diff -ur -exclude=.* --exclude=CVS prj_old prj_new &lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;上例排除了源代码树中以&amp;#39;.&amp;#39;开头的文件和所有CVS目录。其实对于CVS项目，可以直接在源代码树根目录中执行：&lt;/font&gt;&lt;/p&gt; &lt;font size=&quot;3&quot;&gt;cvs diff -u3 &amp;gt; 补丁文件名 &lt;/font&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;u3表示输出3行上下文的unified 格式。打补丁时在源代码树根目录中执行：&lt;/font&gt;&lt;/p&gt; &lt;code&gt;&lt;font size=&quot;3&quot;&gt;patch -p0 &amp;lt; 补丁文件名 &lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&amp;quot;cvs diff&amp;quot;会自动忽略CVS项目外的文件。通过CVS的tag和补丁文件，我们可以方便地保存工作快照。&lt;/font&gt;&lt;/p&gt;</description>
   <link>http://16hot.blog.isyi.com/post/1/922</link>
      <pubDate>Fri, 19 Sep 2008 02:56:39 +1600</pubDate>   
  </item>
    <item>
   <title>Serv-UFTP服务器软件提权防止恶意用户提权</title>
   <description>&lt;span&gt;　　大家应该都知道通过webshell 可以提权，这里简单的讲述一个怎么能够防止别人利用webshell进行提权，也就是说就算恶意用户取得了某个服务器某站点的webshell，也是没办法进行提升权限的。  &lt;p&gt;　&lt;strong&gt;　防止webshell运行cmd命令&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　这里讲述一个简单的方法，那就是把默认的CMD名称改成其他任何复杂名称。自己需要使用的时候可以更改回来。这个是最简单的，当然也存 在安全隐患，当恶意用户上传一个CMD到任意目录下，就可以执行了，这里可以找到很安全的设置方法，比如设置CMD 运行的权限，把所有权限都删除掉，当使用的时候在把权限加上去，wscript.shell 相信大家都比较了解它，Wscript.Shell可以调用系统内核运行DOS基本命令，这里可以通过修改注册表，将此组件改名或删除(建议改名)，方法 如下： &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　HKEY_CLASSES_ROOTWscript.Shell  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　HKEY_CLASSES_ROOTWscript.Shell.1  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　这个样子几个简单的步骤就可以达到webshell无法运行cmd命令的效果。  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　&lt;strong&gt;修改系统默认文件夹漏洞&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　也就是最常见的 C:Documents and SettingsAll Users，虽然大部分人都知道这里可以进程上传，但管理员一般很少注意到这个目录的权限问题，从而产生安全隐患。在这里我们吧此文件夹的阅读权限设置只 允许管理员用户和system用户完全控制，其他的屏蔽掉即可。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　&lt;strong&gt;Serv-U提权&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　Serv-U 作为一款精典的FTP服务器软件，一直被大部分管理员所使用，它简单的安装和配置以及强大的管理功能的人性化也一直被管理员们称颂。但是随着使用者越来越 多，该软件的安全问题也逐渐显露出来。Serv-U 提升权限 ASP版 6.2 ，我们怎么能够防止它进行提权呢？那么只需更改默认端口和默认FTP软件的 账户和密码，默认管理员：LocalAdministrator，默认密码：#l@$ak#.lk;0@P，其修改方法如下： &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　首先利用Ultraedit修改文件ServUDaemon.exe和ServUAdmin.exe两个程序，将默认密码修改成同等长 度的其它字符，然后用Ultraedit打开ServUAdmin.exe查找最后一个B6AB(43958的16进制)，替换成自定义的端口比如 3930（12345）即可。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　当然也希望各各管理员能够及时更新自己的Serv-U 因为这个漏洞只有一些Serv-U的老版本存在的漏洞!最新的Serv-U已经不存在此漏洞和加入了 管理员密码的功能!让我们使用起来更加安全!  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　&lt;strong&gt;安全设置IIS用户&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　重新建立一个用户然后把用户所在组删除，让其独立，然后在IIS中指派给其网站，然后在网站跟目录指派其用户读取、运行，即可，此时即使WEBSHELL上传成功也只能在网站文件夹内活动，涉及不到其他文件夹。  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;　　总结：以上介绍主要是一些常规的防范方式，不同的环境有着不同的设置，如果计算机中安装了其他软件，那就需要相对应的设置了。  &lt;/p&gt;&lt;/span&gt;</description>
   <link>http://16hot.blog.isyi.com/post/1/921</link>
      <pubDate>Tue, 16 Sep 2008 18:58:25 +1600</pubDate>   
  </item>
    <item>
   <title>Linux IPv6 HOWTO (4)</title>
   <description>&lt;pre&gt;14.1 Red Hat Linux and &amp;quot;clones&amp;quot;(小紅帽和它的弟兄娣妹)&lt;br /&gt;&lt;br /&gt;   自從我開始寫 [33]IPv6 &amp;amp; Linux - HowTo.我打算設定一個持久的IPv6配置,包&lt;br /&gt;   含: host-only, router-only, dual-homed-host, router with second stub&lt;br /&gt;   network, normal tunnels, 6to4 tunnels 和其它.現在我寫了一&lt;br /&gt;   個configuration and script files 這個script有自己的HOWTO:&lt;br /&gt;&lt;br /&gt;   [34]IPv6-HOWTO/scripts/current. 夠運的是, Red Hat Linux 從 7.1 開始就&lt;br /&gt;   包含了這個script.多虧了Pekka Savola的幫助.&lt;br /&gt;&lt;br /&gt;14.2 Mandrake(曼德萊克)Linux&lt;br /&gt;&lt;br /&gt;   從8.0後也包含了 IPv6-enabled initscript package但是有點小問&lt;br /&gt;   題(&amp;quot;ifconfig&amp;quot; misses &amp;quot;inet6&amp;quot; before &amp;quot;add&amp;quot;).&lt;br /&gt;&lt;br /&gt;  支持IPv6的網路設定 scripts 測試&lt;br /&gt;&lt;br /&gt;   script library應該存在:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;                     /etc/sysconfig/network-scripts/network-functions-ipv6&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   自動測試:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;                     # test -f /etc/sysconfig/network-scripts/network-functions&lt;br /&gt;-ipv6 &amp;amp;&amp;amp; echo &amp;quot;Main&lt;br /&gt;                     ? IPv6 script library exists&amp;quot;&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   library的版本很重要, 更高的版本包含了更多的功能.您可以通過這個檢視它:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;                     # source /etc/sysconfig/network-scripts/network-functions-&lt;br /&gt;ipv6 &amp;amp;&amp;amp;&lt;br /&gt;                     ? getversion_ipv6_functions&lt;br /&gt;                     20011124&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;  Short hint for enabling IPv6 on current RHL 7.1, 7.2, 7.3, ...(一些小提示)&lt;br /&gt;&lt;br /&gt;     * 檢視IPv6模組是否已經掛進系統.&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;                    # modprobe -c | grep net-pf-10&lt;br /&gt;                    alias net-pf-10 off&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;     * 如果是&amp;quot;off&amp;quot; 在 /etc/sysconfig/network 中加入IPv6的支持.&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;                    NETWORKING_IPV6=yes&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;     * 重新初始網路:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;                    # service network restart&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;     * IPv6模組應該掛進來了:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;                    # modprobe -c | grep ipv6&lt;br /&gt;                    alias net-pf-10 ipv6&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   如果您提供路由廣告autoconfiguration 會自動為您設定, 更多的資訊請看&lt;br /&gt;   /usr/share/doc/initscripts-$version/sysconfig.txt.&lt;br /&gt;&lt;br /&gt;14.3 SuSE(蘇澤斯)Linux&lt;br /&gt;&lt;br /&gt;   7.x 以上, 支持IPv6. 在/etc/rc.config 裡有更多的資訊. 因為不同的設定方&lt;br /&gt;   法和scripts結構, 所以不能將Red Hat Linux 當中的方法照搬過來.&lt;br /&gt;&lt;br /&gt;  更詳盡的資訊請看:&lt;br /&gt;&lt;br /&gt;   [35]How to setup 6to4 IPv6 with SuSE 7.3&lt;br /&gt;&lt;br /&gt;14.4 Debian(迪比安)Linux&lt;br /&gt;&lt;br /&gt;   參照: [36]IPv6 on Debian Linux&lt;br /&gt;&lt;br /&gt;15. 防火牆&lt;br /&gt;&lt;br /&gt;15.1 使用 netfilter6防火牆&lt;br /&gt;&lt;br /&gt;   netfilter6防火牆只支持2.4以上的核心.早期的2.2核心您只能用41號協議過&lt;br /&gt;   濾IPv6-in-IPv4.&lt;br /&gt;&lt;br /&gt;   警告: 按照例子那樣設定並不能真正地保護您的作業系統.&lt;br /&gt;&lt;br /&gt;15.2 更多的資訊:&lt;br /&gt;&lt;br /&gt;     * [37]Netfilter project&lt;br /&gt;     * [38]maillist archive of netfilter users&lt;br /&gt;     * [39]maillist archive of netfilter developers&lt;br /&gt;     * [40]Unofficial status informations&lt;br /&gt;&lt;br /&gt;15.3 準備&lt;br /&gt;&lt;br /&gt;   下載最新的核心:&lt;br /&gt;   [41]http://www.kernel.org/&lt;br /&gt;&lt;br /&gt;   下載最新的iptables:&lt;br /&gt;&lt;br /&gt;   tar:&lt;br /&gt;   [42]http://www.netfilter.org/&lt;br /&gt;&lt;br /&gt;   Source RPM for rebuild of binary (for RedHat systems):&lt;br /&gt;   [43]ftp://ftp.redhat.com/redhat/linux/rawhide/SRPMS/SRPMS/&lt;br /&gt;&lt;br /&gt;  解開源代碼&lt;br /&gt;&lt;br /&gt;   解開源代碼與更名&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;        # tar z|jxf kernel-version.tar.gz|bz2&lt;br /&gt;        # mv linux linux-version-iptables-version+IPv6&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   解開 iptables 源代碼&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # tar z|jxf iptables-version.tar.gz|bz2&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   Apply pending patches&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # make pending-patches KERNEL_DIR=/path/to/src/linux-version-iptables-&lt;br /&gt;version/&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   Apply additional IPv6 related patches (still not in the vanilla kernel&lt;br /&gt;   included)&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # make patch-o-matic KERNEL_DIR=/path/to/src/linux-version-iptables-ve&lt;br /&gt;rsion/&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   在下面的選單中回答yes:&lt;br /&gt;     * ah-esp.patch&lt;br /&gt;     * masq-dynaddr.patch (only needed for systems with dynamic IP&lt;br /&gt;       assigned WAN connections like PPP or PPPoE)&lt;br /&gt;     * ipv6-agr.patch.ipv6&lt;br /&gt;     * ipv6-ports.patch.ipv6&lt;br /&gt;     * LOG.patch.ipv6&lt;br /&gt;     * REJECT.patch.ipv6&lt;br /&gt;&lt;br /&gt;   檢視IPv6括展:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # make print-extensions&lt;br /&gt;         Extensions found: IPv6:owner IPv6:limit IPv6:mac IPv6:multiport&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;  Configure, build and install new kernel(設定,編譯,安裝新的核心)&lt;br /&gt;&lt;br /&gt;   進入代碼目錄:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;        # cd /path/to/src/linux-version-iptables-version/&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   改變Makefile&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         - EXTRAVERSION =&lt;br /&gt;         + EXTRAVERSION = -iptables-version+IPv6-try&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   運行相關的設定:Run configure, enable IPv6 related&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         Code maturity level options&lt;br /&gt;                  Prompt for development and/or incomplete code/drivers : yes&lt;br /&gt;            Networking options&lt;br /&gt;                  Network packet filtering: yes&lt;br /&gt;                  The IPv6 protocol: module&lt;br /&gt;                       IPv6: Netfilter Configuration&lt;br /&gt;                             IP6 tables support: module&lt;br /&gt;                             All new options like following:&lt;br /&gt;                                   limit match support: module&lt;br /&gt;                                   MAC address match support: module&lt;br /&gt;                                   Multiple port match support: module&lt;br /&gt;                                   Owner match support: module&lt;br /&gt;                                   netfilter MARK match support: module&lt;br /&gt;                                   Aggregated address check: module&lt;br /&gt;                                   Packet filtering: module&lt;br /&gt;                                        REJECT target support: module&lt;br /&gt;                                        LOG target support: module&lt;br /&gt;                                   Packet mangling: module&lt;br /&gt;                                   MARK target support: module&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   在系統的其它方面進行相應的修改.&lt;br /&gt;&lt;br /&gt;  Rebuild and install binaries of iptables (打造一個新的iptables)&lt;br /&gt;&lt;br /&gt;   確定您的核心源代碼存在於: /usr/src/linux/&lt;br /&gt;&lt;br /&gt;   Rename older directory&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # mv /usr/src/linux /usr/src/linux.old&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   Create a new softlink&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # ln /path/to/src/linux-version-iptables-version /usr/src/linux&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   Rebuild SRPMS&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # rpm --rebuild /path/to/SRPMS/iptables-version-release.src.rpm&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   Install new iptables packages (iptables + iptables-ipv6) 安裝新&lt;br /&gt;   的iptables&lt;br /&gt;     * On RH 7.1 systems, 通常已經有一個更早的版本, therefore use&lt;br /&gt;       &amp;quot;freshen&amp;quot;&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # rpm -Fhv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;     * 如果沒有安裝,您就親自來吧:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # rpm -ihv /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;     * 如果在RH6.2上安裝,要加上&amp;quot;--nodep&amp;quot;:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # rpm -ihv --nodep /path/to/RPMS/cpu/iptables*-version-release.cpu.rpm&lt;br /&gt;&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;     * 可能要為iptables加上一個softlink:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;          # ln -s /lib/iptables/ /usr/lib/iptables&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;15.4 使用方法&lt;br /&gt;&lt;br /&gt;  檢視&lt;br /&gt;&lt;br /&gt;   將模組掛進來:&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # modprobe ip6_tables&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;   檢視&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;         # [ ! -f /proc/net/ip6_tables_names ] &amp;amp;&amp;amp; echo &amp;quot;Current kernel doesn&amp;#39;t&lt;br /&gt;support&lt;br /&gt;         ? &amp;#39;ip6tables&amp;#39; firewalling (IPv6)!&amp;quot;&lt;br /&gt;       ______________________________________________________________&lt;br /&gt;&lt;br /&gt;15.5 使用ip6tables&lt;br /&gt;&lt;br /&gt;16.3.2.1. List all IPv6 netfilter entries&lt;br /&gt;&lt;br /&gt;Short&lt;br /&gt;&lt;br /&gt;# ip6tables -L&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Extended&lt;br /&gt;&lt;br /&gt;# ip6tables -n -v --line-numbers -L&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;List specified filter&lt;br /&gt;# ip6tables -n -v --line-numbers -L INPUT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 加入一個日誌:&lt;br /&gt;# ip6tables --table filter --append INPUT  -j LOG --log-prefix &amp;quot;INPUT:&amp;quot;&lt;br /&gt;? --log-level 7&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;加入一個入站丟棄的條件:&lt;br /&gt;# ip6tables --table filter --append INPUT  -j DROP&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;移除一個條件:&lt;br /&gt;# ip6tables --table filter --delete INPUT 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;允許 ICMPv6:&lt;br /&gt;Using older kernels (unpatched kernel 2.4.5 and iptables-1.2.2) no type can be&lt;br /&gt;specified&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;允許入站 ICMPv6 經過 tunnels&lt;br /&gt;&lt;br /&gt;# ip6tables -A INPUT -i sit+ -p icmpv6 -j ACCEPT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;允許出站 ICMPv6 經過 tunnels&lt;br /&gt;# ip6tables -A OUTPUT -o sit+ -p icmpv6 -j ACCEPT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Newer kernels allow specifying of ICMPv6 types:&lt;br /&gt;&lt;br /&gt;# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;限制Rate-limiting&lt;br /&gt;Because it can happen (author already saw it to times) that an ICMPv6 storm wil&lt;br /&gt;l raise up, you should use available rate limiting for at least ICMPv6 ruleset.&lt;br /&gt; In addition logging rules should also get rate limiting to prevent DoS attacks&lt;br /&gt; against syslog and storage of log file partition. An example for a rate limite&lt;br /&gt;d ICMPv6 looks like:&lt;br /&gt;&lt;br /&gt;# ip6tables -A INPUT --protocol icmpv6 --icmpv6-type echo-request -j ACCEPT --m&lt;br /&gt;atch limit --limit 30/minute&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 允許入站的 SSH&lt;br /&gt;Here an example is shown for a ruleset which allows incoming SSH connection fro&lt;br /&gt;m a specified IPv6 address&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  允許來自 3ffe:ffff:100::1/128 的 SSH 入站&lt;br /&gt;&lt;br /&gt;# ip6tables -A INPUT -i sit+ -p tcp -s 3ffe:ffff:100::1/128 --sport 512:65535&lt;br /&gt;? --dport 22 -j ACCEPT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;允許回應包Allow response packets (此刻 IPv6 連結追蹤不