??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久亚洲av无码蜜芽,亚洲五月激情综合图片区,亚洲高清视频在线播放http://m.tkk7.com/renyangok/回归blogjavazh-cnMon, 12 May 2025 06:26:45 GMTMon, 12 May 2025 06:26:45 GMT60java中到底传D是引?/title><link>http://m.tkk7.com/renyangok/archive/2008/09/12/228524.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Fri, 12 Sep 2008 02:25:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2008/09/12/228524.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/228524.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2008/09/12/228524.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/228524.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/228524.html</trackback:ping><description><![CDATA[JAVA中的传递都是g递吗Q有没有引用传递呢Q?<br /> <br /> 在回{这两个问题前,让我们首先来看一D代码: <br /> <div id="uqkwqac" class="dp-highlighter"> <div id="iomqukw" class="bar"> <div id="oaguyiq" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://zangweiren.javaeye.com/images/icon_copy.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="eqsoyoy" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="eycgkmu" class="keyword"><strong><font color="#7f0055">class</font></strong></span><span> ParamTest {   </span></span></li> <li><span>    </span><span id="makwwus" class="comment"><font color="#008200">// 初始gؓ0 </font></span><span>  </span></li> <li><span>    </span><span id="yqscgmk" class="keyword"><strong><font color="#7f0055">protected</font></strong></span><span> </span><span id="quegsiw" class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> num = </span><span id="swygaiq" class="number"><font color="#c00000">0</font></span><span>;   </span></li> <li><span>  </span></li> <li><span>    </span><span id="cqacomu" class="comment"><font color="#008200">// 为方法参数重新赋?</font></span><span>  </span></li> <li><span>    </span><span id="qsukwms" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="cmysuks" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(</span><span id="awyquqi" class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> i) {   </span></li> <li><span>         i = </span><span id="uikmwcs" class="number"><font color="#c00000">5</font></span><span>;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="wykoowm" class="comment"><font color="#008200">// 为方法参数重新赋?</font></span><span>  </span></li> <li><span>    </span><span id="oyueiom" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="yqcwqgc" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(ParamTest t) {   </span></li> <li><span>         ParamTest tmp = </span><span id="qakgqgk" class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ParamTest();   </span></li> <li><span>         tmp.num = </span><span id="ccoakqy" class="number"><font color="#c00000">9</font></span><span>;   </span></li> <li><span>         t = tmp;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="iakwyme" class="comment"><font color="#008200">// 改变Ҏ参数的?</font></span><span>  </span></li> <li><span>    </span><span id="ogkogeu" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="cuoqcig" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> add(</span><span id="wqquwck" class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> i) {   </span></li> <li><span>         i += </span><span id="yicooou" class="number"><font color="#c00000">10</font></span><span>;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="kkwoyww" class="comment"><font color="#008200">// 改变Ҏ参数属性的?</font></span><span>  </span></li> <li><span>    </span><span id="aamegeu" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="uuoyeow" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> add(ParamTest pt) {   </span></li> <li><span>         pt.num += </span><span id="aswkcky" class="number"><font color="#c00000">20</font></span><span>;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="wqacwck" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="yqimwue" class="keyword"><strong><font color="#7f0055">static</font></strong></span><span> </span><span id="yoacoms" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> main(String[] args) {   </span></li> <li><span>         ParamTest t = </span><span id="gismymc" class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ParamTest();   </span></li> <li><span>  </span></li> <li><span>         System.out.println(</span><span id="sawgciq" class="string"><font color="#0000ff">"参数--基本cd"</font></span><span>);   </span></li> <li><span>         System.out.println(</span><span id="kkooago" class="string"><font color="#0000ff">"原有的|"</font></span><span> + t.num);   </span></li> <li><span>        </span><span id="uwqkwks" class="comment"><font color="#008200">// 为基本类型参数重新赋?</font></span><span>  </span></li> <li><span>         t.change(t.num);   </span></li> <li><span>         System.out.println(</span><span id="egqcwcs" class="string"><font color="#0000ff">"赋g后:"</font></span><span> + t.num);   </span></li> <li><span>        </span><span id="euoysyo" class="comment"><font color="#008200">// 为引用型参数重新赋?</font></span><span>  </span></li> <li><span>         t.change(t);   </span></li> <li><span>         System.out.println(</span><span id="yskoomk" class="string"><font color="#0000ff">"q算之后Q?</font></span><span> + t.num);   </span></li> <li><span>  </span></li> <li><span>         System.out.println();   </span></li> <li><span>  </span></li> <li><span>         t = </span><span id="qsmokay" class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ParamTest();   </span></li> <li><span>         System.out.println(</span><span id="qscmgem" class="string"><font color="#0000ff">"参数--引用cd"</font></span><span>);   </span></li> <li><span>         System.out.println(</span><span id="uegiuki" class="string"><font color="#0000ff">"原有的|"</font></span><span> + t.num);   </span></li> <li><span>        </span><span id="mqcmgec" class="comment"><font color="#008200">// 改变基本cd参数的?</font></span><span>  </span></li> <li><span>         t.add(t.num);   </span></li> <li><span>         System.out.println(</span><span id="mwyauci" class="string"><font color="#0000ff">"赋引用后Q?</font></span><span> + t.num);   </span></li> <li><span>        </span><span id="scwgsgo" class="comment"><font color="#008200">// 改变引用cd参数所指向对象的属性?</font></span><span>  </span></li> <li><span>         t.add(t);   </span></li> <li><span>         System.out.println(</span><span id="ksuqaqw" class="string"><font color="#0000ff">"改属性后Q?</font></span><span> + t.num);   </span></li> <li><span>     }   </span></li> <li><span>}  </span></li> </ol> </div> <pre class="java" style="display: none;" name="code">public class ParamTest { // 初始gؓ0 protected int num = 0; // 为方法参数重新赋? public void change(int i) { i = 5; } // 为方法参数重新赋? public void change(ParamTest t) { ParamTest tmp = new ParamTest(); tmp.num = 9; t = tmp; } // 改变Ҏ参数的? public void add(int i) { i += 10; } // 改变Ҏ参数属性的? public void add(ParamTest pt) { pt.num += 20; } public static void main(String[] args) { ParamTest t = new ParamTest(); System.out.println("参数--基本cd"); System.out.println("原有的|" + t.num); // 为基本类型参数重新赋? t.change(t.num); System.out.println("赋g后:" + t.num); // 为引用型参数重新赋? t.change(t); System.out.println("q算之后Q? + t.num); System.out.println(); t = new ParamTest(); System.out.println("参数--引用cd"); System.out.println("原有的|" + t.num); // 改变基本cd参数的? t.add(t.num); System.out.println("赋引用后Q? + t.num); // 改变引用cd参数所指向对象的属性? t.add(t); System.out.println("改属性后Q? + t.num); } }</pre> <br /> q段代码的运行结果如下: <br /> <ol> <li>参数--基本cd</li> <li>原有的|0</li> <li>赋g后:0</li> <li>q算之后Q?</li> <li> <br /> </li> <li>参数--引用cd</li> <li>原有的|0</li> <li>赋引用后Q?</li> <li>改属性后Q?0</li> </ol> <br /> 从上面这个直观的l果中我们很Ҏ得出如下l论Q?<br /> <ol> <li>对于基本cdQ在Ҏ体内Ҏ法参数进行重新赋|q不会改变原有变量的倹{?/li> <li>对于引用cdQ在Ҏ体内Ҏ法参数进行重新赋予引用,q不会改变原有变量所持有的引用?/li> <li>Ҏ体内对参数进行运,不媄响原有变量的倹{?/li> <li>Ҏ体内对参数所指向对象的属性进行运,改变原有变量所指向对象的属性倹{?/li> </ol> <br /> 上面ȝ出来的不q是我们所看到的表面现象。那么,Z么会出现q样的现象呢Q这p说到g递和引用传递的概念了。这个问题向来是颇有争议的?<br /> <br /> 大家都知道,在JAVA中变量有以下两种Q?<br /> <ol> <li>基本cd变量Q包括char、byte、short、int、long、float、double、boolean?/li> <li>引用cd变量Q包括类、接口、数l(基本cd数组和对象数l)?/li> </ol> <br /> 当基本类型的变量被当作参C递给ҎӞJAVA虚拟机所做的工作是把q个值拷贝了一份,然后把拷贝后的g递到了方法的内部。因此在上面的例子中Q我们回头来看看q个ҎQ?<br /> <div id="yicgago" class="dp-highlighter"> <div id="squmqoe" class="bar"> <div id="ccgaaiq" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://zangweiren.javaeye.com/images/icon_copy.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="yykmwuk" class="comment"><font color="#008200">// 为方法参数重新赋?</font></span><span>  </span></span></li> <li><span id="iceoaye" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="qqceyek" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(</span><span id="gyaugeu" class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> i) {   </span></li> <li><span>     i = </span><span id="qaumqoe" class="number"><font color="#c00000">5</font></span><span>;   </span></li> <li><span>}  </span></li> </ol> </div> <pre class="java" style="display: none;" name="code">// 为方法参数重新赋? public void change(int i) { i = 5; }</pre> <br /> 在这个方法被调用Ӟ变量i和ParamTest型对象t的属性numh相同的|却是两个不同变量。变量i是由JAVA虚拟机创建的作用域在 change(int i)Ҏ内的局部变量,在这个方法执行完毕后Q它的生命周期就l束了。在JAVA虚拟ZQ它们是以类似如下的方式存储的: <br /> <div style="text-align: center;"><img src="http://zangweiren.javaeye.com/upload/picture/pic/17754/bf858157-cd1b-3e9e-9fd1-374906bfd90f.jpg" alt="" /></div> <br /> 很明显,在基本类型被作ؓ参数传递给方式Ӟ是g递,在整个过E中Ҏ没有牉|到引用这个概c这也是大家所公认的。对于布型变量当然也是如此Q请看下面的例子Q?<br /> <div id="cegycio" class="dp-highlighter"> <div id="askwqgm" class="bar"> <div id="yqaeous" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://zangweiren.javaeye.com/images/icon_copy.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="oyuogwc" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="ucgausq" class="keyword"><strong><font color="#7f0055">class</font></strong></span><span> BooleanTest {   </span></span></li> <li><span>    </span><span id="asmwaye" class="comment"><font color="#008200">// 布尔型?</font></span><span>  </span></li> <li><span>    </span><span id="simeqoe" class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span> bool = </span><span id="ccegqow" class="keyword"><strong><font color="#7f0055">true</font></strong></span><span>;   </span></li> <li><span>  </span></li> <li><span>    </span><span id="owacwks" class="comment"><font color="#008200">// 为布型参数重新赋?</font></span><span>  </span></li> <li><span>    </span><span id="gacugmc" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="sceqsyo" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(</span><span id="kkoyago" class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span> b) {   </span></li> <li><span>         b = </span><span id="eueicqq" class="keyword"><strong><font color="#7f0055">false</font></strong></span><span>;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="gisuouc" class="comment"><font color="#008200">// 对布型参数q行q算 </font></span><span>  </span></li> <li><span>    </span><span id="ooicwec" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="aaewque" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> calculate(</span><span id="gasugyo" class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span> b) {   </span></li> <li><span>         b = b && </span><span id="mmyicam" class="keyword"><strong><font color="#7f0055">false</font></strong></span><span>;   </span></li> <li><span>        </span><span id="ggqumuc" class="comment"><font color="#008200">// Z方便ҎQ将q算l果输出 </font></span><span>  </span></li> <li><span>         System.out.println(</span><span id="wgqsmmi" class="string"><font color="#0000ff">"bq算后的|"</font></span><span> + b);   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="ooacwus" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="emykeus" class="keyword"><strong><font color="#7f0055">static</font></strong></span><span> </span><span id="oysmouk" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> main(String[] args) {   </span></li> <li><span>         BooleanTest t = </span><span id="ggiuemk" class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> BooleanTest();   </span></li> <li><span>  </span></li> <li><span>         System.out.println(</span><span id="scgisay" class="string"><font color="#0000ff">"参数--布尔?</font></span><span>);   </span></li> <li><span>         System.out.println(</span><span id="kkwacsa" class="string"><font color="#0000ff">"原有的|"</font></span><span> + t.bool);   </span></li> <li><span>        </span><span id="ucgscii" class="comment"><font color="#008200">// 为布型参数重新赋?</font></span><span>  </span></li> <li><span>         t.change(t.bool);   </span></li> <li><span>         System.out.println(</span><span id="kkmqsyg" class="string"><font color="#0000ff">"赋g后:"</font></span><span> + t.bool);   </span></li> <li><span>  </span></li> <li><span>        </span><span id="moyswck" class="comment"><font color="#008200">// 改变布尔型参数的?</font></span><span>  </span></li> <li><span>         t.calculate(t.bool);   </span></li> <li><span>         System.out.println(</span><span id="kugikki" class="string"><font color="#0000ff">"q算之后Q?</font></span><span> + t.bool);   </span></li> <li><span>     }   </span></li> <li><span>}  </span></li> </ol> </div> <pre class="java" style="display: none;" name="code">public class BooleanTest { // 布尔型? boolean bool = true; // 为布型参数重新赋? public void change(boolean b) { b = false; } // 对布型参数q行q算 public void calculate(boolean b) { b = b && false; // Z方便ҎQ将q算l果输出 System.out.println("bq算后的|" + b); } public static void main(String[] args) { BooleanTest t = new BooleanTest(); System.out.println("参数--布尔?); System.out.println("原有的|" + t.bool); // 为布型参数重新赋? t.change(t.bool); System.out.println("赋g后:" + t.bool); // 改变布尔型参数的? t.calculate(t.bool); System.out.println("q算之后Q? + t.bool); } }</pre> <br /> 输出l果如下Q?<br /> <ol> <li>参数--布尔?/li> <li>原有的|true</li> <li>赋g后:true</li> <li>bq算后的|false</li> <li>q算之后Qtrue</li> </ol> <br /> 那么当引用型变量被当作参C递给Ҏ时JAVA虚拟机又是怎样处理的呢Q同P它会拯一份这个变量所持有的引用,然后把它传递给JAVA虚拟ZؓҎ 创徏的局部变量,从而这两个变量指向了同一个对象。在首所丄CZ中,ParamTestcd变量t和局部变量pt在JAVA虚拟Z是以如下的方式存 储的Q?<br /> <div style="text-align: center;"><img src="http://zangweiren.javaeye.com/upload/picture/pic/17756/3c3c237f-bd06-3e7a-a0d9-a2317754b560.jpg" alt="" /></div> <br /> 有一U说法是当一个对象或引用cd变量被当作参C递时Q也是g递,q个值就是对象的引用Q因此JAVA中只有g递,没有引用传递。还有一U说法是? 用可以看作是对象的别名,当对象被当作参数传递给ҎӞ传递的是对象的引用Q因此是引用传递。这两种观点各有支持者,但是前一U观点被l大多数人所? 受,其中有《Core Java》一书的作者,以及JAVA的创造者James GoslingQ而《Thinking in Java》一书的作者Bruce Eckel则站在了中立的立Z?<br /> <br /> 我个为g递中的值指的是基本cd的数|即对于布尔型,虽然它的表现形式为true和falseQ但是在栈中Q它仍然是以数值Ş式保存的Q即0? CfalseQ其它数DCtrue。而引用是我们用来操作对象的工P它包含了对象在堆中保存地址的信息。即使在被作为参C递给ҎӞ实际上传递的 是它的拷贝,但那仍是引用。因此,用引用传递来区别与g递,概念上更加清晰?<br /> <br /> 最后我们得出如下的l论Q?<br /> <ol> <li>基本cd和基本类型变量被当作参数传递给ҎӞ是g递。在Ҏ实体中,无法l原变量重新赋|也无法改变它的倹{?/li> <li>对象和引用型变量被当作参C递给ҎӞ在方法实体中Q无法给原变量重新赋|但是可以改变它所指向对象的属性。至于到底它是g递还是引用传递,qƈ不重要,重要的是我们要清楚当一个引用被作ؓ参数传递给一个方法时Q在q个Ҏ体内会发生什么?/li> </ol> <p>什么叫引用?只因个变量的值和其它的不一? <br /> <br /> <br /> 首先理解:都是变量 <br /> int i; <br /> ArrayList b; <br /> i和b都是变量. <br /> 但i是基本变?也叫原始变量. <br /> 其它的就叫引用变?因ؓ它的值是一个内存地址?引用对象?但记?它们都是有一个值的!i是一个数?而b是一个内存地址?单的说是一个十六进 制的?.除了基本变量之外的变量都是引用变?Vector a;q里的a也是一个变?它也是有值的,它的值是一个十六进制的? <br /> <br /> 变量的赋? <br /> int i=10; <br /> int j=i; <br /> //q里把i的?0l了j,所以j的g?0 <br /> <br /> ArrayList b=new ArrayList(); <br /> ArrayList c=b; <br /> //首先,b是一个引用变?它的"?:是一个内存地址?!! new ArrayList()要分配一D内存保存它?怎么h到这D内?那就是通过b里的g.b的值就是new ArrayList()所占内存的首地址.然后c也是一个引用变?它的?地址?和b是一L.也就是new ArrayList()所占内存的首地址.所以当通过b或者cq行操作?它们都是操作同一个对象的. <br /> <br /> 在方法调用的时?Ҏ的参数实际也是一个变?如果是基本类型变量的时?假设有方法method(int aa); <br /> int j=10; <br /> method(j); <br /> q里?int aa实际也是定义了一个变?调用的时候把j的?10也给了aa.所以aa也是10,改变了aa的值ƈ不会改变j的? <br /> <br /> 如果是引用变量的时?假设有方法methodA(ArrayList aa); <br /> ArrayList b = new ArrayList(); <br /> methodA(b); <br /> //Ҏ定义了变量aa,调用的时候把b的?地址?!!!!)l了aa,所以aa与b有一L?地址?!!!),在方法里通过aaL作的时?b所引用的对象也p改变?因ؓ它们引用同一个对? <br /> <br /> U?a = new 银行帐户();//开一个银行帐?q回一个卡L?写在你的Ua里边. <br /> <br /> 用一张纸(引用变量),把你的银行卡号写在上?然后调用我的时?我用另外一张纸(引用变量---Ҏ的Ş?,把你的号码抄q来.然后我通过q个卡号,d银行扑ֈ你的帐号,l你存点? <br /> <br /> 然后你用你的U?引用变量)上的卡号 <没变,q是那个卡号>再去查询银行帐号的时候就会发C多了一些钱?....</p> <p>说说我对g递和引用传递的看法Q?br /> 首先我认为,大家对Java传递参数的行ؓ是清楚的Q这个争论只是一个语义上的争论?br /> 也就是我们是否需要区分g递和应用传递呢Q或者说q样的区分有没有意义Q是否合理?<br /> <br /> 博主认ؓ存在引用传递的关键点在于,传递的对象地址|本质上它是一个引用,无论它是否被copyq?br /> 认ؓ只有g递的关键点在于,传递的对象地址|它是一个值的copyQ这个g表的意义无所谓?br /> <br /> 引用是c++里的概念Q由于java跟c++是有一定关pȝQ这里把引用q移q来Q如果合理未不可?br /> c++中关于引用的解释一般喜Ƣ说是看?#8220;别名”Q我查了几本书,大部分提到引用ƈ不会分配内存I间Q也有一本书提到Q某些编译器会分配存储空间来存储被引用对象的地址?br /> 那么q是回到语义上来Qc++里的q个引用Q语义上?#8220;别名”的意思,我的理解是,一l指向同一个对象的别名应该只存储一份内存地址。当然具体实现可能会 把引用当做一个不可变的指针来处理Q每个别名都存储自己的对象地址Q。但是请注意Q我们应该关注于它的语义Q即Q它没有M值的copyQ即使是一个地 址Q只是另外一个名字而已?br /> <br /> 但是java里面没有q样的概念,所有的地址传递其行ؓ是值的传递方式,语义上统一成g递更为清晎ͼ我们只需要考虑q个值具体是什么,无非两种Q要么是基本cd|要么是个地址?br /> 所以我认ؓq个“引用”的概忉|到java中ƈ不合适。只有g递的说法更合理?/p> <img src ="http://m.tkk7.com/renyangok/aggbug/228524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2008-09-12 10:25 <a href="http://m.tkk7.com/renyangok/archive/2008/09/12/228524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] update-alternatives http://m.tkk7.com/renyangok/archive/2008/02/13/179749.html保尔?/dc:creator>保尔?/author>Wed, 13 Feb 2008 02:08:00 GMThttp://m.tkk7.com/renyangok/archive/2008/02/13/179749.htmlhttp://m.tkk7.com/renyangok/comments/179749.htmlhttp://m.tkk7.com/renyangok/archive/2008/02/13/179749.html#Feedback0http://m.tkk7.com/renyangok/comments/commentRss/179749.htmlhttp://m.tkk7.com/renyangok/services/trackbacks/179749.html
在说?update-alternatives 的详l内容之_先让我们看看pȝ中已有的例子。打开l端Q执行下面的命oQ?br />
herbert@natsu:~$ ls -l /usr/bin/editor
lrwxrwxrwx 1 root root 24 2004-09-26 08:48 /usr/bin/editor -> /etc/alternatives/editor
herbert@natsu:~$ ls -l /etc/alternatives/editor
lrwxrwxrwx 1 root root 12 2004-10-27 16:24 /etc/alternatives/editor -> /usr/bin/vim
herbert@natsu:~$

