﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Robin's Programming World-随笔分类-转载</title><link>http://www.blogjava.net/fastzch/category/7319.html</link><description>I Love Programming As My Life!</description><language>zh-cn</language><lastBuildDate>Tue, 01 Apr 2014 14:10:43 GMT</lastBuildDate><pubDate>Tue, 01 Apr 2014 14:10:43 GMT</pubDate><ttl>60</ttl><item><title>从 USB 设备启动 Surface</title><link>http://www.blogjava.net/fastzch/archive/2014/04/01/411761.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Mon, 31 Mar 2014 16:15:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2014/04/01/411761.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/411761.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2014/04/01/411761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/411761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/411761.html</trackback:ping><description><![CDATA[您可以从可启动 USB 设备启动 Surface。<br /><br />当 Surface 关闭时从可启动 USB 设备启动<br />步骤 1： &nbsp;&nbsp;&nbsp; 将可启动 USB 设备连接到 USB 端口。<br />步骤 2： &nbsp;&nbsp;&nbsp; 按住音量减小 (-) 控制键。<br />步骤 3： &nbsp;&nbsp;&nbsp; 按下并释放电源按钮。<br />步骤 4： &nbsp;&nbsp;&nbsp; 当显示 Surface 徽标时，释放音量控制键。 Surface 将启动 USB 设备上的软件。<br /><br />当 Surface 启用时从可启动 USB 设备启动<br />步骤 1： &nbsp;&nbsp;&nbsp; 将可启动 USB 设备连接到 USB 端口。<br />步骤 2： &nbsp;&nbsp;&nbsp; 从屏幕右边缘向左轻扫，然后点击&#8220;设置&#8221;。<br />（如果您使用鼠标，请指向屏幕的右上角，将鼠标指针下移并单击&#8220;设置&#8221;。）<br />步骤 3： &nbsp;&nbsp;&nbsp; 点击或单击&#8220;更改电脑设置&#8221;。<br />步骤 4： &nbsp;&nbsp;&nbsp; 点击或单击&#8220;更新和恢复&#8221;，然后点击或单击&#8220;恢复&#8221;。<br />步骤 5： &nbsp;&nbsp;&nbsp; 在&#8220;高级启动&#8221;下，点击或单击&#8220;立即重新启动&#8221;。<br />步骤 6： &nbsp;&nbsp;&nbsp; 在&#8220;选择一个选项&#8221;屏幕中，点击或单击&#8220;使用设备&#8221;。<br />步骤 7： &nbsp;&nbsp;&nbsp; 在&#8220;疑难解答&#8221;屏幕中，点击或单击&#8220;高级选项&#8221;。<br />步骤 8： &nbsp;&nbsp;&nbsp; 在&#8220;高级选项&#8221;屏幕中，点击或单击 USB 设备的名称。Surface 将重新启动并从 USB 设备启动。<br /><br />BTW, 还是官方文档靠谱，还是Google靠谱！！！<br />原文地址：http://www.microsoft.com/surface/zh-cn/support/storage-files-and-folders/boot-surface-pro-from-usb-recovery-device<br /><img src ="http://www.blogjava.net/fastzch/aggbug/411761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2014-04-01 00:15 <a href="http://www.blogjava.net/fastzch/archive/2014/04/01/411761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Objective-C内存管理教程和原理剖析口诀与范式</title><link>http://www.blogjava.net/fastzch/archive/2011/12/01/365258.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Thu, 01 Dec 2011 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2011/12/01/365258.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/365258.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2011/12/01/365258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/365258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/365258.html</trackback:ping><description><![CDATA[<span  style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; ">
<table width="100%" class="Framework" cellspacing="0" cellpadding="0" style="background-color: #eeeeee; ">
    <tbody>
        <tr>
            <td class="MainCell" width="100%" style="font-size: 12px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; background-color: white; vertical-align: top; ">
            <div id="main">
            <div class="post" style="border-left-color: #cccccc; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-bottom: 28px; ">
            <div class="posthead" style="background-color: #eeeeee; background-image: url(http://www.cnblogs.com/Skins/HabaHaba/images/PostHeaderBg.gif); padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; color: #444444; font-size: 9px; background-position: 50% 100%; background-repeat: repeat no-repeat; ">
            <h2 style="margin-top: 0px; font-size: 13px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><a id="ctl03_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/VinceYuan/archive/2010/03/08/1680492.html" style="color: #223355; text-decoration: none; ">iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式</a></h2>
            Posted on 2010-03-08 00:35&nbsp;<a href="http://www.cnblogs.com/VinceYuan/" style="color: #223355; text-decoration: none; ">Vince Yuan</a>&nbsp;阅读(2331)&nbsp;<a href="http://www.cnblogs.com/VinceYuan/archive/2010/03/08/1680492.html#commentform" style="color: #223355; text-decoration: none; ">评论(1)</a>&nbsp;<a href="http://www.cnblogs.com/VinceYuan/archive/2010/03/08/1680492.html#" rel="nofollow" style="color: #223355; text-decoration: none; ">编辑</a>&nbsp;<a href="http://www.cnblogs.com/VinceYuan/archive/2010/03/08/1680492.html#" style="color: #223355; text-decoration: none; ">收藏</a>&nbsp;<img src="http://www.cnblogs.com/VinceYuan/aggbug/1680492.html?type=1&amp;webview=1" width="1px" height="1px" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /></div>
            <div class="postbody" style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; margin-bottom: 14px; font-size: 13px; line-height: 1.5; ">
            <div id="cnblogs_post_body">
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span style="font-size: 13px; font-family: 宋体; ">版权声明</span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span style="font-size: 13px; font-family: 宋体; ">此文版权归作者</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">Vince Yuan (vince.yuan#gmail.com)</font></span><span style="font-size: 13px; font-family: 宋体; ">所有。欢迎非营利性转载，转载时必须包含原始链接</span><span lang="EN-US" style="font-size: 13px; "><a href="http://vinceyuan.cnblogs.com/" target="_blank" style="color: #1d58d1; text-decoration: none; "><font face="Calibri">http://vinceyuan.cnblogs.com</font></a></span><span style="font-size: 13px; font-family: 宋体; ">，且必须包含此版权声明的完整内容。</span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span style="font-size: 13px; font-family: 宋体; "></span><span style="font-size: 13px; font-family: 宋体; "></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span style="font-size: 13px; font-family: 宋体; "></span>&nbsp;</p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span style="font-size: 13px; font-family: 宋体; ">版本</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">&nbsp;1.1<span style="font-size: 13px; ">&nbsp;</span></font></span><span style="font-size: 13px; font-family: 宋体; ">发表于</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">2010-03-08</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; ">&nbsp;</p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span style="font-size: 13px; font-family: 宋体; ">二</span><font face="Calibri">&nbsp;</font><span style="font-size: 13px; font-family: 宋体; ">口诀与范式</span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">1</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">口诀。</span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">1.1</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">谁创建，谁释放（类似于&#8220;谁污染，谁治理&#8221;）。如果你通过</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">alloc</font></span><span style="font-size: 13px; font-family: 宋体; ">、</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">new</font></span><span style="font-size: 13px; font-family: 宋体; ">或</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">copy</font></span><span style="font-size: 13px; font-family: 宋体; ">来创建一个对象，那么你必须调用</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">release</font></span><span style="font-size: 13px; font-family: 宋体; ">或</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">autorelease</font></span><span style="font-size: 13px; font-family: 宋体; ">。换句话说，不是你创建的，就不用你去释放。</span><span lang="EN-US" style="font-size: 13px; "><br />
            </span><span style="font-size: 13px; font-family: 宋体; ">例如，你在一个函数中</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">alloc</font></span><span style="font-size: 13px; font-family: 宋体; ">生成了一个对象，且这个对象只在这个函数中被使用，那么你必须在这个函数中调用</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">release</font></span><span style="font-size: 13px; font-family: 宋体; ">或</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">autorelease</font></span><span style="font-size: 13px; font-family: 宋体; ">。如果你在一个</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">class</font></span><span style="font-size: 13px; font-family: 宋体; ">的某个方法中</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">alloc</font></span><span style="font-size: 13px; font-family: 宋体; ">一个成员对象，且没有调用</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">autorelease</font></span><span style="font-size: 13px; font-family: 宋体; ">，那么你需要在这个类的</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">dealloc</font></span><span style="font-size: 13px; font-family: 宋体; ">方法中调用</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">release</font></span><span style="font-size: 13px; font-family: 宋体; ">；如果调用了</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">autorelease</font></span><span style="font-size: 13px; font-family: 宋体; ">，那么在</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">dealloc</font></span><span style="font-size: 13px; font-family: 宋体; ">方法中什么都不需要做。</span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">1.2</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">除了</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">alloc</font></span><span style="font-size: 13px; font-family: 宋体; ">、</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">new</font></span><span style="font-size: 13px; font-family: 宋体; ">或</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">copy</font></span><span style="font-size: 13px; font-family: 宋体; ">之外的方法创建的对象都被声明了</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">autorelease</font></span><span style="font-size: 13px; font-family: 宋体; ">。</span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">1.3</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">谁</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">retain</font></span><span style="font-size: 13px; font-family: 宋体; ">，谁</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">release</font></span><span style="font-size: 13px; font-family: 宋体; ">。只要你调用了</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">retain</font></span><span style="font-size: 13px; font-family: 宋体; ">，无论这个对象是如何生成的，你都要调用</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">release</font></span><span style="font-size: 13px; font-family: 宋体; ">。有时候你的代码中明明没有</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">retain</font></span><span style="font-size: 13px; font-family: 宋体; ">，可是系统会在默认实现中加入</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">retain</font></span><span style="font-size: 13px; font-family: 宋体; ">。不知道为什么苹果公司的文档没有强调这个非常重要的一点，请参考范式</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">2.7</font></span><span style="font-size: 13px; font-family: 宋体; ">和第三章。</span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">范式。</span><span lang="EN-US" style="font-size: 13px; "><br />
            </span><span style="font-size: 13px; font-family: 宋体; ">范式就是模板，就是依葫芦画瓢。由于不同人有不同的理解和习惯，我总结的范式不一定适合所有人，但我能保证照着这样做不会出问题。</span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.1</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">创建一个对象。</span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">ClassA *obj1 = [[ClassA alloc] init];</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.2</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">创建一个</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">autorelease</font></span><span style="font-size: 13px; font-family: 宋体; ">的对象。</span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">ClassA *obj1 = [[[ClassA alloc] init] autorelease];</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.3</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">Release</font></span><span style="font-size: 13px; font-family: 宋体; ">一个对象后，立即把指针清空。（顺便说一句，</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">release</font></span><span style="font-size: 13px; font-family: 宋体; ">一个空指针是合法的，但不会发生任何事情）</span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">[obj1 release];</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">obj1 = nil;</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.4</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">指针赋值给另一个指针。</span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">ClassA *obj2 = obj1;</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">[obj2 retain];</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">//do something</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">[obj2 release];</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">obj2 = nil;</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.5</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">在一个函数中创建并返回对象，需要把这个对象设置为</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">autorelease</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">ClassA *Func1()</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">{</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;</span>ClassA *obj = [[[ClassA alloc]init]autorelease];</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;</span>return obj;</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">}</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.6</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">在子类的</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">dealloc</font></span><span style="font-size: 13px; font-family: 宋体; ">方法中调用基类的</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">dealloc</font></span><span style="font-size: 13px; font-family: 宋体; ">方法</span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">-(void) dealloc</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">{</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&#8230;</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>[super dealloc];</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">}</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.7</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">在一个</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">class</font></span><span style="font-size: 13px; font-family: 宋体; ">中创建和使用</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">property</font></span><span style="font-size: 13px; font-family: 宋体; ">。</span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.7.1</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">声明一个成员变量。</span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.5pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">ClassB *objB;</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.7.2</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">声明</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">property</font></span><span style="font-size: 13px; font-family: 宋体; ">，加上</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">retain</font></span><span style="font-size: 13px; font-family: 宋体; ">参数。</span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">@property (retain) ClassB* objB;</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.7.3</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">定义</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">property</font></span><span style="font-size: 13px; font-family: 宋体; ">。（</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">property</font></span><span style="font-size: 13px; font-family: 宋体; ">的默认实现请看第三章）</span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">@synthesize objB;</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.7.4</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">除了</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">dealloc</font></span><span style="font-size: 13px; font-family: 宋体; ">方法以外，始终用</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">.</font></span><span style="font-size: 13px; font-family: 宋体; ">操作符的方式来调用</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">property</font></span><span style="font-size: 13px; font-family: 宋体; ">。</span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.5pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">self.objB&nbsp;</font></span><span style="font-size: 13px; font-family: 宋体; ">或者</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">objA.objB</font></span></p>
            <p class="MsoListParagraph" style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.7.5</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">在</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">dealloc</font></span><span style="font-size: 13px; font-family: 宋体; ">方法中</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">release</font></span><span style="font-size: 13px; font-family: 宋体; ">这个成员变量。</span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.5pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">[objB release];</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span style="font-size: 13px; font-family: 宋体; ">示例代码如下（详细代码请参考附件中的</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">memman-property.m</font></span><span style="font-size: 13px; font-family: 宋体; ">，你需要特别留意对象是在何时被销毁的。）：</span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">@interface ClassA : NSObject</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">{</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>ClassB* objB;</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">}</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><o:p><font face="Calibri">&nbsp;</font></o:p></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">@property (retain) ClassB* objB;</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">@end</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><o:p><font face="Calibri">&nbsp;</font></o:p></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">@implementation ClassA</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">@synthesize objB;</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">-(void) dealloc</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">{</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>[objB release];</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>[super dealloc];</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">}</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">@end</font></span></p>
            <p class="MsoListParagraph" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><span style="font-size: 13px; "><font face="Calibri">2.7.6</font><span style="font-size: 13px; font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 13px; font-family: 宋体; ">给这个</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">property</font></span><span style="font-size: 13px; font-family: 宋体; ">赋值时，有手动</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">release</font></span><span style="font-size: 13px; font-family: 宋体; ">和</span><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">autorelease</font></span><span style="font-size: 13px; font-family: 宋体; ">两种方式。</span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">void funcNoAutorelease()</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">{</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>ClassB *objB1 = [[ClassB alloc]init];</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>ClassA *objA = [[ClassA alloc]init];</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>objA.objB = objB1;</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>[objB1 release];</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>[objA release];</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">}</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><o:p><font face="Calibri">&nbsp;</font></o:p></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">void funcAutorelease()</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">{</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>ClassB *objB1 = [[[ClassB alloc]init] autorelease];</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>ClassA *objA = [[[ClassA alloc]init] autorelease];</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri"><span style="font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>objA.objB = objB1;</font></span></p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span lang="EN-US" style="font-size: 13px; "><font face="Calibri">}</font></span></p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; ">&nbsp;</p>
            <p class="MsoNormal" align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; text-align: left; ">&nbsp;</p>
            <p class="MsoNormal" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; text-indent: 0px; font-size: 13px; line-height: 19px; "><span style="font-size: 13px; font-family: 宋体; ">示例代码文件链接：</span><span lang="EN-US" style="font-size: 13px; "><a href="http://files.cnblogs.com/VinceYuan/objective-c-memman.zip" target="_blank" style="color: #1d58d1; text-decoration: none; "><font face="Calibri">http://files.cnblogs.com/VinceYuan/objective-c-memman.zip</font></a></span></p>
            </div>
            </div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</span>
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.blogjava.net/fastzch/aggbug/365258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2011-12-01 09:25 <a href="http://www.blogjava.net/fastzch/archive/2011/12/01/365258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决Android模拟器不能上网的问题</title><link>http://www.blogjava.net/fastzch/archive/2011/08/04/355771.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Thu, 04 Aug 2011 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2011/08/04/355771.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/355771.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2011/08/04/355771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/355771.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/355771.html</trackback:ping><description><![CDATA[@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
<span  style="color: #3e5d00; font-family: Arial; font-size: 12px; line-height: 18px; ">
<table style="line-height: 20px !important; table-layout: fixed; width: 968px; ">
    <tbody style="line-height: 20px !important; ">
        <tr style="line-height: 20px !important; ">
            <td style="color: #3e5d00; font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 20px !important; ">
            <div id="blog_text" class="cnt" style="color: #3e5d00; font-family: Georgia; word-wrap: break-word; word-break: normal; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 20px; letter-spacing: 2px; overflow-x: hidden; overflow-y: hidden; position: relative !important; ">
            <p style="line-height: normal; ">Windows下，配置好Adroid环境变量后(如将d:android-sdk-windows-1.0_r1 ools加入系统变量PATH)，在命令行窗口输入：</p>
            <p style="line-height: normal; ">　　emulator</p>
            <p style="line-height: normal; ">　　启动Android 模拟器后，　输入：</p>
            <p style="line-height: normal; ">　　adb shell</p>
            <p style="line-height: normal; ">　　进入adb shell模式：</p>
            <p style="line-height: normal; ">　　将网络连接代理设置写入配置数据库，假如你的上网代理IP是10.193.xx.xx：</p>
            <p style="line-height: normal; ">　　sqlite3 /data/data/com.android.providers.settings/databases/settings.db "INSERT INTO system VALUES(99,'http_proxy','10.193.xx.xx:1080')"</p>
            <p style="line-height: normal; ">　　查询一下是否成功更改了系统设置：</p>
            <p style="line-height: normal; ">　　sqlite3 /data/data/com.android.providers.settings/databases/settings.db "SELECT * FROM system"</p>
            <p style="line-height: normal; ">　　结果中应有：99|http_proxy|10.193.xx.xx:1080</p>
            <p style="line-height: normal; ">　　重启模拟器，应该可以使用Browser上 Internet了.</p>
            <p style="line-height: normal; ">　　删除刚刚写入的配置信息方法：</p>
            <p style="line-height: normal; ">　　sqlite3 /data/data/com.android.providers.settings/databases/settings.db "DELETE FROM system WHERE _id=99"</p>
            <p style="line-height: normal; ">Android模拟器默认的地址是10.0.2.3，默认的DNS也是10.0.2.3，对于在家里上网学习Android的人（像我）来讲，一般电脑的IP都是192.168.1.100之类的，不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置方法很简单，只要把模拟器的默认DNS设置成电脑的DNS地址即可。</p>
            <p style="line-height: normal; ">第一步：用系统的命令进入Android开发包的tools目录</p>
            <p style="line-height: normal; ">&nbsp;cd X:\...\android-sdk-windows\tool</p>
            <p style="line-height: normal; ">第二布：使用adb的shell，确认系统的各项属性</p>
            <p style="line-height: normal; ">adb shell</p>
            <p style="line-height: normal; ">getprop</p>
            <p style="line-height: normal; ">getprop会列出系统当前的各项属性</p>
            <p style="line-height: normal; ">第三步：得到模拟器的DNS地址</p>
            <p style="line-height: normal; ">在结果里可以看到：</p>
            <p style="line-height: normal; ">[net.dns1]: [10.0.2.3]<br style="line-height: normal; " />
            [net.dns2]: [10.0.2.4]<br style="line-height: normal; " />
            [net.dns3]: [10.0.2.5]<br style="line-height: normal; " />
            [net.dns4]: [10.0.2.6]</p>
            <p style="line-height: normal; ">第四步：把dns改成我们自己的DNS</p>
            <p style="line-height: normal; ">setprop net.dns1 192.168.1.1</p>
            <p style="line-height: normal; ">注：一般TP-LINK及D-LINK的DNS都是192.168.1.1，如果不是请使用ipcnofig /all命令确认。</p>
            <p style="line-height: normal; ">大功告成，再去使用模拟器的浏览器的话，你就可以发现你已经可以上网了。</p>
            <p style="line-height: normal; ">&nbsp;</p>
            <p style="line-height: normal; ">&nbsp;</p>
            <p style="line-height: normal; ">我在网上查了一下，发现有以下四种方式：&nbsp;<br style="line-height: normal; " />
            一：将网络连接代理设置写入配置数据库&nbsp;<br style="line-height: normal; " />
            1、通过命令行或者通过双击emulatoer可执行文件，打开模拟器&nbsp;<br style="line-height: normal; " />
            2、在命令行执行adb shell 打开android的控制台 （确保环境变量设置正确，即已经把Android_SDK/tools 添加到了PATH(Linux)/path(Windows)）&nbsp;<br style="line-height: normal; " />
            3、执行 ls -l /data/data/com.android.providers.settings/databases/settings.db ，查看系统设置数据库文件是否存在&nbsp;<br style="line-height: normal; " />
            4、如果数据库文件存在，执行 sqlite3 /data/data/com.android.providers.settings/databases/settings.db，以settings.db为当前scheme启动SQLITE3&nbsp;<br style="line-height: normal; " />
            5、执行 INSERT INTO system VALUES(99,&#8217;http_proxy&#8217;, &#8216;192.168.0.245:8080&#8242;); 语句插入数据，其中192.168.0.245是我用的代理服务器IP，8080是端口，请根据具体情况替换&nbsp;<br style="line-height: normal; " />
            6、执行 SELECT * FROM system; 来查看刚才插入的数据&nbsp;<br style="line-height: normal; " />
            7、重启模拟器，以使代理服务器设置生效&nbsp;<br style="line-height: normal; " />
            8、可以使用 DELETE FROM system WHERE _id=99; 语句来删除代理设置，或者使用 UPDATE system SET value = &#8216;192.168.0.245:8070&#8242; WHERE _id=99; 来修改代理服务器设置&nbsp;<br style="line-height: normal; " />
            <br style="line-height: normal; " />
            二：可能是DNS的问题&nbsp;<br style="line-height: normal; " />
            1、用系统的命令进入Android开发包的tools目录&nbsp;<br style="line-height: normal; " />
            cd E:\android-sdk-windows\tools&nbsp;<br style="line-height: normal; " />
            2、使用adb的shell，确认系统的各项属性&nbsp;<br style="line-height: normal; " />
            adb shell&nbsp;<br style="line-height: normal; " />
            getprop&nbsp;<br style="line-height: normal; " />
            getprop会列出系统当前的各项属性&nbsp;<br style="line-height: normal; " />
            3、得到模拟器的DNS地址&nbsp;<br style="line-height: normal; " />
            在结果里可以看到：&nbsp;<br style="line-height: normal; " />
            [net.dns1]: [10.0.2.3]&nbsp;<br style="line-height: normal; " />
            [net.dns2]: [10.0.2.4]&nbsp;<br style="line-height: normal; " />
            4、把dns改成我们自己的DNS&nbsp;<br style="line-height: normal; " />
            setprop net.dns1 192.168.1.1&nbsp;<br style="line-height: normal; " />
            注：一般TP-LINK及D-LINK的DNS都是192.168.1.1，如果不是请使用ipcnofig /all命令确认。&nbsp;<br style="line-height: normal; " />
            <br style="line-height: normal; " />
            三：直接带参数启动模拟器&nbsp;<br style="line-height: normal; " />
            emulator @default -http-proxy 10.16.xx.xx:8080&nbsp;<br style="line-height: normal; " />
            其中default是模拟器的名称&nbsp;<br style="line-height: normal; " />
            <br style="line-height: normal; " />
            四：在模拟器中设置&nbsp;<br style="line-height: normal; " />
            启动模拟器，然后进入 Settings-&gt;Wireless &amp; networks-&gt;Mobile networks-&gt;Access Point Names&nbsp;&nbsp;&nbsp;<br style="line-height: normal; " />
            然后打开出现在列表中的access point;&nbsp;<br style="line-height: normal; " />
            然后下面这样设置：&nbsp;<br style="line-height: normal; " />
            - Proxy : your proxy address&nbsp;&nbsp;&nbsp;<br style="line-height: normal; " />
            - Port : your proxy port&nbsp;<br style="line-height: normal; " />
            - Username : your username if needed, or &lt;Not set&gt;&nbsp;<br style="line-height: normal; " />
            - Password : your password if needed, or &lt;Not set&gt;&nbsp;</p>
            <p style="line-height: normal; "></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</span><span style="font-family: Arial; ">
<br />
</span>
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.blogjava.net/fastzch/aggbug/355771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2011-08-04 14:54 <a href="http://www.blogjava.net/fastzch/archive/2011/08/04/355771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]如何在Windows 平台获得WASv5.x/6.x的 Java HeapDump和JavaCore 诊断文件?</title><link>http://www.blogjava.net/fastzch/archive/2008/09/10/228085.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Wed, 10 Sep 2008 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2008/09/10/228085.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/228085.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2008/09/10/228085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/228085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/228085.html</trackback:ping><description><![CDATA[
		<p>
				<font style="BACKGROUND-COLOR: #ffff00">笔者注：其实在Unix或Linux系统中照样可以。因为这是通过WSADMIN去操作的，所以不分平台。</font>
		</p>
		<p>很不错的文章，不敢独享，特转载来分享给大家<br />原文出处：<a href="http://www.itpub.net/731657.html">http://www.itpub.net/731657.html</a><br /><br />具体步骤如下：<br />1、 设置Windows的环境变量，使WAS JVM在产生javacore的同时产生HeapDump文件（缺省只会产生 javacore)。点击windows桌面－&gt;鼠标右键－属性－进入系统属性对话框－进入高级页面－点击环境变量－在系统变量中－分别加入以下变量名和变量值<br />变量名 变量值<br />IBM_HEAPDUMP true<br />IBM_HEAP_DUMP true<br />IBM_HEAPDUMPDIR c:\<br /><br />2、 注销当前用户，重新登录<br /><br />3、 可以通过手工或windows 服务的方式启动WAS，如果使用手工方式，如下：<br />===For WAS5.x====<br />cd c:\WebSphere\AppServer\bin<br />startServer.bat server1<br />===For WAS6.x====<br />cd c:\WebSphere\AppServer\profiles\default\bin<br />startServer.bat server1<br /><br />4、 WAS启动正常后，在C:\WebSphere\AppServer\bin或C:\WebSphere\AppServer\profiles\default\bin目录中通过以下命令让JVM产生JavaCore和HeapDump文件<br />键入wsadmin.bat命令，进入wsadmin管理命令行，键入如下代码：<br />set jvm [$AdminControl completeObjectName type=JVM,process=server1,*]<br /><br /><font style="BACKGROUND-COLOR: #ff1493">$AdminControl invoke $jvm dumpThreads</font><br /><br />javacore.TIMESTAMP.NUMBER.txt  文件会自动在C:\WebSphere\AppServer或C:\WebSphere\AppServer\default\或您指定的目录中产生。<br /><br /><font style="BACKGROUND-COLOR: #ff1493">$AdminControl invoke $jvm generateHeapDump<br />生成文件类型名为.phd的文件，这个文件就是完整的堆的dump(此命令为我添加的，这个更有用)</font><br /><br />补充：<br />IBM_HEAPDUMP_OUTOFMEMORY true<br />IBM_JAVADUMP_OUTOFMEMORY true<br />WAS在以上两项环境变量的设置下，一旦JVM出现内存申请失败抛出Out of Memory错误时，JVM将会自动产生JavaCore和HeapDump。<br /><br />在生产环境下，谨慎使用此两项环境变量的设置，以防把文件系统撑爆。<br /></p>
<img src ="http://www.blogjava.net/fastzch/aggbug/228085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2008-09-10 10:51 <a href="http://www.blogjava.net/fastzch/archive/2008/09/10/228085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>美女教我们打领带</title><link>http://www.blogjava.net/fastzch/archive/2008/08/26/224886.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Tue, 26 Aug 2008 15:23:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2008/08/26/224886.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/224886.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2008/08/26/224886.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/224886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/224886.html</trackback:ping><description><![CDATA[常常打领带，可这样的打法还是第一次，分享给大家。<br /><object height="342" width="400"><param name="movie" value="http://www.tudou.com/v/hTU3Nd3x5eo" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><embed src="http://www.tudou.com/v/hTU3Nd3x5eo" type="application/x-shockwave-flash" width="400" height="342" allowfullscreen="true" wmode="transparent" allowscriptaccess="always"></embed></object><img src ="http://www.blogjava.net/fastzch/aggbug/224886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2008-08-26 23:23 <a href="http://www.blogjava.net/fastzch/archive/2008/08/26/224886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［收集］追MM与JAVA的23种设计模式</title><link>http://www.blogjava.net/fastzch/archive/2007/10/26/156179.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Fri, 26 Oct 2007 08:25:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2007/10/26/156179.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/156179.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2007/10/26/156179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/156179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/156179.html</trackback:ping><description><![CDATA[
		<p>
				<font style="BACKGROUND-COLOR: #ffffff" color="#008000"> 看完这篇文章，觉得实在太经典了，收藏！</font>
				<br />
				<br />         1、FACTORY?追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory </p>
		<p>　　工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。 </p>
		<p>　　2、BUILDER?MM最爱听的就是“我爱你”这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出“我爱你”这句话了，国外的MM也可以轻松搞掂，这就是我的“我爱你”builder。（这一定比美军在伊拉克用的翻译机好卖） </p>
		<p>　　建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 </p>
		<p>　　3、FACTORY METHOD?请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说“要一个汉堡”，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。 </p>
		<p>　　工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。 </p>
		<p>　　4、PROTOTYPE?跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要） </p>
		<p>　　原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 </p>
		<p>　　5、SINGLETON?俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道“老公”，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事) </p>
		<p>　　单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 </p>
		<p>
				<strong>结构型模式</strong>
				<br />
				<br />　　6、ADAPTER?在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我) </p>
		<p>　　适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。 </p>
		<p>　　7、BRIDGE?早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题，自己用BRIDGE组合一下不就行了 </p>
		<p>　　桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。 </p>
		<p>　　8、COMPOSITE?Mary今天过生日。“我过生日，你要送我一件礼物。”“嗯，好吧，去商店，你自己挑。”“这件T恤挺漂亮，买，这条裙子好看，买，这个包也不错，买。”“喂，买了三件了呀，我只答应送一件礼物的哦。”“什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。”“……”，MM都会用Composite模式了，你会了没有？ </p>
		<p>　　合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 </p>
		<p>　　9、DECORATOR?Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上“最好的的礼物，就是爱你的Fita”，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？ </p>
		<p>　　装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 </p>
		<p>　　10、FACADE?我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。 </p>
		<p>　　门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。 </p>
		<p>　　11、FLYWEIGHT?每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。 </p>
		<p>　　享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。 </p>
		<p>　　12、PROXY?跟MM在网上聊天，一开头总是“hi,你好”,“你从哪儿来呀？”“你多大了？”“身高多少呀？”这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。 </p>
		<p>　　代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。 </p>
		<p>
				<strong>行为模式</strong>
		</p>
		<p>　　13、CHAIN OF RESPONSIBLEITY?晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上“Hi,可以做我的女朋友吗？如果不愿意请向前传”，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑! </p>
		<p>　　责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接 </p>
		<p>　　起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。 </p>
		<p>　　14、COMMAND?俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：“我同时给我姐姐三个男朋友送COMMAND，就数你最小气，才请我吃面。”， </p>
		<p>　　命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，何时被执行以及是怎么被执行的。系统支持命令的撤消。 </p>
		<p>　　15、INTERPRETER?俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只要做一个Interpreter，照着上面的脚本执行就可以了。 </p>
		<p>　　解释器模式：给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象都有一个解释方法，代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。 </p>
		<p>　　16、ITERATOR?我爱上了Mary，不顾一切的向她求婚。 </p>
		<p>　　Mary：“想要我跟你结婚，得答应我的条件” </p>
		<p>　　我：“什么条件我都答应，你说吧” </p>
		<p>　　Mary：“我看上了那个一克拉的钻石” </p>
		<p>　　我：“我买，我买，还有吗？” </p>
		<p>　　Mary：“我看上了湖边的那栋别墅” </p>
		<p>　　我：“我买，我买，还有吗？” </p>
		<p>　　Mary：“我看上那辆法拉利跑车” </p>
		<p>　　我脑袋嗡的一声，坐在椅子上，一咬牙：“我买，我买，还有吗？” </p>
		<p>　　…… </p>
		<p>　　迭代子模式：迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集，聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。 </p>
		<p>　　17、MEDIATOR?四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。 </p>
		<p>　　调停者模式：调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。 </p>
		<p>　　18、MEMENTO?同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。 </p>
		<p>　　备忘录模式：备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。 </p>
		<p>　　19、OBSERVER?想知道咱们公司最新MM情报吗？加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者（观察者）就可以及时收到情报啦 </p>
		<p>　　观察者模式：观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。 </p>
		<p>　　20、STATE?跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的MM就会说“有事情啦”，对你不讨厌但还没喜欢上的MM就会说“好啊，不过可以带上我同事么？”，已经喜欢上你的MM就会说“几点钟？看完电影再去泡吧怎么样？”，当然你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。 </p>
		<p>　　状态模式：状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候，其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。 </p>
		<p>　　21、STRATEGY?跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。 </p>
		<p>　　策略模式：策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供。由于算法和环境独立开来，算法的增减，修改都不会影响到环境和客户端。 </p>
		<p>　　22、TEMPLATE METHOD??看过《如何说服女生上床》这部经典文章吗？女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具体实现)； </p>
		<p>　　模板方法模式：模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻辑的细节留给具体的子类去实现。 </p>
		<p>　　23、VISITOR?情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的特点来挑，我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个人特点选一张卡，这样就轻松多了； </p>
		<p>　　访问者模式：访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中，而不是分散到一个个的节点类中。当使用访问者模式时，要将尽可能多的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类 <br /> <br /></p>