? 们看刎ͼeditor q个可执行命令实际上是个W号链接Q它指向 /etc/alternatives/editorQ? /etc/alternatives/editor 也是个符号链接,它指?/usr/bin/vim。这P当我输入 editor q回车时Q将执行 vim。之所以要?/usr/bin ?/etc/alternatives 中费心徏立这样两个链接,是要实C面说到的Ҏ:方便脚本
E序的编写和pȝ的管理?br />
下面我们来看看 update-alternatives 的功能。当Ӟ如果你觉得我说得不详l,可以看看q个命o?manpageQUPDATE-ALTERNATIVES(8)?br />
首先要介l的参数?--display。它使我们可以看C个命令的所有可选命令。执?br />
natsu:/home/herbert# update-alternatives --display editor
editor - status is auto.
 link currently points to /usr/bin/vim
/bin/ed - priority -100
 slave editor.1.gz: /usr/share/man/man1/ed.1.gz
/usr/bin/nvi - priority 19
 slave editor.1.gz: /usr/share/man/man1/nvi.1.gz
/bin/nano - priority 40
 slave editor.1.gz: /usr/share/man/man1/nano.1.gz
/usr/bin/vim - priority 120
 slave editor.1.gz: /usr/share/man/man1/vim.1.gz
/usr/bin/emacs21 - priority 0
 slave editor.1.gz: /usr/share/man/man1/emacs.1emacs21.gz
Current `best' version is /usr/bin/vim.
natsu:/home/herbert#

你可以看到我的机器上的所有可以用来被 editor 链接的命令?br />
下面说说 --config。这个选项使我们可以选择其中一个命令:

natsu:/home/herbert# update-alternatives --config editor

There are 5 alternatives which provide `editor'.

  Selection Alternative
-----------------------------------------------
      1 /bin/ed
      2 /usr/bin/nvi
      3 /bin/nano
*+    4 /usr/bin/vim
      5 /usr/bin/emacs21

Press enter to keep the default[*], or type selection number: 4
Using `/usr/bin/vim' to provide `editor'.
natsu:/home/herbert#

我ƈ没有修改它,因ؓ我还是比较喜?vim 的。当Ӟ你可以选择别的E序?br />
? 到这里我们就要介l一些概念了。首先,update-alternatives 在一般情况下是由 postinst ?prerm q样的安装脚本自动调用的Q所以一?alternative 的状态有两种Q自动和手动。每?alternative 的初始状态都是自动。如果系l发现管理员手动修改了一? alternativeQ它的状态就从自动变成了手动Q这样安装脚本就不会更新它了。如果你希望一?alternative 变回自动Q只要执?br />
update-alternatives --auto editor

可以了。你注意C吗?我们说到?#8220;名字”。该怎样写名字呢Q这是我们要介l的W二个概念:
general name -- q是指一pd功能怼的程序的“公用”名字Q包括绝对\径)Q比?/usr/bin/editor?br /> link -- q是指一?alternative ?/etc/alternative 中的名字Q比?editor?br /> alternative -- ֐思义Q这是指一个可选的E序所在的路径Q包括绝对\径)Q比?/usr/bin/vim?br /> -- autoQ?-display ?--config 跟的都是 link。我们要说的W三个概忉|优先U。这个比较简单,当然优先U越高的E序好啦(在大多数情况下,我不想争论)最后一个概忉|d从的 alternative。想想看Q你?/usr/bin/editor 链接C vimQ可是当你执?man editor 时看到的却是 emacs ?manpageQ你会做何感惛_Q这引Zd?alternative 的概念了Q当更新ȝ alternative Ӟ从的 alternative 也会被更新?br />
说完q四个重要的概念后,我们介绍另外两个选项。至于其他的。。。。我怿你会ȝ手册늚Q对吗?