<img src ="http://www.blogjava.net/fastzch/aggbug/156179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2007-10-26 16:25 <a href="http://www.blogjava.net/fastzch/archive/2007/10/26/156179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［收集］项目管理过程组</title><link>http://www.blogjava.net/fastzch/archive/2007/08/30/141433.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Thu, 30 Aug 2007 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2007/08/30/141433.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/141433.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2007/08/30/141433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/141433.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/141433.html</trackback:ping><description><![CDATA[还记得在2006年的PMBOK培训时，每次课都会问一个问题，就是我们讲的那些过程属于哪一个过程组，今天在网上突然看到有作了整理，就收集过来了，分享给大家。<br /><br />出处：<a href="http://blog.csdn.net/iright/archive/2007/06/20/1659338.aspx">http://blog.csdn.net/iright/archive/2007/06/20/1659338.aspx</a><br /><br />无论采用什么方法论和体系，一个项目管理的过程往往涉及了如下这些过程组。把提纲列一下有助于我们检查项目管理的遗漏：
<div></div><div><strong>启动过程组</strong>：</div><div>1制定项目章程</div><div>2制定初步范围说明书</div><div><strong>规划过程组</strong>：</div><div>1制定项目管理计划</div><div>2范围规划</div><div>3范围定义</div><div>4制作工作分解结构</div><div>5活动定义</div><div>6活动排序</div><div>7活动资源估算</div><div>8活动持续时间估算</div><div>9进度表制定</div><div>10费用估算</div><div>11费用预算</div><div>12质量规划</div><div>13人力资源规划</div><div>14沟通规划</div><div>15风险管理规划</div><div>16风险识别</div><div>17定性风险分析</div><div>18定量风险分析</div><div>19风险应对规划</div><div>20采购规划</div><div>21发包规划</div><div><strong>执行过程组</strong></div><div>1指导与管理项目执行</div><div>2实施质量保证</div><div>3项目团队组建</div><div>4项目团队建设</div><div>5信息发布</div><div>6询价</div><div>7卖方选择</div><div><strong>监控过程组</strong></div><div>1监控项目工作</div><div>2整体变更控制</div><div>3范围核实</div><div>4范围控制</div><div>5进度控制</div><div>6费用控制</div><div>7实施质量控制</div><div>8项目团队管理</div><div>9绩效报告</div><div>10利害关系者管理</div><div>11风险控制</div><div>12合同管理</div><div><strong>收尾过程组</strong></div><div>1项目收尾</div><div>2合同收尾</div><img src ="http://www.blogjava.net/fastzch/aggbug/141433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2007-08-30 16:42 <a href="http://www.blogjava.net/fastzch/archive/2007/08/30/141433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［转载］RUP7 之key principles </title><link>http://www.blogjava.net/fastzch/archive/2007/08/30/141429.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Thu, 30 Aug 2007 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2007/08/30/141429.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/141429.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2007/08/30/141429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/141429.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/141429.html</trackback:ping><description><![CDATA[
		<div style="TEXT-INDENT: 11pt">
				<span style="FONT-SIZE: 11pt">   出处：<a href="http://blog.csdn.net/iright/archive/2007/01/09/1478153.aspx">http://blog.csdn.net/iright/archive/2007/01/09/1478153.aspx</a><br /><br />首先让我们来重温一下</span>
				<span style="FONT-SIZE: 11pt">best practices</span>
				<span style="FONT-SIZE: 11pt">；</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Develop Iteratively</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Manage Requirement</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Use Component Architectures</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Model Visually(UML)</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Continuously Verify Quality</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Manage Change</span>
		</div>
		<div style="TEXT-INDENT: 11pt">
				<span style="FONT-SIZE: 11pt">做为</span>
				<span style="FONT-SIZE: 11pt">RUP</span>
				<span style="FONT-SIZE: 11pt">工具和过程的基础，</span>
				<span style="FONT-SIZE: 11pt">best practices</span>
				<span style="FONT-SIZE: 11pt">的影响了业界至少有十年。但是，时过境迁，如今，软件开发已经成为一个关键的业务能力或者说是商业能力。因此也就越发的强调</span>
				<span style="FONT-SIZE: 11pt">business-driven development</span>
				<span style="FONT-SIZE: 11pt">。在这样的背景下，发布不久的</span>
				<span style="FONT-SIZE: 11pt">RUP7.0</span>
				<span style="FONT-SIZE: 11pt">当中对于</span>
				<span style="FONT-SIZE: 11pt">best practices</span>
				<span style="FONT-SIZE: 11pt">进行了重新阐述，代之以</span>
				<span style="FONT-SIZE: 11pt">key principles</span>
				<span style="FONT-SIZE: 11pt">，这样来适应日益发展的系统和软件开发。</span>
		</div>
		<div style="TEXT-INDENT: 11pt">
				<span style="FONT-SIZE: 11pt">那么让我们来看看</span>
				<span style="FONT-SIZE: 11pt">key principles</span>
				<span style="FONT-SIZE: 11pt">都有哪些：</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Adapt The Process</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Balance Competing Stakeholder Priorities</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Collaborate Across Teams</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Demonstrate Value Iteratively</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Elevate Level Of Abstraction</span>
		</div>
		<div style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 11pt">l<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				<span style="FONT-SIZE: 11pt">Focus Continuously On Quality</span>
		</div>
		<div style="TEXT-INDENT: 10.5pt">那么每一项key principles都是什么含意呢？</div>
		<div style="TEXT-INDENT: 10.55pt">
				<strong>Adapt The Process</strong>
				<strong>：</strong>
		</div>
		<div style="TEXT-INDENT: 10.5pt">项目应该有适当的过程，太大的过程和过于简化的过程都是不好的。要根据项目的活动、控制程度、大小、所处于的阶段、团队的分布等等一系列因素来进行过程剪裁以便采用合适的过程。</div>
		<div style="TEXT-INDENT: 10.5pt">过多的过程有的时候并不是好事情，需要因地制宜，因为它意味着更多的文档、要同步更多的模型、更多正式的评审等等；对于一些小型的项目组，成员对技术非常熟悉，人员少而且都坐在一起工作，这时候往往考虑使用轻量化的过程，比如比较流行的敏捷过程。当然随着项目逐步增大，对于过程的纪律性要求也会逐步升高。另外，过程需要被持续的改进，并且还需要根据未知项的级别和多少来平衡计划与估计。</div>
		<div style="TEXT-INDENT: 10.55pt">
				<strong>Balance Competing Stakeholder Priorities</strong>
				<strong>：</strong>
		</div>
		<div style="TEXT-INDENT: 10.5pt">我没有查到这个key principle的本源，不知平衡利益相关方的优先级是否也从咱们中国文化中的平衡哲学中（阴阳）有所借鉴。在项目中我们常常见到的就是业务需要与各个相关方可能发生的冲突，以及客户化的开发与软件资产复用所产生的矛盾。</div>
		<div style="TEXT-INDENT: 10.5pt">另外，还需要不断的更新优先级列表，因为随着对项目理解的深入，这是一个动态的过程。</div>
		<div style="TEXT-INDENT: 10.5pt">因此，要做好这个法则，进行有效的需求管理是基础。真正做好需求分析和管理才可以有效的识别和排列各个需求的优先级，平衡好业务和客户的需求。对于开发来讲就要有一定的技术内功作为基础，具有一定的架构和封装能力，管理好已有的软件资产，并充分了解其商业价值，以便在恰当的时间和地方进行复用，既照顾了客户需求又复用了已有资产降低了成本。</div>
		<div style="TEXT-INDENT: 10.55pt">
				<strong>Collaborate Across Teams</strong>
				<strong>：</strong>
		</div>
		<div style="TEXT-INDENT: 10.5pt">这个法则主要是强调整个项目范围内的沟通、协作，要通过恰当的团队组织以及有效的合作大环境建立而产生协作的土壤。最终形成有战斗力的团队。</div>
		<div style="TEXT-INDENT: 10.5pt">要实现良好的团队协作，需要激发团队成员的斗志，让大家都表现出自己的最佳状态。要建立起一个能够“自管理”的团队，要鼓励团队成员跨职责的协作；当然，要有一个有效的协作环境作为基础（比如工具平台、通讯平台、组织氛围），通过对工件和任务进行管理来加强协作、过程和质量。另外，不要忘记根本，项目是需要盈利的，这就需要将商业团队、软件团队、和执行团队进行有机的集成。</div>
		<div style="TEXT-INDENT: 10.55pt">
				<strong>Demonstrate Value Iteratively</strong>
				<strong>：</strong>
		</div>
		<div style="TEXT-INDENT: 10.5pt">迭代仍然是一个关键问题，软件开发需要采用迭代的过程来更好的适应变更、得到反馈、加入新的条件、更早的降低风险并动态的调整所采用的软件过程。</div>
		<div style="TEXT-INDENT: 10.5pt">迭代是一个老生常谈的问题，关键的不是形式而是内容，好的迭代需要明确进入和结束准则，应该增量的实现用户价值，并实时的收集反馈，根据项目各方的动态状况作出调整。那种仅仅将项目从形式上划分成几个阶段或者release的方式其实只是加入了检查点（checkpoint），并不是真正意义上的迭代。</div>
		<div style="TEXT-INDENT: 10.55pt">
				<strong>Elevate Level Of Abstraction</strong>
				<strong>：</strong>
		</div>
		<div style="TEXT-INDENT: 10.5pt">提升抽象层次。如果说是技术的发展使我们提升了抽象层次，到不如说是复杂度的增加迫使我们不得不发展技术来提升抽象层次，以便解决复杂的开发设计问题。现在软件项目的复杂度越来越要求我们在早期能够形成一个稳定的架构，以之成为应对变更、复用、甚至是减少文档化工作的基础。一个好的架构必须是有弹性的、高质量的、易懂的、并且是复杂度可控的。另外一点就是一个架构应该在早期进行测试，而不是在实现后才去验证。</div>
		<div style="TEXT-INDENT: 10.5pt">我们可以回首看看中间件、SOA等的发展，无不是在抽象层次上做了大量文章。对了，还有大家广泛使用的UML，例子举不胜举。</div>
		<div style="TEXT-INDENT: 10.55pt">
				<strong>Focus Continuously On Quality</strong>
				<strong>：</strong>
		</div>
		<div style="TEXT-INDENT: 10.5pt">这一条非常像best practices里面的Continuously Verify Quality。作为迭代的软件过程来说，它可以提供更多的机会来度量和验证。</div>
		<div style="TEXT-INDENT: 10.5pt">质量的保证是需要从两个方面努力，一个是过程质量，这就需要建立一个良好的，适用的过程；另一个是软件过程产物质量，这就需要尽早的持续的进行集成和测试。</div>