W一个是 --install。它的格式是Q?br />
update-alternatives --install gen link alt pri [--slave sgen slink salt] ...

genQ? linkQaltQpri 分别是我们上面说q的。如果需要从?alternativeQ你可以?--slave 加在后面。如果你在向一个已l存在的 alternative l中d新的 alternativesQ该命o会把q些 alternatives 加入到这个已l存在的 alternative l的
列表中,q用新的可选命令作为新的命令;否则Q将会徏立一个新的自动的 alternative l?br />
呜呼Q我加入了一个错误的 alternative。我不想要这?alternative 了。在q种情况 下,可以执行下面的命令:

update-alternatives --remove name path

name 是一个在 /etc/alternatives 中的名字Q也是上面?linkQ?path 是希望删除的可选程序名的绝对\径名Q放心,q样只是从列表中删除了这个程序,q不会真的从盘上删除程序的可执行文Ӟ。如果从一? alternative l中删除了一个正在被链接的程序ƈ且这个组仍然没有变成I的Qupdate-alternatives 会自动用一个具有其他优先的可选程序代替原来的E序。如果这个组变成I的了,那么q这?alternative l都会被U除。如果删除的E序没有被链接,则只有有兌个程序的信息会被U除?br />
说个例子吧。我下蝲?EclipseQƈ且安装了 gcj ?gij。可是我发现 GNU ?java 工具q不以q行 Eclipse。我只好?Sun 公司的网上下蝲了它?java 工具 jdk。因为是自己安装的,我将它们安装?/usr/local 上,以便来重新安装 Linux pȝ时这些程序仍然可以用。于是我要做的就是用q个 jdk 中的 java ?javac 来代替系l原来的。执?br />
natsu:/home/herbert# update-alternatives --display java
java - status is auto.
 link currently points to /usr/local/j2sdk1.4.2_06/bin/java
/usr/bin/gij-wrapper-3.3 - priority 33
 slave java.1.gz: /usr/share/man/man1/gij-wrapper-3.3.1.gz
/usr/local/j2sdk1.4.2_06/bin/java - priority 100
 slave java.1.gz: /usr/local/j2sdk1.4.2_06/man/man1/java.1
Current `best' version is /usr/local/j2sdk1.4.2_06/bin/java.
natsu:/home/herbert# update-alternatives --display javac
javac - status is auto.
 link currently points to /usr/local/j2sdk1.4.2_06/bin/javac
/usr/bin/gcj-wrapper-3.3 - priority 33
 slave javah: /usr/bin/gcjh-wrapper-3.3
 slave javac.1.gz: /usr/share/man/man1/gcj-wrapper-3.3.1.gz
 slave javah.1.gz: /usr/share/man/man1/gcjh-wrapper-3.3.1.gz
/usr/bin/gcj-wrapper-3.4 - priority 33
 slave javah: /usr/bin/gcjh-wrapper-3.4
 slave javac.1.gz: /usr/share/man/man1/gcj-wrapper-3.4.1.gz
 slave javah.1.gz: /usr/share/man/man1/gcjh-wrapper-3.4.1.gz
/usr/local/j2sdk1.4.2_06/bin/javac - priority 100
 slave javah: /usr/local/j2sdk1.4.2_06/bin/javah
 slave javac.1.gz: /usr/local/j2sdk1.4.2_06/man/man1/javac.1
 slave javah.1.gz: /usr/local/j2sdk1.4.2_06/man/man1/javah.1
Current `best' version is /usr/local/j2sdk1.4.2_06/bin/javac.
natsu:/home/herbert#

Q你看到的是我更C后的Q就可以得到关于要更新哪?alternatives 的信息。我是这么更新的Q?br />
update-alternatives --install /usr/bin/javac javac /usr/local/j2sdk1.4.2_06/bin/javac 100 --slave /usr/bin/javah javah /usr/local/j2sdk1.4.2_06/bin/javah --slave /usr/share/man/man1/javac.1.gz javac.1.gz /usr/local/j2sdk1.4.2_06/man/man1/javac.1 --slave /usr/share/man/man1/javah.1.gz javah.1.gz /usr/local/j2sdk1.4.2_06/man/man1/javah.1
update-alternatives --install /usr/bin/java java /usr/local/j2sdk1.4.2_06/bin/java 100 --slave /usr/share/man/man1/java.1.gz java.1.gz /usr/local/j2sdk1.4.2_06/man/man1/java.1


]]>
Ubuntu7.10pȝ安装Q包括各U常用YӞ昑֍驱动Q双昄器,chroot sarge环境Q?/title><link>http://m.tkk7.com/renyangok/archive/2007/12/19/168813.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Wed, 19 Dec 2007 09:29:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2007/12/19/168813.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/168813.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2007/12/19/168813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/168813.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/168813.html</trackback:ping><description><![CDATA[1, insert Ubuntu 7.10 CD<br /> a, format disc(primary 10G ext3; extend 59G ext3; swap 1G)<br /> <br /> b, install(timezone shanghai; en_US; "prepare disc space" manual, or the system will partition autoly)<br /> <br /> c, auto restart, go on install system(remenber cut off the net line except the netwidth is large, or it will cost long time to download from far away)<br /> <br /> 2, config<br /> a, sources list<br /> sudo vim /etc/apt/sources.list<br /> # add "deb http://debian.exoweb.net/debian.cn99.com/debian etch main" into it<br /> sudo apt-get update<br /> sudo apt-get upgrade<br /> <br /> b, vedio card driver<br /> 在ubuntu7.10下装nvidia 7 series昑֍q|双屏显C:<br /> <br /> 一Q显卡驱?Q?双显C器 <br /> (修改X配置命oQsudo dpkg-reconfigure xserver-xorg)<br /> <br /> 1Q到nvidia|站下蝲7pd昑֍的最新驱?br /> <br /> 2Qensure that the linux-restricted-modules or linux-restricted-modules-common packages have been uninstalled. Alternatively, you can edit the /etc/default/linux-restricted-modules or /etc/default/linux-restricted-modules-common configuration file and disable the NVIDIA linux-restricted kernel modules (nvidia, nvidia_legacy) via:<br /> <br /> DISABLED_MODULES="nv nvidia_new"<br /> <br /> 3, <br /> sudo apt-get remove --purge nvidia-glx nvidia-glx-new<br /> sudo rm /etc/init.d/nvidia-glx /etc/init.d/nvidia-kernel /lib/linux-restricted-modules/.nvidia_new_installed<br /> <br /> 4Q然后ctrl+alt+1q入tty1<br /> sudo /etc/init.d/gdm stop<br /> sudo sh NVIDIA-Linux-x86-100.14.23-pkg1.run<br /> (q时会出现错误提C,说少?#8220;libc header file...libc development package”)<br /> sudo apt-get install sudo apt-get install build-essential xorg-dev pkg-config linux-headers-$(uname -r), libc6-dev<br /> sudo sh NVIDIA-Linux-x86-100.14.23-pkg1.run<br /> sudo /etc/init.d/gdm start<br /> <br /> 用application -> system tools里的nvidia工具去配|双昄?br /> <br /> c, multi-language<br /> System -> Administration -> Language support: install English and Chinese<br /> check "input method"<br /> <br /> d, Wen Quan Yi font<br /> browse http://wenq.org/, and download 文泉驿点阵宋?and 文泉驿矢量正? then install them<br /> System -> Preference -> Appearance -> Fonts 前四w择Q点阵宋体(WenQuanYi Bitmap SongQ, W五不改(MonospaceQ?br /> sudo fc-cache -f -v (h字体~存Q每ơ修改字体都要这P不然Xorg会很?<br /> <br /> e, stardict                    <br /> sudo apt-get install stardict<br /> (http://stardict.sourceforge.net/Dictionaries_zh_CN.php 下蝲朗道英汉Q汉英字?<br /> tar -xjvf *** --directory /usr/share/stardict/dic/<br /> <br /> f, pidgin internet messager<br /> sudo apt-get install gaim-guifications<br /> config: Tools -> Plugins -> (check) Guifications; then, config it to uncheck on "Chat message"<br /> <br /> 3, install and config Software<br /> sudo apt-get install postgresql-8.1 python2.4 ipython vim-gnome sun-java5-jdk eclipse subversion build-essential ssh build-essential meld kompare<br /> <br /> a, postgresql<br /> sudo su - postgres (for user postgres has Null password, so you can't just "su - postgres", or you can sudo "sudo passwd postgres" to set password for postgres, then "su - postgres")<br /> createuser (enter username and password.)<br /> config postgresql as below:<br /> In /etc/postgresql/8.1/main/postgresql.conf, Change listen_addresses to '*' and change datestyle to 'ISO,European' and uncomment them.<br /> In /etc/postgresql/8.1/main/pg_hba.conf, 最后加入一?#8220;host        all    justin        127.0.0.1/16        trust”<br /> <br /> b, eclipse<br /> sudo eclipse, exit, eclipse<br /> <br /> c, ssh<br /> When other mathines want to ssh or scp your mathine which is new OS, it should "rm ~/.ssh/known_hosts" to reload the new Cert.<br /> <br /> d, kompare<br /> add a file svndiff in src with context<br /> """<br /> if [ $1 ] ; then<br />     svn up -r $1<br />     svn st -q<br />     svn log -r $1<br />     PRE=`expr $1 - 1`<br />     svn diff --diff-cmd=diff -x "-U 10000" -r$PRE:$1 > /tmp/$1.diff<br />     cat /tmp/$1.diff | kompare -<br /> else<br />     svn up<br />     svn st<br />     svn diff --diff-cmd=diff -x "-U 10000" | kompare -<br /> fi<br /> """<br /> then, in src, ./svndiff 9827 will show diff about r9827<br /> <br /> e, firefox add-ons<br /> firebug, flashblock<br /> <br /> 3, chroot<br /> a,<br /> sudo apt-get install debootstrap<br /> sudo debootstrap --arch i386 etch /home/etch http://debian.exoweb.net/debian.cn99.com/debian/<br /> (if in 64 bit system, use --arch amd64)<br /> sudo chroot /home/etch<br /> #in etch as root<br /> apt-get install locales<br /> dpkg-reconfigure locales #(choose en_us UTF8 as before)<br /> apt-get install vim vim-gnome xbase-clients less sudo postgresql-client subversion<br /> echo "etch" > /etc/debian-chroot<br /> visudo (add user justin to sudo)<br /> adduser justin (删除的命令是userdel justin)<br /> <br /> 在ubuntu?usr/bin/etch加入Q?br /> sudo cp /etc/passwd /home/etch/etc/<br /> sudo cp /etc/shadow /home/etch/etc/<br /> sudo cp /etc/group /home/etch/etc/<br /> sudo cp /etc/sudoers /home/etch/etc/<br /> sudo cp /etc/resolv.conf /home/etch/etc/<br /> sudo cp /etc/hosts /home/etch/etc/<br /> <br /> ?etc/fstab加入Q?br /> /home   /home/etch/home    none    bind 0 0<br /> /tmp    /home/etch/tmp     none    bind 0 0<br /> /dev    /home/etch/dev     none    bind 0 0<br /> /proc   /home/etch/proc    none    bind 0 0<br /> sudo chroot /home/etch/  su - justin<br /> <br /> 现在可一享受chroot的双pȝ?br /> <br /> b, run X in etch 3 steps<br /> b1, (etch)mkdir /tmp/.X11-unix<br /> (ubuntu)sudo echo "/tmp/.X11-unix/x0 /home/justin/etch/tmp/.X11-unix/x0 none bind 0 0" >> /etc/fstab<br /> # another way is write it in to /etc/fstab, or sudo mount --bind /tmp/*** /home/justin/etch/tmp/***<br /> b2, (etch)vim ~/.bashrc # add "export DISPLAY=:0.0"<br /> b3, (ubuntu) cp ~/.Xauthority ~/etch/home/justin/ Q其实这步不需要,因ؓ上面已经?home mountC/home/etch/home了)<br /> <br /> c, install java<br /> #download jdk-1_5_0_14-linux-i586.bin to /opt/, and into etch/opt/<br /> sudo chmod +x jdk-1_5_0_14-linux-i586.bin<br /> sudo ./jdk-1_5_0_14-linux-i586.bin<br /> vim ~/.bashrc<br /> #add below in the end of .bashrc<br /> #export JAVA_HOME=/opt/jdk1.5.0_14<br /> #export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar<br /> #export PATH=$JAVA_HOME/bin:$PATH<br /> <br /> java -version<br /> #java version "1.5.0_14"<br /> #Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03)<br /> #Java HotSpot(TM) Client VM (build 1.5.0_14-b03, mixed mode, sharing)<br /> <font size="-1">配置默认<font color="#c60a00">Java</font>使用哪个 <font color="#c60a00">sudo</font> update-alternatives --config <font color="#c60a00">java</font></font><br /> <img src ="http://m.tkk7.com/renyangok/aggbug/168813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2007-12-19 17:29 <a href="http://m.tkk7.com/renyangok/archive/2007/12/19/168813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求两个数或多个数的最大公U数法及其实现http://m.tkk7.com/renyangok/archive/2007/12/15/167956.html保尔?/dc:creator>保尔?/author>Sat, 15 Dec 2007 07:40:00 GMThttp://m.tkk7.com/renyangok/archive/2007/12/15/167956.htmlhttp://m.tkk7.com/renyangok/comments/167956.htmlhttp://m.tkk7.com/renyangok/archive/2007/12/15/167956.html#Feedback2http://m.tkk7.com/renyangok/comments/commentRss/167956.htmlhttp://m.tkk7.com/renyangok/services/trackbacks/167956.html
1、欧几里L?


Ƨ几里d法又称辗{盔R法,用于计算两个整数a,b的最大公U数。其计算原理依赖于下面的定理Q?

定理Qgcd(a,b) = gcd(b,a mod b)

证明Qa可以表示成a = kb + rQ则r = a mod b
假设d是a,b的一个公U数Q则?
d|a, d|bQ而r = a - kbQ因此d|r
因此d?b,a mod b)的公U数

假设d ?b,a mod b)的公U数Q则
d | b , d |r Q但是a = kb +r
因此d也是(a,b)的公U数