<img src ="http://www.blogjava.net/fastzch/aggbug/141429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2007-08-30 16:36 <a href="http://www.blogjava.net/fastzch/archive/2007/08/30/141429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收集]web.xml的细节</title><link>http://www.blogjava.net/fastzch/archive/2007/08/28/140607.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Tue, 28 Aug 2007 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2007/08/28/140607.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/140607.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2007/08/28/140607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/140607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/140607.html</trackback:ping><description><![CDATA[
		<p>web.xml的元素 <br />首先注意 xml是大小写敏感的</p>
		<p>1、 web.xml的头和根元素<br />必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。 <br />DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本（如2.2或2.3）并指定管理此文件其余部分内容的语法的DTD(Document Type Definition，文档类型定义)。 <br />所有部署描述符文件的顶层（根）元素为web-app。<br />例（红色部分是可选项）：<br />--------------------------------------------------------------------------------------------------------------------------<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />   &lt;web-app id="WebApp"&gt;<br />   &lt;/web-app&gt;<br />--------------------------------------------------------------------------------------------------------------------------<br /> 2、元素 <br />以下元素几乎都是可选项，不过要注意它们是有顺序的。虽然有些服务器要求宽松些，但某些服务器会拒绝执行顺序不正确的web应用。所以还是按顺序写好</p>
		<p>--------------------------------------------------------------------------------------------------------------------------<br />· icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。 <br />· display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。 <br />· description description元素给出与此有关的说明性文本。 <br />· context-param context-param元素声明应用范围内的初始化参数。 <br />· filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。 <br />· filter-mapping 一旦命名了一个过滤器，就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。 <br />· listener servlet API的版本2.3增加了对事件监听程序的支持，事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。 <br />· servlet 在向servlet或JSP页面制定初始化参数或定制URL时，必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。 <br />· servlet-mapping服务器一般为servlet提供一个缺省的URL：<a href="http://host/webAppPrefix/servlet/ServletName">http://host/webAppPrefix/servlet/ServletName</a>。但是，常常会更改这个URL，以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时，使用servlet-mapping元素。<br />·session-config如果某个会话在一定时间内未被访问，服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值，或者可利用session-config元素制定缺省超时值。 <br />· mime-mapping 如果Web应用具有想到特殊的文件，希望能保证给他们分配特定的MIME类型，则mime-mapping元素提供这种保证。 <br />· welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时，使用哪个文件。 <br />· error-page error-page元素使得在返回特定HTTP状态代码时，或者特定类型的异常被抛出时，能够制定将要显示的页面。 <br />· taglib taglib元素对标记库描述符文件（Tag Libraryu Descriptor file）指定别名。此功能使你能够更改TLD文件的位置，而不用编辑使用这些文件的JSP页面。 <br />· resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象。 <br />· resource-ref resource-ref元素声明一个资源工厂使用的外部资源。 <br />· security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用 <br />· login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。 <br />· security-role security-role元素给出安全角色的一个列表，这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。 <br />· env-entry env-entry元素声明Web应用的环境项。 <br />· ejb-ref ejb-ref元素声明一个EJB的主目录的引用。 <br />· ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目录的应用。 </p>
<img src ="http://www.blogjava.net/fastzch/aggbug/140607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2007-08-28 18:00 <a href="http://www.blogjava.net/fastzch/archive/2007/08/28/140607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[轉載]在IHS上配置SSL</title><link>http://www.blogjava.net/fastzch/archive/2007/08/03/134292.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Fri, 03 Aug 2007 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2007/08/03/134292.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/134292.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2007/08/03/134292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/134292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/134292.html</trackback:ping><description><![CDATA[
		<div>在網上看到兩篇不錯的手記,覺得有用,轉來,有需要的朋友們可以享用.<br /><br />在IHS上配置SSL<br />原文地址: <a href="http://cdalong.spaces.live.com/blog/cns!127ab823c1bd7f1f!168.entry">http://cdalong.spaces.live.com/blog/cns!127ab823c1bd7f1f!168.entry</a><br /><br />之前一直都没做过这方面的配置，但是觉得说不定什么时候用得着，就问了配过的同事，自己也在网上找了些资料了解了大概的过程。但是大部分都没有写明是在IHS的哪个版本上作的，于是想试试在IHS61上面是不是也是同样的做法。参考的资料包括：<br />1.IHS User's Guide中的Chapter 5中的securing communications<br />2.WebSphere Application Server V6.1 Security Handbook(sg246316).pdf中的7.2和7.3<br />其中7.2介绍了Browser和IHS的SSL配置，也是我试验的内容；7.3讲的是IHS plugin和WAS的SSL配置。<br />3.WebSphere Security Fundamentals(redp3944).pdf<br />笔记本上本来就有一个WAS61的环境，于是装上IHS和plugin开始试验。可能是太久没有用IHS了，都忘记了怎样将IHS加到DM的console中进行管理。一开始以为就是把webserver的定义建起来就可以了，一启动就产生了一个FFDC，打开一看说是没找到webserver1的定义，详细信息如下：<br />------Start of DE processing------ = [07-1-26 15:48:29:228 CST] , key = javax.management.MBeanException com.ibm.ws.management.AdminServiceImpl.invoke 679<br />Exception = javax.management.MBeanException<br />Source = com.ibm.ws.management.AdminServiceImpl.invoke<br />probeid = 679<br />Stack Dump = javax.management.MBeanException: Exception thrown in RequiredModelMBean while trying to invoke operation launchProcess<br /> at javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1116)<br /> 。。。<br />Caused by: com.ibm.websphere.management.exception.AdminException: Server, webserver1, not found.<br /> 。。。<br />突然记起以前做的时候好像是要运行一个IHS安装过程中自己生成的脚本的，试试看。在PLUGIN_HOME\bin找到configurewebserver1.bat拷贝至DM_PROFILE\bin直接执行，webserver1的启动停止都OK了。<br />接下来开始在本次试验的主要工作：<br />1、使用ikeyman生成CMS key database file，虽然好像除了CMS外还有其他的类型但是好像看到某本redbook上说了IHS只能使用CMS的。创建了mykey.kdb后再给运行IHS的机器发一个证书，直接在ikeyman中新建自签署证书就可以了，创建的证书会出现在个人证书列表中，最后不要忘了转储密码（Stash the password to a file）.<br />ihs_610.pdf中描述如下：<br />Create a new key database as follows:<br />1. Start the IKEYMAN user interface. Refer to Starting the Key Management utility for platform-specific instructions. <br />2. Click key database file from the main user interface, then click New. Select CMS for the Key database type. IBM HTTP Server does not support database types other than CMS. <br />3. Enter your password in the Password Prompt dialog box, and confirm the password. Select Stash the password to a file. Click OK. The new key database should display in the IKEYMAN utility with default signer certificates. Ensure that there is a functional, non-expiring signer certificate for each of your personal certificates.</div>
		<div>Creating a self-signed certificate <br />It usually takes two to three weeks to get a certificate from a well known certificate authority (CA). While waiting for a certificate to be issued, use IKEYMAN to create a self-signed server certificate to enable SSL sessions between clients and the server. Use this procedure if you act as your own CA for a private Web network. Complete the following steps to create a self-signed certificate: <br />1. If you have not created the key database, see Creating a new key database for instructions. <br />2. Start the IKEYMAN user interface. <br />3. Click Key Database File from the main UI, and then click Open. <br />4. Enter your key database name in the Open dialog box, or click the key.kdb file, if you use the default. Click OK. <br />5. In the Password Prompt dialog box, enter your correct password and click OK. <br />6. Click Personal Certificates in the Key Database content frame, and click the New Self-Signed radio button. <br />7. Enter the following information in the Password Prompt dialog box: v Key label: Enter a descriptive comment to identify the key and certificate in the database. <br />v Key size: Choose your level of encryptions from the drop-down menu. <br />v Common Name: Enter the fully qualified host name of the Web server as the common name. Example: <a href="http://www.myserver.com/"><font color="#ffffff">www.myserver.com</font></a>. <br />v Organization Name: Enter your organization name. <br />v Optional: Organization Unit v Optional: Locality <br />v Optional: State/Province <br />v Optional: Zip code <br />v Country: Enter a country code. Specify at least two characters. Example: US Certificate request file name, or use the default name. <br />v Validity Period<br />8. Click OK.<br />其实在生产环境中应该是创建完key database后将CA发的证书（如*.cer）导入，自己做试验的话自签一个就可以了，并不影响配置和实现。<br />2、修改http.conf。<br />以下是我在http.conf中增加的：<br /># SSL config<br />LoadModule ibm_ssl_module modules/mod_ibm_ssl.so<br />&lt;IfModule mod_ibm_ssl.c&gt;<br /> Listen 443<br /> &lt;VirtualHost *:443&gt;<br />  SSLEnable<br /> &lt;/VirtualHost&gt;<br />&lt;/IfModule&gt;<br />SSLDisable<br />KeyFile "C:/IBM/HTTPServer/bin/mykey.kdb"<br />一开始看到IBM中国的论坛上说NT环境的话load一个XXX.dll，但是打开IHS_HOME\modules看到了一大堆的so，而且原来的http.conf中也load了不少so，找redbook上写的应该没错。改完保存重新启动IHS，一切OK。<br />下面开始验证，就拿snoop来试一试吧。打开<a href="http://...:9080/snoop"><font color="#ffffff">http://...:9080/snoop</font></a>，显示正常。试试<a href="http://.../snoop"><font color="#ffffff">http://.../snoop</font></a>，等了半天没出来。troubleshooting的时间到了，很明显request没有被plugin转发给WAS，重新生成插件看看。在DM console中找到“环境--更新全局 Web 服务器插件配置”，更新完之后原来http.conf中的WebSpherePluginConfig指向的文件并没有更新，难道是插件位置不对？修改为DM_HOME\config\cells\plugin-cfg.xml，这回IHS读到新的插件了，但是老觉得“更新全局 Web 服务器插件配置”中的全局好像大对劲。搞了半天没找对地方，更新webserver1的插件应该是在“服务器--Web服务器”中的这回应该没错了，再试还是老样子。突然想起来之前做过的另一个试验给server1加上了80侦听，动手把IHS改成81。修改了Listen 0.0.0.0:81和ServerName szd610-286.boshi.com.cn:81两行。奇怪的是原来IHS占着80，server1启动时也不会报错。重起webserver1和server1后80和81都正常启动了，http://...:81/snoop和http://.../snoop访问正常，访问https://.../snoop出来两个安全警报，确定后终于看到了snoop。<br /><br /><br /></div>
		<p>IHS虚拟主机SSL配置 <br />原文地址: <a href="http://blog.csdn.net/panda0083/archive/2007/06/06/1640890.aspx">http://blog.csdn.net/panda0083/archive/2007/06/06/1640890.aspx</a></p>
		<p>由于websphere 的经典模式是将静态页面，图片与动态页面 分离，所以经常会遇到虚拟主机配置的问题。</p>
		<p>常规的虚拟主机配置与apache的虚拟主机配置一样只需配置virual host标签，但是如果遇到两个虚拟主机都需要SSL通讯该如何配置呢？</p>
		<p>下面给出配置方案</p>
		<p>其实没有大家想得那么复杂，只需要针对每个虚拟主机对应得域名配置一个443的虚拟主机即可。</p>
		<p>1，用ikeyman生成密钥</p>
		<p>2，在httpd.conf中加入</p>
		<p>NameVirtualHost 10.4.33.1:80<br /> &lt;VirtualHost 10.4.33.1:80&gt;<br />    DocumentRoot path1   <br />    ServerName domain1.cn<br /> &lt;/VirtualHost&gt;<br />&lt;VirtualHost 10.4.33.51:80&gt;<br />    DocumentRoot  path2</p>
		<p>    ServerName domain2.cn<br />    &lt;/VirtualHost&gt;</p>
		<p>&lt;IfModule mod_ibm_ssl.c&gt;<br /> Listen 443<br /> NameVirtualHost 10.4.33.51:443<br /> &lt;VirtualHost 10.4.33.51:443&gt;<br /> DocumentRoot path1<br />  ServerName domain1.cn<br /> SSLEnable<br /> &lt;/VirtualHost&gt;<br /> &lt;VirtualHost 10.4.33.51:443&gt;<br /> DocumentRoot path2<br />  ServerName domain2.cn<br /> SSLEnable<br /> &lt;/VirtualHost&gt;</p>
		<p> &lt;/IfModule&gt;<br /> SSLDisable<br /> KeyFile "/opt/IBMIHS/bin/key.kdb"</p>