因此(a,b)?b,a mod b)的公U数是一LQ其最大公U数也必然相{,得证

Ƨ几里d法是Ҏq个原理来做的,其算法用C++语言描述为:

void swap(int & a, int & b){
     int c = a;
       a = b;
       b = c;
}

int gcd(int a,int b){
     if(0 == a ){
         return b;
     }
     if( 0 == b){
         return a;
     }
     if(a > b){
         swap(a,b);
     }
     int c;
     for(c = a % b ; c > 0 ; c = a % b){
           a = b;
           b = c;
     }
     return b;
}

2、Stein法
Ƨ几里d法是计两个数最大公U数的传l算法,它无Z理论q是从效率上都是很好的。但是有一个致命的~陷Q这个缺陷只有在大素数时才会昄出来?

考虑现在的硬件^収ͼ一般整数最多也是64位,对于q样的整敎ͼ计算两个C间的模是很简单的。对于字长ؓ32位的q_Q计两个不过32位的整数? 模,只需要一个指令周期,而计?4位以下的整数模,也不q几个周期而已。但是对于更大的素数Q这L计算q程׃得不qh设计Qؓ了计两个超q? 64位的整数的模Q用户也怸得不采用cM于多位数除法手算q程中的试商法,q个q程不但复杂Q而且消耗了很多CPU旉。对于现代密码算法,要求计算 128位以上的素数的情冉|比皆是,设计q样的程序迫切希望能够抛弃除法和取模?

Stein法由J. Stein 1961q提出,q个Ҏ也是计算两个数的最大公U数。和Ƨ几里d法 法不同的是QStein法只有整数的移位和加减法,q对于程序设计者是一个福韟?

Z说明Stein法的正性,首先必须注意C下结论:

gcd(a,a) = aQ也是一个数和它自n的公U数是其自n
gcd(ka,kb) = k gcd(a,b)Q也是最大公U数q算和倍乘q算可以交换Q特D的Q当k=2Ӟ说明两个偶数的最大公U数必然能被2整除

C++/java 实现
// c++/java stein 法
int gcd(int a,int b){
     if(a<b){
//arrange so that a>b
         int temp = a;
           a = b;
           b=temp;
     }
     if(0==b)
//the base case
        return a;
     if(a%2==0 && b%2 ==0)
//a and b are even
         return 2*gcd(a/2,b/2);
     if ( a%2 == 0)
// only a is even
         return gcd(a/2,b);
     if ( b%2==0 )
// only b is even
         return gcd(a,b/2);
     return gcd((a+b)/2,(a-b)/2);
// a and b are odd
}

二,多个数的最大公U数Q?python实现Q取出数la中最的Q从2到最的循环Q找出其中最大的能被数组中所有数整除的那个数Q就是最大公U数)
def gcd(a):
    a.sort()
    min = a[0]
    result = 1
    for i in range(2, min+1):
        flag = True
        for j in a:
            if j % i != 0:
                flag = False
        if flag == True:
            result = i
    return result


]]>
l合数学QCatalan?/title><link>http://m.tkk7.com/renyangok/archive/2007/11/16/161089.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Fri, 16 Nov 2007 10:07:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2007/11/16/161089.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/161089.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2007/11/16/161089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/161089.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/161089.html</trackback:ping><description><![CDATA[Catalan敎ͼ(for http://acm.pku.edu.cn/JudgeOnline/problem?id=2084)<br /> <br /> C_n = ΣC_i*C_(n-i)Q其?≤i<nQ?br /> C_n = C(2n,n) / (n+1)Q?其中C(2n, n) 表示l合敎ͼ公式为:C(n, k) = n! / (k!(n-k)!)<br /> C_n=C_(n-1)*(4n-2)/(n+1)?br /> <br /> 它的意义有很多,例如Qn+1边Ş用对角线划分? 三角形的Ҏ敎ͼn?1和n?1满所有部分和不小于零的排列数Q具有n个节点的二叉树的数量……<br /> <br /> Q详l说明参考:http://hi.baidu.com/kikoqiu/blog/item/81d792015ab13e01738da51d.htmlQ?br /> <img src ="http://m.tkk7.com/renyangok/aggbug/161089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2007-11-16 18:07 <a href="http://m.tkk7.com/renyangok/archive/2007/11/16/161089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>crontab用法http://m.tkk7.com/renyangok/archive/2007/11/02/157783.html保尔?/dc:creator>保尔?/author>Fri, 02 Nov 2007 08:56:00 GMThttp://m.tkk7.com/renyangok/archive/2007/11/02/157783.htmlhttp://m.tkk7.com/renyangok/comments/157783.htmlhttp://m.tkk7.com/renyangok/archive/2007/11/02/157783.html#Feedback0http://m.tkk7.com/renyangok/comments/commentRss/157783.htmlhttp://m.tkk7.com/renyangok/services/trackbacks/157783.html
crontab [ -u user ] file
crontab [ -u user ] { -l | -r | -e }

指o說明

crontab 提供我們在固定的間隔時間執行自a的E式、系i指令或 shell secrip。時間間隔的單位可以是分鐘、小時、日、週、月及以上的Li合。允a׃用者離R執行,並且可以執行結果以 email 通知使用者。因此,非常a合週期性的理分析或資料備份等工作?br />
基本上,crontab 的指令格式分為六個部分,前五個為時間間隔Q最後則是執行的指o。每一個部分用I格來區隔?br />
?-- 0-59
?-- 0-23
?-- 1-31
?-- 1-12 或用英文名E?br /> 星期 -- 0-7 或用英文名E?br /> 工作命o -- 指oQshell scriptQ程?...(使用i對路徑)
以上?crontab 的基本格式?br />
達R說明

-u user
以指定的使用者n份,埯 crontab 工作。此達R僅供 root 使用?br />

-l
示使用者現行的 crontab 檔?br />
-r
U除現行?crontab 檔?br />
-e
進入 vi R輯 crontab ?如有a定 VISUAL ?EDITOR 環境變數Q怎用該環境變數所a定的編輯器來編?。在使用者退出編輯器後,會自動將所R輯 crontab 檔,|入 crontab 埯?br /> 盔R檔案

/etc/cron.allow
/etc/cron.deny

實例說明

# crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.3672 installed on Thu Jan 1 15:55:18 2004)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
0 0-23/6 * * * /usr/bin/webalizer
30 3 * * * /root/fbin/bak-web
#

先前曾提刎ͼcrontab 的格式分成六個部分,前五個是時間參數。在上例中你會發N了數字與英文名稱Q有使用到符?*"Q這個符號代表每一單位的意思,譬如 30 3 * * * 既代?30?3?每日 每月 星期的每天?br />
時間的指定,可以是單一的數字,或幾個數字用逗號來連接。看下例

30 3,12 * * * /root/fbin/bak-web

其中的第二項?3,12Q這代?3 以及 12 時的意思。再來看下例

30 */6 * * * /root/fbin/bak-web

我把W二項改?*/6 這代表每 6 時Q也相當?6,12,18,24 的作用。此外還有一個區D늚做法

30 8-18/2 * * * /root/fbin/bak-web

我把W二項改?8-18/2 這代表在 8 時?18 時之間?2 時Q也相當?8,10,12,14,16,18 的作用?br />
在認知的以上介紹各項時間用法後,你可以視實際的需要自行組合。用上的彈性是相當自由的。這篇暫時到此?br />



]]>
diff和patch使用指南http://m.tkk7.com/renyangok/archive/2007/10/25/155792.html保尔?/dc:creator>保尔?/author>Thu, 25 Oct 2007 02:22:00 GMThttp://m.tkk7.com/renyangok/archive/2007/10/25/155792.htmlhttp://m.tkk7.com/renyangok/comments/155792.htmlhttp://m.tkk7.com/renyangok/archive/2007/10/25/155792.html#Feedback0http://m.tkk7.com/renyangok/comments/commentRss/155792.htmlhttp://m.tkk7.com/renyangok/services/trackbacks/155792.html(转自Q?/font>http://blog.chinaunix.net/u/24474/showart_217098.html)

diff和patch是一对工P在数学上来说Qdiff是对两个集合的差q算Qpatch是对两个集合的和q算?br /> diff比较两个文g或文仉合的差异Qƈ记录下来Q生成一个diff文gQ这也是我们常说的patch文gQ即补丁文g?br /> patch能将diff文gq用?原来的两个集合之一Q从而得到另一个集合。D个例子来说文件A和文件B,l过diff之后生成了补丁文件C,那么着个过E相当于 A -B = C ,那么patch的过E就是B+C = A 或A-C =B?br /> 因此我们只要能得到A, B, C三个文g中的M两个Q就能用diff和patchq对工具生成另外一个文件?br />
q就是diff和patch的妙处。下面分别介l一下两个工L用法:

1. diff的用?br />
diff后面可以接两个文件名或两个目录名?如果是一个目录名加一个文件名Q那么只作用在那么个目录下的同名文g?br />
如果是两个目录的话,作用于该目录下的所有文Ӟ不递归。如果我们希望递归执行Q需要?r参数?br />
命odiff A B > C ,一般A是原始文ӞB是修改后的文ӞCUCؓA的补丁文件?br /> 不加M参数生成的diff文g格式是一U简单的格式Q这U格式只标出了不一L行数和内宏V我们需要一U更详细的格式,可以标识Z同之处的上下文环境,q样更有利于提高patch命o的识别能力。这个时候可以用-c开兟?br />

2. patch的用?br />
patch用于Ҏ原文件和补丁文g生成目标文g。还是拿上个例子来说