<img src ="http://www.blogjava.net/fastzch/aggbug/134292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2007-08-03 17:38 <a href="http://www.blogjava.net/fastzch/archive/2007/08/03/134292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[轉載]session详解</title><link>http://www.blogjava.net/fastzch/archive/2007/01/16/94308.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Tue, 16 Jan 2007 13:44:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2007/01/16/94308.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/94308.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2007/01/16/94308.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/94308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/94308.html</trackback:ping><description><![CDATA[
		<p class="TextColor1" id="subjcns!38BC563D902DC3A1!125" style="MARGIN-BOTTOM: 0px">
				<font style="BACKGROUND-COLOR: #ffffff" color="#ffa500" size="2">
						<em>這篇文章對Session的講解可以說是十分到位，相信看過的人肯定會受益匪淺，轉來與大家共享。</em>
				</font>
		</p>
		<p class="TextColor1" style="MARGIN-BOTTOM: 0px"> </p>
		<div id="msgcns!38BC563D902DC3A1!125">
				<div>
						<strong>一、术语session<br /><br />　</strong>在我的经验里，session这个词被滥用的程度大概仅次于transaction，更加有趣的是transaction与session在某些语境下的含义是相同的。 
<p>    session，中文经常翻译为会话，其本来的含义是指有始有终的一系列动作/消息，比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session.有时候我们可以看到这样的话“在一个浏览器会话期间，……”，这里的会话一词用的就是其本义，是指从一个浏览器窗口打开到关闭这个期间 ①。最混乱的是“用户（客户端）在一次会话期间”这样一句话，它可能指用户的一系列动作（一般情况下是同某个具体目的相关的一系列动作，比如从登录到选购商品到结账登出这样一个网上购物的过程，有时候也被称为一个transaction），然而有时候也可能仅仅是指一次连接，也有可能是指含义①，其中的差别只能靠上下文来推断②。</p><p>    然而当session一词与网络协议相关联时，它又往往隐含了“面向连接”和/或“保持状态”这样两个含义， “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道，比如打电话，直到对方接了电话通信才能开始，与此相对的是写信，在你把信发出去的时候你并不能确认对方的地址是否正确，通信渠道不一定能建立，但对发信人来说，通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来，使得消息之间可以互相依赖，比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者 “一个POP3 session”③。</p><p>    而到了web服务器蓬勃发展的时代，session在web开发语境下的语义又有了新的扩展，它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构，如“把xxx保存在session 里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持，所以在某种特定语言的语境下，session也被用来指代该语言的解决方案，比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。</p><p>    鉴于这种混乱已不可改变，本文中session一词的运用也会根据上下文有不同的含义，请大家注意分辨。</p><p>    在本文中，使用中文“浏览器会话期间”来表达含义①，使用“session机制”来表达含义④，使用“session”表达含义⑤，使用具体的“HttpSession”来表达含义⑥</p><p>    <strong>二、HTTP协议与状态<br /><br />　</strong>保持HTTP 协议本身是无状态的，这与HTTP协议本来的目的是相符的，客户端只需要简单的向服务器请求下载某些文件，无论是客户端还是服务器都没有必要纪录彼此过去的行为，每一次请求之间都是独立的，好比一个顾客和一个自动售货机或者一个普通的（非会员制）大卖场之间的关系一样。</p><p>    然而聪明（或者贪心？）的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用，就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为，另一方面在服务器端则出现了CGI规范以响应客户端的动态请求，作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。</p><p>    让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠，然而一次性消费5杯咖啡的机会微乎其微，这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案：1、该店的店员很厉害，能记住每位顾客的消费数量，只要顾客一走进咖啡店，店员就知道该怎么对待了。这种做法就是协议本身支持状态。</p><p>    2、发给顾客一张卡片，上面记录着消费的数量，一般还有个有效期限。每次消费时，如果顾客出示这张卡片，则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。</p><p>    3、发给顾客一张会员卡，除了卡号之外什么信息也不纪录，每次消费时，如果顾客出示该卡片，则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。</p><p>    由于HTTP协议是无状态的，而出于种种考虑也不希望使之成为有状态的，因此，后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案，而session机制采用的是在服务器端保持状态的方案。同时我们也看到，由于采用服务器端保持状态的方案在客户端也需要保存一个标识，所以session机制可能需要借助于cookie机制来达到保存标识的目的，但实际上它还有其他选择。</p><p>    <strong>三、理解cookie机制<br /><br />　</strong>cookie机制的基本原理就如上面的例子一样简单，但是还有几个问题需要解决：“会员卡”如何分发：“会员卡”的内容；以及客户如何使用“会员卡”。</p><p>    正统的cookie分发是通过扩展HTTP协议来实现的，服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie.然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie.</p><p>    而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie，如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置，则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示，如果某家分店还发行了自己的会员卡，那么进这家店的时候除了要出示麦当劳的会员卡，还要出示这家店的会员卡。</p><p>    cookie的内容主要包括：名字，值，过期时间，路径和域。</p><p>    其中域可以指定某一个域比如。google.com，相当于总店招牌，比如宝洁公司，也可以指定一个域下的具体某台机器比如<a href="http://www.google.com/"><u><font color="#0000ff">www.google.com</font></u></a>或者froogle.google.com，可以用飘柔来做比。</p><p>    路径就是跟在域名后面的URL路径，比如/或者/foo等等，可以用某飘柔专柜做比。</p><p>    路径与域合在一起就构成了cookie的作用范围。</p><p>    如果不设置过期时间，则表示这个cookie的生命期为浏览器会话期间，只要关闭浏览器窗口，cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie.会话cookie一般不存储在硬盘上而是保存在内存里，当然这种行为并不是规范规定的。如果设置了过期时间，浏览器就会把cookie保存到硬盘上，关闭后再次打开浏览器，这些cookie仍然有效直到超过设定的过期时间。</p><p>    存储在硬盘上的cookie 可以在不同的浏览器进程间共享，比如两个IE窗口。而对于保存在内存里的cookie，不同的浏览器有不同的处理方式。对于IE，在一个打开的窗口上按 Ctrl-N（或者从文件菜单）打开的窗口可以与原窗口共享，而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie；对于 Mozilla Firefox0.8，所有的进程和标签页都可以共享同样的cookie.一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie.浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。</p><p>    下面就是一个goolge设置cookie的响应头的例子HTTP/1.1 302 FoundLocation： <a href="http://www.google.com/intl/zh-CN/Set-Cookie"><u><font color="#0000ff">http://www.google.com/intl/zh-CN/Set-Cookie</font></u></a>： PREF=ID=0565f77e132de138：NW=1：TM=1098082649：LM=1098082649：S=KaeaCFPo49RiA_d8； expires=Sun， 17-Jan-2038 19：14：07 GMT； path=/； domain=.google.comContent-Type： text/html</p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125320274.jpg" border="0" /></p><p>    这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分</p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125320533.jpg" border="0" /></p><p>    浏览器在再次访问goolge的资源时自动向外发送cookie</p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125322468.jpg" border="0" /></p><p>    用Firefox可以很容易的观察现有的cookie的值使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。</p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125322207.jpg" border="0" /></p><p>    IE也可以设置在接受cookie前询问</p><p>   <strong> 四、理解session机制</strong></p><p>    session机制是一种服务器端的机制，服务器使用一种类似于散列表的结构（也可能就是使用散列表）来保存信息。</p><p>    当程序需要为某个客户端的请求创建一个session的时候，服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id，如果已包含一个session id则说明以前已经为此客户端创建过session，服务器就按照session id把这个 session检索出来使用（如果检索不到，可能会新建一个），如果客户端请求不包含session id，则为此客户端创建一个session并且生成一个与此session相关联的session id，session id的值应该是一个既不会重复，又不容易被找到规律以仿造的字符串，这个 session id将被在本次响应中返回给客户端保存。</p><p>    保存这个session id的方式可以采用cookie，这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID，而。比如weblogic对于web应用程序生成的cookie，JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng！-145788764，它的名字就是 JSESSIONID.</p><p>    由于cookie可以被人为的禁止，必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写，就是把session id直接附加在URL路径的后面，附加方式也有两种，一种是作为URL路径的附加信息，表现形式为<a href="http://……/xxx"><u><font color="#0000ff">http://……/xxx</font></u></a>；jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng！-145788764另一种是作为查询字符串附加在URL后面，表现形式为<a href="http://……/xxx"><u><font color="#0000ff">http://……/xxx</font></u></a>？jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng！-145788764这两种方式对于用户来说是没有区别的，只是服务器在解析的时候处理的方式不同，采用第一种方式也有利于把session id的信息和正常程序参数区分开来。</p><p>    为了在整个交互过程中始终保持状态，就必须在每个客户端可能请求的路径后面都包含这个session id.</p><p>    另一种技术叫做表单隐藏字段。就是服务器会自动修改表单，添加一个隐藏字段，以便在表单提交时能够把session id传递回服务器。比如下面的表单&lt;form name="testform" action="/xxx"&gt;&lt;input type="text"&gt;&lt;/form&gt;</p><p>    在被传递给客户端之前将被改写成&lt;form name="testform" action="/xxx"&gt;&lt;input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng！-145788764"&gt;&lt;input type="text"&gt;&lt;/form&gt;</p><p>    这种技术现在已较少应用，笔者接触过的很古老的iPlanet6（SunONE应用服务器的前身）就使用了这种技术。</p><p>    实际上这种技术可以简单的用对action应用URL重写来代替。</p><p>    在谈论session机制的时候，常常听到这样一种误解“只要关闭浏览器，session就消失了”。其实可以想象一下会员卡的例子，除非顾客主动对店家提出销卡，否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的，除非程序通知服务器删除一个session，否则服务器会一直保留，程序一般都是在用户做log off的时候发个指令去删除session.然而浏览器从来不会主动在关闭之前通知服务器它将要关闭，因此服务器根本不会有机会知道浏览器已经关闭，之所以会有这种错觉，是大部分session机制都使用会话cookie来保存session id，而关闭浏览器后这个 session id就消失了，再次连接服务器时也就无法找到原来的session.如果服务器设置的cookie被保存到硬盘上，或者使用某种手段改写浏览器发出的HTTP请求头，把原来的session id发送给服务器，则再次打开浏览器仍然能够找到原来的session.</p><p>    恰恰是由于关闭浏览器不会导致session被删除，迫使服务器为seesion设置了一个失效时间，当距离客户端上一次使用session的时间超过这个失效时间时，服务器就可以认为客户端已经停止了活动，才会把session删除以节省存储空间。</p><p>    <strong>五、理解javax.servlet.http.HttpSession<br /><br />　</strong> HttpSession是Java平台对session机制的实现规范，因为它仅仅是个接口，具体到每个web应用服务器的提供商，除了对规范支持之外，仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作为例子来演示。</p><p>    首先，Weblogic Server提供了一系列的参数来控制它的HttpSession的实现，包括使用cookie的开关选项，使用URL重写的开关选项，session持久化的设置，session失效时间的设置，以及针对cookie的各种设置，比如设置cookie的名字、路径、域， cookie的生存时间等。</p><p>    一般情况下，session都是存储在内存里，当服务器进程被停止或者重启的时候，内存里的session也会被清空，如果设置了session的持久化特性，服务器就会把session保存到硬盘上，当服务器进程重新启动或这些信息将能够被再次使用， Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。</p><p>    复制严格说来不算持久化保存，因为session实际上还是保存在内存里，不过同样的信息被复制到各个cluster内的服务器进程中，这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session.</p><p>    cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie.默认是使用会话cookie.有兴趣的可以用它来试验我们在第四节里提到的那个误解。</p><p>    cookie的路径对于web应用程序来说是一个非常重要的选项，Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。</p><p>    关于session的设置参考[5] <a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869"><u><font color="#0000ff">http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869</font></u></a></p><p>   <strong> 六、HttpSession常见问题</strong>（在本小节中session的含义为⑤和⑥的混合）</p><p>    1、session在何时被创建一个常见的误解是以为session在有客户端访问时就被创建，然而事实是直到某server端程序调用 HttpServletRequest.getSession（true）这样的语句时才被创建，注意如果JSP没有显示的使用 &lt;% @page session="false"%&gt; 关闭session，则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession（true）；这也是JSP中隐含的 session对象的来历。</p><p>    由于session会消耗内存资源，因此，如果不打算使用session，应该在所有的JSP中关闭它。</p><p>    2、session何时被删除综合前面的讨论，session在下列情况下被删除a.程序调用HttpSession.invalidate（）；或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置；或c.服务器进程被停止（非持久session）</p><p>    3、如何做到在浏览器关闭时删除session严格的讲，做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作，然后向服务器发送一个请求来删除session.但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。</p><p>    4、有个HttpSessionListener是怎么回事你可以创建这样的listener去监控session的创建和销毁事件，使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener，而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener，HttpSessionActivationListener和 HttpSessionAttributeListener.</p><p>    5、存放在session中的对象必须是可序列化的吗不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象，在session销毁时会有一个Exception，很奇怪。</p><p>    6、如何才能正确的应付客户端禁止cookie的可能性对所有的URL使用URL重写，包括超链接，form的action，和重定向的URL，具体做法参见[6] <a href="http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770"><u><font color="#0000ff">http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770</font></u></a></p><p>    7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session参见第三小节对cookie的讨论，对session来说是只认id不认人，因此不同的浏览器，不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。</p><p>    8、如何防止用户打开两个浏览器窗口操作导致的session混乱这个问题与防止表单多次提交是类似的，可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端，同时保存在session里，客户端提交表单时必须把这个id也返回服务器，程序首先比较返回的id与保存在session里的值是否一致，如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口，一般不设置这个id，或者使用单独的id，以防主窗口无法操作，建议不要再window.open打开的窗口里做修改操作，这样就可以不用设置。</p><p>    9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变，需要向其他服务器进程复制新的session值。</p><p>    10、为什么session不见了排除session正常失效的因素之外，服务器本身的可能性应该是微乎其微的，虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过；浏览器插件的可能性次之，笔者也遇到过3721插件造成的问题；理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。</p><p>    出现这一问题的大部分原因都是程序的错误，最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。</p><p> <strong>   七、跨应用程序的session共享</strong></p><p>    常常有这样的情况，一个大项目被分割成若干小项目开发，为了能够互不干扰，要求每个小项目作为一个单独的web应用程序开发，可是到了最后突然发现某几个小项目之间需要共享一些信息，或者想使用session来实现SSO（single sign on），在session中保存login的用户信息，最自然的要求是应用程序间能够访问彼此的session.</p><p>    然而按照Servlet规范，session的作用范围应该仅仅限于当前应用程序下，不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范，但是实现的细节却可能各有不同，因此解决跨应用程序session共享的方法也各不相同。</p><p>    首先来看一下Tomcat是如何实现web应用程序之间session的隔离的，从 Tomcat设置的cookie路径来看，它对不同的应用程序设置的cookie路径是不同的，这样不同的应用程序所用的session id是不同的，因此即使在同一个浏览器窗口里访问不同的应用程序，发送给服务器的session id也可以是不同的。</p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125323841.jpg" border="0" /></p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125323233.jpg" border="0" /></p><p>    根据这个特性，我们可以推测Tomcat中session的内存结构大致如下。</p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125323802.jpg" border="0" /></p><p>    笔者以前用过的iPlanet也采用的是同样的方式，估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器，解决的思路很简单，实际实行起来也不难。要么让所有的应用程序共享一个session id，要么让应用程序能够获得其他应用程序的session id.</p><p>    iPlanet中有一种很简单的方法来实现共享一个session id，那就是把各个应用程序的cookie路径都设为/（实际上应该是/NASApp，对于应用程序来讲它的作用相当于根）。</p><p>    &lt;session-info&gt;&lt;path&gt;/NASApp&lt;/path&gt;&lt;/session-info&gt;</p><p>    需要注意的是，操作共享的session应该遵循一些编程约定，比如在session attribute名字的前面加上应用程序的前缀，使得 setAttribute（"name"， "neo"）变成setAttribute（"app1.name"， "neo"），以防止命名空间冲突，导致互相覆盖。</p><p>    在Tomcat中则没有这么方便的选择。在Tomcat版本3上，我们还可以有一些手段来共享session.对于版本4以上的Tomcat，目前笔者尚未发现简单的办法。只能借助于第三方的力量，比如使用文件、数据库、JMS或者客户端cookie，URL参数或者隐藏字段等手段。</p><p>    我们再看一下Weblogic Server是如何处理session的。</p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125323420.jpg" border="0" /></p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125324813.jpg" border="0" /></p><p>    从截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/，这是不是意味着在Weblogic Server中默认的就可以共享session了呢？然而一个小实验即可证明即使不同的应用程序使用的是同一个session，各个应用程序仍然只能访问自己所设置的那些属性。这说明Weblogic Server中的session的内存结构可能如下</p><p align="center"><img style="DISPLAY: inline" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200603/20060314125324805.jpg" border="0" /></p><p>    对于这样一种结构，在 session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量，比如使用文件、数据库、JMS或者客户端 cookie，URL参数或者隐藏字段等手段，还有一种较为方便的做法，就是把一个应用程序的session放到ServletContext中，这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下，</p><p>    应用程序A context.setAttribute（"appA"， session）；</p><p>    应用程序B contextA = context.getContext（"/appA"）；HttpSession sessionA = （HttpSession）contextA.getAttribute（"appA"）；</p><p>    值得注意的是这种用法不可移植，因为根据ServletContext的JavaDoc，应用服务器可以处于安全的原因对于context.getContext（"/appA"）；返回空值，以上做法在Weblogic Server 8.1中通过。</p><p>    那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢？原来是为了SSO，凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点，修改首先登录的那个应用程序的描述符weblogic.xml，把cookie路径修改为/appA 访问另外一个应用程序会重新要求登录，即使是反过来，先访问cookie路径为/的应用程序，再访问修改过路径的这个，虽然不再提示登录，但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM，因为浏览器和web服务器对basic认证方式有其他的处理方式，第二次请求的认证不是通过 session来实现的。具体请参看[7] secion 14.8 Authorization，你可以修改所附的示例程序来做这些试验。</p><p>    <strong>八、总结<br /><br />　</strong>session机制本身并不复杂，然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器，服务器的经验当作普遍适用的经验，而是始终需要具体情况具体分析。</p><p>    摘要：虽然session机制在web应用程序中被采用已经很长时间了，但是仍然有很多人不清楚session机制的本质，以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。</p></div>
		</div>