patch A C p得到B, q一步叫做对A打上了B的名字ؓC的补丁?br />
之一步之后,你的文gA变成了文gB。如果你打完补丁之后x复到A怎么办呢Q?br />
patch -R B C 可以重新还原到A了?br />
所以不用担心会失去A的问题?br />
其实patch在具体用的时候是不用指定原文件的Q因丁文件中都已l记载了原文件的路径和名U。patch_聪明可以认出来。但是有时候会有点? 问题。比如一般对两个目录diff的时候可能已l包含了原目录的名字Q但是我们打补丁的时候会q入到目录中再用patch,着个时候就需要你告诉 patch命o怎么处理补丁文g中的路径。可以利?pn开养I告诉patch命o忽略的\径分隔符的个数。D例如下:

A文g?DIR_A下,修改后的B文g在DIR_B下,一般DIR_A和DIR_B在同一U目录。我们ؓ了对整个目录下的所有文件一ơ性diff,我们一般会到DIR_A和DIR_B的父目录下执行以下命?br />
diff -rc DIR_A DIR_B > C

q个时候补丁文件C中会记录了原始文件的路径?DIR_A/A

现在另一个用户得CA文g和C文gQ其中A文g所在的目录也是DIR_A?一般,他会比较喜欢在DIR_A目录下面q行patch操作Q它会执?br />
patch < C

但是q个时候patch分析C文g中的记录Q认为原始文件是./DIR_A/AQ但实际上是./AQ此时patch会找不到原始文g。ؓ了避免这U情冉|们可以?p1参数如下

patch -p1 < C

此时Qpatch会忽略掉W??#8221;/”之前的内容,认ؓ原始文g?./AQ这样就正确了?br /> 使用patch

patch附带有一个很好的帮助Q其中罗列了很多选项Q但?9%的时间只要两个选项p满我们的需要:

patch -p1 < [patchfile]

patch -R < [patchfile] (used to undo a patch)