<img src ="http://www.blogjava.net/fastzch/aggbug/94308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2007-01-16 21:44 <a href="http://www.blogjava.net/fastzch/archive/2007/01/16/94308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[轉載]Eclipse 3.0 RC2 热键表 (中英对照解说版，Default)</title><link>http://www.blogjava.net/fastzch/archive/2006/12/04/85430.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Mon, 04 Dec 2006 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2006/12/04/85430.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/85430.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2006/12/04/85430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/85430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/85430.html</trackback:ping><description><![CDATA[◎阅读说明：冒号 ( : )后的<font color="#0000ff">蓝色标注</font>热键为Eclipse预设的标准热键，空<br />白即表示Eclipse并未对该项目设热键；<font color="#ff0000">红色标注</font>选项表示常用或重要热<br />键；<font color="#008080">teal色标注选项</font>表示可以启动该热键的范围。<br />◎热键修改处：<br />Window-&gt;Preference-&gt;Workbench-&gt;Keys<br />◎FAQ，如果没设热键的功能要如何启动？<br />方法一.自己增设热键。<br />方法二.热键设定里的选项，其实菜单大部分都有，可以由菜单中直接点选。<br />◎给所有在看这篇文章的朋友：<br />T55555为了JavaWorld周年庆把DG2拿出来了，为了效法他的精神，所以我决定把<br />我的第一次也贡献出来，加入JavaWorld这半年来我第一次打这么长的文章...XD<br />。本来打算3.0 Release出来后再整理热键表，但3.0 RC系列架构已经趋于平稳，<br />Release出来也不会有多大的变动，所以就先整理了。热键表所列的功能，只要您<br />全部实际操作过一遍，将会为您在操作Eclipse上，带来莫大的帮助。<br /><br />-------------------------------------------------------------------------------------------------------------<br /><br /><b>Compare - 比较</b>Copy All from Left to Right (由左向右复制全部)<br />Copy All from Right to Left (由右向左复制全部)<br />Copy from Left to Right (由左向右复制)<br />Copy from Right to Left (由右向左复制)<br />Select Next Change (选取下一个变更)<br />Select Previous Change (选取上一个变更)<br /><br /><b>CVS - Concurrent Versions System (版本控制系统)</b><br />Checkout from CVS (由CVS检查)<br /><br /><b>Edit - 编辑</b>Add Bookmark (新增书签)<br />Add Task (新增作业)<br /><font color="#ff0000">Collapse (程序代码折迭) </font>： <font color="#0000ff">Ctrl+键盘右方数字区的'-' </font><font color="#008080"><editing text="" /></font><br /><font color="#ff0000">Content Assist (内容辅助 - Code Templetes启动)：</font><font color="#0000ff">Alt+/ 或 Ctrl+Space </font><font color="#008000"><in windows="" and="" dialogs="" /></font><br />Context Information (内容信息) ： <font color="#0000ff">Alt+？ 或 ALT+Shift+？或 Ctrl+Shift+Space </font><font color="#008080"><in windows="" /></font><br />Copy (复制选取文字到OS剪贴簿) ：<font color="#0000ff"> Ctrl+C</font><font color="#008080"><in windows="" and="" dialogs="" /></font><br />Custom Encoding (自订编码)<br />Cut (剪下选取文字并加至OS剪贴簿) ： <font color="#0000ff">Ctrl+X</font><font color="#008080"><in windows="" and="" dialogs="" /></font><br />Default Encoding (使用预设编码)<br />Delete (删除选取的文字) ：<font color="#0000ff"> Delete </font><font color="#008080"><in windows="" /></font><br /><font color="#ff0000">Expand (程序代码展开) </font>： <font color="#0000ff">Ctrl+键盘右方数字区的'+</font>' <font color="#008080"><editing text="" /></font><br /><font color="#ff0000">Expand All (程序代码全部展开) </font>： <font color="#0000ff">Ctrl+键盘右方数字区的'*' </font><font color="#008080"><editing text="" /></font><br />Find and Replace (寻找并取代文字) ： <font color="#0000ff">Ctrl+F</font><font color="#008080"><in windows="" /></font><br />Find Next (寻找下一个项目) ： <font color="#0000ff">Ctrl+K </font><font color="#008080"><editing text="" /></font><br />Find Previous (寻找上一个项目) ： <font color="#0000ff">Ctrl+Shift+K </font><font color="#008080"><editing text="" /></font><br />Incremental Find (渐进式寻找) ： <font color="#0000ff">Ctrl+J </font><font color="#008080"><editing text="" /></font><br />Incremental Find Reverse (逆向渐进式寻找) ： <font color="#0000ff">Ctrl+Shift+J </font><font color="#008080"><editing text="" /></font><br />ISO-8859-1 Encoding (将编码变更为 ISO-8859-1)<br />Paste (从OS剪贴簿贴上文字) ：<font color="#0000ff"> Ctrl+V</font><font color="#008080"><in windows="" and="" dialogs="" /></font><br />Quick Diff Toggle (QuickDiff 开启/关闭) ： <font color="#0000ff">Ctrl+Shift+Q </font><font color="#008080"><editing text="" /></font><br />Quick Fix (快速套件修正) ： <font color="#0000ff">Ctrl+1</font><font color="#008080"><editing source="" java="" /></font><br />Redo (重做上一次作业) ： <font color="#0000ff">Ctrl+Y </font><font color="#008080"><in windows="" /></font><br />Restore Last Selection (恢复最后选取) ：<font color="#0000ff"> Alt+Shift+方向键'↓'</font><font color="#008080"><editing source="" java="" /></font><br />Revert to Saved (回复至已储存)<br />Select All (选择全部文字) ： <font color="#0000ff">Ctrl+A</font><font color="#008080"><in windows="" and="" dialogs="" /></font><br />Select Enclosing Element ： <br />(选取含括的元素)<font color="#0000ff"> Alt+Shift+方向键'↑' </font><font color="#008080"><editing source="" java="" /></font><br />Select Next Element (选取下一个元素) ： <font color="#0000ff">Alt+Shift+方向键'→'</font><font color="#008080"><editing source="" java="" /></font><br />Select Previous Element (选取上一个元素) ： <font color="#0000ff">Alt+Shift+方向键'←'</font><font color="#008080"><editing source="" java="" /></font><br />Shift Left (将该行文字往左移动一个缩排)<br />Shift Right (将该行文字往右移动一个缩排)<br />Show Tooltip Description (在光标位置显示元素的工具提示说明) ：<font color="#0000ff"> F2 </font><font color="#008080"><editing source="" java="" /></font><br />System Encoding (将编码变更为系统编码)<br /><font color="#ff0000">Toggle Folding (程序代码折迭、展开功能 开启/关闭) ：</font><font color="#0000ff">Ctrl+键盘右方数字区的'/'</font><font color="#008080"><editing text="" /></font><br />Toggle Insert Model (Smart Insert模式 开启/关闭) ：<font color="#0000ff"> Ctrl+Shift+Insert </font><font color="#008080"><editing text="" /></font><br /><font color="#ff0000">Undo (复原前次作业) ：</font><font color="#0000ff">Ctrl+Z </font><font color="#008080"><in windows="" /></font><br />US ASCII Encoding (将编码变更为 ASCII)<br />UTF-16BE Encoding (将编码变更为 UTF-16BE)<br />UTF-16 Encoding (将编码变更为 UTF-16)<br />UTF-16LE Encoding (将编码变更为 UTF-16LE)<br />UTF-8 Encoding (将编码变更为 UTF-8)<br /><br /><b>File - 档案</b>Close (关闭档案) ： <font color="#0000ff">Ctrl+W 或 Ctrl+F4 </font><font color="#008080"><in windows="" /></font><br />Close All (关闭全部档案) ：<font color="#0000ff"> Ctrl+Shift+W 或 Ctrl+Shift+F4 </font><font color="#008080"><in windows="" /></font><br />Exit (关闭屏幕最上层窗口) ： <font color="#0000ff">Alt+F4 </font>&lt;<font color="#008080">In Dialogs and Windows&gt; </font><br /><font color="#008000">(注：3.0RC2并没预设这组热键，但仍然可以使用。)</font><br /><br />Export (开启汇出菜单)<br />Import (开启汇入菜单)<br />Move (移动档案)<br />New (开启档案建立精灵Wizard) ： <font color="#0000ff">Ctrl+N </font><font color="#008080"><in windows="" /></font><br />New menu (显示File-&gt;New选单) ： <font color="#0000ff">ALT+Shift+N </font><font color="#008080"><in windows="" /></font><br />Open External File (开启外部档案)<br />Open Workspace (开启Workspace设定窗口)<br />Print (打印档案) ： <font color="#0000ff">Ctrl+P </font><font color="#008080"><in windows="" /></font><br />Properties (org.eclipse.ui.file.properties) (显示档案内容) ： <font color="#0000ff">Alt+Enter </font><font color="#008080"><in windows="" /></font><br />Refresh (重新整理) ：<font color="#0000ff"> F5 </font><font color="#008080"><in windows="" /></font><br />Rename (重新命名) ： <font color="#0000ff">F2</font><font color="#008080"><in windows="" /></font><br />Revert (回复至已储存)<br /><font color="#ff0000">Save (储存档案) ：</font><font color="#0000ff">Ctrl+S </font><font color="#008080"><in windows="" /></font><br />Save All (储存全部档案) ： <font color="#0000ff">Ctrl+Shift+S </font><font color="#008080"><in windows="" /></font><br />Save As (另存新檔)<br /><b>Help - 说明</b>About (开启关于对话框)<br /><font color="#ff0000">Help Contents (开启Eclipse说明文件)</font>Tips and Tricks (开启要诀和技巧说明页面)<br />Weclome (开启欢迎使用页面)<br /><br /><b>Navigate - 导览</b>Back (向后导览)<br />Backward History (在编辑器导览历程中向后移动) ： <font color="#0000ff">Alt+方向键'←'</font><font color="#008080"><in windows="" /></font><br />Forward (向前导览)<br />Forward History (在编辑器导览历程中向前移动) ：<font color="#0000ff"> Alt+方向键'→' </font><font color="#008080"><in windows="" /></font><br />Go Into (进入选取的目录内)<br />Go to Line (移至某一行文字) ： <font color="#0000ff">Ctrl+L </font><font color="#008080"><editing text="" /></font><br />Go to Matching Bracket (将游标移至对称的方括号) ：<font color="#0000ff"> Ctrl+Shift+P </font><font color="#008080"><editing source="" java="" /></font><br />Go to Next Member (移至下一个Member) ： <font color="#0000ff">Ctrl+Shift+方向键'↓'</font><font color="#008080"><editing source="" java="" /></font><br />Go to Package (移至套件，用于Package Explorer)<br />Go to Previous Member (移至上一个Member) ： <font color="#0000ff">Ctrl+Shift+方向键'↑' </font><font color="#008080"><editing source="" java="" /></font><br />Go to Resource (移至资源)<br />Go to Type (移至类别，用于Package Explorer)<br />Last Edit Loaction (移至前次编辑位置) ：<font color="#0000ff"> Ctrl+Q</font><font color="#008080"><in windows="" /></font><br />Next (移至下一个标示元素) ：<font color="#0000ff"> Ctrl+.</font><font color="#008080"><in windows="" /></font><br />(注：元素类型可由Toolbar的Next Annotation小倒三角图示设定。) <br /><br />Open Call Hierarchy (开启Call Hierarchy窗口) ： <font color="#0000ff">Ctrl+Alt+H </font><font color="#008080"><in windows="" /></font><br /><font color="#ff0000">Open Declaration (浏览所选取的Java元素) </font>：<font color="#0000ff"> F3 </font><font color="#008080"><in windows="" /></font><font color="#008000">(注：效果等于Ctrl+鼠标左键点选。) </font><br /><font color="#ff0000">Open External Javadoc (开启外部Javadoc) ：</font><font color="#0000ff">Shift+F2 </font><font color="#008080"><in windows="" /></font><br />Open Resource (开启资源选取对话框) ：<font color="#0000ff"> Ctrl+Shift+R </font><font color="#008080"><in windows="" /></font><br />Open Structure (显示所选元素的结构) ： <font color="#0000ff">Ctrl+F3</font><font color="#008080"><editing source="" java="" /></font><br />Open Super Implementation (开启super类型中的实作)<br />Open Type (开启类别) ： <font color="#0000ff">Ctrl+Shift+T</font><font color="#008080"><in windows="" /></font><br />Open Type Hierarchy (开启类别阶层显示窗口) ： <font color="#0000ff">F4 </font><font color="#008080"><in windows="" /></font><br />Open Type in Hierarchy (在类别阶层的视图中开启类别) ： <font color="#0000ff">Ctrl+Shift+H </font><font color="#008080"><in windows="" /></font><br />Previous (移至上一个标示元素) ：<font color="#0000ff"> Ctrl+, </font><font color="#008080"><in windows="" /></font><br /><font color="#008000">(注：元素类型可由Toolbar的Previous Annotation小倒三角图示设定。) </font><br />Quick Hierarchy (以浮动方式将类别阶层窗口显示在编辑器上) ：<font color="#0000ff"> Ctrl+T </font><font color="#008080"><editing source="" java="" /></font><br />Quick Outline (以浮动方式将概要窗口显示在编辑器上) ： <font color="#0000ff">Ctrl+O</font><font color="#008080"><editing source="" java="" /></font><br />Show In menu (显示当前Show In菜单可用的选项) ：<font color="#0000ff"> Alt+Shift+W</font><font color="#008080"><in windows="" /></font><br /><font color="#ff0000">Show in Package Explorer (在套件浏览器中显示所选元素) </font><br />Up (导览上一层)<br /><br /><b>Project - 专案</b>Build All (建置所有项目) ： <font color="#0000ff">Ctrl+B</font><font color="#008080"><in windows="" /></font><br />Build Clean (清除项目)<br />Build Project (建置专案)<br />Close Project (关闭专案)<br />Generate Javadoc (产生Javadoc)<br />Open Project (开启专案)<br /><font color="#ff0000">Properties (org.eclipse.ui.project.properties) (开启项目属性设定窗口)</font>Rebuild All (重新建置所有项目)<br />Rebuild Project (重新建置项目)<br />Repeat Working Set Build (重复建置所设定的项目) <font color="#008000">(注：Build Automatically 关闭时才可使用。)</font><br /><b>Refactor - Java (重构 - Java)</b><br /><font color="#ff0000">Change Method Signature (变更方法签章) ：</font><font color="#0000ff">Alt+Shift+C </font><font color="#008080"><in windows="" /></font><br />Convert Anonymous Class to Nested (将匿名类别转换成巢状类别)<br />Convert Local Variable to Field (将区域变量转换成字段) ：<font color="#0000ff"> Alt+Shift+F </font><font color="#008080"><editing source="" java="" /></font><br /><font color="#ff0000">Encapsulate Field (封装字段：为字段建立getting和setting方法，并只用这些方法来存取字段)</font><br />Extract Constant (撷取成常数：将数字撷取至新的Static字段，并使用新的Static字段)<br /><br /><font color="#008000">注：&lt;-START-&gt;</font><br /><br /><font color="#008000">如下段程序代码经由Extract Constant重构数字10后...</font><br /><pre class="codeStyle">public class Test { <br /> public static void main(String[] args) { <br /> int x = 10;<br />  }<br /> }</pre><font color="#008000">会变成下列程序代码：(常数字段名称，在重构时可以自由设定。)</font><br /><pre class="codeStyle">public class Test { <br /> public static final int TEN = 10;<br /> public static void main(String[] args) { <br /> int x = TEN;<br />  }<br /> }</pre><font color="#008000">注：&lt;-END-&gt;</font><br /><br />Extract Interface (撷取成界面：将原类别内的方法撷取至新接口中，原类别将实作该接口) <br />(注：新界面会存成一个新的*.java檔。若是在interface中执行此功能，旧接口则会继承新接口。)<br />Extract Local Variable (撷取成区域变量：将数字撷取为新的区域变量) ： <font color="#0000ff">Alt+Shift+L</font><font color="#008080"><in windows="" /></font><br />Extract Method (撷取成方法：将选取的表示式撷取成一个新方法) ： <font color="#0000ff">Alt+Shift+M </font><font color="#008080"><in windows="" /></font><br />Generalize Type (将reference的类别型态更改可以取代的Superclass)<br />Inline (列入常数、区域变量或方法) ： <font color="#0000ff">Alt+Shift+I </font><font color="#008080"><in windows="" /></font><br />Introduce Factory (采用代理：利用方法来取得建构子)<br /><br /><font color="#008000">注：&lt;-START-&gt;<br /><br />如下段程序代码经由Introduce Factory重构Test建构子后...</font><br /><pre class="codeStyle">public class Test { <br /> private int number;<br /> Test(int x) { <br /> number = x;<br />  }<br /> public static void main(String[] args) { <br /> System.out.println(new Test(5).number);<br />  }<br /> }</pre><font color="#008000">会变成下列程序代码：</font><br /><pre class="codeStyle">public class Test { <br /> private int number;<br /> public Test(int x) { <br /> number = x;<br />  }<br /> public static void main(String[] args) { <br /> System.out.println(createTest(5).number);<br />  }<br /> public static Test createTest(int x) { <br /> return new Test(x);<br />  }<br /> }</pre><br /><font color="#008000"><br />注：&lt;-END-&gt;<br /><br />Introduce Parameter (采用参数：将区域变量改成参数方式传递)<br /><br />注：&lt;-START-&gt;<br /><br />如下段程序代码经由Introduce Parameter重构数字5后...</font><br /><pre class="codeStyle">public class Test { <br /> public static void main(String[] args) { <br /> int x = 5;<br />  }<br /> }</pre>会变成下列程序代码：<br /><pre class="codeStyle">public class Test { <br /> public static void main(String[] args, int five) { <br /> int x = five;<br />  }<br /> }</pre><font color="#008000">注：&lt;-END-&gt;</font><br />Move Member Type to New File (将类别成员移至一个新档)<br /><font color="#ff0000">Move - Refactoring (移动 - 重构：将所选取的元素移至新位置) </font>： <font color="#0000ff">Alt+Shift+V</font><font color="#008080"><in windows="" /></font><br />Pull Up (将类别成员&lt;字段与方法&gt;上推到类别的父类别中)<br />Push Down (将类别成员(字段与方法)下推到类别的子类别中)<br />Redo - Refactoring (重做 - 重构：重做前次的重构) ： <font color="#0000ff">Alt+Shift+Y </font><font color="#008080"><in windows="" /></font><br />Refactor Quick Menu (在编辑区显示重构的快速菜单) ： <font color="#0000ff">Alt+Shift+T </font><font color="#008080"><in windows="" /></font><br /><font color="#ff0000">Rename - Refactoring (更名 - 重构：将所选取的元素重新命名，类别名称、区域变量名称等...) </font>：<font color="#0000ff">Alt+Shift+R </font><font color="#008080"><in windows="" /></font><br /><font color="#ff0000">Undo - Refactoring (复原 - 重构：复原前次的重构) </font>：<font color="#0000ff"> Alt+Shift+Z</font><font color="#008080"><in windows="" /></font><br />Use Supertype Where Possible (启动「适当时使用父类别」重构对话框。)<br /><br /><b><font color="#0000ff">◎补充命名规则：(重构时不照此规则命名时，Eclipse将会警示，<br />虽然可以不管警示，但这是个好风格。)</font></b><br />1.接口(interface)名称：开头大写。<br />2.区域变量(Local Variable)名称：开头小写 。<br />3.常数字段(public static final int...)名称：全部大写。<br /><br /><b>Run/Debug - 执行/除错</b><br />Add Class Load Breakpoint (新增一个类别加载断点))<br />Add Java Exception Breakpoint (新增一个Java异常状况断点)<br />Debug... (开启除错启动配置对话框)<br /><font color="#ff0000">Debug Last Launched (开启最近一次启动作业的除错模式)</font> ：<font color="#0000ff"> F11</font><font color="#008080"><in windows="" /></font><br />Display (org.eclipse.jdt.debug.ui.commands.Display) (显示) ： <font color="#0000ff">Ctrl+Shift+D </font><font color="#008080"><in windows="" /></font><br />(<font color="#008000">注：当执行绪暂停时，此指令会使用「显示」检视画面，显示在该执行绪之堆栈框或变量的环境定义下<br />，评估所选表示式的结果。)</font><br />Execute (执行：开启执行启动配置对话框) ： <font color="#0000ff">Ctrl+U </font><font color="#008080"><in windows="" /></font><br />Inspect (观察)： <font color="#0000ff">Ctrl+Shift+I</font><font color="#008080"><in windows="" /></font><br /><font color="#008000">(注：当执行绪暂停时，此指令会使用「表示式」检视画面，显示在该执行绪之堆栈框或变量的环境定义<br />下，视察所选表示式或变量的结果。)</font><br />Profile Last Launched (最近一次作业的概况)<br />Resume (继续执行绪的执行) ： <font color="#0000ff">F8</font><font color="#008080"><debugging /></font><br /><font color="#ff0000">Run Last Launched (在执行模式下迅速执行最近一次的启动作业</font>)：<font color="#0000ff"> Ctrl+F11 </font><font color="#008080"><in windows="" /></font><br />Run Last Launched External Tool (执行前一次启动的外部工具)<br />Run to Line (执行至指定行，可在没有设定断点之处暂停执行) ： <font color="#0000ff">Ctrl+R</font><font color="#008080"><debugging /></font><br />Skip All Breakpoints (在不清除断点的情况下，执行时跳过所有的断点)<br />Step Into (进入副程序) ： <font color="#0000ff">F5 </font><font color="#008080"><debugging /></font><br />Step Into Selection (进入目前所选的陈述式进行副程序除错) ： <font color="#0000ff">Ctrl+F5 </font><font color="#008080"><debugging /></font><br />Step Over (跳过副程序) ： <font color="#0000ff">F6</font><font color="#008080"><debugging /></font><br />Step Return (跳出副程序)： <font color="#0000ff">F7</font><font color="#008080"><debugging /></font><br />Suspend (暂停执行绪)<br />Terminate (终止执行绪)<br /><font color="#ff0000">Toggle Breakpoint (新增/移除，断点) ：</font><font color="#0000ff">Ctrl+Shift+B </font><font color="#008080"><in windows="" /></font><br />Toggle Method Breakpoint (新增/移除，方法断点)<br />Toggle Step Filters (以过滤条件逐步除错) ： <font color="#0000ff">Shift+F5 </font><font color="#008080"><in windows="" /></font><br />Toggle Watchpoint (新增/移除，字段的监视点)<br /><br /><b>Search - 搜索</b>Declaration in Hierarchy (在它的阶层中搜寻所选元素的宣告)<br />Declaration in Project (在项目中搜寻所选元素的宣告)<br />Declaration in Working Set (在工作集中搜寻所选元素的宣告)<br />Declaration in Workspace (在工作区中搜寻所选元素的宣告) ： <font color="#0000ff">Ctrl+G</font><font color="#008080"><in windows="" /></font><br />Exception Occurrences (搜索例外事件)<br />File Search (开启搜寻对话框的档案搜寻页面)<br />Implementors in Project (在项目中搜寻所选接口的实作者)<br />Implementors in Working Set (在工作集中搜寻所选接口的实作者)<br />Implementors in Workspace (在工作区中搜寻所选接口的实作者)<br />Occurrences in File (在它的宣告档案中搜寻所选元素的所有出现处) ：<font color="#0000ff"> Ctrl+Shift+U</font><font color="#008080"><in windows="" /></font><br /><font color="#ff0000">Open Search Dialog (开启搜寻对话框) </font>：<font color="#0000ff"> Ctrl+H </font><font color="#008080"><in windows="" /></font><br />Read Access in Hierarchy (在它的阶层中搜寻所选元素的读取参考)<br />Read Access in Project (在项目中搜寻所选元素的读取参考)<br />Read Access in Working Set (在工作集中搜寻所选元素的读取参考)<br />Read Access in Workspace (在工作区中搜寻所选元素的读取参考)<br />References in Hierarchy (在它的阶层中搜寻所选元素的参考)<br />References in Project (在项目中搜寻所选元素的参考)<br />References in Working Set (在工作集中搜寻所选元素的参考)<br />References in Workspace (在工作区中搜寻所选元素的参考) ： <font color="#0000ff">Ctrl+Shift+G </font><font color="#008080"><in windows="" /></font><br />Referring Tests (查询测试)<br />Write Access in Hierarchy (在它的阶层中搜寻所选元素的写入参考)<br />Write Access in Project (在项目中搜寻所选元素的写入参考)<br />Write Access in Working Set (在工作集中搜寻所选元素的写入参考)<br />Write Access in Workspace (在工作区中搜寻所选元素的写入参考)<br /><br /><b>Source - 程序代码</b><br /><font color="#ff0000">Add Block Comment (将选取的字行以多行批注/**/包起来) </font>： <font color="#0000ff">Ctrl+Shift+/ </font><font color="#008080"><editing source="" java="" /></font><br />Add Constructors from Superclass (从父类别增加一个建构子)<br />Add Import (为目前所选的类别参考建立一项汇入宣告) ：<font color="#0000ff"> Ctrl+Shift+M</font><font color="#008080"><editing source="" java="" /></font><br /><font color="#ff0000">Add Javadoc Comment (新增Javadoc批注) ：</font><font color="#0000ff">Alt+Shift+J </font><font color="#008080"><in windows="" /></font><br />Comment (批注)<br />Externalize Strings (开启「外部化字符串」精灵)<br />Find Strings to Externalize (寻找要外部化的字符串)<br /><font color="#ff0000">Format (程序代码自动排版) ：</font> Ctrl+Shift+F <editing source="" java="" /><br />Format Element (格式化元素)<br /><font color="#ff0000">Generate Constructor using Fields (使用字段来产生建构子)</font><br /><br />注：&lt;-START-&gt;<br /><br /><font color="#008000">如下段程序代码，选取字段名称money并经由Generate Constructor using Fields指令后...</font><br /><pre class="codeStyle">public class Test { <br /> int money;<br /> public static void main(String[] args) { <br />  }<br /> }</pre><font color="#008000">会变成下列程序代码：</font><br /><pre class="codeStyle">public class Test { <br /> int money;<br /> public Test(int money) { <br /> this.money = money;<br />  }<br /> public static void main(String[] args) { <br />  }<br /> }</pre>注：&lt;-END-&gt;<br /><br />Generate Delegate Methods (开启「产生委派方法」对话框，可新增类型字段的委派方法)<br />Generate Getters and Setters (开启「产生Getter与Setter」对话框，可以为字段自动<br />建立Getter和Setter方法)<br />Indent Line (单行缩排，其会遵照Formatter设定的格式) ： <font color="#0000ff">Ctrl+I </font><font color="#008080"><editing source="" java="" /></font><br />Mark Occurrences (标注事件)： <font color="#0000ff">Alt+Shift+O</font><font color="#008080"><editing source="" java="" /></font><br />Organize Imports (组织汇入) ： <font color="#0000ff">Ctrl+Shift+O</font><font color="#008080"><in windows="" /></font><br /><font color="#008000">(注：这是个很方便的功能，简易说明一下使用时机：假设我们在程序中打，JFrame src;而并未<br />import任何swing类别，此时Eclipse便会出现错误警示，用红底线将JFrame标起来，此时只要按<br />下Ctrl+Shift+O，Eclipse便会自动将：import javax.swing.JFrame;加到程序代码中了。)</font><br />Override/Implement Methods (开启「覆写/实作方法」对话框，可覆写或实作现行类别中的方法)<br />Remove Block Comment (移除多行批注/**/) ： <font color="#0000ff">Ctrl+Shift+</font><font color="#008080"><editing source="" java="" /></font><br />Remove Occurrence Annotations (移除事件书签)： <font color="#0000ff">Alt+Shift+U</font><font color="#008080"><editing source="" java="" /></font><br />Sort Members (排序成员)<br />Source Quick Menu (在编辑区显示Source的快速菜单) ： <font color="#0000ff">Alt+Shift+S </font><font color="#008080"><in windows="" /></font><br />Surround with try/catch Block (以try/catch区块包覆所选文字)<br />Toggle Comment (加上单行批注/取消单行批注) ：<font color="#0000ff"> Ctrl+/ 或 Ctrl+7 或 Ctrl+Shift+C </font><font color="#008080"><editing source="" java="" /></font><br />Uncomment (取消批注)<br /><br /><b><font color="#0000ff">◎补充，Source 隐藏热键</font></b>：<br />1.Shift Right (向右移位，增加目前所选字行的内缩层次) ： <font color="#0000ff">Tab </font><font color="#008080"><editing source="" java="" /></font><br />2.Shift Left (向左移位，减少目前所选字行的内缩层次) ： <font color="#0000ff">Shift+Tab </font><font color="#008080"><editing source="" java="" /></font><br /><br /><b>Team - 团队</b>Synchronize (同步化)<br /><br /><b>Text Editing - 文字编辑</b><br />Claer Mark (清除标记)<br />Copy Lines (将选取的文字，复制成新行) ： <font color="#0000ff">Ctrl+Alt+方向键'↓'</font><font color="#008080"><editing text="" /></font><br />Cut Line (剪下单行文字)<br />Cut to Beginning of Line (剪下文字，范围为选取处至单行开头)<br />Cut to End of Line (剪下文字，范围为选取处至单行尾端)<br />Delete Line (删除单行文字) ： <font color="#0000ff">Ctrl+D </font><font color="#008080"><editing text="" /></font><br />Delete Next (删除下一行)<br />Delete Next Word (删除下一个字组) ： <font color="#0000ff">Ctrl+Delete </font><font color="#008080"><editing text="" /></font><br />Delete Previous (删除前一行)<br />Delete Previous Word (删除前一个字组) ： <font color="#0000ff">Ctrl+Backspace </font><font color="#008080"><editing text="" /></font><br />Delete to Beginning of Line (删除文字，范围为选取处至单行开头)<br />Delete to End of Line (删除文字，范围为选取处至单行尾端)<br />Duplicate Lines (将选取的文字，复制成新行) ： <font color="#0000ff">Ctrl+Alt+方向键'↑'</font><font color="#008080"><editing text="" /></font><br />Insert Line Above Current Line (在光标处的该行上方插入新行) ： <font color="#0000ff">Ctrl+Shift+Enter </font><font color="#008080"><editing text="" /></font><br />Insert Line Below Current Line (在光标处的该行下方插入新行) ： <font color="#0000ff">Shift+Enter </font><font color="#008080"><editing text="" /></font><br />Line Down (游标往下移一行)<br />Line End (游标移至该行尾端)<br />Line Start (游标移至该行开头)<br />Line Up (游标往上移一行)<br />Move Lines Down (将该行文字往下移动) ： <font color="#008080">Alt+方向键'↓'</font><font color="#008080"><editing text="" /></font><br />Move Lines Up (将该行文字往上移动) ： <font color="#0000ff">Alt+方向键'↑' </font><font color="#008080"><editing text="" /></font><br />Next Column (游标移至下一列)<br />Next Word (游标移至下一个字组) ：<font color="#0000ff"> Ctrl+方向键'→'</font><font color="#008080"><editing text="" /></font><br />Page Down (移至下一页)<br />Page Up (移至上一页)<br />Previous Column (游标移至上一列)<br />Previous Word (游标移至上一个字组) ：<font color="#0000ff"> Ctrl+方向键'←' </font><font color="#008080"><editing text="" /></font><br />Scroll Line Down (向下卷动) ：<font color="#0000ff"> Ctrl+方向键'↓' </font><font color="#008080"><editing text="" /></font><br />Scroll Line Up (向上卷动) ： <font color="#0000ff">Ctrl+方向键'↑'</font><font color="#008080"><editing text="" /></font><br />Select Line Down (选取下一行)<br />Select Line End (选取至文字尾端)<br />Select Line Start (选取至文字开头)<br />Select Line Up (选取上一行)<br />Select Next Column (选取下一列)<br />Select Next Word (选取下一个字组)：<font color="#0000ff"> Ctrl+Shift+方向键'→'</font><font color="#008080"><editing text="" /></font><br />Select Page Down (选取下一页)<br />Select Page Up (选取上一页)<br />Select Previous Column (选取上一列)<br />Select Previous Word (选取前一个字组) ：<font color="#0000ff"> Ctrl+Shift+方向键'←'</font><font color="#008080"><editing text="" /></font><br />Select Text End (选取至文字编辑器尾端)<br />Select Text Start (选取至文字编辑器开头)<br />Select Window End (选取至窗口尾端)<br />Select Window Start (选取至窗口开头)<br />Set Mark (设定标记)<br />Swap Mark (交换标记)<br />Text End (光标移至文字编辑器最底端)<br />Text Start (光标移至文字编辑器最顶端)<br />Toggle Overwrite (覆写/插入 模式选择) ： <font color="#0000ff">Insert</font><font color="#008080"><editing text="" /></font><br />To Lower Case (将选取的英文字转为小写) ： <font color="#0000ff">Ctrl+Shift+Y </font><font color="#008080"><editing text="" /></font><br />To Upper Case (将选取的英文字转为大写) ：<font color="#0000ff"> Ctrl+Shift+X</font><font color="#008080"><editing text="" /></font><br />Window End (将光标移至窗口尾端)<br />Window Start (将光标移至窗口开头)<br /><br /><b>Views - 检视</b><br />Ant (开启Ant检视窗口)<br />Bookmarks (开启书签检视窗口)<br />Breakpoints (开启断点检视窗口)<br />Classic Search (开启传统的搜索检视窗口)<br />Console (开启主控台检视窗口)<br />CVS Annotate (开启CVS Annotate检视窗口)<br />CVS Editors (开启CVS Editor检视窗口)<br />CVS Repositories (开启CVS Repositories检视窗口)<br />CVS Resource History (开启CVS Resource History检视窗口)<br />Debug (开启除错检视窗口)<br />Display (org.eclipse.jdt.debug.ui.DisplayView) (开启除错-显示检视窗口)<br />Error Log (开启错误记录检视窗口)<br />Expressions (开启除错-表示式检视窗口)<br />Java Call Hierarchy (开启Call Hierarchy检视窗口)<br />Java Declaration (开启宣告检视窗口)<br />Javadoc (开启Javadoc检视窗口)<br />Java Members (开启类别成员检视窗口)<br />Java Package Explorer (开启套件浏览器) ： <font color="#0000ff">Alt+Shift+Q,P </font><font color="#008080"><in windows="" /></font><br />Java Packages (开启Java套件检视窗口)<br />Java Projects (开启Java项目检视窗口) <br />Java Type Hierarchy (开启类别阶层检视窗口) ：<font color="#0000ff"> Alt+Shift+Q,T</font><font color="#008080"><in windows="" /></font><br />Java Types (开启Java类别检视窗口)<br />JUnit (开启JUnit检视窗口)<br />Memory (开启除错-内存检视窗口)<br />Navigator (开启导览器) <br />Outline (开启概要检视窗口) ： <font color="#0000ff">Alt+Shift+Q,O</font><font color="#008080"><in windows="" /></font><br />Plug-in Dependencies (开启Plug-in Dependencies检视窗口)<br />Plug-in Registry (开启Plug-in Registry检视窗口)<br />Plug-ins (开启Plug-ins检视窗口)<br />Problems (开启问题检视窗口) ： <font color="#0000ff">Alt+Shift+Q,X </font><font color="#008080"><in windows="" /></font><br />Progress (开启执行进度检视窗口)<br />Properties (org.eclipse.ui.views.Property/Sheet) (开启属性检视窗口)<br />Registers (开启除错-缓存器检视窗口)<br />Search (开启搜索检视窗口) ： <font color="#0000ff">Alt+Shift+Q,S </font><font color="#008080"><in windows="" /></font><br />Synchronize (开启同步化检视窗口) ：<font color="#0000ff"> Alt+Shift+Q,Y</font><font color="#008080"><in windows="" /></font><br />Tasks (开启作业检视窗口)<br />Threads and Monitors (开启除错-执行绪检视窗口)<br />Variables (开启除错-变量检视窗口)<br /><br /><b><font color="#0000ff">◎补充：Views 检视窗口的开启处：</font></b><br />Window-&gt;Show View-&gt;Other。<br /><br /><b>Window - 窗口</b><br />Activate Editor (启动编辑器) ： <font color="#0000ff">F12</font><font color="#008080"><in windows="" /></font><br />Close All Perspectives (关闭全部视景)<br />Close Perspective (关闭视景)<br />Customize Perspective (自订视景)<br />Hide Editors (隐藏编辑器)<br />Lock the Toolbars (锁定工具列)<br />Maximize Active View or Editor (编辑区最大化) ： <font color="#0000ff">Ctrl+M</font><font color="#008080"><in windows="" /></font><br />Next Editor (切换至下一个编辑器) ： <font color="#0000ff">Ctrl+F6 </font><font color="#008080"><in windows="" /></font><br />Next Perspective (切换至下一个视景) ： <font color="#0000ff">Ctrl+F8 </font><font color="#008080"><in windows="" /></font><br />Next View (切换至下一个视图) ： <font color="#0000ff">Ctrl+F7 </font><font color="#008080"><in windows="" /></font><br />Open Editor Drop Down (以浮动的方式在编辑区，显示快速切换编辑器菜单) ： <font color="#0000ff">Ctrl+E</font><font color="#008080"><in windows="" /></font><br />Pin Editor (固定编辑器)<br /><font color="#ff0000">Preferences (开启偏爱设定)</font><br />Previous Editor (切换至上一个编辑器) ：<font color="#0000ff"> Ctrl+Shift+F6 </font><font color="#008080"><in windows="" /></font><br /><br />Previous Perspective (切换至上一个视景) ： <font color="#0000ff">Ctrl+Shift+F8 </font><font color="#008080"><in windows="" /></font><br />Previous View (切换至上一个视图) ：<font color="#0000ff"> Ctrl+Shift+F7 </font><font color="#008080"><in windows="" /></font><br />Reset Perspective (重新设定视景)<br />Save Perspective As (储存为新视景)<br />Show Ruler Context Menu (显示标尺的内容菜单) ： Ctrl+F10 <editing text="" /><br /><font color="#ff0000"><br />Show Selected Element Only </font><font color="#0000ff">(仅显示所选元素的程序代码)</font><br />Show System Menu (显示系统菜单) ：<font color="#0000ff"> Alt+- </font><font color="#008080"><in windows="" /></font><br /><br />Show View Menu (显示视图菜单) ：<font color="#0000ff"> Ctrl+F10 </font><font color="#008080"><in windows="" /></font><br /><br />Switch to Editor (切换至编辑器) ： <font color="#0000ff">Ctrl+Shift+E</font><img src ="http://www.blogjava.net/fastzch/aggbug/85430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2006-12-04 18:00 <a href="http://www.blogjava.net/fastzch/archive/2006/12/04/85430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［转载］cvs相关工具下载地址总结</title><link>http://www.blogjava.net/fastzch/archive/2006/04/26/43392.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Wed, 26 Apr 2006 10:48:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2006/04/26/43392.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/43392.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2006/04/26/43392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/43392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/43392.html</trackback:ping><description><![CDATA[
		<em>CVS工具很重要，所以转过来了，出处不详。</em>
		<br />
		<br />cvs相关工具下载地址总结，还有什么我没有写到的欢迎补充<br />CVS服务器端：<br />CVS 下载地址：<a href="http://www.cvshome.org/" target="_blank"><font face="Times New Roman">http://www.cvshome.org/</font></a><font face="Times New Roman"> (最新版本：hp:1.12.11,Linux and win32:1.11.17)<br />cvsnt 下载地址：</font><a href="http://www.cvsnt.com/cvspro/" target="_blank"><font face="Times New Roman">http://www.cvsnt.com/cvspro/</font></a><font face="Times New Roman"> (最新版本：2.0.58d) </font><p></p><p>CVS客户端：<br />TortoiseCVS 下载地址：<a href="http://www.tortoisecvs.org/" target="_blank">http://www.tortoisecvs.org/</a> (最新版本：1.8.11)<br />wincvs 下载地址：<a href="http://cvsgui.sourceforge.net/download.html" target="_blank">http://cvsgui.sourceforge.net/download.html</a> (最新版本：1.3.20.3)<br />Python 下载地址：<a href="http://www.python.org/download/" target="_blank">http://www.python.org/download/</a> (最新版本：2.4)<br />TCL 下载地址：<a href="http://www.activestate.com/Products/ActiveTCL/" target="_blank">http://www.activestate.com/Products/ActiveTCL/</a> (最新版本：8.4.9.0)<br />SmartCVS 下载地址：<a href="http://www.regnis.de/download.html" target="_blank">http://www.regnis.de/download.html</a> (最新版本：3.0.6)</p><p>CVSWEB 下载地址：<a href="http://www.freebsd.org/projects/cvsweb.html" target="_blank">http://www.freebsd.org/projects/cvsweb.html</a> (最新版本：3.0.5)<br />viewcvs 下载地址：<a href="http://viewcvs.sourceforge.net/" target="_blank">http://viewcvs.sourceforge.net/</a>(最新版本：0.9.2)<br />CvsGraph 下载地址：<a href="http://www.akhphd.au.dk/~bertho/cvsgraph/" target="_blank">http://www.akhphd.au.dk/~bertho/cvsgraph/</a>(最新版本:1.5.1)</p><p>缺陷跟踪：<br />CVSTrac 下载地址：<a href="http://www.cnpack.org/" target="_blank">http://www.cnpack.org/</a> (<a href="http://www.cvstrac.org/" target="_blank">http://www.cvstrac.org/</a>)(最新版本：1.1.5)</p><p><br />基于CVS的代码统计工具：按代码量，按开发者的统计表等：<br />StatCVS 下载地址：<a href="http://sourceforge.net/projects/statcvs" target="_blank">http://sourceforge.net/projects/statcvs</a> (最新版本：0.2.2)</p><p><br />CVS权限管理（CVSACL is a patch for CVS）：<br />cvsacl 下载地址：<a href="http://cvsacl.sourceforge.net/" target="_blank">http://cvsacl.sourceforge.net/</a>(最新版本：1.2.2)</p><p>subversion服务器端：<br />subversion 下载地址：<a href="http://subversion.tigris.org/project_packages.html#binary-packages" target="_blank">http://subversion.tigris.org/project_packages.html#binary-packages</a> (最新版本：1.1.3)</p><p>subversion客户端：<br />tortoisesvn 下载地址：<a href="http://tortoisesvn.tigris.org/" target="_blank">http://tortoisesvn.tigris.org/</a> (最新版本：1.1.3)<br />rapidsvn 下载地址：<a href="http://rapidsvn.tigris.org/" target="_blank">http://rapidsvn.tigris.org/</a> (最新版本：0.7.0)</p><img src ="http://www.blogjava.net/fastzch/aggbug/43392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2006-04-26 18:48 <a href="http://www.blogjava.net/fastzch/archive/2006/04/26/43392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［转载］对着电脑笑了20分钟的笑话</title><link>http://www.blogjava.net/fastzch/archive/2006/04/25/42995.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Tue, 25 Apr 2006 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2006/04/25/42995.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/42995.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2006/04/25/42995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/42995.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/42995.html</trackback:ping><description><![CDATA[ <font face="Arial"><em><font color="#000000">这些笑话实在好笑，所以就转来了。</font><br /></em></font><br />1、 碗掉下来，天大个疤 <br />2、一次文艺晚会，主持人上台报幕：下面请欣赏：新疆歌舞，掀起你的头盖骨！毛骨悚然！！！！！ <br />3、老虎不发猫，你当我是病危呀！ <br />4、上高中时，课堂纪律混乱，老师一怒之下揪起XXX，说：XXX,你给我站墙上去！~~全班暴寒！ <br />5、一次我开车，坐我旁边的女同事突然问：“你怎么开车不系安全套的？” <br />6、我：那是我们物理老师。。。 <br />　 同学：教什么的阿？ <br />　 我：化学。。。 <br />7、在网吧，一同学突然举手，大喊：“老师！” <br />8、我们宿舍一个人喝多了要去尿尿然后带出一句冷话：尿喝多了，酒就特别多． <br />9、买橘子，老板：一块五一斤。我：太贵了，五块钱三斤吧。老板：不行不行。 <br />10、朋友问我电脑配置，我说显示器是彩屏的。（本来是想说液晶的） <br />11、初中文艺晚会，抢答题环节。 <br />　　 女主持：“大家注意了，不要抢的太快。等我说完开始在举手” <br />　 　然后开始念题目，说，“现在开。。。” <br />　　 这时候，一个选手就抢答了。 <br />　 　主持人就说“这位同学太着急了一点。我‘始’（屎）还在口里，你怎么就抢 了” <br />12、听过一MM在食堂喊“给我一碗viper~！” <br />13、上学的时候 <br />　 　有一天一个电话找我 　同学接完递给我说：“你妈**。” <br />　　 我一边接过电话一便随口说到：“男的女的” <br />　 　大家狂笑 我被笑了4年 <br />14、同学的高中同学（一男生）走进面馆很酷把头发一甩：“老板，2两葱不要米线！”完了还加一句：“多下点米线啊！”老板：“。。。。你到底是要米线还是要葱？？” <br />15、有一次寝室里同学的老妈打电话过来 <br />　　 我习惯说“他不在”，但是这一次我想说的的是“已经出去了” <br />　　 结果说出来是：“他已经…不在了” <br />16、gg递给我一根冰糕，我咬一口大叫：“烫死我了！” <br />17、和我姐姐去李宁买鞋，我姐一开口：“小姐，这鞋多少钱一斤？” <br />18、有一次我拍我宿舍同学的肚子，她大声说：“别拍，我肚子里有小便。” <br />19、 高中时每人发个胸牌。。一次来检查前，班主任跑到教室大声喊，大家快把胸罩戴起来，来查拉。。　全场鸦雀无声。。。 <br />20、上学时周末回家，晚饭后烟瘾犯了，打算借口去散步。在门口换鞋时，老爸问我干吗去？我随口说了句：“去散个烟！”结果老爸从我身上搜出一包555，狠狠K了我一顿。 <br />21、一次教育局领导视察课间操，结束后，本应由体育老师宣布“解散”，但一时情急，忘词了，憋了半天，大喊：“撤退！” <br />22、高中有一老师姓江，酷似罗家英（演大话西游唐僧的），我去问他问题，脱口而出：“唐老师，这题……” <br />23、有一同事，有天我开车在路上车胎没气了，问哪里有充气的，同事说：“街上到处都是打胎的啊！” <br />24、有一老师大概通宵麻将，见黑板没擦，大怒：“今天谁做庄啊？黑板都不擦！” <br />25、有一次我大叔见我小姑在搽大宝，突然大叫一声：“你皮肤这么好，还用护舒宝啊？” <br />26、老师留下作业，我不会做就抄别人的，然后去办公室交作业，看见老师说：“我抄完了！” <br />27、有一次，我们去黄山旅游，导游刚好介绍到：百步云梯是当年刘小庆&lt;&lt;小花&gt;&gt;的景点。突然我们团里一个男人脱口而出：“导演........“众人晕。 <br />28、那次几个女同学来我家玩，我去拿水了，她们打开影碟机看片子，我在里屋听到是粤语，然后我大喊调下音道，音道错了，顿时哑口无言，我脸一虹一紫～～差点晕了过去～～ <br />29、偶高中，放学和偶MM一起回家，校门口看到一卖烧烤的，MM说要吃牛杂，因为烤架前人比较多，偶怕老板听不见，于是偶大声喊道：“老板，5串牛鞭”然后一片寂静，三秒钟后所有人一起暴笑。偶巨尴尬。。。最尴尬的是MM接着问偶“牛鞭是什么”偶只好非 常非常小声地回答MM：“牛鞭就是牛尾巴啊”。。 <br />30、我和我的mm电话吵架，她把电视音量开得很大，我心里烦，就大声说：“把电话给我关掉！”现在想起来，那个寒啊！ <br /><br />31、早上和同学去吃早餐 其中一个只吃包子馅，另外一个只吃皮。我们正在说他们两个浪费的时候吃馅的同学来了一句“行了 以后你吃我的包皮好了”在场的所有喝粥 的全部喷出来了。 <br />32、说个真事，上班的厂车上，MM问我：我的电脑不行了，老是死。我说：那你回去查查病毒看，记得要升级杀毒软件。MM：哦。第二天一大早，车上又见MM，偶随口问了句：查过了没？怎样？然后。。。。。。。。。MM大声的说了句：气死我了，查了半天，说 是没（梅）毒。你说怎么办好啊？？？当时那个寒啊。。。。现在还记忆尤新 <br />33、我宿舍一个同学的高中同学打电话来，他说找谁，我说不在，接着说了谢谢 <br />34、以前别人来我阿姨家作客，刚进门的。刚好我阿姨要去上厕所。她连忙招呼客人说：“你们坐哈坐哈，我去厕所给你们倒点茶喝！” <br />35、以前我们有个政治经济学老师，特别喜欢侃！有次谈到美圆强势。他这么 <br />说，“你们知道为什么只有美圆才被叫做‘美金’，却从来没有听说过有叫‘英 <br />金’、‘法金’？” <br />36、大学军训时,教官大吼一声说:用你们的旁光（余光）对齐~~~~偶们想笑又不敢笑,那个难过呀.... <br />37、女同学和她的表妹请我吃饭，席间让我多吃点，我不知道怎么会犯如下的错 <br />误：“谢谢，最近没性欲，你们多吃点吧！”当时大家都喷饭了。。 <br />38、我们单位早上上班有车子接送的，因为车子不大，有一次，一mm上车后没座 <br />位，坐我旁边的一男同事忙站起来，热情的和她打招呼说到：“某某，你坐我屁股上吧！”　我当时一直狂笑到下车~！ <br />39、以前痴迷网络游戏，经常在网吧杀的混天暗地的，学期结束后，和一帮哥们回家，火车就快要开了，我们却还没找到站台，一时语急说道：“MD，这里怎么连个坐标（其实要找指示牌）也没有啊！~”哥们听后爆笑~~ <br />40、以前住校的时候，上下铺。一次A手机要充电。可是一个床铺就一个插座，插了台灯看书就不能充电了，于是乎，A把充电器插在B上面。B晚上要听音乐，看见A的充电器大吼：“哎，我说你怎么老插我上面吖？你怎么不插你下面？”完后一阵骚动，汗~~ <br />41、大学时候，一同学和我争论问题，一时处于下风，情急中一拍桌子起身大叫：你胡说，我又不是不傻！ <br />42、我一哥们去相亲，回来大家问他怎么样，哥们讲：这个女孩真糙。中午到了饭点，2个人进了一家牛肉拉面馆，女孩对师傅大声说道：嘿，给拉2碗~~~拉面的师傅说：你吃吗？吃我就拉。 <br />43、小时候冰棍雪糕的一般都是推着自行车叫卖，有一次，在屋子里听一阿姨喊：新来的雪糕，热乎的。（估计阿姨以前是卖油饼油条的） <br />44、室友用热得快烧水，水开后那厮却悠哉游哉地看书不动弹，实在看不下去了于是开口说：“该拔了吧？叫得好大声。。”没反应。十五秒后补充：“那里很热哎，就这么一直插着很容易插坏的啊。。”没动静。过半分钟水彻底沸腾，哗啦啦地溅了来。“那什么，射出 来了。喷出好多东西叫声也越来越大再插着恐怕会弄坏人家哎。。你确定不拔？”。。。一本厚厚的书朝偶的头飞过来!!!~ <br />45、高3时我们班主任是教数学的...他给我们复习时~每到画图时,画射线时~~就大声说~~`同学们看好了啊~~我射了啊 <br /><br />46.上大学的时候去衡山玩,当时爬山爬了一半,累的正想歇会的时候看到路边有个买纪念品的欧巴桑,上去开口就问:"老婆........" <br /><br />47.上自习的时候，大家都在看复习，GG对MM说：“我刚背了单词，帮忙默写一下。” MM不想默，GG就求她，你（摸）默我吧，（摸）我吧！！结果MM实在忍受不了，大喊，老师你看我不想（摸）默他，他非要我（摸）默~~~！！！ <br /><br />48.有一天去同学家吃饭，喝了点酒，她爸爸忽然进来了，本来是想喊叔叔的，结果说错了，说：“爸，来座！”~~寒！大帮同学笑得要死 <br /><br />49.我同事跟人争执，急了张口来了句“你以为我吃饭长大的啊？”我一直纳闷他到底吃什么长大的。" <br /><br />50.小学时一个很讨厌的男生找我借橡皮，我不借，他就死缠烂打，之后我用尽全身的力气狂吼了一句“我不嫁（借）给你”当时同学们立马安静下来了，，，。 <br /><br />51.一次ktv,点歌，一mm大声喊：给我点一首周截棍的“双杰伦”...... <br /><img src ="http://www.blogjava.net/fastzch/aggbug/42995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2006-04-25 13:36 <a href="http://www.blogjava.net/fastzch/archive/2006/04/25/42995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些爱情的准则［转载］</title><link>http://www.blogjava.net/fastzch/archive/2006/04/11/40453.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Tue, 11 Apr 2006 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2006/04/11/40453.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/40453.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2006/04/11/40453.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/40453.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/40453.html</trackback:ping><description><![CDATA[1.不要为了寂寞去恋爱，时间是个魔鬼，天长日久，如果你是个多情的人，即使不爱对方，到时候也会产生感情，最后你怎么办？<br /><br />2.不要为了负责而去结婚。要知道，不爱对方却和对方结婚是最不负责的。即使当时让对方很伤心，但是总比让他几年甚至一辈子伤心强。<br /><br />3.不管多大多老，不管家人朋友怎么催，都不要随便对待婚姻，婚姻不是打牌，重新洗牌要付出巨大代价。<br /><br />4.感情的事基本上没有谁对谁错，他（她）要离开你，总是你有什么地方不能令他满足，回头想想过去在一起的日子，总是美好的。当然，卑劣的感情骗子也有，他们的花言巧语完全是为了骗取对方和自己上床，这样的人还是极少数。<br /><br />5.和一个生活习惯有很多差异的人恋爱不要紧，结婚要慎重，想想你是否可以长久忍受彼此的不同。<br /><br />6.有人说恋爱要找自己喜欢的人，结婚要找喜欢自己的人，都是片面的。恋人不喜欢自己有什么可恋的？老婆自己不喜欢怎么过一辈子？<br /><br />7.真爱一个人，就要尽量让他开心，他开心了你就会开心，那么双方就有激情了。<br /><br />8. 不要因为自己长相不如对方而放弃追求的打算，长相只是一时的印象，真正决定能否结合主要取决于双方的性格。我见过的帅哥配丑女，丑女配帅哥的太多了。<br /><br />9. 女人要学会扮靓自己，不要拿朴素来做挡箭牌，不要拿家务做借口，不懂时尚，你就不是一个完整的女人。<br /><br />10. 恋爱的时间能长尽量长。这最少有两点好处：一，充分，尽可能长的享受恋爱的愉悦，婚姻和恋爱的感觉是很不同的。二，两人相处时间越长，越能检验彼此是否真心，越能看出两人性格是否合得来。这样婚后的感情就会牢固得多。<br /><br />11. 男人不坏，女人不爱，这坏不是指心肠狠毒，自私无情什么的。而是指油嘴滑舌，花言巧语。一般的好男人以为说情话是油嘴滑舌，轻浮肉麻的表现，所以不愿去做。对别人这样说是不对，可是对自己老婆，就要油嘴滑舌一点。为什么不能做个心好嘴滑的男人呢？<br /><br />12. 都说婚姻是爱情的坟墓，那是因为婚前已经往去坟墓的路上走着。就算不结婚也会在坟墓前分手。为什么不先分手就一头钻进坟墓呢？<br /><br />13. 只会读书的女人是一本字典，再好人们也只会在需要的时候去翻看一下，只会扮靓的女人只是一具花瓶，看久了也就那样。服饰美容是做好一个女人的必要条件，不是充要条件。你还需要多看书。这样你会发现生活更加美好。<br /><br />14. 平平淡淡才是真，没错，可那应该是激情过后的平淡，然后再起激情，再有平淡。激情平淡应呈波浪形交替出现。光有平淡无激情的生活有什么意思？只要你真心爱他，到死你也会有激情的。<br /><br />15. 你爱他吗？爱就告诉他，何必把思念之苦藏在心底深处。怕样子，地位，身份不相配？别怕，爱一个人是美好的。<br /><br />16. 老婆和老妈掉进了河里，我先救老妈，因为是老妈给了我生命，我找不到任何理由丢下她不管。老婆如果没救上来，我可以再给她陪葬，在墓里继续我们的爱情。<br /><br />17. 草率地结了婚已经是错了，再也不要草率地去离婚。先试试看，真的不行再离也不迟。<br /><br />18. 经常听说男人味女人味，你知道男人味是一种什么味道，女人味又是一种什么味道吗？男人味就是豁达勇敢，女人味就是温柔体贴。<br /><br />19. 魅力是什么？魅力不是漂亮，漂亮的女人不一定能吸引我，端庄幽雅的女人我才喜欢。所以你不用担心自己不够漂亮。<br /><br />20. 初恋都让人难忘，觉得美好。为什么？不是因为他（她）很漂亮或很帅，也不是因为得不到的就是好的，而是因为人初涉爱河时心里异常纯真，绝无私心杂念，只知道倾己所有去爱对方。而以后的爱情都没有这么纯洁无瑕了。纯真是人世间最为可贵的东西。我们渴求的就是她。<br /><br />21. 初恋的人大多都不懂爱，所以初恋失败的多。成功的少。结婚应该找个未婚的，因为谁都喜欢原装。而恋爱，还是找个恋爱过的人才好。因为经历过恋爱的人才知道什么是爱，怎么去爱。<br /><br />22. 男人有钱就变坏，是的，很多男人这样，不过，一有钱就变坏的男人就算没钱，也好不到哪里去。<br /><br />23. 一个男人能不能给你安全感，完全不取决于他的身高，而取决于他的心高。高大而窝囊的 男人我见过不少。矮小而昂扬的男人我也见过。一个男人要心高气傲，这样才像男人。当然，前提是要有才华。<br /><br />24. 天长地久有没有？当然有！为什么大多数人不相信有？因为他们没有找到人生旅途中最适合自己的那一个。也就是冥冥中注定的那一个。为什么找不到？茫茫人海，人生如露，要找到最合适自己的那一个谈何容易？你或许可以在40岁时找到上天注定的那一个，可是你能等到40岁吗？在20多岁时找不到，却不得不结婚，在三四十岁时找到却不得不放弃。这就是人生的悲哀。<br /><br />25. 为什么生活中很少见到传说中天长地久，可歌可泣的爱情故事？因为这样的感情非常可贵，可贵的东西是那么好见到的吗？金子钻石容易见到吗？<br /><br />26. 从前失恋之时，我都会恨她，恨她为什么这么薄情寡义，听到有关她的不好的消息，我都会偷着乐，现在不了，现在即使失去她，我也会祝福她，衷心希望她能过得很好。她过得不好我会很难过。这也是喜欢和爱的一个区别。<br /><br />27. 和聪明的人恋爱会很快乐，因为他们幽默，会说话，但也时时存在着危机，因为这样的人很容易变心。和老实的人恋爱会很放心，但生活却也非常得乏味。<br /><br />28. 女人不要太好强，有的女人自尊心过强。是别人的错她态度很强硬，是自己的错她同样态度很强硬。她总以为去求别人是下贱的表现，她是永远不会求男人的。这样的女人很令人头疼。聪明的女人会知道什么时候该坚强，什么时候该示弱。好强应该对外人，对爱的人这么好强你还要不要他呵护你啊？<br /><br />29. 要看一个人有没有内涵，内看谈吐，外看着装。还可以看写字。谈吐可以看出一个人的学识和修养。着装可以看出一个人的品位，写字可以看出一个人的性格。<br /><br />30. 想知道一个人爱不爱你，就看他和你在一起有没有活力，开不开心，有就是爱，没有就是不爱。<br /><br />31. 有的人老是抱怨找不好人，一两次不要紧，多了就有问题了，首先你要检讨自己本身有没有问题，如果没有，那你就要审视一下自己的眼光了，为什么每次坏人总被你碰到？<br /><br />32. 有人说男人一旦变心，九头牛也拉不回，难道女人变心，九头牛就拉得回来吗？男女之间只在生理上有差异，心理方面大同小异。<br /><br />33. 爱情与人品没多大关系，从前有个女同事跟我说她喜欢射雕里的杨康，不喜欢郭靖，我很惊奇，爱坏厌好？后来想想，也没什么，杨康认贼作父，卖国求荣是不对。可他对爱情却很执着，这样的人为什么不能享有爱？现实生活也有这样的例子，古惑仔也有古惑仔的爱情。<br /><br />34. 有人说没有面包的爱情终究会夭折。我说说这话的人不懂什么是爱情。从前恋爱我很反感别人说女方这条件好那条件好。我不管你什么出身，什么学历，什么地位，如果我爱你，你擦皮鞋甚至做妓女我也无所谓。大人说我幼稚，没有钱怎么过日子？我说有钱没爱过的是什么日子？和自己爱的人在一起，喝水吃腌菜我也是高兴的。<br /><br />35. 如果真爱一个人，就会心甘情愿为他而改变。如果一个人在你面前我行素，置你不喜欢的行为而不顾，那么他就是不爱你。所以如果你不够关心他或是他不够关心你，那么你就不爱他或他不爱你，而不要以为是自己本来就很粗心或相信他是一个粗心的人。遇见自己真爱的人，懦夫也会变勇敢，同理，粗心鬼也会变得细心。<br /><br />36. 彼此都有意而不说出来是爱情的最高境界。因为这个时候两人都在尽情的享受媚眼，尽情的享受目光相对时的火热心理，尽情的享受手指相碰时的惊心动魄。一旦说出来，味道会淡许多，因为两人同意以后，所有的行为都是已被许可，已有心理准备的了，到最后渐渐会变得麻木。<br /><br />37. 一个萝卜一个坑，说的是婚姻情况。事实上对于爱情来说，是不成立的，优秀的人，不管男女，都会是一个萝卜好几个坑。所以这个世界天天上演着悲欢离合的故事。<br /><br />38. 有两种女人很可爱，一种是妈妈型的，很体贴人，很会照顾人，会把男人照顾的非常周到。和这样的女人在一起，会感觉到强烈的被爱。还有一种是妹妹型的。很胆小，很害羞，非常的依赖男人，和这样的女人在一起，会激发自己男人的个性的显现。比如打老鼠扛重物什么的。会常常想到去保护自己的小女人。还有一种女人既不知道关心体贴人，又从不向男人低头示弱，这样的女人最让男人无可奈何。<br /><br />39. 吝啬是男人的大忌，就算穷也不要做出一副穷样。有人抱怨女人只爱男人的钱，其实也并不一定就是这样，有的女人喜欢男人为她花钱，有时候也是为了证实自己在男人心目中的位置，男人如果喜欢一个女人，一定愿意为她花钱的。<br /><br />40. 男女搭配，干活不累。因为在异性面前，男人总喜欢表现自己很男人的一面。这样也才像个男人，所以大男子主义有时候是必须有的。<br /><br />41. 追求爱慕的异性是很常见的说法。其实对方不喜欢你，你再怎么追也没用，对方喜欢你，根本不需要挖空心思去追。或许真有一天他被你的诚意所打动，可最终大多还是会分手的。因为爱情不是感动，你不是他心目中的理想伴侣，即使一时接受你，将来碰上他心仪的那一位，一样会离开你。当然，对于喜欢你的人，你还是需要花点心思去讨好他的，因为这样才像拍拖，才浪漫。<br /><br />42. 经常有人问在朋友和恋人之间叫你选择，你会选择哪一个？其实这个问题是多余的。真正懂你的朋友或恋人，他们会体谅你的行为，如果不体谅你，因此失去也不必太在意。朋友或恋人是要互相帮助的，而不是硬性迁就。<br /><br />43. 曾经沧海难为水，除却巫山不是云。可是如果我还没经沧海或是刚到沧海打了个转就回来，而且也没到过巫山就一头钻进了围城怎么办啊<br /><br />44. 浪漫是什么？是送花？雨中漫步？楼前伫立不去？如果两人彼此倾心相爱，什么事都不做，静静相对都会感觉是浪漫的。否则，即使两人坐到月亮上拍拖，也是感觉不到浪漫的。<br /><br />45. 是否门当户对不要紧，最重要应该是兴当趣对，不然没有共同语言，即使在一起，仍然会感觉到孤独。<br /><br />46. 学会用理解的，欣赏的眼光去看对方，而不是以自以为是的关心去管对方。<br /><br />47. 幼稚的人和幼稚的人在一起没什么问题，成熟的人和成熟的人在一起也没什么问题，成熟的人和幼稚的人在一起问题就多了。<br /><br />48. 有的女人恋爱时让男友宠着自己，结婚后仍然要老公百般宠着自己，却忘记做为一个女人应该做的份内之事。这样的女人是不懂得爱情的。<br /><br />49. 持久的爱情源于彼此发自内心的真爱，建立在平等的基础之上。任何只顾疯狂爱人而不顾自己有否被爱，或是只顾享受被爱而不知真心爱人的人都不会有好的结局。 <br /><img src ="http://www.blogjava.net/fastzch/aggbug/40453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2006-04-11 13:33 <a href="http://www.blogjava.net/fastzch/archive/2006/04/11/40453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>选择JSF不选Struts的十大理由［转载］</title><link>http://www.blogjava.net/fastzch/archive/2006/02/09/30003.html</link><dc:creator>Robin's Programming World</dc:creator><author>Robin's Programming World</author><pubDate>Thu, 09 Feb 2006 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/fastzch/archive/2006/02/09/30003.html</guid><wfw:comment>http://www.blogjava.net/fastzch/comments/30003.html</wfw:comment><comments>http://www.blogjava.net/fastzch/archive/2006/02/09/30003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fastzch/comments/commentRss/30003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fastzch/services/trackbacks/30003.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 一个客户不知道该选用Struts还是JSF。就像你预料的那样，我通常会问：这2中框架之间有什么区别？当然，除了我的这个客户外很多人都面临这样的选择。 