-p1选项代表patchfile?nbsp;     文g名左边目录的层数Q顶层目录在不同的机器上有所不同。要使用q个选项Q就要把你的patch攑֜要被打补丁的目录下,然后在这个目录中q行path -p1 < [patchfile]?/font>

]]>
JDK1.4引入的新Ҏ之一--断言QassertQ?/title><link>http://m.tkk7.com/renyangok/archive/2007/10/12/152316.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Fri, 12 Oct 2007 05:16:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2007/10/12/152316.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/152316.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2007/10/12/152316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/152316.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/152316.html</trackback:ping><description><![CDATA[<div><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;"><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">断言概述</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">~写代码Ӟ我们L会做Z些假设,断言是用于在代码中捕捉q些假设<span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> 可以断a看作是异常处理的一U高UŞ?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言表示Z些布表辑ּQ程序员怿在程序中的某个特定点该表辑ּgؓ?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以在Q何时候启用和用断言验证Q因此可以在试时启用断a而在部v时禁用断a。同PE序投入q行后,最l用户在遇到问题时可以重新v用断a?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言可以创徏更稳定,品质更好且易于除错的代码</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">当需要在一个gؓ</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">FALSE</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">时中断当前操作的话,可以使用断言</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">单元试必须使用断言Q?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Junit/JunitX</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">除了cd查和单元试外,断言q提供了一U确定个U特性是否在E序中得到维护的极好的方?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言使我们向按契U式设计更近了一?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <br /> </span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">常见的断aҎ?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">前置条g断言Q代码执行之前必d备的Ҏ?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">后置条g断言Q代码执行之后必d备的Ҏ?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">前后不变断言Q代码执行前后不能变化的Ҏ?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <br /> </span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">断言使用方式</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言可以有两UŞ?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">1.assert Expression1 <br /> 2.assert Expression1:Expression2 <br /> </span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">其中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Expression1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">应该L一个布|</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Expression2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是断ap|时输出的p|消息的字W串。如?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Expression1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">为假Q则抛出一?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q这是一个错误,而不是一个异常,也就是说是一个不可控制异常(</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">unchecked Exception),AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">׃是错误,所以可以不捕获Q但不推荐这样做Q因为那样会使你的系l进入不E_状态?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <br /> </span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">L断言</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言在默认情况下是关闭的Q要在编译时启用断言Q需要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">source1.4</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">标记</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">javac source1.4 Test.java ,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">在运行时启用断言需要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -ea</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">参数</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">。要在系l类中启用和用断言可以使用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -esa </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -dsa</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">参数?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">例如Q?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">public >  public AssertExampleOne(){} <br />   public static void main(String args[]){ <br />     int x=10; <br />     System.out.println("Testing Assertion that x==100"); <br />     assert x=100;"Out assertion failed!"; <br />     System.out.println("Test passed!"); <br />   } <br /> } <br /> <br /> </span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">如果~译时未?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -source1.4,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">则编译通不q?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">在执行时未加</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -ea </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">时输Zؓ</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">Testing Assertion that x==100 <br /> Test passed <br /> jre</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">忽略了断a的就代码Q而用了该参数就会输Zؓ</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">Testing Assertion that x==100 <br /> Exception in thread "main" java.lang.AssertionError: Out assertion failed! <br /> at AssertExampleOne.main(AssertExampleOne.java:6) <br /> <br /> <br /> </span></span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">断言的副作用</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">׃E序员的问题Q断a的用可能会带来副作?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q例如:</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">boolean isEnable=false; <br /> //... <br /> assert isEnable=true; <br /> </span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q个断言的副作用是因为它修改了程序中变量的值ƈ且未抛出错误Q这L错误如果不细心的查是很难发现的。但是同时我们可以根据以上的副作用得C个有用的Ҏ,Ҏ它来试断言是否打开?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <span style="color: #9370db;">public ><br />   public static void main(String args[]){ <br />     boolean isEnable=false; <br />     //... <br />     assert isEnable=true; <br />     if(isEnable==false){ <br />       throw new RuntimeException("Assertion shoule be enable!"); <br />     } <br />   } <br /> } <br /> <br /> <br /> </span></span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">何时需要用断a</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <span style="color: #9370db;">1.</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以在预计正常情况下E序不会到达的地Ҏ|断a</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert false <br /> 2.</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言可以用于查传递给U有Ҏ的参数。(对于公有ҎQ因为是提供l外部的接口Q所以必dҎ中有相应的参数检验才能保证代码的健壮性)</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">3.</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言试Ҏ执行的前|条件和后置条g</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">4.</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言查类的不变状态,保M情况下,某个变量的状态必L뀂(?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">age</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">属性应大于</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">0</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">于某个合适|</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <br /> </span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">什么地方不要用断a</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言语句不是永远会执行,可以屏蔽也可以启?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">因此Q?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">1.</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">不要使用断言作ؓ公共Ҏ的参数检查,公共Ҏ的参数永q都要执?/span></span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">2.</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言语句不可以有M边界效应Q不要用断a语句M改变量和改变Ҏ的返回?/span><br /> <br /> 下边是介l断a的用?/span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;"><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">:</span></span><br /> <br /> assert<span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是在</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">J2SE1.4</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">中引入的新特性,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assertion</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是在代码中包括的布型状态,E序员认个状态是</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">true</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">。一般来?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">在开发的时候是查程序的安全性的Q在发布的时候通常都不使用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">。在</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">1.4</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">中添加了</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">关键字和</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">java.lang.AssertError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">cȝ支持?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">首先Q我们有必要从一个例子说?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert <br /> <br /> public >  public static void main(String[] args) { <br />     AssertTest at = new AssertTest(); <br />     at.assertMe(true); <br />     at.assertMe(false); <br />   } <br />   private void assertMe(boolean boo) { <br />     assert boo?true:false; <br />     System.out.println("true condition"); <br />   } <br /> } <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">E序中包含了</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的话Q你要用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">javac -source 1.4 xxx.java</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来编译,否则~译器会报错的。要惌</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得部分运行的话,要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">java -ea xxx</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来运行,否则包含</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得行会被忽略。下面我们运?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">javac -source 1.4 AssertTest.java <br /> java -ea AssertTest <br /> </span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">看看l果的输出是Q?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <span style="color: #9370db;">true condition <br /> Exception in thread "main" java.lang.AssertionError <br /> at AssertTest.assertMe(AssertTest.java:13) <br /> at AssertTest.main(AssertTest.java:7) <br /> <br /> </span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">当我们运?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">at.assertMe(true)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得时候,׃</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert boo?true:false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">相当?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> assert true;</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">因此没有M问题Q程序往下执行打印出</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">true condition</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q但是执?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">at.assertMe(false)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的时候相当于</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q这个时候解释器׃抛出</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">了,E序q止了。大家必L?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是承自</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Error</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得,因此你可以不再程序中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">catch</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">它的Q当然你也可以在E序?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">catch</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">它然后程序可以l执行。例如:</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">public >  public static void main(String[] args) { <br />     AssertTest at = new AssertTest(); <br />     try { <br />       at.assertMe(true); <br />       at.assertMe(false); <br />     } catch(AssertionError ae) { <br />       System.out.println("AsseriontError catched"); <br />     } <br />     System.out.println("go on"); <br />   } <br />   private void assertMe(boolean boo) { <br />     assert boo?true:false; <br />     System.out.println("true condition"); <br />   } <br /> } <br /> <br /> assert</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q有另外一U表辄方式Q就?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert exp1:exp2;</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">其中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是个</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">boolean</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q回值得表达式,?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以是原始的数据cd或者对象都可以例如Q?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">boolean boo = true; <br /> String str = null; <br /> assert boo = false</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">str="error"; <br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">我们刚开始讲?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得Ş式,?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得时候,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得默认构造器会被调用Q但?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert exp1:exp2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q样的Ş式,?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">true</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的时候后?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">被或略,如果</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的话Q后面的表达式的l果会被计算出来q作?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得构造器参数。看下面的例子:</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">public >  public static void main(String[] args) { <br />     AssertTest at = new AssertTest(); <br />     at.assertMe(true); <br />     at.assertMe(false); <br />   } <br />   private void assertMe(boolean boo) { <br />     String s = null; <br />     assert boo?true:false:s = "hello world"; <br />     System.out.println("true condition"); <br />   } <br /> }</span><br /> <br /> q行的时候会得到q样的结?</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">true condition <br /> Exception in thread "main" java.lang.AssertionError: hello world <br /> at AssertTest.assertMe(AssertTest.java:14) <br /> at AssertTest.main(AssertTest.java:7) <br /> <br /> Assert</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">最好不要滥用,原因?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q不一定都?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">enable</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的,下面两种情况׃应该?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert <br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">不要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">public</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的方法里面检查参数是不是?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">null</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">之类的操作,</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">例如<br /> <br /> public int get(String s) { <br />   assert s != null; <br /> } <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">如果需要检查也最好通过</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">if s = null </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">抛出</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">NullPointerException</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来检?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> 不要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来检查方法操作的q回值来判断Ҏ操作的结果,</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">例如<br /> <br /> assert list.removeAll();<br /> <br /> q样看v来好像没有问?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">但是x如果</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">disable</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">呢,那样他就不会被执行了</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">所?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">removeAll()</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">操作没有被执行</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以q样代替</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> <br /> boolean boo = list.removeAl(); <br /> assert boo;</span></div> <span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> <span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> </span></span></span></span> <img src ="http://m.tkk7.com/renyangok/aggbug/152316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2007-10-12 13:16 <a href="http://m.tkk7.com/renyangok/archive/2007/10/12/152316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python学习W记http://m.tkk7.com/renyangok/archive/2007/09/02/142080.html保尔?/dc:creator>保尔?/author>Sun, 02 Sep 2007 08:18:00 GMThttp://m.tkk7.com/renyangok/archive/2007/09/02/142080.htmlhttp://m.tkk7.com/renyangok/comments/142080.htmlhttp://m.tkk7.com/renyangok/archive/2007/09/02/142080.html#Feedback0http://m.tkk7.com/renyangok/comments/commentRss/142080.htmlhttp://m.tkk7.com/renyangok/services/trackbacks/142080.html阅读全文

]]>
.bash_profile?bashrc的区?/title><link>http://m.tkk7.com/renyangok/archive/2007/07/16/130504.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Mon, 16 Jul 2007 02:52:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2007/07/16/130504.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/130504.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2007/07/16/130504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/130504.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/130504.html</trackback:ping><description><![CDATA[<font size="2">/etc/profile:此文件ؓpȝ的每个用戯|环境信?当用L一ơ登录时,该文件被执行.q从/etc/profile.d目录的配|文件中搜集shell的设|?<br> <br> /etc/bashrc:为每一个运行bash shell的用h行此文g.当bash shell被打开?该文件被d.<br> <br> ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用L录时,该文件仅仅执行一?默认情况?他设|一些环境变?执行用户?bashrc文g.<br> <br> ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell?该该文g被读?<br> <br> ~/.bash_logout:当每ơ退出系l?退出bash shell)?执行该文? <br> <br> 另外,/etc/profile中设定的变量(全局)的可以作用于M用户,而~/.bashrc{中讑֮的变?局?只能l承/etc/profile中的变量,他们?父子"关系.<br> <br> ~/.bash_profile 是交互式、login 方式q入 bash q行?br> <br> ~/.bashrc 是交互式 non-login 方式q入 bash q行?br> <br> 通常二者设|大致相同,所以通常前者会调用后者?/font><img src ="http://m.tkk7.com/renyangok/aggbug/130504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2007-07-16 10:52 <a href="http://m.tkk7.com/renyangok/archive/2007/07/16/130504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://maomi02.com" target="_blank">ɫۼۺ</a>| <a href="http://miya77772.com" target="_blank">Ļ</a>| <a href="http://kyqp0033.com" target="_blank">vƬ߹ۿ</a>| <a href="http://0359puju.com" target="_blank">õ788Ƶ</a>| <a href="http://517qq.com" target="_blank">޾ƷӰ</a>| <a href="http://bb927bb.com" target="_blank">Ƶַ</a>| <a href="http://kkjk123.com" target="_blank">69ӰԺ߹ۿ</a>| <a href="http://zzhdrsqwx.com" target="_blank">ձh߾Ʒѹۿ</a>| <a href="http://taoduoduo666.com" target="_blank">޻ɫƬѿ</a>| <a href="http://langtuojidian.com" target="_blank">һӰ߿Ƭ </a>| <a href="http://sdnuoyuan.com" target="_blank">պƵƵ</a>| <a href="http://szzdjl.com" target="_blank">ҹƵ</a>| <a href="http://ssni703.com" target="_blank">av</a>| <a href="http://bzzxyp.com" target="_blank">ҪWWWѿƵ</a>| <a href="http://xjtuykw.com" target="_blank">޾Ʒsuvһ88</a>| <a href="http://qiyupu.com" target="_blank">޳aƬӰԺ</a>| <a href="http://bnb989.com" target="_blank">rhгijվ</a>| <a href="http://hzkjjy.com" target="_blank">һŮ</a>| <a href="http://gzmsijz.com" target="_blank">պƷƵ</a>| <a href="http://mychjp.com" target="_blank">jlzzjlzzjzjzjz</a>| <a href="http://an930.com" target="_blank">ձѵӰһ</a>| <a href="http://8mav958.com" target="_blank">һѻɫƬ</a>| <a href="http://js-jiarui.com" target="_blank">þ޾ƷƵ</a>| <a href="http://qsqse1.com" target="_blank">ƹƵӰԺ߹ۿ</a>| <a href="http://1880531.com" target="_blank">޵һվ</a>| <a href="http://www-75044.com" target="_blank">޾Ʒa vС˵</a>| <a href="http://www66913.com" target="_blank">ѹۿëƬ</a>| <a href="http://www-175345.com" target="_blank">һ</a>| <a href="http://wwwav800.com" target="_blank">avƬ߲</a>| <a href="http://b7277.com" target="_blank">þùƷһ</a>| <a href="http://yyfass.com" target="_blank">99þþƷ</a>| <a href="http://cqyouyongpx.com" target="_blank">100ëƬȫ</a>| <a href="http://eoeoyui.com" target="_blank">һػƴƬ߹ۿ</a>| <a href="http://alodaba.com" target="_blank">þþƷѹۿ</a>| <a href="http://www79909c.com" target="_blank">ҹƷӰ߹ۿ</a>| <a href="http://aplus178.com" target="_blank">ŷaվ</a>| <a href="http://shyangpuks.com" target="_blank">ɫҳѹۿ</a>| <a href="http://323c.com" target="_blank">һƵ</a>| <a href="http://paweax.com" target="_blank">þþƷ5555</a>| <a href="http://wxzg66.com" target="_blank">18վƬѹۿ</a>| <a href="http://gdporun.com" target="_blank">ŷרһ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>