<p class="main">&nbsp;&nbsp;&nbsp; 总的来说，我建议在新项目中优先考虑JSF。虽然常常有一些商业上的因素迫使我们为现有的项目选择了Struts，而且那些解决方案还有待考验，但是，让我们面对一个事实：JSF比Struts好多了。 </p>
<p class="main">&nbsp;&nbsp;&nbsp; 下面是我选择JSF而不选Struts的十大理由： </p>
<ul>
<li>1.Components(组件) 
</li><li>2.Render Kits 
</li><li>3.Renderers 
</li><li>4.Value Binding Expressions（值绑定表达式） 
</li><li>5.Event Model（事件模型） 
</li><li>6.Extensibility(可扩展性) 
</li><li>7.Managed Beans(Dependency Injection 依赖注入) 
</li><li>8.POJO Action Methods 
</li><li>9.JSF is the standard Java-based web app framework (JSF是java web应用程序的标准框架) 
</li><li>10.There's only one Struts(只有一个Struts) </li></ul>
<p class="main">&nbsp;&nbsp;&nbsp; 10.There's only one Struts(只有一个Struts) Struts 是一个开源产品，然而JSF是一个标准。这个细节常常被新的JSF学习者忽略，其实这是显而易见的，因为我们有多个JSF的实现。虽然JSF还很不成熟，但是我们已经有了2个优秀的JSF实现可以选择：Sun的参考实现和Apache的MyFaces。另一方面，我们只有一个Struts。 </p>
<p class="main">&nbsp;&nbsp;&nbsp; 9.JSF is the standard(JSF是标准) JEE 5.0要提供一个JSF的实现，这表明JSF不久将会无处不在。这可能与你无关，但是和工具供应商密切相关。现在大概有50个java web应用程序框架，工具供应商不会情愿去支持一个特别的框架，但是他们会毫不犹豫的去支持一个标准。而且不止供应商，开源项目也会迅速的聚集在JSF的四周，争先恐后的去实现相同的功能。比如说，直到我们去实现本质上和Shale的Tapestry差不多的视图的时候，我才知道Facalets。（从长远来看，我相信这种冗余是件好事，会给我们带来好处） </p>
<p class="main">&nbsp;&nbsp;&nbsp; 8.POJO Action Methods Struts的行为是和 Struts的API绑定在一起的，但是JSF的行为方法可以在POJPO中实现。这意味着你不用在表单和模型对象之间实现一个多余的行为层。顺便说一下，在JSF里面没有行为对象，行为在模型对象中实现。但是也请注意一点：如果你愿意你也可以生成与JSF独立的行为对象。在Struts里面，你有 Form Bean和Action Bean。Form Bean包含数据而Action Bean包含逻辑。OO狂会想去合并前2者，在Struts你办不到。但是在JSF中，你可以分开数据和逻辑，也可以合并到一个对象中，一切由你决定。 </p>
<p class="main">&nbsp;&nbsp;&nbsp; 7.Managed Beans(Dependency Injection 依赖注入) 和Spring一样，JSF也使用了依赖注入（DJ）（或控制反转（IoC））去实例化和初始化Bean。Struts的确为你生成了Form Bean和Action Bean，但是JSF可以为你生成各种各样的Managed Bean。 </p>
<p class="main">&nbsp;&nbsp;&nbsp; 6.Extensibility(可扩展性) 这个很重要。JSF有6个对象实现了这个框架的大部分功能，而且你可以很容易的用你自己的实现代替原有实现。比如你想加一个自定义参数在JSF表达式语言里面，或是添加一个自己的视图控制器以便于区分组件和HTML。事实上Shale实现了上面的功能。如果你还没有满足，JSF提供了几个地方你可以轻松的控制JSF的生命周期。Shale给你的会更多。</p>
<p class="main">&nbsp;&nbsp;&nbsp; 5.Event Model（事件模型） JSF的事件模型使你可以对值改变，动作，JSF生命周期阶段变换等作出反应。在JSF1.1中，那些事件都是在服务器端处理的，这肯定是一个缺陷，好在JSF2.0计划支持客户端事件，拭目以待吧。 </p>
<p class="main">&nbsp;&nbsp;&nbsp; 4.Value Binding Expressions（值绑定表达式） 在Struts 中，你负责把数据从Form传递到模型对象。你实现的Action的execute方法是把Form作为一个参数。然后你再手动的把数据从Form Bean里面取出放到模型对象里面。你要为应用里面的每个Form做这些事情，然而在JSF里面，你只需像这样：#{model.property} 就够了，其他的交给JSF来处理。 </p>
<p class="main">&nbsp;&nbsp;&nbsp; 3.Renderers 你有看过Struts的标签的源代码吗？它直接生成HTML。JSF组件标签什么都不生成，它和服务器上的一对component-renderer对应。Component维护组件状态，rendered负责获得视图。重点是renderers是可插拔的，即你可以根据自己需求实现然后替代掉默认实现。比如说我在NFJS上面的Felix谈话中举例说明了怎么去实现一个自定义的label renderer。你只需要配置你的renderer，JSF就会自动在你的应用程序里面使用他。 </p>
<p class="main">&nbsp;&nbsp;&nbsp; 2.Render Kits 在几年前我曾经有份Struts咨询工作，我们必须同时支持浏览器和无线设备，非常痛苦。但是用JSF来完成那个任务非常容易，因为你可以生成你自己的render kit－为一种特定显示技术的renderers的集合－然后配置到JSF里面。 </p>
<p class="main">&nbsp;&nbsp;&nbsp; 1.Components(组件) 组件是Struts和JSF之间最大的区别。就像Swing一样，JSF提供丰富的底层构件去开发组件然后添加到标准的组件集。那些底层构件让你很容易的生成自己的组件并且和别人共享。现在我们到处都能看到自定义组件跳出来，比如说Oracle的ADF和MyFaces，两者都提供了丰富的组件集，就像 javascript日历，tree等等。当然，组件只是一部分。典型的是，组件都和一个独立的renderer对应，这给我们带来了真正的好处（看第3 条）。但是和JSF中的很多东西一样，你不一定要墨守成规。只要你愿意，你可以实现render自己的组件，虽然这样你会失去给组件加入别的 renderer的能力。 </p><img src ="http://www.blogjava.net/fastzch/aggbug/30003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fastzch/" target="_blank">Robin's Programming World</a> 2006-02-09 10:52 <a href="http://www.blogjava.net/fastzch/archive/2006/02/09/30003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>